Merge android-4.19.51 (d1f7f3b
) into msm-4.19
* refs/heads/tmp-d1f7f3b: Linux 4.19.51 ALSA: seq: Cover unsubscribe_port() in list_mutex drm/vc4: fix fb references in async update ovl: support stacked SEEK_HOLE/SEEK_DATA ovl: check the capability before cred overridden Revert "drm/nouveau: add kconfig option to turn off nouveau legacy contexts. (v3)" Revert "Bluetooth: Align minimum encryption key size for LE and BR/EDR connections" percpu: do not search past bitmap when allocating an area gpio: vf610: Do not share irq_chip soc: renesas: Identify R-Car M3-W ES1.3 usb: typec: fusb302: Check vconn is off when we start toggling ARM: exynos: Fix undefined instruction during Exynos5422 resume pwm: Fix deadlock warning when removing PWM device ARM: dts: exynos: Always enable necessary APIO_1V8 and ABB_1V8 regulators on Arndale Octa pwm: tiehrpwm: Update shadow register for disabling PWMs dmaengine: idma64: Use actual device for DMA transfers ice: Add missing case in print_link_msg for printing flow control gpio: gpio-omap: add check for off wake capable gpios PCI: xilinx: Check for __get_free_pages() failure block, bfq: increase idling for weight-raised queues video: imsttfb: fix potential NULL pointer dereferences video: hgafb: fix potential NULL pointer dereference scsi: qla2xxx: Reset the FCF_ASYNC_{SENT|ACTIVE} flags PCI: rcar: Fix 64bit MSI message address handling PCI: rcar: Fix a potential NULL pointer dereference net: hns3: return 0 and print warning when hit duplicate MAC power: supply: max14656: fix potential use-before-alloc platform/x86: intel_pmc_ipc: adding error handling ARM: OMAP2+: pm33xx-core: Do not Turn OFF CEFUSE as PPA may be using it drm/amd/display: Use plane->color_space for dpp if specified PCI: rpadlpar: Fix leaked device_node references in add/remove paths ARM: dts: imx6qdl: Specify IMX6QDL_CLK_IPG as "ipg" clock to SDMA ARM: dts: imx6sx: Specify IMX6SX_CLK_IPG as "ipg" clock to SDMA ARM: dts: imx6ul: Specify IMX6UL_CLK_IPG as "ipg" clock to SDMA ARM: dts: imx7d: Specify IMX7D_CLK_IPG as "ipg" clock to SDMA ARM: dts: imx6sll: Specify IMX6SLL_CLK_IPG as "ipg" clock to SDMA ARM: dts: imx6sx: Specify IMX6SX_CLK_IPG as "ahb" clock to SDMA ARM: dts: imx53: Specify IMX5_CLK_IPG as "ahb" clock to SDMA ARM: dts: imx50: Specify IMX5_CLK_IPG as "ahb" clock to SDMA ARM: dts: imx51: Specify IMX5_CLK_IPG as "ahb" clock to SDMA soc: rockchip: Set the proper PWM for rk3288 clk: rockchip: Turn on "aclk_dmac1" for suspend on rk3288 soc: mediatek: pwrap: Zero initialize rdata in pwrap_init_cipher PCI: keystone: Prevent ARM32 specific code to be compiled for ARM64 platform/chrome: cros_ec_proto: check for NULL transfer function i40e: Queues are reserved despite "Invalid argument" error x86/PCI: Fix PCI IRQ routing table memory leak net: thunderbolt: Unregister ThunderboltIP protocol handler when suspending switchtec: Fix unintended mask of MRPC event iommu/arm-smmu-v3: Don't disable SMMU in kdump kernel vfio: Fix WARNING "do not call blocking ops when !TASK_RUNNING" nfsd: avoid uninitialized variable warning nfsd: allow fh_want_write to be called twice fuse: retrieve: cap requested size to negotiated max_write nvmem: sunxi_sid: Support SID on A83T and H5 nvmem: core: fix read buffer in place ALSA: hda - Register irq handler after the chip initialization netfilter: nf_flow_table: fix netdev refcnt leak netfilter: nf_flow_table: check ttl value in flow offload data path nvme-pci: shutdown on timeout during deletion nvme-pci: unquiesce admin queue on shutdown PCI: designware-ep: Use aligned ATU window for raising MSI interrupts misc: pci_endpoint_test: Fix test_reg_bar to be updated in pci_endpoint_test iommu/vt-d: Set intel_iommu_gfx_mapped correctly blk-mq: move cancel of requeue_work into blk_mq_release watchdog: fix compile time error of pretimeout governors watchdog: imx2_wdt: Fix set_timeout for big timeout values netfilter: nf_tables: fix base chain stat rcu_dereference usage mips: Make sure dt memory regions are valid netfilter: nf_conntrack_h323: restore boundary check correctness netfilter: nf_flow_table: fix missing error check for rhashtable_insert_fast mmc: mmci: Prevent polling for busy detection in IRQ context ovl: do not generate duplicate fsnotify events for "fake" path PCI: dwc: Free MSI IRQ page in dw_pcie_free_msi() PCI: dwc: Free MSI in dw_pcie_host_init() error path uml: fix a boot splat wrt use of cpu_all_mask configfs: fix possible use-after-free in configfs_register_group percpu: remove spurious lock dependency between percpu and sched f2fs: fix to do checksum even if inode page is uptodate f2fs: fix to do sanity check on valid block count of segment f2fs: fix to use inline space only if inline_xattr is enable f2fs: fix to avoid panic in dec_valid_block_count() f2fs: fix to clear dirty inode in error path of f2fs_iget() f2fs: fix to do sanity check on free nid f2fs: fix to avoid panic in f2fs_remove_inode_page() f2fs: fix to avoid panic in f2fs_inplace_write_data() f2fs: fix to avoid panic in do_recover_data() ntp: Allow TAI-UTC offset to be set to zero mailbox: stm32-ipcc: check invalid irq pwm: meson: Use the spin-lock only to protect register modifications EDAC/mpc85xx: Prevent building as a module bpf: fix undefined behavior in narrow load handling drm/nouveau/kms/gv100-: fix spurious window immediate interlocks objtool: Don't use ignore flag for fake jumps drm/bridge: adv7511: Fix low refresh rate selection drm/nouveau/kms/gf119-gp10x: push HeadSetControlOutputResource() mthd when encoders change perf/x86/intel: Allow PEBS multi-entry in watermark mode mfd: twl6040: Fix device init errors for ACCCTL register drm/nouveau/disp/dp: respect sink limits when selecting failsafe link configuration mfd: intel-lpss: Set the device in reset state when init mfd: tps65912-spi: Add missing of table registration drivers: thermal: tsens: Don't print error message on -EPROBE_DEFER thermal: rcar_gen3_thermal: disable interrupt in .remove kernel/sys.c: prctl: fix false positive in validate_prctl_map() mm/slab.c: fix an infinite loop in leaks_show() mm/cma_debug.c: fix the break condition in cma_maxchunk_get() mm: page_mkclean vs MADV_DONTNEED race mm/cma.c: fix the bitmap status to show failed allocation reason initramfs: free initrd memory if opening /initrd.image fails mm/cma.c: fix crash on CMA allocation if bitmap allocation fails mem-hotplug: fix node spanned pages when we have a node with only ZONE_MOVABLE hugetlbfs: on restore reserve error path retain subpool reservation mm/hmm: select mmu notifier when selecting HMM ARM: prevent tracing IPI_CPU_BACKTRACE drm/pl111: Initialize clock spinlock early ipc: prevent lockup on alloc_msg and free_msg sysctl: return -EINVAL if val violates minmax fs/fat/file.c: issue flush after the writeback of FAT rapidio: fix a NULL pointer dereference when create_workqueue() fails x86: Fix RETPOLINE_CFLAGS check BACKPORT: kheaders: Do not regenerate archive if config is not changed BACKPORT: kheaders: Move from proc to sysfs BACKPORT: Provide in-kernel headers to make extending kernel easier UPSTREAM: binder: check for overflow when alloc for security context Conflicts: arch/arm/kernel/smp.c Change-Id: I3ea68f5be5910b6ae24d16194db149c24c36da36 Signed-off-by: Ivaylo Georgiev <irgeorgiev@codeaurora.org>
This commit is contained in:
commit
e09e20aa23
125 changed files with 808 additions and 297 deletions
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 19
|
||||
SUBLEVEL = 50
|
||||
SUBLEVEL = 51
|
||||
EXTRAVERSION =
|
||||
NAME = "People's Front"
|
||||
|
||||
|
|
|
@ -106,6 +106,7 @@
|
|||
regulator-name = "PVDD_APIO_1V8";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
ldo3_reg: LDO3 {
|
||||
|
@ -144,6 +145,7 @@
|
|||
regulator-name = "PVDD_ABB_1V8";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
ldo9_reg: LDO9 {
|
||||
|
|
|
@ -420,7 +420,7 @@
|
|||
reg = <0x63fb0000 0x4000>;
|
||||
interrupts = <6>;
|
||||
clocks = <&clks IMX5_CLK_SDMA_GATE>,
|
||||
<&clks IMX5_CLK_SDMA_GATE>;
|
||||
<&clks IMX5_CLK_AHB>;
|
||||
clock-names = "ipg", "ahb";
|
||||
#dma-cells = <3>;
|
||||
fsl,sdma-ram-script-name = "imx/sdma/sdma-imx50.bin";
|
||||
|
|
|
@ -481,7 +481,7 @@
|
|||
reg = <0x83fb0000 0x4000>;
|
||||
interrupts = <6>;
|
||||
clocks = <&clks IMX5_CLK_SDMA_GATE>,
|
||||
<&clks IMX5_CLK_SDMA_GATE>;
|
||||
<&clks IMX5_CLK_AHB>;
|
||||
clock-names = "ipg", "ahb";
|
||||
#dma-cells = <3>;
|
||||
fsl,sdma-ram-script-name = "imx/sdma/sdma-imx51.bin";
|
||||
|
|
|
@ -701,7 +701,7 @@
|
|||
reg = <0x63fb0000 0x4000>;
|
||||
interrupts = <6>;
|
||||
clocks = <&clks IMX5_CLK_SDMA_GATE>,
|
||||
<&clks IMX5_CLK_SDMA_GATE>;
|
||||
<&clks IMX5_CLK_AHB>;
|
||||
clock-names = "ipg", "ahb";
|
||||
#dma-cells = <3>;
|
||||
fsl,sdma-ram-script-name = "imx/sdma/sdma-imx53.bin";
|
||||
|
|
|
@ -905,7 +905,7 @@
|
|||
compatible = "fsl,imx6q-sdma", "fsl,imx35-sdma";
|
||||
reg = <0x020ec000 0x4000>;
|
||||
interrupts = <0 2 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clks IMX6QDL_CLK_SDMA>,
|
||||
clocks = <&clks IMX6QDL_CLK_IPG>,
|
||||
<&clks IMX6QDL_CLK_SDMA>;
|
||||
clock-names = "ipg", "ahb";
|
||||
#dma-cells = <3>;
|
||||
|
|
|
@ -739,7 +739,7 @@
|
|||
reg = <0x020ec000 0x4000>;
|
||||
interrupts = <0 2 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clks IMX6SL_CLK_SDMA>,
|
||||
<&clks IMX6SL_CLK_SDMA>;
|
||||
<&clks IMX6SL_CLK_AHB>;
|
||||
clock-names = "ipg", "ahb";
|
||||
#dma-cells = <3>;
|
||||
/* imx6sl reuses imx6q sdma firmware */
|
||||
|
|
|
@ -591,7 +591,7 @@
|
|||
compatible = "fsl,imx6sll-sdma", "fsl,imx35-sdma";
|
||||
reg = <0x020ec000 0x4000>;
|
||||
interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clks IMX6SLL_CLK_SDMA>,
|
||||
clocks = <&clks IMX6SLL_CLK_IPG>,
|
||||
<&clks IMX6SLL_CLK_SDMA>;
|
||||
clock-names = "ipg", "ahb";
|
||||
#dma-cells = <3>;
|
||||
|
|
|
@ -803,7 +803,7 @@
|
|||
compatible = "fsl,imx6sx-sdma", "fsl,imx6q-sdma";
|
||||
reg = <0x020ec000 0x4000>;
|
||||
interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clks IMX6SX_CLK_SDMA>,
|
||||
clocks = <&clks IMX6SX_CLK_IPG>,
|
||||
<&clks IMX6SX_CLK_SDMA>;
|
||||
clock-names = "ipg", "ahb";
|
||||
#dma-cells = <3>;
|
||||
|
|
|
@ -707,7 +707,7 @@
|
|||
"fsl,imx35-sdma";
|
||||
reg = <0x020ec000 0x4000>;
|
||||
interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clks IMX6UL_CLK_SDMA>,
|
||||
clocks = <&clks IMX6UL_CLK_IPG>,
|
||||
<&clks IMX6UL_CLK_SDMA>;
|
||||
clock-names = "ipg", "ahb";
|
||||
#dma-cells = <3>;
|
||||
|
|
|
@ -1050,8 +1050,8 @@
|
|||
compatible = "fsl,imx7d-sdma", "fsl,imx35-sdma";
|
||||
reg = <0x30bd0000 0x10000>;
|
||||
interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clks IMX7D_SDMA_CORE_CLK>,
|
||||
<&clks IMX7D_AHB_CHANNEL_ROOT_CLK>;
|
||||
clocks = <&clks IMX7D_IPG_ROOT_CLK>,
|
||||
<&clks IMX7D_SDMA_CORE_CLK>;
|
||||
clock-names = "ipg", "ahb";
|
||||
#dma-cells = <3>;
|
||||
fsl,sdma-ram-script-name = "imx/sdma/sdma-imx7d.bin";
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
#include <linux/threads.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
/* number of IPIS _not_ including IPI_CPU_BACKTRACE */
|
||||
#define NR_IPI 7
|
||||
|
||||
typedef struct {
|
||||
|
|
|
@ -76,6 +76,10 @@ enum ipi_msg_type {
|
|||
IPI_CPU_STOP,
|
||||
IPI_IRQ_WORK,
|
||||
IPI_COMPLETION,
|
||||
/*
|
||||
* CPU_BACKTRACE is special and not included in NR_IPI
|
||||
* or tracable with trace_ipi_*
|
||||
*/
|
||||
IPI_CPU_BACKTRACE,
|
||||
/*
|
||||
* SGI8-15 can be reserved by secure firmware, and thus may
|
||||
|
@ -818,16 +822,7 @@ core_initcall(register_cpufreq_notifier);
|
|||
|
||||
static void raise_nmi(cpumask_t *mask)
|
||||
{
|
||||
/*
|
||||
* Generate the backtrace directly if we are running in a calling
|
||||
* context that is not preemptible by the backtrace IPI. Note
|
||||
* that nmi_cpu_backtrace() automatically removes the current cpu
|
||||
* from mask.
|
||||
*/
|
||||
if (cpumask_test_cpu(smp_processor_id(), mask) && irqs_disabled())
|
||||
nmi_cpu_backtrace(NULL);
|
||||
|
||||
smp_cross_call_common(mask, IPI_CPU_BACKTRACE);
|
||||
__smp_cross_call(mask, IPI_CPU_BACKTRACE);
|
||||
}
|
||||
|
||||
void arch_trigger_cpumask_backtrace(const cpumask_t *mask, bool exclude_self)
|
||||
|
|
|
@ -434,8 +434,27 @@ static void exynos3250_pm_resume(void)
|
|||
|
||||
static void exynos5420_prepare_pm_resume(void)
|
||||
{
|
||||
unsigned int mpidr, cluster;
|
||||
|
||||
mpidr = read_cpuid_mpidr();
|
||||
cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1);
|
||||
|
||||
if (IS_ENABLED(CONFIG_EXYNOS5420_MCPM))
|
||||
WARN_ON(mcpm_cpu_powered_up());
|
||||
|
||||
if (IS_ENABLED(CONFIG_HW_PERF_EVENTS) && cluster != 0) {
|
||||
/*
|
||||
* When system is resumed on the LITTLE/KFC core (cluster 1),
|
||||
* the DSCR is not properly updated until the power is turned
|
||||
* on also for the cluster 0. Enable it for a while to
|
||||
* propagate the SPNIDEN and SPIDEN signals from Secure JTAG
|
||||
* block and avoid undefined instruction issue on CP14 reset.
|
||||
*/
|
||||
pmu_raw_writel(S5P_CORE_LOCAL_PWR_EN,
|
||||
EXYNOS_COMMON_CONFIGURATION(0));
|
||||
pmu_raw_writel(0,
|
||||
EXYNOS_COMMON_CONFIGURATION(0));
|
||||
}
|
||||
}
|
||||
|
||||
static void exynos5420_pm_resume(void)
|
||||
|
|
|
@ -51,10 +51,12 @@ static int amx3_common_init(void)
|
|||
|
||||
/* CEFUSE domain can be turned off post bootup */
|
||||
cefuse_pwrdm = pwrdm_lookup("cefuse_pwrdm");
|
||||
if (cefuse_pwrdm)
|
||||
omap_set_pwrdm_state(cefuse_pwrdm, PWRDM_POWER_OFF);
|
||||
else
|
||||
if (!cefuse_pwrdm)
|
||||
pr_err("PM: Failed to get cefuse_pwrdm\n");
|
||||
else if (omap_type() != OMAP2_DEVICE_TYPE_GP)
|
||||
pr_info("PM: Leaving EFUSE power domain active\n");
|
||||
else
|
||||
omap_set_pwrdm_state(cefuse_pwrdm, PWRDM_POWER_OFF);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -41,7 +41,19 @@ char *mips_get_machine_name(void)
|
|||
#ifdef CONFIG_USE_OF
|
||||
void __init early_init_dt_add_memory_arch(u64 base, u64 size)
|
||||
{
|
||||
return add_memory_region(base, size, BOOT_MEM_RAM);
|
||||
if (base >= PHYS_ADDR_MAX) {
|
||||
pr_warn("Trying to add an invalid memory region, skipped\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Truncate the passed memory region instead of type casting */
|
||||
if (base + size - 1 >= PHYS_ADDR_MAX || base + size < base) {
|
||||
pr_warn("Truncate memory region %llx @ %llx to size %llx\n",
|
||||
size, base, PHYS_ADDR_MAX - base);
|
||||
size = PHYS_ADDR_MAX - base;
|
||||
}
|
||||
|
||||
add_memory_region(base, size, BOOT_MEM_RAM);
|
||||
}
|
||||
|
||||
int __init early_init_dt_reserve_memory_arch(phys_addr_t base,
|
||||
|
|
|
@ -56,7 +56,7 @@ static int itimer_one_shot(struct clock_event_device *evt)
|
|||
static struct clock_event_device timer_clockevent = {
|
||||
.name = "posix-timer",
|
||||
.rating = 250,
|
||||
.cpumask = cpu_all_mask,
|
||||
.cpumask = cpu_possible_mask,
|
||||
.features = CLOCK_EVT_FEAT_PERIODIC |
|
||||
CLOCK_EVT_FEAT_ONESHOT,
|
||||
.set_state_shutdown = itimer_shutdown,
|
||||
|
|
|
@ -308,6 +308,8 @@ PHONY += vdso_install
|
|||
vdso_install:
|
||||
$(Q)$(MAKE) $(build)=arch/x86/entry/vdso $@
|
||||
|
||||
archprepare: checkbin
|
||||
checkbin:
|
||||
ifdef CONFIG_RETPOLINE
|
||||
ifeq ($(RETPOLINE_CFLAGS),)
|
||||
@echo "You are building kernel with non-retpoline compiler." >&2
|
||||
|
|
|
@ -3072,7 +3072,7 @@ static int intel_pmu_hw_config(struct perf_event *event)
|
|||
return ret;
|
||||
|
||||
if (event->attr.precise_ip) {
|
||||
if (!(event->attr.freq || event->attr.wakeup_events)) {
|
||||
if (!(event->attr.freq || (event->attr.wakeup_events && !event->attr.watermark))) {
|
||||
event->hw.flags |= PERF_X86_EVENT_AUTO_RELOAD;
|
||||
if (!(event->attr.sample_type &
|
||||
~intel_pmu_large_pebs_flags(event)))
|
||||
|
|
|
@ -1119,6 +1119,8 @@ static const struct dmi_system_id pciirq_dmi_table[] __initconst = {
|
|||
|
||||
void __init pcibios_irq_init(void)
|
||||
{
|
||||
struct irq_routing_table *rtable = NULL;
|
||||
|
||||
DBG(KERN_DEBUG "PCI: IRQ init\n");
|
||||
|
||||
if (raw_pci_ops == NULL)
|
||||
|
@ -1129,8 +1131,10 @@ void __init pcibios_irq_init(void)
|
|||
pirq_table = pirq_find_routing_table();
|
||||
|
||||
#ifdef CONFIG_PCI_BIOS
|
||||
if (!pirq_table && (pci_probe & PCI_BIOS_IRQ_SCAN))
|
||||
if (!pirq_table && (pci_probe & PCI_BIOS_IRQ_SCAN)) {
|
||||
pirq_table = pcibios_get_irq_routing_table();
|
||||
rtable = pirq_table;
|
||||
}
|
||||
#endif
|
||||
if (pirq_table) {
|
||||
pirq_peer_trick();
|
||||
|
@ -1145,8 +1149,10 @@ void __init pcibios_irq_init(void)
|
|||
* If we're using the I/O APIC, avoid using the PCI IRQ
|
||||
* routing table
|
||||
*/
|
||||
if (io_apic_assign_pci_irqs)
|
||||
if (io_apic_assign_pci_irqs) {
|
||||
kfree(rtable);
|
||||
pirq_table = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
x86_init.pci.fixup_irqs();
|
||||
|
|
|
@ -2509,6 +2509,8 @@ static void bfq_arm_slice_timer(struct bfq_data *bfqd)
|
|||
if (BFQQ_SEEKY(bfqq) && bfqq->wr_coeff == 1 &&
|
||||
bfq_symmetric_scenario(bfqd))
|
||||
sl = min_t(u64, sl, BFQ_MIN_TT);
|
||||
else if (bfqq->wr_coeff > 1)
|
||||
sl = max_t(u32, sl, 20ULL * NSEC_PER_MSEC);
|
||||
|
||||
bfqd->last_idling_start = ktime_get();
|
||||
hrtimer_start(&bfqd->idle_slice_timer, ns_to_ktime(sl),
|
||||
|
|
|
@ -411,7 +411,6 @@ void blk_sync_queue(struct request_queue *q)
|
|||
struct blk_mq_hw_ctx *hctx;
|
||||
int i;
|
||||
|
||||
cancel_delayed_work_sync(&q->requeue_work);
|
||||
queue_for_each_hw_ctx(q, hctx, i)
|
||||
cancel_delayed_work_sync(&hctx->run_work);
|
||||
} else {
|
||||
|
|
|
@ -2465,6 +2465,8 @@ void blk_mq_release(struct request_queue *q)
|
|||
struct blk_mq_hw_ctx *hctx;
|
||||
unsigned int i;
|
||||
|
||||
cancel_delayed_work_sync(&q->requeue_work);
|
||||
|
||||
/* hctx kobj stays in hctx */
|
||||
queue_for_each_hw_ctx(q, hctx, i) {
|
||||
if (!hctx)
|
||||
|
|
|
@ -3231,6 +3231,7 @@ static void binder_transaction(struct binder_proc *proc,
|
|||
|
||||
if (target_node && target_node->txn_security_ctx) {
|
||||
u32 secid;
|
||||
size_t added_size;
|
||||
|
||||
security_task_getsecid(proc->tsk, &secid);
|
||||
ret = security_secid_to_secctx(secid, &secctx, &secctx_sz);
|
||||
|
@ -3240,7 +3241,15 @@ static void binder_transaction(struct binder_proc *proc,
|
|||
return_error_line = __LINE__;
|
||||
goto err_get_secctx_failed;
|
||||
}
|
||||
extra_buffers_size += ALIGN(secctx_sz, sizeof(u64));
|
||||
added_size = ALIGN(secctx_sz, sizeof(u64));
|
||||
extra_buffers_size += added_size;
|
||||
if (extra_buffers_size < added_size) {
|
||||
/* integer overflow of extra_buffers_size */
|
||||
return_error = BR_FAILED_REPLY;
|
||||
return_error_param = EINVAL;
|
||||
return_error_line = __LINE__;
|
||||
goto err_bad_extra_size;
|
||||
}
|
||||
}
|
||||
|
||||
trace_binder_transaction(reply, t, target_node);
|
||||
|
@ -3589,6 +3598,7 @@ static void binder_transaction(struct binder_proc *proc,
|
|||
t->buffer->transaction = NULL;
|
||||
binder_alloc_free_buf(&target_proc->alloc, t->buffer);
|
||||
err_binder_alloc_buf_failed:
|
||||
err_bad_extra_size:
|
||||
if (secctx)
|
||||
security_release_secctx(secctx, secctx_sz);
|
||||
err_get_secctx_failed:
|
||||
|
|
|
@ -835,6 +835,9 @@ static const int rk3288_saved_cru_reg_ids[] = {
|
|||
RK3288_CLKSEL_CON(10),
|
||||
RK3288_CLKSEL_CON(33),
|
||||
RK3288_CLKSEL_CON(37),
|
||||
|
||||
/* We turn aclk_dmac1 on for suspend; this will restore it */
|
||||
RK3288_CLKGATE_CON(10),
|
||||
};
|
||||
|
||||
static u32 rk3288_saved_cru_regs[ARRAY_SIZE(rk3288_saved_cru_reg_ids)];
|
||||
|
@ -850,6 +853,14 @@ static int rk3288_clk_suspend(void)
|
|||
readl_relaxed(rk3288_cru_base + reg_id);
|
||||
}
|
||||
|
||||
/*
|
||||
* Going into deep sleep (specifically setting PMU_CLR_DMA in
|
||||
* RK3288_PMU_PWRMODE_CON1) appears to fail unless
|
||||
* "aclk_dmac1" is on.
|
||||
*/
|
||||
writel_relaxed(1 << (12 + 16),
|
||||
rk3288_cru_base + RK3288_CLKGATE_CON(10));
|
||||
|
||||
/*
|
||||
* Switch PLLs other than DPLL (for SDRAM) to slow mode to
|
||||
* avoid crashes on resume. The Mask ROM on the system will
|
||||
|
|
|
@ -597,7 +597,7 @@ static int idma64_probe(struct idma64_chip *chip)
|
|||
idma64->dma.directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV);
|
||||
idma64->dma.residue_granularity = DMA_RESIDUE_GRANULARITY_BURST;
|
||||
|
||||
idma64->dma.dev = chip->dev;
|
||||
idma64->dma.dev = chip->sysdev;
|
||||
|
||||
dma_set_max_seg_size(idma64->dma.dev, IDMA64C_CTLH_BLOCK_TS_MASK);
|
||||
|
||||
|
@ -637,6 +637,7 @@ static int idma64_platform_probe(struct platform_device *pdev)
|
|||
{
|
||||
struct idma64_chip *chip;
|
||||
struct device *dev = &pdev->dev;
|
||||
struct device *sysdev = dev->parent;
|
||||
struct resource *mem;
|
||||
int ret;
|
||||
|
||||
|
@ -653,11 +654,12 @@ static int idma64_platform_probe(struct platform_device *pdev)
|
|||
if (IS_ERR(chip->regs))
|
||||
return PTR_ERR(chip->regs);
|
||||
|
||||
ret = dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
|
||||
ret = dma_coerce_mask_and_coherent(sysdev, DMA_BIT_MASK(64));
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
chip->dev = dev;
|
||||
chip->sysdev = sysdev;
|
||||
|
||||
ret = idma64_probe(chip);
|
||||
if (ret)
|
||||
|
|
|
@ -216,12 +216,14 @@ static inline void idma64_writel(struct idma64 *idma64, int offset, u32 value)
|
|||
/**
|
||||
* struct idma64_chip - representation of iDMA 64-bit controller hardware
|
||||
* @dev: struct device of the DMA controller
|
||||
* @sysdev: struct device of the physical device that does DMA
|
||||
* @irq: irq line
|
||||
* @regs: memory mapped I/O space
|
||||
* @idma64: struct idma64 that is filed by idma64_probe()
|
||||
*/
|
||||
struct idma64_chip {
|
||||
struct device *dev;
|
||||
struct device *sysdev;
|
||||
int irq;
|
||||
void __iomem *regs;
|
||||
struct idma64 *idma64;
|
||||
|
|
|
@ -250,8 +250,8 @@ config EDAC_PND2
|
|||
micro-server but may appear on others in the future.
|
||||
|
||||
config EDAC_MPC85XX
|
||||
tristate "Freescale MPC83xx / MPC85xx"
|
||||
depends on FSL_SOC
|
||||
bool "Freescale MPC83xx / MPC85xx"
|
||||
depends on FSL_SOC && EDAC=y
|
||||
help
|
||||
Support for error detection and correction on the Freescale
|
||||
MPC8349, MPC8560, MPC8540, MPC8548, T4240
|
||||
|
|
|
@ -343,6 +343,22 @@ static void omap_clear_gpio_debounce(struct gpio_bank *bank, unsigned offset)
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Off mode wake-up capable GPIOs in bank(s) that are in the wakeup domain.
|
||||
* See TRM section for GPIO for "Wake-Up Generation" for the list of GPIOs
|
||||
* in wakeup domain. If bank->non_wakeup_gpios is not configured, assume none
|
||||
* are capable waking up the system from off mode.
|
||||
*/
|
||||
static bool omap_gpio_is_off_wakeup_capable(struct gpio_bank *bank, u32 gpio_mask)
|
||||
{
|
||||
u32 no_wake = bank->non_wakeup_gpios;
|
||||
|
||||
if (no_wake)
|
||||
return !!(~no_wake & gpio_mask);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline void omap_set_gpio_trigger(struct gpio_bank *bank, int gpio,
|
||||
unsigned trigger)
|
||||
{
|
||||
|
@ -374,13 +390,7 @@ static inline void omap_set_gpio_trigger(struct gpio_bank *bank, int gpio,
|
|||
}
|
||||
|
||||
/* This part needs to be executed always for OMAP{34xx, 44xx} */
|
||||
if (!bank->regs->irqctrl) {
|
||||
/* On omap24xx proceed only when valid GPIO bit is set */
|
||||
if (bank->non_wakeup_gpios) {
|
||||
if (!(bank->non_wakeup_gpios & gpio_bit))
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (!bank->regs->irqctrl && !omap_gpio_is_off_wakeup_capable(bank, gpio)) {
|
||||
/*
|
||||
* Log the edge gpio and manually trigger the IRQ
|
||||
* after resume if the input level changes
|
||||
|
@ -393,7 +403,6 @@ static inline void omap_set_gpio_trigger(struct gpio_bank *bank, int gpio,
|
|||
bank->enabled_non_wakeup_gpios &= ~gpio_bit;
|
||||
}
|
||||
|
||||
exit:
|
||||
bank->level_mask =
|
||||
readl_relaxed(bank->base + bank->regs->leveldetect0) |
|
||||
readl_relaxed(bank->base + bank->regs->leveldetect1);
|
||||
|
|
|
@ -37,6 +37,7 @@ struct fsl_gpio_soc_data {
|
|||
|
||||
struct vf610_gpio_port {
|
||||
struct gpio_chip gc;
|
||||
struct irq_chip ic;
|
||||
void __iomem *base;
|
||||
void __iomem *gpio_base;
|
||||
const struct fsl_gpio_soc_data *sdata;
|
||||
|
@ -66,8 +67,6 @@ struct vf610_gpio_port {
|
|||
#define PORT_INT_EITHER_EDGE 0xb
|
||||
#define PORT_INT_LOGIC_ONE 0xc
|
||||
|
||||
static struct irq_chip vf610_gpio_irq_chip;
|
||||
|
||||
static const struct fsl_gpio_soc_data imx_data = {
|
||||
.have_paddr = true,
|
||||
};
|
||||
|
@ -243,15 +242,6 @@ static int vf610_gpio_irq_set_wake(struct irq_data *d, u32 enable)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static struct irq_chip vf610_gpio_irq_chip = {
|
||||
.name = "gpio-vf610",
|
||||
.irq_ack = vf610_gpio_irq_ack,
|
||||
.irq_mask = vf610_gpio_irq_mask,
|
||||
.irq_unmask = vf610_gpio_irq_unmask,
|
||||
.irq_set_type = vf610_gpio_irq_set_type,
|
||||
.irq_set_wake = vf610_gpio_irq_set_wake,
|
||||
};
|
||||
|
||||
static int vf610_gpio_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
|
@ -259,6 +249,7 @@ static int vf610_gpio_probe(struct platform_device *pdev)
|
|||
struct vf610_gpio_port *port;
|
||||
struct resource *iores;
|
||||
struct gpio_chip *gc;
|
||||
struct irq_chip *ic;
|
||||
int i;
|
||||
int ret;
|
||||
|
||||
|
@ -295,6 +286,14 @@ static int vf610_gpio_probe(struct platform_device *pdev)
|
|||
gc->direction_output = vf610_gpio_direction_output;
|
||||
gc->set = vf610_gpio_set;
|
||||
|
||||
ic = &port->ic;
|
||||
ic->name = "gpio-vf610";
|
||||
ic->irq_ack = vf610_gpio_irq_ack;
|
||||
ic->irq_mask = vf610_gpio_irq_mask;
|
||||
ic->irq_unmask = vf610_gpio_irq_unmask;
|
||||
ic->irq_set_type = vf610_gpio_irq_set_type;
|
||||
ic->irq_set_wake = vf610_gpio_irq_set_wake;
|
||||
|
||||
ret = gpiochip_add_data(gc, port);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
@ -306,14 +305,13 @@ static int vf610_gpio_probe(struct platform_device *pdev)
|
|||
/* Clear the interrupt status register for all GPIO's */
|
||||
vf610_gpio_writel(~0, port->base + PORT_ISFR);
|
||||
|
||||
ret = gpiochip_irqchip_add(gc, &vf610_gpio_irq_chip, 0,
|
||||
handle_edge_irq, IRQ_TYPE_NONE);
|
||||
ret = gpiochip_irqchip_add(gc, ic, 0, handle_edge_irq, IRQ_TYPE_NONE);
|
||||
if (ret) {
|
||||
dev_err(dev, "failed to add irqchip\n");
|
||||
gpiochip_remove(gc);
|
||||
return ret;
|
||||
}
|
||||
gpiochip_set_chained_irqchip(gc, &vf610_gpio_irq_chip, port->irq,
|
||||
gpiochip_set_chained_irqchip(gc, ic, port->irq,
|
||||
vf610_gpio_irq_handler);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -388,6 +388,10 @@ void dpp1_cnv_setup (
|
|||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
/* Set default color space based on format if none is given. */
|
||||
color_space = input_color_space ? input_color_space : color_space;
|
||||
|
||||
REG_SET(CNVC_SURFACE_PIXEL_FORMAT, 0,
|
||||
CNVC_SURFACE_PIXEL_FORMAT, pixel_format);
|
||||
REG_UPDATE(FORMAT_CONTROL, FORMAT_CONTROL__ALPHA_EN, alpha_en);
|
||||
|
@ -399,7 +403,7 @@ void dpp1_cnv_setup (
|
|||
for (i = 0; i < 12; i++)
|
||||
tbl_entry.regval[i] = input_csc_color_matrix.matrix[i];
|
||||
|
||||
tbl_entry.color_space = input_color_space;
|
||||
tbl_entry.color_space = color_space;
|
||||
|
||||
if (color_space >= COLOR_SPACE_YCBCR601)
|
||||
select = INPUT_CSC_SELECT_ICSC;
|
||||
|
|
|
@ -1890,7 +1890,7 @@ static void update_dpp(struct dpp *dpp, struct dc_plane_state *plane_state)
|
|||
plane_state->format,
|
||||
EXPANSION_MODE_ZERO,
|
||||
plane_state->input_csc_color_matrix,
|
||||
COLOR_SPACE_YCBCR601_LIMITED);
|
||||
plane_state->color_space);
|
||||
|
||||
//set scale and bias registers
|
||||
build_prescale_params(&bns_params, plane_state);
|
||||
|
|
|
@ -747,11 +747,11 @@ static void adv7511_mode_set(struct adv7511 *adv7511,
|
|||
vsync_polarity = 1;
|
||||
}
|
||||
|
||||
if (mode->vrefresh <= 24000)
|
||||
if (drm_mode_vrefresh(mode) <= 24)
|
||||
low_refresh_rate = ADV7511_LOW_REFRESH_RATE_24HZ;
|
||||
else if (mode->vrefresh <= 25000)
|
||||
else if (drm_mode_vrefresh(mode) <= 25)
|
||||
low_refresh_rate = ADV7511_LOW_REFRESH_RATE_25HZ;
|
||||
else if (mode->vrefresh <= 30000)
|
||||
else if (drm_mode_vrefresh(mode) <= 30)
|
||||
low_refresh_rate = ADV7511_LOW_REFRESH_RATE_30HZ;
|
||||
else
|
||||
low_refresh_rate = ADV7511_LOW_REFRESH_RATE_NONE;
|
||||
|
|
|
@ -16,21 +16,10 @@ config DRM_NOUVEAU
|
|||
select INPUT if ACPI && X86
|
||||
select THERMAL if ACPI && X86
|
||||
select ACPI_VIDEO if ACPI && X86
|
||||
select DRM_VM
|
||||
help
|
||||
Choose this option for open-source NVIDIA support.
|
||||
|
||||
config NOUVEAU_LEGACY_CTX_SUPPORT
|
||||
bool "Nouveau legacy context support"
|
||||
depends on DRM_NOUVEAU
|
||||
select DRM_VM
|
||||
default y
|
||||
help
|
||||
There was a version of the nouveau DDX that relied on legacy
|
||||
ctx ioctls not erroring out. But that was back in time a long
|
||||
ways, so offer a way to disable it now. For uapi compat with
|
||||
old nouveau ddx this should be on by default, but modern distros
|
||||
should consider turning it off.
|
||||
|
||||
config NOUVEAU_PLATFORM_DRIVER
|
||||
bool "Nouveau (NVIDIA) SoC GPUs"
|
||||
depends on DRM_NOUVEAU && ARCH_TEGRA
|
||||
|
|
|
@ -41,6 +41,7 @@ struct nv50_disp_interlock {
|
|||
NV50_DISP_INTERLOCK__SIZE
|
||||
} type;
|
||||
u32 data;
|
||||
u32 wimm;
|
||||
};
|
||||
|
||||
void corec37d_ntfy_init(struct nouveau_bo *, u32);
|
||||
|
|
|
@ -306,7 +306,7 @@ nv50_head_atomic_check(struct drm_crtc *crtc, struct drm_crtc_state *state)
|
|||
asyh->set.or = head->func->or != NULL;
|
||||
}
|
||||
|
||||
if (asyh->state.mode_changed)
|
||||
if (asyh->state.mode_changed || asyh->state.connectors_changed)
|
||||
nv50_head_atomic_check_mode(head, asyh);
|
||||
|
||||
if (asyh->state.color_mgmt_changed ||
|
||||
|
|
|
@ -75,6 +75,7 @@ wimmc37b_init_(const struct nv50_wimm_func *func, struct nouveau_drm *drm,
|
|||
return ret;
|
||||
}
|
||||
|
||||
wndw->interlock.wimm = wndw->interlock.data;
|
||||
wndw->immd = func;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -151,7 +151,7 @@ nv50_wndw_flush_set(struct nv50_wndw *wndw, u32 *interlock,
|
|||
if (asyw->set.point) {
|
||||
if (asyw->set.point = false, asyw->set.mask)
|
||||
interlock[wndw->interlock.type] |= wndw->interlock.data;
|
||||
interlock[NV50_DISP_INTERLOCK_WIMM] |= wndw->interlock.data;
|
||||
interlock[NV50_DISP_INTERLOCK_WIMM] |= wndw->interlock.wimm;
|
||||
|
||||
wndw->immd->point(wndw, asyw);
|
||||
wndw->immd->update(wndw, interlock);
|
||||
|
|
|
@ -1015,11 +1015,8 @@ nouveau_driver_fops = {
|
|||
static struct drm_driver
|
||||
driver_stub = {
|
||||
.driver_features =
|
||||
DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME | DRIVER_RENDER
|
||||
#if defined(CONFIG_NOUVEAU_LEGACY_CTX_SUPPORT)
|
||||
| DRIVER_KMS_LEGACY_CONTEXT
|
||||
#endif
|
||||
,
|
||||
DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME | DRIVER_RENDER |
|
||||
DRIVER_KMS_LEGACY_CONTEXT,
|
||||
|
||||
.load = nouveau_drm_load,
|
||||
.unload = nouveau_drm_unload,
|
||||
|
|
|
@ -365,8 +365,15 @@ nvkm_dp_train(struct nvkm_dp *dp, u32 dataKBps)
|
|||
* and it's better to have a failed modeset than that.
|
||||
*/
|
||||
for (cfg = nvkm_dp_rates; cfg->rate; cfg++) {
|
||||
if (cfg->nr <= outp_nr && cfg->nr <= outp_bw)
|
||||
failsafe = cfg;
|
||||
if (cfg->nr <= outp_nr && cfg->nr <= outp_bw) {
|
||||
/* Try to respect sink limits too when selecting
|
||||
* lowest link configuration.
|
||||
*/
|
||||
if (!failsafe ||
|
||||
(cfg->nr <= sink_nr && cfg->bw <= sink_bw))
|
||||
failsafe = cfg;
|
||||
}
|
||||
|
||||
if (failsafe && cfg[1].rate < dataKBps)
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -531,14 +531,15 @@ pl111_init_clock_divider(struct drm_device *drm)
|
|||
dev_err(drm->dev, "CLCD: unable to get clcdclk.\n");
|
||||
return PTR_ERR(parent);
|
||||
}
|
||||
|
||||
spin_lock_init(&priv->tim2_lock);
|
||||
|
||||
/* If the clock divider is broken, use the parent directly */
|
||||
if (priv->variant->broken_clockdivider) {
|
||||
priv->clk = parent;
|
||||
return 0;
|
||||
}
|
||||
parent_name = __clk_get_name(parent);
|
||||
|
||||
spin_lock_init(&priv->tim2_lock);
|
||||
div->init = &init;
|
||||
|
||||
ret = devm_clk_hw_register(drm->dev, div);
|
||||
|
|
|
@ -818,6 +818,7 @@ static void vc4_plane_atomic_async_update(struct drm_plane *plane,
|
|||
drm_atomic_set_fb_for_plane(plane->state, state->fb);
|
||||
}
|
||||
|
||||
swap(plane->state->fb, state->fb);
|
||||
/* Set the cursor's position on the screen. This is the
|
||||
* expected change from the drm_mode_cursor_universal()
|
||||
* helper.
|
||||
|
|
|
@ -2414,13 +2414,9 @@ static int arm_smmu_device_reset(struct arm_smmu_device *smmu, bool bypass)
|
|||
/* Clear CR0 and sync (disables SMMU and queue processing) */
|
||||
reg = readl_relaxed(smmu->base + ARM_SMMU_CR0);
|
||||
if (reg & CR0_SMMUEN) {
|
||||
if (is_kdump_kernel()) {
|
||||
arm_smmu_update_gbpa(smmu, GBPA_ABORT, 0);
|
||||
arm_smmu_device_disable(smmu);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
dev_warn(smmu->dev, "SMMU currently enabled! Resetting...\n");
|
||||
WARN_ON(is_kdump_kernel() && !disable_bypass);
|
||||
arm_smmu_update_gbpa(smmu, GBPA_ABORT, 0);
|
||||
}
|
||||
|
||||
ret = arm_smmu_device_disable(smmu);
|
||||
|
@ -2513,6 +2509,8 @@ static int arm_smmu_device_reset(struct arm_smmu_device *smmu, bool bypass)
|
|||
return ret;
|
||||
}
|
||||
|
||||
if (is_kdump_kernel())
|
||||
enables &= ~(CR0_EVTQEN | CR0_PRIQEN);
|
||||
|
||||
/* Enable the SMMU interface, or ensure bypass */
|
||||
if (!bypass || disable_bypass) {
|
||||
|
|
|
@ -4033,9 +4033,7 @@ static void __init init_no_remapping_devices(void)
|
|||
|
||||
/* This IOMMU has *only* gfx devices. Either bypass it or
|
||||
set the gfx_mapped flag, as appropriate */
|
||||
if (dmar_map_gfx) {
|
||||
intel_iommu_gfx_mapped = 1;
|
||||
} else {
|
||||
if (!dmar_map_gfx) {
|
||||
drhd->ignored = 1;
|
||||
for_each_active_dev_scope(drhd->devices,
|
||||
drhd->devices_cnt, i, dev)
|
||||
|
@ -4831,6 +4829,9 @@ int __init intel_iommu_init(void)
|
|||
goto out_free_reserved_range;
|
||||
}
|
||||
|
||||
if (dmar_map_gfx)
|
||||
intel_iommu_gfx_mapped = 1;
|
||||
|
||||
init_no_remapping_devices();
|
||||
|
||||
ret = init_dmars();
|
||||
|
|
|
@ -8,9 +8,9 @@
|
|||
#include <linux/bitfield.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/mailbox_controller.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pm_wakeirq.h>
|
||||
|
||||
|
@ -240,9 +240,11 @@ static int stm32_ipcc_probe(struct platform_device *pdev)
|
|||
|
||||
/* irq */
|
||||
for (i = 0; i < IPCC_IRQ_NUM; i++) {
|
||||
ipcc->irqs[i] = of_irq_get_byname(dev->of_node, irq_name[i]);
|
||||
ipcc->irqs[i] = platform_get_irq_byname(pdev, irq_name[i]);
|
||||
if (ipcc->irqs[i] < 0) {
|
||||
dev_err(dev, "no IRQ specified %s\n", irq_name[i]);
|
||||
if (ipcc->irqs[i] != -EPROBE_DEFER)
|
||||
dev_err(dev, "no IRQ specified %s\n",
|
||||
irq_name[i]);
|
||||
ret = ipcc->irqs[i];
|
||||
goto err_clk;
|
||||
}
|
||||
|
@ -263,9 +265,10 @@ static int stm32_ipcc_probe(struct platform_device *pdev)
|
|||
|
||||
/* wakeup */
|
||||
if (of_property_read_bool(np, "wakeup-source")) {
|
||||
ipcc->wkp = of_irq_get_byname(dev->of_node, "wakeup");
|
||||
ipcc->wkp = platform_get_irq_byname(pdev, "wakeup");
|
||||
if (ipcc->wkp < 0) {
|
||||
dev_err(dev, "could not get wakeup IRQ\n");
|
||||
if (ipcc->wkp != -EPROBE_DEFER)
|
||||
dev_err(dev, "could not get wakeup IRQ\n");
|
||||
ret = ipcc->wkp;
|
||||
goto err_clk;
|
||||
}
|
||||
|
|
|
@ -273,6 +273,9 @@ static void intel_lpss_init_dev(const struct intel_lpss *lpss)
|
|||
{
|
||||
u32 value = LPSS_PRIV_SSP_REG_DIS_DMA_FIN;
|
||||
|
||||
/* Set the device in reset state */
|
||||
writel(0, lpss->priv + LPSS_PRIV_RESETS);
|
||||
|
||||
intel_lpss_deassert_reset(lpss);
|
||||
|
||||
intel_lpss_set_remap_addr(lpss);
|
||||
|
|
|
@ -27,6 +27,7 @@ static const struct of_device_id tps65912_spi_of_match_table[] = {
|
|||
{ .compatible = "ti,tps65912", },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, tps65912_spi_of_match_table);
|
||||
|
||||
static int tps65912_spi_probe(struct spi_device *spi)
|
||||
{
|
||||
|
|
|
@ -322,8 +322,19 @@ int twl6040_power(struct twl6040 *twl6040, int on)
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Register access can produce errors after power-up unless we
|
||||
* wait at least 8ms based on measurements on duovero.
|
||||
*/
|
||||
usleep_range(10000, 12000);
|
||||
|
||||
/* Sync with the HW */
|
||||
regcache_sync(twl6040->regmap);
|
||||
ret = regcache_sync(twl6040->regmap);
|
||||
if (ret) {
|
||||
dev_err(twl6040->dev, "Failed to sync with the HW: %i\n",
|
||||
ret);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Default PLL configuration after power up */
|
||||
twl6040->pll = TWL6040_SYSCLK_SEL_LPPLL;
|
||||
|
|
|
@ -662,6 +662,7 @@ static int pci_endpoint_test_probe(struct pci_dev *pdev,
|
|||
data = (struct pci_endpoint_test_data *)ent->driver_data;
|
||||
if (data) {
|
||||
test_reg_bar = data->test_reg_bar;
|
||||
test->test_reg_bar = test_reg_bar;
|
||||
test->alignment = data->alignment;
|
||||
irq_type = data->irq_type;
|
||||
}
|
||||
|
|
|
@ -1295,9 +1295,10 @@ static irqreturn_t mmci_irq(int irq, void *dev_id)
|
|||
}
|
||||
|
||||
/*
|
||||
* Don't poll for busy completion in irq context.
|
||||
* Busy detection has been handled by mmci_cmd_irq() above.
|
||||
* Clear the status bit to prevent polling in IRQ context.
|
||||
*/
|
||||
if (host->variant->busy_detect && host->busy_status)
|
||||
if (host->variant->busy_detect_flag)
|
||||
status &= ~host->variant->busy_detect_flag;
|
||||
|
||||
ret = 1;
|
||||
|
|
|
@ -4300,8 +4300,11 @@ int hclge_add_uc_addr_common(struct hclge_vport *vport,
|
|||
return hclge_add_mac_vlan_tbl(vport, &req, NULL);
|
||||
|
||||
/* check if we just hit the duplicate */
|
||||
if (!ret)
|
||||
ret = -EINVAL;
|
||||
if (!ret) {
|
||||
dev_warn(&hdev->pdev->dev, "VF %d mac(%pM) exists\n",
|
||||
vport->vport_id, addr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
dev_err(&hdev->pdev->dev,
|
||||
"PF failed to add unicast entry(%pM) in the MAC table\n",
|
||||
|
|
|
@ -6758,10 +6758,12 @@ static int i40e_setup_tc(struct net_device *netdev, void *type_data)
|
|||
struct i40e_pf *pf = vsi->back;
|
||||
u8 enabled_tc = 0, num_tc, hw;
|
||||
bool need_reset = false;
|
||||
int old_queue_pairs;
|
||||
int ret = -EINVAL;
|
||||
u16 mode;
|
||||
int i;
|
||||
|
||||
old_queue_pairs = vsi->num_queue_pairs;
|
||||
num_tc = mqprio_qopt->qopt.num_tc;
|
||||
hw = mqprio_qopt->qopt.hw;
|
||||
mode = mqprio_qopt->mode;
|
||||
|
@ -6862,6 +6864,7 @@ static int i40e_setup_tc(struct net_device *netdev, void *type_data)
|
|||
}
|
||||
ret = i40e_configure_queue_channels(vsi);
|
||||
if (ret) {
|
||||
vsi->num_queue_pairs = old_queue_pairs;
|
||||
netdev_info(netdev,
|
||||
"Failed configuring queue channels\n");
|
||||
need_reset = true;
|
||||
|
|
|
@ -652,6 +652,9 @@ void ice_print_link_msg(struct ice_vsi *vsi, bool isup)
|
|||
case ICE_FC_RX_PAUSE:
|
||||
fc = "RX";
|
||||
break;
|
||||
case ICE_FC_NONE:
|
||||
fc = "None";
|
||||
break;
|
||||
default:
|
||||
fc = "Unknown";
|
||||
break;
|
||||
|
|
|
@ -1285,6 +1285,7 @@ static int __maybe_unused tbnet_suspend(struct device *dev)
|
|||
tbnet_tear_down(net, true);
|
||||
}
|
||||
|
||||
tb_unregister_protocol_handler(&net->handler);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1293,6 +1294,8 @@ static int __maybe_unused tbnet_resume(struct device *dev)
|
|||
struct tb_service *svc = tb_to_service(dev);
|
||||
struct tbnet *net = tb_service_get_drvdata(svc);
|
||||
|
||||
tb_register_protocol_handler(&net->handler);
|
||||
|
||||
netif_carrier_off(net->dev);
|
||||
if (netif_running(net->dev)) {
|
||||
netif_device_attach(net->dev);
|
||||
|
|
|
@ -1132,6 +1132,7 @@ static enum blk_eh_timer_return nvme_timeout(struct request *req, bool reserved)
|
|||
struct nvme_dev *dev = nvmeq->dev;
|
||||
struct request *abort_req;
|
||||
struct nvme_command cmd;
|
||||
bool shutdown = false;
|
||||
u32 csts = readl(dev->bar + NVME_REG_CSTS);
|
||||
|
||||
/* If PCI error recovery process is happening, we cannot reset or
|
||||
|
@ -1168,12 +1169,14 @@ static enum blk_eh_timer_return nvme_timeout(struct request *req, bool reserved)
|
|||
* shutdown, so we return BLK_EH_DONE.
|
||||
*/
|
||||
switch (dev->ctrl.state) {
|
||||
case NVME_CTRL_DELETING:
|
||||
shutdown = true;
|
||||
case NVME_CTRL_CONNECTING:
|
||||
case NVME_CTRL_RESETTING:
|
||||
dev_warn_ratelimited(dev->ctrl.device,
|
||||
"I/O %d QID %d timeout, disable controller\n",
|
||||
req->tag, nvmeq->qid);
|
||||
nvme_dev_disable(dev, false);
|
||||
nvme_dev_disable(dev, shutdown);
|
||||
nvme_req(req)->flags |= NVME_REQ_CANCELLED;
|
||||
return BLK_EH_DONE;
|
||||
default:
|
||||
|
@ -2187,8 +2190,11 @@ static void nvme_dev_disable(struct nvme_dev *dev, bool shutdown)
|
|||
* must flush all entered requests to their failed completion to avoid
|
||||
* deadlocking blk-mq hot-cpu notifier.
|
||||
*/
|
||||
if (shutdown)
|
||||
if (shutdown) {
|
||||
nvme_start_queues(&dev->ctrl);
|
||||
if (dev->ctrl.admin_q && !blk_queue_dying(dev->ctrl.admin_q))
|
||||
blk_mq_unquiesce_queue(dev->ctrl.admin_q);
|
||||
}
|
||||
mutex_unlock(&dev->shutdown_lock);
|
||||
}
|
||||
|
||||
|
|
|
@ -799,7 +799,7 @@ EXPORT_SYMBOL_GPL(nvmem_cell_put);
|
|||
static void nvmem_shift_read_buffer_in_place(struct nvmem_cell *cell, void *buf)
|
||||
{
|
||||
u8 *p, *b;
|
||||
int i, bit_offset = cell->bit_offset;
|
||||
int i, extra, bit_offset = cell->bit_offset;
|
||||
|
||||
p = b = buf;
|
||||
if (bit_offset) {
|
||||
|
@ -814,11 +814,16 @@ static void nvmem_shift_read_buffer_in_place(struct nvmem_cell *cell, void *buf)
|
|||
p = b;
|
||||
*b++ >>= bit_offset;
|
||||
}
|
||||
|
||||
/* result fits in less bytes */
|
||||
if (cell->bytes != DIV_ROUND_UP(cell->nbits, BITS_PER_BYTE))
|
||||
*p-- = 0;
|
||||
} else {
|
||||
/* point to the msb */
|
||||
p += cell->bytes - 1;
|
||||
}
|
||||
|
||||
/* result fits in less bytes */
|
||||
extra = cell->bytes - DIV_ROUND_UP(cell->nbits, BITS_PER_BYTE);
|
||||
while (--extra >= 0)
|
||||
*p-- = 0;
|
||||
|
||||
/* clear msb bits if any leftover in the last byte */
|
||||
*p &= GENMASK((cell->nbits%BITS_PER_BYTE) - 1, 0);
|
||||
}
|
||||
|
|
|
@ -235,8 +235,10 @@ static const struct sunxi_sid_cfg sun50i_a64_cfg = {
|
|||
static const struct of_device_id sunxi_sid_of_match[] = {
|
||||
{ .compatible = "allwinner,sun4i-a10-sid", .data = &sun4i_a10_cfg },
|
||||
{ .compatible = "allwinner,sun7i-a20-sid", .data = &sun7i_a20_cfg },
|
||||
{ .compatible = "allwinner,sun8i-a83t-sid", .data = &sun50i_a64_cfg },
|
||||
{ .compatible = "allwinner,sun8i-h3-sid", .data = &sun8i_h3_cfg },
|
||||
{ .compatible = "allwinner,sun50i-a64-sid", .data = &sun50i_a64_cfg },
|
||||
{ .compatible = "allwinner,sun50i-h5-sid", .data = &sun50i_a64_cfg },
|
||||
{/* sentinel */},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, sunxi_sid_of_match);
|
||||
|
|
|
@ -237,6 +237,7 @@ static void ks_pcie_setup_interrupts(struct keystone_pcie *ks_pcie)
|
|||
ks_dw_pcie_enable_error_irq(ks_pcie);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ARM
|
||||
/*
|
||||
* When a PCI device does not exist during config cycles, keystone host gets a
|
||||
* bus error instead of returning 0xffffffff. This handler always returns 0
|
||||
|
@ -256,6 +257,7 @@ static int keystone_pcie_fault(unsigned long addr, unsigned int fsr,
|
|||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int __init ks_pcie_host_init(struct pcie_port *pp)
|
||||
{
|
||||
|
@ -279,12 +281,14 @@ static int __init ks_pcie_host_init(struct pcie_port *pp)
|
|||
val |= BIT(12);
|
||||
writel(val, pci->dbi_base + PCIE_CAP_BASE + PCI_EXP_DEVCTL);
|
||||
|
||||
#ifdef CONFIG_ARM
|
||||
/*
|
||||
* PCIe access errors that result into OCP errors are caught by ARM as
|
||||
* "External aborts"
|
||||
*/
|
||||
hook_fault_code(17, keystone_pcie_fault, SIGBUS, 0,
|
||||
"Asynchronous external abort");
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -385,6 +385,7 @@ int dw_pcie_ep_raise_msi_irq(struct dw_pcie_ep *ep, u8 func_no,
|
|||
{
|
||||
struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
|
||||
struct pci_epc *epc = ep->epc;
|
||||
unsigned int aligned_offset;
|
||||
u16 msg_ctrl, msg_data;
|
||||
u32 msg_addr_lower, msg_addr_upper, reg;
|
||||
u64 msg_addr;
|
||||
|
@ -410,13 +411,15 @@ int dw_pcie_ep_raise_msi_irq(struct dw_pcie_ep *ep, u8 func_no,
|
|||
reg = ep->msi_cap + PCI_MSI_DATA_32;
|
||||
msg_data = dw_pcie_readw_dbi(pci, reg);
|
||||
}
|
||||
msg_addr = ((u64) msg_addr_upper) << 32 | msg_addr_lower;
|
||||
aligned_offset = msg_addr_lower & (epc->mem->page_size - 1);
|
||||
msg_addr = ((u64)msg_addr_upper) << 32 |
|
||||
(msg_addr_lower & ~aligned_offset);
|
||||
ret = dw_pcie_ep_map_addr(epc, func_no, ep->msi_mem_phys, msg_addr,
|
||||
epc->mem->page_size);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
writel(msg_data | (interrupt_num - 1), ep->msi_mem);
|
||||
writel(msg_data | (interrupt_num - 1), ep->msi_mem + aligned_offset);
|
||||
|
||||
dw_pcie_ep_unmap_addr(epc, func_no, ep->msi_mem_phys);
|
||||
|
||||
|
|
|
@ -303,20 +303,24 @@ void dw_pcie_free_msi(struct pcie_port *pp)
|
|||
|
||||
irq_domain_remove(pp->msi_domain);
|
||||
irq_domain_remove(pp->irq_domain);
|
||||
|
||||
if (pp->msi_page)
|
||||
__free_page(pp->msi_page);
|
||||
}
|
||||
|
||||
void dw_pcie_msi_init(struct pcie_port *pp)
|
||||
{
|
||||
struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
|
||||
struct device *dev = pci->dev;
|
||||
struct page *page;
|
||||
u64 msi_target;
|
||||
|
||||
page = alloc_page(GFP_KERNEL);
|
||||
pp->msi_data = dma_map_page(dev, page, 0, PAGE_SIZE, DMA_FROM_DEVICE);
|
||||
pp->msi_page = alloc_page(GFP_KERNEL);
|
||||
pp->msi_data = dma_map_page(dev, pp->msi_page, 0, PAGE_SIZE,
|
||||
DMA_FROM_DEVICE);
|
||||
if (dma_mapping_error(dev, pp->msi_data)) {
|
||||
dev_err(dev, "Failed to map MSI data\n");
|
||||
__free_page(page);
|
||||
__free_page(pp->msi_page);
|
||||
pp->msi_page = NULL;
|
||||
return;
|
||||
}
|
||||
msi_target = (u64)pp->msi_data;
|
||||
|
@ -439,7 +443,7 @@ int dw_pcie_host_init(struct pcie_port *pp)
|
|||
if (ret)
|
||||
pci->num_viewport = 2;
|
||||
|
||||
if (IS_ENABLED(CONFIG_PCI_MSI) && pci_msi_enabled()) {
|
||||
if (pci_msi_enabled()) {
|
||||
/*
|
||||
* If a specific SoC driver needs to change the
|
||||
* default number of vectors, it needs to implement
|
||||
|
@ -477,7 +481,7 @@ int dw_pcie_host_init(struct pcie_port *pp)
|
|||
if (pp->ops->host_init) {
|
||||
ret = pp->ops->host_init(pp);
|
||||
if (ret)
|
||||
goto error;
|
||||
goto err_free_msi;
|
||||
}
|
||||
|
||||
pp->root_bus_nr = pp->busn->start;
|
||||
|
@ -491,7 +495,7 @@ int dw_pcie_host_init(struct pcie_port *pp)
|
|||
|
||||
ret = pci_scan_root_bus_bridge(bridge);
|
||||
if (ret)
|
||||
goto error;
|
||||
goto err_free_msi;
|
||||
|
||||
bus = bridge->bus;
|
||||
|
||||
|
@ -507,6 +511,9 @@ int dw_pcie_host_init(struct pcie_port *pp)
|
|||
pci_bus_add_devices(bus);
|
||||
return 0;
|
||||
|
||||
err_free_msi:
|
||||
if (pci_msi_enabled() && !pp->ops->msi_host_init)
|
||||
dw_pcie_free_msi(pp);
|
||||
error:
|
||||
pci_free_host_bridge(bridge);
|
||||
return ret;
|
||||
|
|
|
@ -164,6 +164,7 @@ struct pcie_port {
|
|||
struct irq_domain *irq_domain;
|
||||
struct irq_domain *msi_domain;
|
||||
dma_addr_t msi_data;
|
||||
struct page *msi_page;
|
||||
u32 num_vectors;
|
||||
u32 irq_status[MAX_MSI_CTRLS];
|
||||
raw_spinlock_t lock;
|
||||
|
|
|
@ -892,7 +892,7 @@ static int rcar_pcie_enable_msi(struct rcar_pcie *pcie)
|
|||
{
|
||||
struct device *dev = pcie->dev;
|
||||
struct rcar_msi *msi = &pcie->msi;
|
||||
unsigned long base;
|
||||
phys_addr_t base;
|
||||
int err, i;
|
||||
|
||||
mutex_init(&msi->lock);
|
||||
|
@ -931,10 +931,14 @@ static int rcar_pcie_enable_msi(struct rcar_pcie *pcie)
|
|||
|
||||
/* setup MSI data target */
|
||||
msi->pages = __get_free_pages(GFP_KERNEL, 0);
|
||||
if (!msi->pages) {
|
||||
err = -ENOMEM;
|
||||
goto err;
|
||||
}
|
||||
base = virt_to_phys((void *)msi->pages);
|
||||
|
||||
rcar_pci_write_reg(pcie, base | MSIFE, PCIEMSIALR);
|
||||
rcar_pci_write_reg(pcie, 0, PCIEMSIAUR);
|
||||
rcar_pci_write_reg(pcie, lower_32_bits(base) | MSIFE, PCIEMSIALR);
|
||||
rcar_pci_write_reg(pcie, upper_32_bits(base), PCIEMSIAUR);
|
||||
|
||||
/* enable all MSI interrupts */
|
||||
rcar_pci_write_reg(pcie, 0xffffffff, PCIEMSIIER);
|
||||
|
|
|
@ -336,14 +336,19 @@ static const struct irq_domain_ops msi_domain_ops = {
|
|||
* xilinx_pcie_enable_msi - Enable MSI support
|
||||
* @port: PCIe port information
|
||||
*/
|
||||
static void xilinx_pcie_enable_msi(struct xilinx_pcie_port *port)
|
||||
static int xilinx_pcie_enable_msi(struct xilinx_pcie_port *port)
|
||||
{
|
||||
phys_addr_t msg_addr;
|
||||
|
||||
port->msi_pages = __get_free_pages(GFP_KERNEL, 0);
|
||||
if (!port->msi_pages)
|
||||
return -ENOMEM;
|
||||
|
||||
msg_addr = virt_to_phys((void *)port->msi_pages);
|
||||
pcie_write(port, 0x0, XILINX_PCIE_REG_MSIBASE1);
|
||||
pcie_write(port, msg_addr, XILINX_PCIE_REG_MSIBASE2);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* INTx Functions */
|
||||
|
@ -498,6 +503,7 @@ static int xilinx_pcie_init_irq_domain(struct xilinx_pcie_port *port)
|
|||
struct device *dev = port->dev;
|
||||
struct device_node *node = dev->of_node;
|
||||
struct device_node *pcie_intc_node;
|
||||
int ret;
|
||||
|
||||
/* Setup INTx */
|
||||
pcie_intc_node = of_get_next_child(node, NULL);
|
||||
|
@ -526,7 +532,9 @@ static int xilinx_pcie_init_irq_domain(struct xilinx_pcie_port *port)
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
xilinx_pcie_enable_msi(port);
|
||||
ret = xilinx_pcie_enable_msi(port);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -51,6 +51,7 @@ static struct device_node *find_vio_slot_node(char *drc_name)
|
|||
if (rc == 0)
|
||||
break;
|
||||
}
|
||||
of_node_put(parent);
|
||||
|
||||
return dn;
|
||||
}
|
||||
|
@ -71,6 +72,7 @@ static struct device_node *find_php_slot_pci_node(char *drc_name,
|
|||
return np;
|
||||
}
|
||||
|
||||
/* Returns a device_node with its reference count incremented */
|
||||
static struct device_node *find_dlpar_node(char *drc_name, int *node_type)
|
||||
{
|
||||
struct device_node *dn;
|
||||
|
@ -306,6 +308,7 @@ int dlpar_add_slot(char *drc_name)
|
|||
rc = dlpar_add_phb(drc_name, dn);
|
||||
break;
|
||||
}
|
||||
of_node_put(dn);
|
||||
|
||||
printk(KERN_INFO "%s: slot %s added\n", DLPAR_MODULE_NAME, drc_name);
|
||||
exit:
|
||||
|
@ -439,6 +442,7 @@ int dlpar_remove_slot(char *drc_name)
|
|||
rc = dlpar_remove_pci_slot(drc_name, dn);
|
||||
break;
|
||||
}
|
||||
of_node_put(dn);
|
||||
vm_unmap_aliases();
|
||||
|
||||
printk(KERN_INFO "%s: slot %s removed\n", DLPAR_MODULE_NAME, drc_name);
|
||||
|
|
|
@ -1116,7 +1116,8 @@ static int mask_event(struct switchtec_dev *stdev, int eid, int idx)
|
|||
if (!(hdr & SWITCHTEC_EVENT_OCCURRED && hdr & SWITCHTEC_EVENT_EN_IRQ))
|
||||
return 0;
|
||||
|
||||
if (eid == SWITCHTEC_IOCTL_EVENT_LINK_STATE)
|
||||
if (eid == SWITCHTEC_IOCTL_EVENT_LINK_STATE ||
|
||||
eid == SWITCHTEC_IOCTL_EVENT_MRPC_COMP)
|
||||
return 0;
|
||||
|
||||
dev_dbg(&stdev->dev, "%s: %d %d %x\n", __func__, eid, idx, hdr);
|
||||
|
|
|
@ -67,6 +67,17 @@ static int send_command(struct cros_ec_device *ec_dev,
|
|||
else
|
||||
xfer_fxn = ec_dev->cmd_xfer;
|
||||
|
||||
if (!xfer_fxn) {
|
||||
/*
|
||||
* This error can happen if a communication error happened and
|
||||
* the EC is trying to use protocol v2, on an underlying
|
||||
* communication mechanism that does not support v2.
|
||||
*/
|
||||
dev_err_once(ec_dev->dev,
|
||||
"missing EC transfer API, cannot send command\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
ret = (*xfer_fxn)(ec_dev, msg);
|
||||
if (msg->result == EC_RES_IN_PROGRESS) {
|
||||
int i;
|
||||
|
|
|
@ -776,13 +776,17 @@ static int ipc_create_pmc_devices(void)
|
|||
if (ret) {
|
||||
dev_err(ipcdev.dev, "Failed to add punit platform device\n");
|
||||
platform_device_unregister(ipcdev.tco_dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (!ipcdev.telem_res_inval) {
|
||||
ret = ipc_create_telemetry_device();
|
||||
if (ret)
|
||||
if (ret) {
|
||||
dev_warn(ipcdev.dev,
|
||||
"Failed to add telemetry platform device\n");
|
||||
platform_device_unregister(ipcdev.punit_dev);
|
||||
platform_device_unregister(ipcdev.tco_dev);
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -280,6 +280,13 @@ static int max14656_probe(struct i2c_client *client,
|
|||
|
||||
INIT_DELAYED_WORK(&chip->irq_work, max14656_irq_worker);
|
||||
|
||||
chip->detect_psy = devm_power_supply_register(dev,
|
||||
&chip->psy_desc, &psy_cfg);
|
||||
if (IS_ERR(chip->detect_psy)) {
|
||||
dev_err(dev, "power_supply_register failed\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = devm_request_irq(dev, chip->irq, max14656_irq,
|
||||
IRQF_TRIGGER_FALLING,
|
||||
MAX14656_NAME, chip);
|
||||
|
@ -289,13 +296,6 @@ static int max14656_probe(struct i2c_client *client,
|
|||
}
|
||||
enable_irq_wake(chip->irq);
|
||||
|
||||
chip->detect_psy = devm_power_supply_register(dev,
|
||||
&chip->psy_desc, &psy_cfg);
|
||||
if (IS_ERR(chip->detect_psy)) {
|
||||
dev_err(dev, "power_supply_register failed\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
schedule_delayed_work(&chip->irq_work, msecs_to_jiffies(2000));
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -312,10 +312,12 @@ int pwmchip_add_with_polarity(struct pwm_chip *chip,
|
|||
if (IS_ENABLED(CONFIG_OF))
|
||||
of_pwmchip_add(chip);
|
||||
|
||||
pwmchip_sysfs_export(chip);
|
||||
|
||||
out:
|
||||
mutex_unlock(&pwm_lock);
|
||||
|
||||
if (!ret)
|
||||
pwmchip_sysfs_export(chip);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(pwmchip_add_with_polarity);
|
||||
|
@ -349,7 +351,7 @@ int pwmchip_remove(struct pwm_chip *chip)
|
|||
unsigned int i;
|
||||
int ret = 0;
|
||||
|
||||
pwmchip_sysfs_unexport_children(chip);
|
||||
pwmchip_sysfs_unexport(chip);
|
||||
|
||||
mutex_lock(&pwm_lock);
|
||||
|
||||
|
@ -369,8 +371,6 @@ int pwmchip_remove(struct pwm_chip *chip)
|
|||
|
||||
free_pwms(chip);
|
||||
|
||||
pwmchip_sysfs_unexport(chip);
|
||||
|
||||
out:
|
||||
mutex_unlock(&pwm_lock);
|
||||
return ret;
|
||||
|
|
|
@ -111,6 +111,10 @@ struct meson_pwm {
|
|||
const struct meson_pwm_data *data;
|
||||
void __iomem *base;
|
||||
u8 inverter_mask;
|
||||
/*
|
||||
* Protects register (write) access to the REG_MISC_AB register
|
||||
* that is shared between the two PWMs.
|
||||
*/
|
||||
spinlock_t lock;
|
||||
};
|
||||
|
||||
|
@ -235,6 +239,7 @@ static void meson_pwm_enable(struct meson_pwm *meson,
|
|||
{
|
||||
u32 value, clk_shift, clk_enable, enable;
|
||||
unsigned int offset;
|
||||
unsigned long flags;
|
||||
|
||||
switch (id) {
|
||||
case 0:
|
||||
|
@ -255,6 +260,8 @@ static void meson_pwm_enable(struct meson_pwm *meson,
|
|||
return;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&meson->lock, flags);
|
||||
|
||||
value = readl(meson->base + REG_MISC_AB);
|
||||
value &= ~(MISC_CLK_DIV_MASK << clk_shift);
|
||||
value |= channel->pre_div << clk_shift;
|
||||
|
@ -267,11 +274,14 @@ static void meson_pwm_enable(struct meson_pwm *meson,
|
|||
value = readl(meson->base + REG_MISC_AB);
|
||||
value |= enable;
|
||||
writel(value, meson->base + REG_MISC_AB);
|
||||
|
||||
spin_unlock_irqrestore(&meson->lock, flags);
|
||||
}
|
||||
|
||||
static void meson_pwm_disable(struct meson_pwm *meson, unsigned int id)
|
||||
{
|
||||
u32 value, enable;
|
||||
unsigned long flags;
|
||||
|
||||
switch (id) {
|
||||
case 0:
|
||||
|
@ -286,9 +296,13 @@ static void meson_pwm_disable(struct meson_pwm *meson, unsigned int id)
|
|||
return;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&meson->lock, flags);
|
||||
|
||||
value = readl(meson->base + REG_MISC_AB);
|
||||
value &= ~enable;
|
||||
writel(value, meson->base + REG_MISC_AB);
|
||||
|
||||
spin_unlock_irqrestore(&meson->lock, flags);
|
||||
}
|
||||
|
||||
static int meson_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
|
||||
|
@ -296,19 +310,16 @@ static int meson_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
|
|||
{
|
||||
struct meson_pwm_channel *channel = pwm_get_chip_data(pwm);
|
||||
struct meson_pwm *meson = to_meson_pwm(chip);
|
||||
unsigned long flags;
|
||||
int err = 0;
|
||||
|
||||
if (!state)
|
||||
return -EINVAL;
|
||||
|
||||
spin_lock_irqsave(&meson->lock, flags);
|
||||
|
||||
if (!state->enabled) {
|
||||
meson_pwm_disable(meson, pwm->hwpwm);
|
||||
channel->state.enabled = false;
|
||||
|
||||
goto unlock;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (state->period != channel->state.period ||
|
||||
|
@ -329,7 +340,7 @@ static int meson_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
|
|||
err = meson_pwm_calc(meson, channel, pwm->hwpwm,
|
||||
state->duty_cycle, state->period);
|
||||
if (err < 0)
|
||||
goto unlock;
|
||||
return err;
|
||||
|
||||
channel->state.polarity = state->polarity;
|
||||
channel->state.period = state->period;
|
||||
|
@ -341,9 +352,7 @@ static int meson_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
|
|||
channel->state.enabled = true;
|
||||
}
|
||||
|
||||
unlock:
|
||||
spin_unlock_irqrestore(&meson->lock, flags);
|
||||
return err;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void meson_pwm_get_state(struct pwm_chip *chip, struct pwm_device *pwm,
|
||||
|
|
|
@ -382,6 +382,8 @@ static void ehrpwm_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
|
|||
}
|
||||
|
||||
/* Update shadow register first before modifying active register */
|
||||
ehrpwm_modify(pc->mmio_base, AQSFRC, AQSFRC_RLDCSF_MASK,
|
||||
AQSFRC_RLDCSF_ZRO);
|
||||
ehrpwm_modify(pc->mmio_base, AQCSFRC, aqcsfrc_mask, aqcsfrc_val);
|
||||
/*
|
||||
* Changes to immediate action on Action Qualifier. This puts
|
||||
|
|
|
@ -449,19 +449,6 @@ void pwmchip_sysfs_export(struct pwm_chip *chip)
|
|||
}
|
||||
|
||||
void pwmchip_sysfs_unexport(struct pwm_chip *chip)
|
||||
{
|
||||
struct device *parent;
|
||||
|
||||
parent = class_find_device(&pwm_class, NULL, chip,
|
||||
pwmchip_sysfs_match);
|
||||
if (parent) {
|
||||
/* for class_find_device() */
|
||||
put_device(parent);
|
||||
device_unregister(parent);
|
||||
}
|
||||
}
|
||||
|
||||
void pwmchip_sysfs_unexport_children(struct pwm_chip *chip)
|
||||
{
|
||||
struct device *parent;
|
||||
unsigned int i;
|
||||
|
@ -479,6 +466,7 @@ void pwmchip_sysfs_unexport_children(struct pwm_chip *chip)
|
|||
}
|
||||
|
||||
put_device(parent);
|
||||
device_unregister(parent);
|
||||
}
|
||||
|
||||
static int __init pwm_sysfs_init(void)
|
||||
|
|
|
@ -2145,6 +2145,14 @@ static int riocm_add_mport(struct device *dev,
|
|||
mutex_init(&cm->rx_lock);
|
||||
riocm_rx_fill(cm, RIOCM_RX_RING_SIZE);
|
||||
cm->rx_wq = create_workqueue(DRV_NAME "/rxq");
|
||||
if (!cm->rx_wq) {
|
||||
riocm_error("failed to allocate IBMBOX_%d on %s",
|
||||
cmbox, mport->name);
|
||||
rio_release_outb_mbox(mport, cmbox);
|
||||
kfree(cm);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
INIT_WORK(&cm->rx_work, rio_ibmsg_handler);
|
||||
|
||||
cm->tx_slot = 0;
|
||||
|
|
|
@ -3261,6 +3261,8 @@ static void qla24xx_async_gpsc_sp_done(void *s, int res)
|
|||
"Async done-%s res %x, WWPN %8phC \n",
|
||||
sp->name, res, fcport->port_name);
|
||||
|
||||
fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE);
|
||||
|
||||
if (res == QLA_FUNCTION_TIMEOUT)
|
||||
return;
|
||||
|
||||
|
@ -4604,6 +4606,7 @@ int qla24xx_async_gnnid(scsi_qla_host_t *vha, fc_port_t *fcport)
|
|||
|
||||
done_free_sp:
|
||||
sp->free(sp);
|
||||
fcport->flags &= ~FCF_ASYNC_SENT;
|
||||
done:
|
||||
return rval;
|
||||
}
|
||||
|
|
|
@ -1104,7 +1104,7 @@ static bool pwrap_is_pmic_cipher_ready(struct pmic_wrapper *wrp)
|
|||
static int pwrap_init_cipher(struct pmic_wrapper *wrp)
|
||||
{
|
||||
int ret;
|
||||
u32 rdata;
|
||||
u32 rdata = 0;
|
||||
|
||||
pwrap_writel(wrp, 0x1, PWRAP_CIPHER_SWRST);
|
||||
pwrap_writel(wrp, 0x0, PWRAP_CIPHER_SWRST);
|
||||
|
|
|
@ -285,6 +285,9 @@ static int __init renesas_soc_init(void)
|
|||
/* R-Car M3-W ES1.1 incorrectly identifies as ES2.0 */
|
||||
if ((product & 0x7fff) == 0x5210)
|
||||
product ^= 0x11;
|
||||
/* R-Car M3-W ES1.3 incorrectly identifies as ES2.1 */
|
||||
if ((product & 0x7fff) == 0x5211)
|
||||
product ^= 0x12;
|
||||
if (soc->id && ((product >> 8) & 0xff) != soc->id) {
|
||||
pr_warn("SoC mismatch (product = 0x%x)\n", product);
|
||||
return -ENODEV;
|
||||
|
|
|
@ -66,9 +66,11 @@ static const struct rockchip_grf_info rk3228_grf __initconst = {
|
|||
};
|
||||
|
||||
#define RK3288_GRF_SOC_CON0 0x244
|
||||
#define RK3288_GRF_SOC_CON2 0x24c
|
||||
|
||||
static const struct rockchip_grf_value rk3288_defaults[] __initconst = {
|
||||
{ "jtag switching", RK3288_GRF_SOC_CON0, HIWORD_UPDATE(0, 1, 12) },
|
||||
{ "pwm select", RK3288_GRF_SOC_CON2, HIWORD_UPDATE(1, 1, 0) },
|
||||
};
|
||||
|
||||
static const struct rockchip_grf_info rk3288_grf __initconst = {
|
||||
|
|
|
@ -1416,12 +1416,7 @@ static const struct pci_device_id pxa2xx_spi_pci_compound_match[] = {
|
|||
|
||||
static bool pxa2xx_spi_idma_filter(struct dma_chan *chan, void *param)
|
||||
{
|
||||
struct device *dev = param;
|
||||
|
||||
if (dev != chan->device->dev->parent)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
return param == chan->device->dev;
|
||||
}
|
||||
|
||||
static struct pxa2xx_spi_master *
|
||||
|
|
|
@ -171,7 +171,8 @@ static int tsens_probe(struct platform_device *pdev)
|
|||
if (tmdev->ops->calibrate) {
|
||||
ret = tmdev->ops->calibrate(tmdev);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "tsens calibration failed\n");
|
||||
if (ret != -EPROBE_DEFER)
|
||||
dev_err(dev, "tsens calibration failed\n");
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -328,6 +328,9 @@ MODULE_DEVICE_TABLE(of, rcar_gen3_thermal_dt_ids);
|
|||
static int rcar_gen3_thermal_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct rcar_gen3_thermal_priv *priv = dev_get_drvdata(dev);
|
||||
|
||||
rcar_thermal_irq_set(priv, false);
|
||||
|
||||
pm_runtime_put(dev);
|
||||
pm_runtime_disable(dev);
|
||||
|
|
|
@ -365,7 +365,7 @@ static bool dw8250_fallback_dma_filter(struct dma_chan *chan, void *param)
|
|||
|
||||
static bool dw8250_idma_filter(struct dma_chan *chan, void *param)
|
||||
{
|
||||
return param == chan->device->dev->parent;
|
||||
return param == chan->device->dev;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -434,7 +434,7 @@ static void dw8250_quirks(struct uart_port *p, struct dw8250_data *data)
|
|||
data->uart_16550_compatible = true;
|
||||
}
|
||||
|
||||
/* Platforms with iDMA */
|
||||
/* Platforms with iDMA 64-bit */
|
||||
if (platform_get_resource_byname(to_platform_device(p->dev),
|
||||
IORESOURCE_MEM, "lpss_priv")) {
|
||||
data->dma.rx_param = p->dev->parent;
|
||||
|
|
|
@ -641,6 +641,8 @@ static int fusb302_set_toggling(struct fusb302_chip *chip,
|
|||
return ret;
|
||||
chip->intr_togdone = false;
|
||||
} else {
|
||||
/* Datasheet says vconn MUST be off when toggling */
|
||||
WARN(chip->vconn_on, "Vconn is on during toggle start");
|
||||
/* unmask TOGDONE interrupt */
|
||||
ret = fusb302_i2c_clear_bits(chip, FUSB_REG_MASKA,
|
||||
FUSB_REG_MASKA_TOGDONE);
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
#include <linux/uaccess.h>
|
||||
#include <linux/vfio.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/sched/signal.h>
|
||||
|
||||
#define DRIVER_VERSION "0.3"
|
||||
#define DRIVER_AUTHOR "Alex Williamson <alex.williamson@redhat.com>"
|
||||
|
@ -904,30 +905,17 @@ void *vfio_device_data(struct vfio_device *device)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(vfio_device_data);
|
||||
|
||||
/* Given a referenced group, check if it contains the device */
|
||||
static bool vfio_dev_present(struct vfio_group *group, struct device *dev)
|
||||
{
|
||||
struct vfio_device *device;
|
||||
|
||||
device = vfio_group_get_device(group, dev);
|
||||
if (!device)
|
||||
return false;
|
||||
|
||||
vfio_device_put(device);
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Decrement the device reference count and wait for the device to be
|
||||
* removed. Open file descriptors for the device... */
|
||||
void *vfio_del_group_dev(struct device *dev)
|
||||
{
|
||||
DEFINE_WAIT_FUNC(wait, woken_wake_function);
|
||||
struct vfio_device *device = dev_get_drvdata(dev);
|
||||
struct vfio_group *group = device->group;
|
||||
void *device_data = device->device_data;
|
||||
struct vfio_unbound_dev *unbound;
|
||||
unsigned int i = 0;
|
||||
long ret;
|
||||
bool interrupted = false;
|
||||
|
||||
/*
|
||||
|
@ -964,6 +952,8 @@ void *vfio_del_group_dev(struct device *dev)
|
|||
* interval with counter to allow the driver to take escalating
|
||||
* measures to release the device if it has the ability to do so.
|
||||
*/
|
||||
add_wait_queue(&vfio.release_q, &wait);
|
||||
|
||||
do {
|
||||
device = vfio_group_get_device(group, dev);
|
||||
if (!device)
|
||||
|
@ -975,12 +965,10 @@ void *vfio_del_group_dev(struct device *dev)
|
|||
vfio_device_put(device);
|
||||
|
||||
if (interrupted) {
|
||||
ret = wait_event_timeout(vfio.release_q,
|
||||
!vfio_dev_present(group, dev), HZ * 10);
|
||||
wait_woken(&wait, TASK_UNINTERRUPTIBLE, HZ * 10);
|
||||
} else {
|
||||
ret = wait_event_interruptible_timeout(vfio.release_q,
|
||||
!vfio_dev_present(group, dev), HZ * 10);
|
||||
if (ret == -ERESTARTSYS) {
|
||||
wait_woken(&wait, TASK_INTERRUPTIBLE, HZ * 10);
|
||||
if (signal_pending(current)) {
|
||||
interrupted = true;
|
||||
dev_warn(dev,
|
||||
"Device is currently in use, task"
|
||||
|
@ -989,8 +977,10 @@ void *vfio_del_group_dev(struct device *dev)
|
|||
current->comm, task_pid_nr(current));
|
||||
}
|
||||
}
|
||||
} while (ret <= 0);
|
||||
|
||||
} while (1);
|
||||
|
||||
remove_wait_queue(&vfio.release_q, &wait);
|
||||
/*
|
||||
* In order to support multiple devices per group, devices can be
|
||||
* plucked from the group while other devices in the group are still
|
||||
|
|
|
@ -285,6 +285,8 @@ static int hga_card_detect(void)
|
|||
hga_vram_len = 0x08000;
|
||||
|
||||
hga_vram = ioremap(0xb0000, hga_vram_len);
|
||||
if (!hga_vram)
|
||||
goto error;
|
||||
|
||||
if (request_region(0x3b0, 12, "hgafb"))
|
||||
release_io_ports = 1;
|
||||
|
|
|
@ -1516,6 +1516,11 @@ static int imsttfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
info->fix.smem_start = addr;
|
||||
info->screen_base = (__u8 *)ioremap(addr, par->ramdac == IBM ?
|
||||
0x400000 : 0x800000);
|
||||
if (!info->screen_base) {
|
||||
release_mem_region(addr, size);
|
||||
framebuffer_release(info);
|
||||
return -ENOMEM;
|
||||
}
|
||||
info->fix.mmio_start = addr + 0x800000;
|
||||
par->dc_regs = ioremap(addr + 0x800000, 0x1000);
|
||||
par->cmap_regs_phys = addr + 0x840000;
|
||||
|
|
|
@ -1967,6 +1967,7 @@ comment "Watchdog Pretimeout Governors"
|
|||
|
||||
config WATCHDOG_PRETIMEOUT_GOV
|
||||
bool "Enable watchdog pretimeout governors"
|
||||
depends on WATCHDOG_CORE
|
||||
help
|
||||
The option allows to select watchdog pretimeout governors.
|
||||
|
||||
|
|
|
@ -178,8 +178,10 @@ static void __imx2_wdt_set_timeout(struct watchdog_device *wdog,
|
|||
static int imx2_wdt_set_timeout(struct watchdog_device *wdog,
|
||||
unsigned int new_timeout)
|
||||
{
|
||||
__imx2_wdt_set_timeout(wdog, new_timeout);
|
||||
unsigned int actual;
|
||||
|
||||
actual = min(new_timeout, wdog->max_hw_heartbeat_ms * 1000);
|
||||
__imx2_wdt_set_timeout(wdog, actual);
|
||||
wdog->timeout = new_timeout;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1754,12 +1754,19 @@ int configfs_register_group(struct config_group *parent_group,
|
|||
|
||||
inode_lock_nested(d_inode(parent), I_MUTEX_PARENT);
|
||||
ret = create_default_group(parent_group, group);
|
||||
if (!ret) {
|
||||
spin_lock(&configfs_dirent_lock);
|
||||
configfs_dir_set_ready(group->cg_item.ci_dentry->d_fsdata);
|
||||
spin_unlock(&configfs_dirent_lock);
|
||||
}
|
||||
if (ret)
|
||||
goto err_out;
|
||||
|
||||
spin_lock(&configfs_dirent_lock);
|
||||
configfs_dir_set_ready(group->cg_item.ci_dentry->d_fsdata);
|
||||
spin_unlock(&configfs_dirent_lock);
|
||||
inode_unlock(d_inode(parent));
|
||||
return 0;
|
||||
err_out:
|
||||
inode_unlock(d_inode(parent));
|
||||
mutex_lock(&subsys->su_mutex);
|
||||
unlink_group(group);
|
||||
mutex_unlock(&subsys->su_mutex);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(configfs_register_group);
|
||||
|
|
2
fs/dax.c
2
fs/dax.c
|
@ -908,7 +908,7 @@ static void dax_mapping_entry_mkclean(struct address_space *mapping,
|
|||
goto unlock_pmd;
|
||||
|
||||
flush_cache_page(vma, address, pfn);
|
||||
pmd = pmdp_huge_clear_flush(vma, address, pmdp);
|
||||
pmd = pmdp_invalidate(vma, address, pmdp);
|
||||
pmd = pmd_wrprotect(pmd);
|
||||
pmd = pmd_mkclean(pmd);
|
||||
set_pmd_at(vma->vm_mm, address, pmdp, pmd);
|
||||
|
|
|
@ -193,12 +193,17 @@ static int fat_file_release(struct inode *inode, struct file *filp)
|
|||
int fat_file_fsync(struct file *filp, loff_t start, loff_t end, int datasync)
|
||||
{
|
||||
struct inode *inode = filp->f_mapping->host;
|
||||
int res, err;
|
||||
int err;
|
||||
|
||||
err = __generic_file_fsync(filp, start, end, datasync);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
res = generic_file_fsync(filp, start, end, datasync);
|
||||
err = sync_mapping_buffers(MSDOS_SB(inode->i_sb)->fat_inode->i_mapping);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return res ? res : err;
|
||||
return blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL, NULL);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1682,7 +1682,7 @@ static int fuse_retrieve(struct fuse_conn *fc, struct inode *inode,
|
|||
offset = outarg->offset & ~PAGE_MASK;
|
||||
file_size = i_size_read(inode);
|
||||
|
||||
num = outarg->size;
|
||||
num = min(outarg->size, fc->max_write);
|
||||
if (outarg->offset > file_size)
|
||||
num = 0;
|
||||
else if (outarg->offset + num > file_size)
|
||||
|
|
|
@ -2413,8 +2413,10 @@ nfsd4_encode_fattr(struct xdr_stream *xdr, struct svc_fh *fhp,
|
|||
__be32 status;
|
||||
int err;
|
||||
struct nfs4_acl *acl = NULL;
|
||||
#ifdef CONFIG_NFSD_V4_SECURITY_LABEL
|
||||
void *context = NULL;
|
||||
int contextlen;
|
||||
#endif
|
||||
bool contextsupport = false;
|
||||
struct nfsd4_compoundres *resp = rqstp->rq_resp;
|
||||
u32 minorversion = resp->cstate.minorversion;
|
||||
|
@ -2899,12 +2901,14 @@ nfsd4_encode_fattr(struct xdr_stream *xdr, struct svc_fh *fhp,
|
|||
*p++ = cpu_to_be32(NFS4_CHANGE_TYPE_IS_TIME_METADATA);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NFSD_V4_SECURITY_LABEL
|
||||
if (bmval2 & FATTR4_WORD2_SECURITY_LABEL) {
|
||||
status = nfsd4_encode_security_label(xdr, rqstp, context,
|
||||
contextlen);
|
||||
if (status)
|
||||
goto out;
|
||||
}
|
||||
#endif
|
||||
|
||||
attrlen = htonl(xdr->buf->len - attrlen_offset - 4);
|
||||
write_bytes_to_xdr_buf(xdr->buf, attrlen_offset, &attrlen, 4);
|
||||
|
|
|
@ -120,8 +120,11 @@ void nfsd_put_raparams(struct file *file, struct raparms *ra);
|
|||
|
||||
static inline int fh_want_write(struct svc_fh *fh)
|
||||
{
|
||||
int ret = mnt_want_write(fh->fh_export->ex_path.mnt);
|
||||
int ret;
|
||||
|
||||
if (fh->fh_want_write)
|
||||
return 0;
|
||||
ret = mnt_want_write(fh->fh_export->ex_path.mnt);
|
||||
if (!ret)
|
||||
fh->fh_want_write = true;
|
||||
return ret;
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include <linux/mount.h>
|
||||
#include <linux/xattr.h>
|
||||
#include <linux/uio.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include "overlayfs.h"
|
||||
|
||||
static char ovl_whatisit(struct inode *inode, struct inode *realinode)
|
||||
|
@ -29,10 +30,11 @@ static struct file *ovl_open_realfile(const struct file *file,
|
|||
struct inode *inode = file_inode(file);
|
||||
struct file *realfile;
|
||||
const struct cred *old_cred;
|
||||
int flags = file->f_flags | O_NOATIME | FMODE_NONOTIFY;
|
||||
|
||||
old_cred = ovl_override_creds(inode->i_sb);
|
||||
realfile = open_with_fake_path(&file->f_path, file->f_flags | O_NOATIME,
|
||||
realinode, current_cred());
|
||||
realfile = open_with_fake_path(&file->f_path, flags, realinode,
|
||||
current_cred());
|
||||
ovl_revert_creds(old_cred);
|
||||
|
||||
pr_debug("open(%p[%pD2/%c], 0%o) -> (%p, 0%o)\n",
|
||||
|
@ -50,7 +52,7 @@ static int ovl_change_flags(struct file *file, unsigned int flags)
|
|||
int err;
|
||||
|
||||
/* No atime modificaton on underlying */
|
||||
flags |= O_NOATIME;
|
||||
flags |= O_NOATIME | FMODE_NONOTIFY;
|
||||
|
||||
/* If some flag changed that cannot be changed then something's amiss */
|
||||
if (WARN_ON((file->f_flags ^ flags) & ~OVL_SETFL_MASK))
|
||||
|
@ -144,11 +146,47 @@ static int ovl_release(struct inode *inode, struct file *file)
|
|||
|
||||
static loff_t ovl_llseek(struct file *file, loff_t offset, int whence)
|
||||
{
|
||||
struct inode *realinode = ovl_inode_real(file_inode(file));
|
||||
struct inode *inode = file_inode(file);
|
||||
struct fd real;
|
||||
const struct cred *old_cred;
|
||||
ssize_t ret;
|
||||
|
||||
return generic_file_llseek_size(file, offset, whence,
|
||||
realinode->i_sb->s_maxbytes,
|
||||
i_size_read(realinode));
|
||||
/*
|
||||
* The two special cases below do not need to involve real fs,
|
||||
* so we can optimizing concurrent callers.
|
||||
*/
|
||||
if (offset == 0) {
|
||||
if (whence == SEEK_CUR)
|
||||
return file->f_pos;
|
||||
|
||||
if (whence == SEEK_SET)
|
||||
return vfs_setpos(file, 0, 0);
|
||||
}
|
||||
|
||||
ret = ovl_real_fdget(file, &real);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* Overlay file f_pos is the master copy that is preserved
|
||||
* through copy up and modified on read/write, but only real
|
||||
* fs knows how to SEEK_HOLE/SEEK_DATA and real fs may impose
|
||||
* limitations that are more strict than ->s_maxbytes for specific
|
||||
* files, so we use the real file to perform seeks.
|
||||
*/
|
||||
inode_lock(inode);
|
||||
real.file->f_pos = file->f_pos;
|
||||
|
||||
old_cred = ovl_override_creds(inode->i_sb);
|
||||
ret = vfs_llseek(real.file, offset, whence);
|
||||
revert_creds(old_cred);
|
||||
|
||||
file->f_pos = real.file->f_pos;
|
||||
inode_unlock(inode);
|
||||
|
||||
fdput(real);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void ovl_file_accessed(struct file *file)
|
||||
|
@ -371,10 +409,68 @@ static long ovl_real_ioctl(struct file *file, unsigned int cmd,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static long ovl_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
static unsigned int ovl_get_inode_flags(struct inode *inode)
|
||||
{
|
||||
unsigned int flags = READ_ONCE(inode->i_flags);
|
||||
unsigned int ovl_iflags = 0;
|
||||
|
||||
if (flags & S_SYNC)
|
||||
ovl_iflags |= FS_SYNC_FL;
|
||||
if (flags & S_APPEND)
|
||||
ovl_iflags |= FS_APPEND_FL;
|
||||
if (flags & S_IMMUTABLE)
|
||||
ovl_iflags |= FS_IMMUTABLE_FL;
|
||||
if (flags & S_NOATIME)
|
||||
ovl_iflags |= FS_NOATIME_FL;
|
||||
|
||||
return ovl_iflags;
|
||||
}
|
||||
|
||||
static long ovl_ioctl_set_flags(struct file *file, unsigned long arg)
|
||||
{
|
||||
long ret;
|
||||
struct inode *inode = file_inode(file);
|
||||
unsigned int flags;
|
||||
unsigned int old_flags;
|
||||
|
||||
if (!inode_owner_or_capable(inode))
|
||||
return -EACCES;
|
||||
|
||||
if (get_user(flags, (int __user *) arg))
|
||||
return -EFAULT;
|
||||
|
||||
ret = mnt_want_write_file(file);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
inode_lock(inode);
|
||||
|
||||
/* Check the capability before cred override */
|
||||
ret = -EPERM;
|
||||
old_flags = ovl_get_inode_flags(inode);
|
||||
if (((flags ^ old_flags) & (FS_APPEND_FL | FS_IMMUTABLE_FL)) &&
|
||||
!capable(CAP_LINUX_IMMUTABLE))
|
||||
goto unlock;
|
||||
|
||||
ret = ovl_maybe_copy_up(file_dentry(file), O_WRONLY);
|
||||
if (ret)
|
||||
goto unlock;
|
||||
|
||||
ret = ovl_real_ioctl(file, FS_IOC_SETFLAGS, arg);
|
||||
|
||||
ovl_copyflags(ovl_inode_real(inode), inode);
|
||||
unlock:
|
||||
inode_unlock(inode);
|
||||
|
||||
mnt_drop_write_file(file);
|
||||
|
||||
return ret;
|
||||
|
||||
}
|
||||
|
||||
static long ovl_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
long ret;
|
||||
|
||||
switch (cmd) {
|
||||
case FS_IOC_GETFLAGS:
|
||||
|
@ -382,23 +478,7 @@ static long ovl_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
|||
break;
|
||||
|
||||
case FS_IOC_SETFLAGS:
|
||||
if (!inode_owner_or_capable(inode))
|
||||
return -EACCES;
|
||||
|
||||
ret = mnt_want_write_file(file);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = ovl_maybe_copy_up(file_dentry(file), O_WRONLY);
|
||||
if (!ret) {
|
||||
ret = ovl_real_ioctl(file, cmd, arg);
|
||||
|
||||
inode_lock(inode);
|
||||
ovl_copyflags(ovl_inode_real(inode), inode);
|
||||
inode_unlock(inode);
|
||||
}
|
||||
|
||||
mnt_drop_write_file(file);
|
||||
ret = ovl_ioctl_set_flags(file, arg);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
|
@ -774,7 +774,6 @@ static inline void pwm_remove_table(struct pwm_lookup *table, size_t num)
|
|||
#ifdef CONFIG_PWM_SYSFS
|
||||
void pwmchip_sysfs_export(struct pwm_chip *chip);
|
||||
void pwmchip_sysfs_unexport(struct pwm_chip *chip);
|
||||
void pwmchip_sysfs_unexport_children(struct pwm_chip *chip);
|
||||
#else
|
||||
static inline void pwmchip_sysfs_export(struct pwm_chip *chip)
|
||||
{
|
||||
|
@ -783,10 +782,6 @@ static inline void pwmchip_sysfs_export(struct pwm_chip *chip)
|
|||
static inline void pwmchip_sysfs_unexport(struct pwm_chip *chip)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void pwmchip_sysfs_unexport_children(struct pwm_chip *chip)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_PWM_SYSFS */
|
||||
|
||||
#endif /* __LINUX_PWM_H */
|
||||
|
|
|
@ -182,9 +182,6 @@ struct adv_info {
|
|||
|
||||
#define HCI_MAX_SHORT_NAME_LENGTH 10
|
||||
|
||||
/* Min encryption key size to match with SMP */
|
||||
#define HCI_MIN_ENC_KEY_SIZE 7
|
||||
|
||||
/* Default LE RPA expiry time, 15 minutes */
|
||||
#define HCI_DEFAULT_RPA_TIMEOUT (15 * 60)
|
||||
|
||||
|
|
|
@ -599,6 +599,15 @@ config IKCONFIG_PROC
|
|||
This option enables access to the kernel configuration file
|
||||
through /proc/config.gz.
|
||||
|
||||
config IKHEADERS
|
||||
tristate "Enable kernel headers through /sys/kernel/kheaders.tar.xz"
|
||||
depends on SYSFS
|
||||
help
|
||||
This option enables access to the in-kernel headers that are generated during
|
||||
the build process. These can be used to build eBPF tracing programs,
|
||||
or similar programs. If you build the headers as a module, a module called
|
||||
kheaders.ko is built which can be loaded on-demand to get access to headers.
|
||||
|
||||
config LOG_BUF_SHIFT
|
||||
int "Kernel log buffer size (16 => 64KB, 17 => 128KB)"
|
||||
range 12 25
|
||||
|
|
|
@ -632,13 +632,12 @@ static int __init populate_rootfs(void)
|
|||
printk(KERN_INFO "Trying to unpack rootfs image as initramfs...\n");
|
||||
err = unpack_to_rootfs((char *)initrd_start,
|
||||
initrd_end - initrd_start);
|
||||
if (!err) {
|
||||
free_initrd();
|
||||
if (!err)
|
||||
goto done;
|
||||
} else {
|
||||
clean_rootfs();
|
||||
unpack_to_rootfs(__initramfs_start, __initramfs_size);
|
||||
}
|
||||
|
||||
clean_rootfs();
|
||||
unpack_to_rootfs(__initramfs_start, __initramfs_size);
|
||||
|
||||
printk(KERN_INFO "rootfs image is not initramfs (%s)"
|
||||
"; looks like an initrd\n", err);
|
||||
fd = ksys_open("/initrd.image",
|
||||
|
@ -652,7 +651,6 @@ static int __init populate_rootfs(void)
|
|||
written, initrd_end - initrd_start);
|
||||
|
||||
ksys_close(fd);
|
||||
free_initrd();
|
||||
}
|
||||
done:
|
||||
/* empty statement */;
|
||||
|
@ -662,9 +660,9 @@ static int __init populate_rootfs(void)
|
|||
initrd_end - initrd_start);
|
||||
if (err)
|
||||
printk(KERN_EMERG "Initramfs unpacking failed: %s\n", err);
|
||||
free_initrd();
|
||||
#endif
|
||||
}
|
||||
free_initrd();
|
||||
flush_delayed_fput();
|
||||
/*
|
||||
* Try loading default modules from initramfs. This gives
|
||||
|
|
10
ipc/mqueue.c
10
ipc/mqueue.c
|
@ -391,7 +391,8 @@ static void mqueue_evict_inode(struct inode *inode)
|
|||
struct user_struct *user;
|
||||
unsigned long mq_bytes, mq_treesize;
|
||||
struct ipc_namespace *ipc_ns;
|
||||
struct msg_msg *msg;
|
||||
struct msg_msg *msg, *nmsg;
|
||||
LIST_HEAD(tmp_msg);
|
||||
|
||||
clear_inode(inode);
|
||||
|
||||
|
@ -402,10 +403,15 @@ static void mqueue_evict_inode(struct inode *inode)
|
|||
info = MQUEUE_I(inode);
|
||||
spin_lock(&info->lock);
|
||||
while ((msg = msg_get(info)) != NULL)
|
||||
free_msg(msg);
|
||||
list_add_tail(&msg->m_list, &tmp_msg);
|
||||
kfree(info->node_cache);
|
||||
spin_unlock(&info->lock);
|
||||
|
||||
list_for_each_entry_safe(msg, nmsg, &tmp_msg, m_list) {
|
||||
list_del(&msg->m_list);
|
||||
free_msg(msg);
|
||||
}
|
||||
|
||||
/* Total amount of bytes accounted for the mqueue */
|
||||
mq_treesize = info->attr.mq_maxmsg * sizeof(struct msg_msg) +
|
||||
min_t(unsigned int, info->attr.mq_maxmsg, MQ_PRIO_MAX) *
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include <linux/utsname.h>
|
||||
#include <linux/proc_ns.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
#include "util.h"
|
||||
|
||||
|
@ -64,6 +65,9 @@ static struct msg_msg *alloc_msg(size_t len)
|
|||
pseg = &msg->next;
|
||||
while (len > 0) {
|
||||
struct msg_msgseg *seg;
|
||||
|
||||
cond_resched();
|
||||
|
||||
alen = min(len, DATALEN_SEG);
|
||||
seg = kmalloc(sizeof(*seg) + alen, GFP_KERNEL_ACCOUNT);
|
||||
if (seg == NULL)
|
||||
|
@ -176,6 +180,8 @@ void free_msg(struct msg_msg *msg)
|
|||
kfree(msg);
|
||||
while (seg != NULL) {
|
||||
struct msg_msgseg *tmp = seg->next;
|
||||
|
||||
cond_resched();
|
||||
kfree(seg);
|
||||
seg = tmp;
|
||||
}
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue