mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 03:15:31 +09:00
Merge 5.10.111 into android13-5.10-lts
Changes in 5.10.111
ubifs: Rectify space amount budget for mkdir/tmpfile operations
gfs2: Check for active reservation in gfs2_release
gfs2: Fix gfs2_release for non-writers regression
gfs2: gfs2_setattr_size error path fix
rtc: wm8350: Handle error for wm8350_register_irq
KVM: x86/svm: Clear reserved bits written to PerfEvtSeln MSRs
KVM: x86/emulator: Emulate RDPID only if it is enabled in guest
drm: Add orientation quirk for GPD Win Max
ath5k: fix OOB in ath5k_eeprom_read_pcal_info_5111
drm/amd/display: Add signal type check when verify stream backends same
drm/amd/amdgpu/amdgpu_cs: fix refcount leak of a dma_fence obj
usb: gadget: tegra-xudc: Do not program SPARAM
usb: gadget: tegra-xudc: Fix control endpoint's definitions
ptp: replace snprintf with sysfs_emit
powerpc: dts: t104xrdb: fix phy type for FMAN 4/5
ath11k: fix kernel panic during unload/load ath11k modules
ath11k: mhi: use mhi_sync_power_up()
bpf: Make dst_port field in struct bpf_sock 16-bit wide
scsi: mvsas: Replace snprintf() with sysfs_emit()
scsi: bfa: Replace snprintf() with sysfs_emit()
power: supply: axp20x_battery: properly report current when discharging
mt76: dma: initialize skip_unmap in mt76_dma_rx_fill
cfg80211: don't add non transmitted BSS to 6GHz scanned channels
libbpf: Fix build issue with llvm-readelf
ipv6: make mc_forwarding atomic
powerpc: Set crashkernel offset to mid of RMA region
drm/amdgpu: Fix recursive locking warning
PCI: aardvark: Fix support for MSI interrupts
iommu/arm-smmu-v3: fix event handling soft lockup
usb: ehci: add pci device support for Aspeed platforms
PCI: endpoint: Fix alignment fault error in copy tests
tcp: Don't acquire inet_listen_hashbucket::lock with disabled BH.
PCI: pciehp: Add Qualcomm quirk for Command Completed erratum
power: supply: axp288-charger: Set Vhold to 4.4V
iwlwifi: mvm: Correctly set fragmented EBS
ipv4: Invalidate neighbour for broadcast address upon address addition
dm ioctl: prevent potential spectre v1 gadget
dm: requeue IO if mapping table not yet available
drm/amdkfd: make CRAT table missing message informational only
scsi: pm8001: Fix pm80xx_pci_mem_copy() interface
scsi: pm8001: Fix pm8001_mpi_task_abort_resp()
scsi: pm8001: Fix task leak in pm8001_send_abort_all()
scsi: pm8001: Fix tag leaks on error
scsi: pm8001: Fix memory leak in pm8001_chip_fw_flash_update_req()
mt76: mt7615: Fix assigning negative values to unsigned variable
scsi: aha152x: Fix aha152x_setup() __setup handler return value
scsi: hisi_sas: Free irq vectors in order for v3 HW
net/smc: correct settings of RMB window update limit
mips: ralink: fix a refcount leak in ill_acc_of_setup()
macvtap: advertise link netns via netlink
tuntap: add sanity checks about msg_controllen in sendmsg
Bluetooth: Fix not checking for valid hdev on bt_dev_{info,warn,err,dbg}
Bluetooth: use memset avoid memory leaks
bnxt_en: Eliminate unintended link toggle during FW reset
PCI: endpoint: Fix misused goto label
MIPS: fix fortify panic when copying asm exception handlers
powerpc/secvar: fix refcount leak in format_show()
scsi: libfc: Fix use after free in fc_exch_abts_resp()
can: isotp: set default value for N_As to 50 micro seconds
net: account alternate interface name memory
net: limit altnames to 64k total
net: sfp: add 2500base-X quirk for Lantech SFP module
usb: dwc3: omap: fix "unbalanced disables for smps10_out1" on omap5evm
xtensa: fix DTC warning unit_address_format
MIPS: ingenic: correct unit node address
Bluetooth: Fix use after free in hci_send_acl
netlabel: fix out-of-bounds memory accesses
ceph: fix memory leak in ceph_readdir when note_last_dentry returns error
init/main.c: return 1 from handled __setup() functions
minix: fix bug when opening a file with O_DIRECT
clk: si5341: fix reported clk_rate when output divider is 2
staging: vchiq_core: handle NULL result of find_service_by_handle
phy: amlogic: meson8b-usb2: Use dev_err_probe()
staging: wfx: fix an error handling in wfx_init_common()
w1: w1_therm: fixes w1_seq for ds28ea00 sensors
NFSv4.2: fix reference count leaks in _nfs42_proc_copy_notify()
NFSv4: Protect the state recovery thread against direct reclaim
xen: delay xen_hvm_init_time_ops() if kdump is boot on vcpu>=32
clk: ti: Preserve node in ti_dt_clocks_register()
clk: Enforce that disjoints limits are invalid
SUNRPC/call_alloc: async tasks mustn't block waiting for memory
SUNRPC/xprt: async tasks mustn't block waiting for memory
SUNRPC: remove scheduling boost for "SWAPPER" tasks.
NFS: swap IO handling is slightly different for O_DIRECT IO
NFS: swap-out must always use STABLE writes.
x86/Kconfig: Do not allow CONFIG_X86_X32_ABI=y with llvm-objcopy
serial: samsung_tty: do not unlock port->lock for uart_write_wakeup()
virtio_console: eliminate anonymous module_init & module_exit
jfs: prevent NULL deref in diFree
SUNRPC: Fix socket waits for write buffer space
NFS: nfsiod should not block forever in mempool_alloc()
NFS: Avoid writeback threads getting stuck in mempool_alloc()
parisc: Fix CPU affinity for Lasi, WAX and Dino chips
parisc: Fix patch code locking and flushing
mm: fix race between MADV_FREE reclaim and blkdev direct IO read
Revert "hv: utils: add PTP_1588_CLOCK to Kconfig to fix build"
drm/amdgpu: fix off by one in amdgpu_gfx_kiq_acquire()
Drivers: hv: vmbus: Fix potential crash on module unload
Revert "NFSv4: Handle the special Linux file open access mode"
NFSv4: fix open failure with O_ACCMODE flag
scsi: zorro7xx: Fix a resource leak in zorro7xx_remove_one()
net/tls: fix slab-out-of-bounds bug in decrypt_internal
ice: Clear default forwarding VSI during VSI release
net: ipv4: fix route with nexthop object delete warning
net: stmmac: Fix unset max_speed difference between DT and non-DT platforms
drm/imx: imx-ldb: Check for null pointer after calling kmemdup
drm/imx: Fix memory leak in imx_pd_connector_get_modes
bnxt_en: reserve space inside receive page for skb_shared_info
sfc: Do not free an empty page_ring
RDMA/mlx5: Don't remove cache MRs when a delay is needed
IB/rdmavt: add lock to call to rvt_error_qp to prevent a race condition
dpaa2-ptp: Fix refcount leak in dpaa2_ptp_probe
ice: Set txq_teid to ICE_INVAL_TEID on ring creation
ice: Do not skip not enabled queues in ice_vc_dis_qs_msg
ipv6: Fix stats accounting in ip6_pkt_drop
ice: synchronize_rcu() when terminating rings
net: openvswitch: don't send internal clone attribute to the userspace.
net: openvswitch: fix leak of nested actions
rxrpc: fix a race in rxrpc_exit_net()
net: phy: mscc-miim: reject clause 45 register accesses
qede: confirm skb is allocated before using
spi: bcm-qspi: fix MSPI only access with bcm_qspi_exec_mem_op()
bpf: Support dual-stack sockets in bpf_tcp_check_syncookie
drbd: Fix five use after free bugs in get_initial_state
io_uring: don't touch scm_fp_list after queueing skb
SUNRPC: Handle ENOMEM in call_transmit_status()
SUNRPC: Handle low memory situations in call_status()
SUNRPC: svc_tcp_sendmsg() should handle errors from xdr_alloc_bvec()
iommu/omap: Fix regression in probe for NULL pointer dereference
perf: arm-spe: Fix perf report --mem-mode
perf tools: Fix perf's libperf_print callback
perf session: Remap buf if there is no space for event
arm64: Add part number for Arm Cortex-A78AE
Revert "mmc: sdhci-xenon: fix annoying 1.8V regulator warning"
mmc: mmci: stm32: correctly check all elements of sg list
mmc: renesas_sdhi: don't overwrite TAP settings when HS400 tuning is complete
lz4: fix LZ4_decompress_safe_partial read out of bound
mmmremap.c: avoid pointless invalidate_range_start/end on mremap(old_size=0)
mm/mempolicy: fix mpol_new leak in shared_policy_replace
io_uring: fix race between timeout flush and removal
x86/pm: Save the MSR validity status at context setup
x86/speculation: Restore speculation related MSRs during S3 resume
btrfs: fix qgroup reserve overflow the qgroup limit
btrfs: prevent subvol with swapfile from being deleted
arm64: patch_text: Fixup last cpu should be master
RDMA/hfi1: Fix use-after-free bug for mm struct
gpio: Restrict usage of GPIO chip irq members before initialization
ata: sata_dwc_460ex: Fix crash due to OOB write
perf: qcom_l2_pmu: fix an incorrect NULL check on list iterator
irqchip/gic-v3: Fix GICR_CTLR.RWP polling
drm/amdgpu/smu10: fix SoC/fclk units in auto mode
drm/nouveau/pmu: Add missing callbacks for Tegra devices
drm/amdkfd: Create file descriptor after client is added to smi_clients list
perf build: Don't use -ffat-lto-objects in the python feature test when building with clang-13
perf python: Fix probing for some clang command line options
tools build: Filter out options and warnings not supported by clang
tools build: Use $(shell ) instead of `` to get embedded libperl's ccopts
dmaengine: Revert "dmaengine: shdma: Fix runtime PM imbalance on error"
ubsan: remove CONFIG_UBSAN_OBJECT_SIZE
mm: don't skip swap entry even if zap_details specified
cgroup: Use open-time credentials for process migraton perm checks
selftests/cgroup: Fix build on older distros
selftests: cgroup: Make cg_create() use 0755 for permission instead of 0644
selftests: cgroup: Test open-time credential usage for migration checks
selftests: cgroup: Test open-time cgroup namespace usage for migration checks
arm64: module: remove (NOLOAD) from linker script
Drivers: hv: vmbus: Replace smp_store_mb() with virt_store_mb()
irqchip/gic, gic-v3: Prevent GSI to SGI translations
mm/sparsemem: fix 'mem_section' will never be NULL gcc 12 warning
powerpc: Fix virt_addr_valid() for 64-bit Book3E & 32-bit
Linux 5.10.111
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Change-Id: I13be62e58dc6406f6a55e1530a771b2f690e09a7
This commit is contained in:
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
VERSION = 5
|
VERSION = 5
|
||||||
PATCHLEVEL = 10
|
PATCHLEVEL = 10
|
||||||
SUBLEVEL = 110
|
SUBLEVEL = 111
|
||||||
EXTRAVERSION =
|
EXTRAVERSION =
|
||||||
NAME = Dare mighty things
|
NAME = Dare mighty things
|
||||||
|
|
||||||
|
|||||||
@@ -75,6 +75,7 @@
|
|||||||
#define ARM_CPU_PART_CORTEX_A77 0xD0D
|
#define ARM_CPU_PART_CORTEX_A77 0xD0D
|
||||||
#define ARM_CPU_PART_NEOVERSE_V1 0xD40
|
#define ARM_CPU_PART_NEOVERSE_V1 0xD40
|
||||||
#define ARM_CPU_PART_CORTEX_A78 0xD41
|
#define ARM_CPU_PART_CORTEX_A78 0xD41
|
||||||
|
#define ARM_CPU_PART_CORTEX_A78AE 0xD42
|
||||||
#define ARM_CPU_PART_CORTEX_X1 0xD44
|
#define ARM_CPU_PART_CORTEX_X1 0xD44
|
||||||
#define ARM_CPU_PART_CORTEX_A510 0xD46
|
#define ARM_CPU_PART_CORTEX_A510 0xD46
|
||||||
#define ARM_CPU_PART_CORTEX_A710 0xD47
|
#define ARM_CPU_PART_CORTEX_A710 0xD47
|
||||||
@@ -123,6 +124,7 @@
|
|||||||
#define MIDR_CORTEX_A77 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A77)
|
#define MIDR_CORTEX_A77 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A77)
|
||||||
#define MIDR_NEOVERSE_V1 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_NEOVERSE_V1)
|
#define MIDR_NEOVERSE_V1 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_NEOVERSE_V1)
|
||||||
#define MIDR_CORTEX_A78 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A78)
|
#define MIDR_CORTEX_A78 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A78)
|
||||||
|
#define MIDR_CORTEX_A78AE MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A78AE)
|
||||||
#define MIDR_CORTEX_X1 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_X1)
|
#define MIDR_CORTEX_X1 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_X1)
|
||||||
#define MIDR_CORTEX_A510 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A510)
|
#define MIDR_CORTEX_A510 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A510)
|
||||||
#define MIDR_CORTEX_A710 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A710)
|
#define MIDR_CORTEX_A710 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A710)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
SECTIONS {
|
SECTIONS {
|
||||||
#ifdef CONFIG_ARM64_MODULE_PLTS
|
#ifdef CONFIG_ARM64_MODULE_PLTS
|
||||||
.plt 0 (NOLOAD) : { BYTE(0) }
|
.plt 0 : { BYTE(0) }
|
||||||
.init.plt 0 (NOLOAD) : { BYTE(0) }
|
.init.plt 0 : { BYTE(0) }
|
||||||
.text.ftrace_trampoline 0 (NOLOAD) : { BYTE(0) }
|
.text.ftrace_trampoline 0 : { BYTE(0) }
|
||||||
|
|
||||||
#ifdef CONFIG_CRYPTO_FIPS140
|
#ifdef CONFIG_CRYPTO_FIPS140
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -216,8 +216,8 @@ static int __kprobes aarch64_insn_patch_text_cb(void *arg)
|
|||||||
int i, ret = 0;
|
int i, ret = 0;
|
||||||
struct aarch64_insn_patch *pp = arg;
|
struct aarch64_insn_patch *pp = arg;
|
||||||
|
|
||||||
/* The first CPU becomes master */
|
/* The last CPU becomes master */
|
||||||
if (atomic_inc_return(&pp->cpu_count) == 1) {
|
if (atomic_inc_return(&pp->cpu_count) == num_online_cpus()) {
|
||||||
for (i = 0; ret == 0 && i < pp->insn_cnt; i++)
|
for (i = 0; ret == 0 && i < pp->insn_cnt; i++)
|
||||||
ret = aarch64_insn_patch_text_nosync(pp->text_addrs[i],
|
ret = aarch64_insn_patch_text_nosync(pp->text_addrs[i],
|
||||||
pp->new_insns[i]);
|
pp->new_insns[i]);
|
||||||
|
|||||||
@@ -850,6 +850,7 @@ u8 spectre_bhb_loop_affected(int scope)
|
|||||||
if (scope == SCOPE_LOCAL_CPU) {
|
if (scope == SCOPE_LOCAL_CPU) {
|
||||||
static const struct midr_range spectre_bhb_k32_list[] = {
|
static const struct midr_range spectre_bhb_k32_list[] = {
|
||||||
MIDR_ALL_VERSIONS(MIDR_CORTEX_A78),
|
MIDR_ALL_VERSIONS(MIDR_CORTEX_A78),
|
||||||
|
MIDR_ALL_VERSIONS(MIDR_CORTEX_A78AE),
|
||||||
MIDR_ALL_VERSIONS(MIDR_CORTEX_A78C),
|
MIDR_ALL_VERSIONS(MIDR_CORTEX_A78C),
|
||||||
MIDR_ALL_VERSIONS(MIDR_CORTEX_X1),
|
MIDR_ALL_VERSIONS(MIDR_CORTEX_X1),
|
||||||
MIDR_ALL_VERSIONS(MIDR_CORTEX_A710),
|
MIDR_ALL_VERSIONS(MIDR_CORTEX_A710),
|
||||||
|
|||||||
@@ -429,7 +429,7 @@
|
|||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
|
|
||||||
eth0_addr: eth-mac-addr@0x22 {
|
eth0_addr: eth-mac-addr@22 {
|
||||||
reg = <0x22 0x6>;
|
reg = <0x22 0x6>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ static inline void setup_8250_early_printk_port(unsigned long base,
|
|||||||
unsigned int reg_shift, unsigned int timeout) {}
|
unsigned int reg_shift, unsigned int timeout) {}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern void set_handler(unsigned long offset, void *addr, unsigned long len);
|
void set_handler(unsigned long offset, const void *addr, unsigned long len);
|
||||||
extern void set_uncached_handler(unsigned long offset, void *addr, unsigned long len);
|
extern void set_uncached_handler(unsigned long offset, void *addr, unsigned long len);
|
||||||
|
|
||||||
typedef void (*vi_handler_t)(void);
|
typedef void (*vi_handler_t)(void);
|
||||||
|
|||||||
@@ -2097,19 +2097,19 @@ static void *set_vi_srs_handler(int n, vi_handler_t addr, int srs)
|
|||||||
* If no shadow set is selected then use the default handler
|
* If no shadow set is selected then use the default handler
|
||||||
* that does normal register saving and standard interrupt exit
|
* that does normal register saving and standard interrupt exit
|
||||||
*/
|
*/
|
||||||
extern char except_vec_vi, except_vec_vi_lui;
|
extern const u8 except_vec_vi[], except_vec_vi_lui[];
|
||||||
extern char except_vec_vi_ori, except_vec_vi_end;
|
extern const u8 except_vec_vi_ori[], except_vec_vi_end[];
|
||||||
extern char rollback_except_vec_vi;
|
extern const u8 rollback_except_vec_vi[];
|
||||||
char *vec_start = using_rollback_handler() ?
|
const u8 *vec_start = using_rollback_handler() ?
|
||||||
&rollback_except_vec_vi : &except_vec_vi;
|
rollback_except_vec_vi : except_vec_vi;
|
||||||
#if defined(CONFIG_CPU_MICROMIPS) || defined(CONFIG_CPU_BIG_ENDIAN)
|
#if defined(CONFIG_CPU_MICROMIPS) || defined(CONFIG_CPU_BIG_ENDIAN)
|
||||||
const int lui_offset = &except_vec_vi_lui - vec_start + 2;
|
const int lui_offset = except_vec_vi_lui - vec_start + 2;
|
||||||
const int ori_offset = &except_vec_vi_ori - vec_start + 2;
|
const int ori_offset = except_vec_vi_ori - vec_start + 2;
|
||||||
#else
|
#else
|
||||||
const int lui_offset = &except_vec_vi_lui - vec_start;
|
const int lui_offset = except_vec_vi_lui - vec_start;
|
||||||
const int ori_offset = &except_vec_vi_ori - vec_start;
|
const int ori_offset = except_vec_vi_ori - vec_start;
|
||||||
#endif
|
#endif
|
||||||
const int handler_len = &except_vec_vi_end - vec_start;
|
const int handler_len = except_vec_vi_end - vec_start;
|
||||||
|
|
||||||
if (handler_len > VECTORSPACING) {
|
if (handler_len > VECTORSPACING) {
|
||||||
/*
|
/*
|
||||||
@@ -2317,7 +2317,7 @@ void per_cpu_trap_init(bool is_boot_cpu)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Install CPU exception handler */
|
/* Install CPU exception handler */
|
||||||
void set_handler(unsigned long offset, void *addr, unsigned long size)
|
void set_handler(unsigned long offset, const void *addr, unsigned long size)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_CPU_MICROMIPS
|
#ifdef CONFIG_CPU_MICROMIPS
|
||||||
memcpy((void *)(ebase + offset), ((unsigned char *)addr - 1), size);
|
memcpy((void *)(ebase + offset), ((unsigned char *)addr - 1), size);
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ static int __init ill_acc_of_setup(void)
|
|||||||
pdev = of_find_device_by_node(np);
|
pdev = of_find_device_by_node(np);
|
||||||
if (!pdev) {
|
if (!pdev) {
|
||||||
pr_err("%pOFn: failed to lookup pdev\n", np);
|
pr_err("%pOFn: failed to lookup pdev\n", np);
|
||||||
|
of_node_put(np);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,10 +40,7 @@ static void __kprobes *patch_map(void *addr, int fixmap, unsigned long *flags,
|
|||||||
|
|
||||||
*need_unmap = 1;
|
*need_unmap = 1;
|
||||||
set_fixmap(fixmap, page_to_phys(page));
|
set_fixmap(fixmap, page_to_phys(page));
|
||||||
if (flags)
|
raw_spin_lock_irqsave(&patch_lock, *flags);
|
||||||
raw_spin_lock_irqsave(&patch_lock, *flags);
|
|
||||||
else
|
|
||||||
__acquire(&patch_lock);
|
|
||||||
|
|
||||||
return (void *) (__fix_to_virt(fixmap) + (uintaddr & ~PAGE_MASK));
|
return (void *) (__fix_to_virt(fixmap) + (uintaddr & ~PAGE_MASK));
|
||||||
}
|
}
|
||||||
@@ -52,10 +49,7 @@ static void __kprobes patch_unmap(int fixmap, unsigned long *flags)
|
|||||||
{
|
{
|
||||||
clear_fixmap(fixmap);
|
clear_fixmap(fixmap);
|
||||||
|
|
||||||
if (flags)
|
raw_spin_unlock_irqrestore(&patch_lock, *flags);
|
||||||
raw_spin_unlock_irqrestore(&patch_lock, *flags);
|
|
||||||
else
|
|
||||||
__release(&patch_lock);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void __kprobes __patch_text_multiple(void *addr, u32 *insn, unsigned int len)
|
void __kprobes __patch_text_multiple(void *addr, u32 *insn, unsigned int len)
|
||||||
@@ -67,8 +61,9 @@ void __kprobes __patch_text_multiple(void *addr, u32 *insn, unsigned int len)
|
|||||||
int mapped;
|
int mapped;
|
||||||
|
|
||||||
/* Make sure we don't have any aliases in cache */
|
/* Make sure we don't have any aliases in cache */
|
||||||
flush_kernel_vmap_range(addr, len);
|
flush_kernel_dcache_range_asm(start, end);
|
||||||
flush_icache_range(start, end);
|
flush_kernel_icache_range_asm(start, end);
|
||||||
|
flush_tlb_kernel_range(start, end);
|
||||||
|
|
||||||
p = fixmap = patch_map(addr, FIX_TEXT_POKE0, &flags, &mapped);
|
p = fixmap = patch_map(addr, FIX_TEXT_POKE0, &flags, &mapped);
|
||||||
|
|
||||||
@@ -81,8 +76,10 @@ void __kprobes __patch_text_multiple(void *addr, u32 *insn, unsigned int len)
|
|||||||
* We're crossing a page boundary, so
|
* We're crossing a page boundary, so
|
||||||
* need to remap
|
* need to remap
|
||||||
*/
|
*/
|
||||||
flush_kernel_vmap_range((void *)fixmap,
|
flush_kernel_dcache_range_asm((unsigned long)fixmap,
|
||||||
(p-fixmap) * sizeof(*p));
|
(unsigned long)p);
|
||||||
|
flush_tlb_kernel_range((unsigned long)fixmap,
|
||||||
|
(unsigned long)p);
|
||||||
if (mapped)
|
if (mapped)
|
||||||
patch_unmap(FIX_TEXT_POKE0, &flags);
|
patch_unmap(FIX_TEXT_POKE0, &flags);
|
||||||
p = fixmap = patch_map(addr, FIX_TEXT_POKE0, &flags,
|
p = fixmap = patch_map(addr, FIX_TEXT_POKE0, &flags,
|
||||||
@@ -90,10 +87,10 @@ void __kprobes __patch_text_multiple(void *addr, u32 *insn, unsigned int len)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
flush_kernel_vmap_range((void *)fixmap, (p-fixmap) * sizeof(*p));
|
flush_kernel_dcache_range_asm((unsigned long)fixmap, (unsigned long)p);
|
||||||
|
flush_tlb_kernel_range((unsigned long)fixmap, (unsigned long)p);
|
||||||
if (mapped)
|
if (mapped)
|
||||||
patch_unmap(FIX_TEXT_POKE0, &flags);
|
patch_unmap(FIX_TEXT_POKE0, &flags);
|
||||||
flush_icache_range(start, end);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void __kprobes __patch_text(void *addr, u32 insn)
|
void __kprobes __patch_text(void *addr, u32 insn)
|
||||||
|
|||||||
@@ -139,12 +139,12 @@
|
|||||||
fman@400000 {
|
fman@400000 {
|
||||||
ethernet@e6000 {
|
ethernet@e6000 {
|
||||||
phy-handle = <&phy_rgmii_0>;
|
phy-handle = <&phy_rgmii_0>;
|
||||||
phy-connection-type = "rgmii";
|
phy-connection-type = "rgmii-id";
|
||||||
};
|
};
|
||||||
|
|
||||||
ethernet@e8000 {
|
ethernet@e8000 {
|
||||||
phy-handle = <&phy_rgmii_1>;
|
phy-handle = <&phy_rgmii_1>;
|
||||||
phy-connection-type = "rgmii";
|
phy-connection-type = "rgmii-id";
|
||||||
};
|
};
|
||||||
|
|
||||||
mdio0: mdio@fc000 {
|
mdio0: mdio@fc000 {
|
||||||
|
|||||||
@@ -132,7 +132,11 @@ static inline bool pfn_valid(unsigned long pfn)
|
|||||||
#define virt_to_page(kaddr) pfn_to_page(virt_to_pfn(kaddr))
|
#define virt_to_page(kaddr) pfn_to_page(virt_to_pfn(kaddr))
|
||||||
#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT)
|
#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT)
|
||||||
|
|
||||||
#define virt_addr_valid(kaddr) pfn_valid(virt_to_pfn(kaddr))
|
#define virt_addr_valid(vaddr) ({ \
|
||||||
|
unsigned long _addr = (unsigned long)vaddr; \
|
||||||
|
_addr >= PAGE_OFFSET && _addr < (unsigned long)high_memory && \
|
||||||
|
pfn_valid(virt_to_pfn(_addr)); \
|
||||||
|
})
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* On Book-E parts we need __va to parse the device tree and we can't
|
* On Book-E parts we need __va to parse the device tree and we can't
|
||||||
|
|||||||
@@ -1296,6 +1296,12 @@ int __init early_init_dt_scan_rtas(unsigned long node,
|
|||||||
entryp = of_get_flat_dt_prop(node, "linux,rtas-entry", NULL);
|
entryp = of_get_flat_dt_prop(node, "linux,rtas-entry", NULL);
|
||||||
sizep = of_get_flat_dt_prop(node, "rtas-size", NULL);
|
sizep = of_get_flat_dt_prop(node, "rtas-size", NULL);
|
||||||
|
|
||||||
|
#ifdef CONFIG_PPC64
|
||||||
|
/* need this feature to decide the crashkernel offset */
|
||||||
|
if (of_get_flat_dt_prop(node, "ibm,hypertas-functions", NULL))
|
||||||
|
powerpc_firmware_features |= FW_FEATURE_LPAR;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (basep && entryp && sizep) {
|
if (basep && entryp && sizep) {
|
||||||
rtas.base = *basep;
|
rtas.base = *basep;
|
||||||
rtas.entry = *entryp;
|
rtas.entry = *entryp;
|
||||||
|
|||||||
@@ -26,15 +26,18 @@ static ssize_t format_show(struct kobject *kobj, struct kobj_attribute *attr,
|
|||||||
const char *format;
|
const char *format;
|
||||||
|
|
||||||
node = of_find_compatible_node(NULL, NULL, "ibm,secvar-backend");
|
node = of_find_compatible_node(NULL, NULL, "ibm,secvar-backend");
|
||||||
if (!of_device_is_available(node))
|
if (!of_device_is_available(node)) {
|
||||||
return -ENODEV;
|
rc = -ENODEV;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
rc = of_property_read_string(node, "format", &format);
|
rc = of_property_read_string(node, "format", &format);
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
goto out;
|
||||||
|
|
||||||
rc = sprintf(buf, "%s\n", format);
|
rc = sprintf(buf, "%s\n", format);
|
||||||
|
|
||||||
|
out:
|
||||||
of_node_put(node);
|
of_node_put(node);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
|
|||||||
@@ -147,11 +147,18 @@ void __init reserve_crashkernel(void)
|
|||||||
if (!crashk_res.start) {
|
if (!crashk_res.start) {
|
||||||
#ifdef CONFIG_PPC64
|
#ifdef CONFIG_PPC64
|
||||||
/*
|
/*
|
||||||
* On 64bit we split the RMO in half but cap it at half of
|
* On the LPAR platform place the crash kernel to mid of
|
||||||
* a small SLB (128MB) since the crash kernel needs to place
|
* RMA size (512MB or more) to ensure the crash kernel
|
||||||
* itself and some stacks to be in the first segment.
|
* gets enough space to place itself and some stack to be
|
||||||
|
* in the first segment. At the same time normal kernel
|
||||||
|
* also get enough space to allocate memory for essential
|
||||||
|
* system resource in the first segment. Keep the crash
|
||||||
|
* kernel starts at 128MB offset on other platforms.
|
||||||
*/
|
*/
|
||||||
crashk_res.start = min(0x8000000ULL, (ppc64_rma_size / 2));
|
if (firmware_has_feature(FW_FEATURE_LPAR))
|
||||||
|
crashk_res.start = ppc64_rma_size / 2;
|
||||||
|
else
|
||||||
|
crashk_res.start = min(0x8000000ULL, (ppc64_rma_size / 2));
|
||||||
#else
|
#else
|
||||||
crashk_res.start = KDUMP_KERNELBASE;
|
crashk_res.start = KDUMP_KERNELBASE;
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -2873,6 +2873,11 @@ config IA32_AOUT
|
|||||||
config X86_X32
|
config X86_X32
|
||||||
bool "x32 ABI for 64-bit mode"
|
bool "x32 ABI for 64-bit mode"
|
||||||
depends on X86_64
|
depends on X86_64
|
||||||
|
# llvm-objcopy does not convert x86_64 .note.gnu.property or
|
||||||
|
# compressed debug sections to x86_x32 properly:
|
||||||
|
# https://github.com/ClangBuiltLinux/linux/issues/514
|
||||||
|
# https://github.com/ClangBuiltLinux/linux/issues/1141
|
||||||
|
depends on $(success,$(OBJCOPY) --version | head -n1 | grep -qv llvm)
|
||||||
help
|
help
|
||||||
Include code to run binaries for the x32 native 32-bit ABI
|
Include code to run binaries for the x32 native 32-bit ABI
|
||||||
for 64-bit processors. An x32 process gets access to the
|
for 64-bit processors. An x32 process gets access to the
|
||||||
|
|||||||
@@ -3611,8 +3611,10 @@ static int em_rdpid(struct x86_emulate_ctxt *ctxt)
|
|||||||
{
|
{
|
||||||
u64 tsc_aux = 0;
|
u64 tsc_aux = 0;
|
||||||
|
|
||||||
if (ctxt->ops->get_msr(ctxt, MSR_TSC_AUX, &tsc_aux))
|
if (!ctxt->ops->guest_has_rdpid(ctxt))
|
||||||
return emulate_ud(ctxt);
|
return emulate_ud(ctxt);
|
||||||
|
|
||||||
|
ctxt->ops->get_msr(ctxt, MSR_TSC_AUX, &tsc_aux);
|
||||||
ctxt->dst.val = tsc_aux;
|
ctxt->dst.val = tsc_aux;
|
||||||
return X86EMUL_CONTINUE;
|
return X86EMUL_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -225,6 +225,7 @@ struct x86_emulate_ops {
|
|||||||
bool (*guest_has_long_mode)(struct x86_emulate_ctxt *ctxt);
|
bool (*guest_has_long_mode)(struct x86_emulate_ctxt *ctxt);
|
||||||
bool (*guest_has_movbe)(struct x86_emulate_ctxt *ctxt);
|
bool (*guest_has_movbe)(struct x86_emulate_ctxt *ctxt);
|
||||||
bool (*guest_has_fxsr)(struct x86_emulate_ctxt *ctxt);
|
bool (*guest_has_fxsr)(struct x86_emulate_ctxt *ctxt);
|
||||||
|
bool (*guest_has_rdpid)(struct x86_emulate_ctxt *ctxt);
|
||||||
|
|
||||||
void (*set_nmi_mask)(struct x86_emulate_ctxt *ctxt, bool masked);
|
void (*set_nmi_mask)(struct x86_emulate_ctxt *ctxt, bool masked);
|
||||||
|
|
||||||
|
|||||||
@@ -253,12 +253,10 @@ static int amd_pmu_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
|
|||||||
/* MSR_EVNTSELn */
|
/* MSR_EVNTSELn */
|
||||||
pmc = get_gp_pmc_amd(pmu, msr, PMU_TYPE_EVNTSEL);
|
pmc = get_gp_pmc_amd(pmu, msr, PMU_TYPE_EVNTSEL);
|
||||||
if (pmc) {
|
if (pmc) {
|
||||||
if (data == pmc->eventsel)
|
data &= ~pmu->reserved_bits;
|
||||||
return 0;
|
if (data != pmc->eventsel)
|
||||||
if (!(data & pmu->reserved_bits)) {
|
|
||||||
reprogram_gp_counter(pmc, data);
|
reprogram_gp_counter(pmc, data);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|||||||
@@ -6875,6 +6875,11 @@ static bool emulator_guest_has_fxsr(struct x86_emulate_ctxt *ctxt)
|
|||||||
return guest_cpuid_has(emul_to_vcpu(ctxt), X86_FEATURE_FXSR);
|
return guest_cpuid_has(emul_to_vcpu(ctxt), X86_FEATURE_FXSR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool emulator_guest_has_rdpid(struct x86_emulate_ctxt *ctxt)
|
||||||
|
{
|
||||||
|
return guest_cpuid_has(emul_to_vcpu(ctxt), X86_FEATURE_RDPID);
|
||||||
|
}
|
||||||
|
|
||||||
static ulong emulator_read_gpr(struct x86_emulate_ctxt *ctxt, unsigned reg)
|
static ulong emulator_read_gpr(struct x86_emulate_ctxt *ctxt, unsigned reg)
|
||||||
{
|
{
|
||||||
return kvm_register_read(emul_to_vcpu(ctxt), reg);
|
return kvm_register_read(emul_to_vcpu(ctxt), reg);
|
||||||
@@ -6958,6 +6963,7 @@ static const struct x86_emulate_ops emulate_ops = {
|
|||||||
.guest_has_long_mode = emulator_guest_has_long_mode,
|
.guest_has_long_mode = emulator_guest_has_long_mode,
|
||||||
.guest_has_movbe = emulator_guest_has_movbe,
|
.guest_has_movbe = emulator_guest_has_movbe,
|
||||||
.guest_has_fxsr = emulator_guest_has_fxsr,
|
.guest_has_fxsr = emulator_guest_has_fxsr,
|
||||||
|
.guest_has_rdpid = emulator_guest_has_rdpid,
|
||||||
.set_nmi_mask = emulator_set_nmi_mask,
|
.set_nmi_mask = emulator_set_nmi_mask,
|
||||||
.get_hflags = emulator_get_hflags,
|
.get_hflags = emulator_get_hflags,
|
||||||
.set_hflags = emulator_set_hflags,
|
.set_hflags = emulator_set_hflags,
|
||||||
|
|||||||
@@ -40,7 +40,8 @@ static void msr_save_context(struct saved_context *ctxt)
|
|||||||
struct saved_msr *end = msr + ctxt->saved_msrs.num;
|
struct saved_msr *end = msr + ctxt->saved_msrs.num;
|
||||||
|
|
||||||
while (msr < end) {
|
while (msr < end) {
|
||||||
msr->valid = !rdmsrl_safe(msr->info.msr_no, &msr->info.reg.q);
|
if (msr->valid)
|
||||||
|
rdmsrl(msr->info.msr_no, msr->info.reg.q);
|
||||||
msr++;
|
msr++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -440,8 +441,10 @@ static int msr_build_context(const u32 *msr_id, const int num)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (i = saved_msrs->num, j = 0; i < total_num; i++, j++) {
|
for (i = saved_msrs->num, j = 0; i < total_num; i++, j++) {
|
||||||
|
u64 dummy;
|
||||||
|
|
||||||
msr_array[i].info.msr_no = msr_id[j];
|
msr_array[i].info.msr_no = msr_id[j];
|
||||||
msr_array[i].valid = false;
|
msr_array[i].valid = !rdmsrl_safe(msr_id[j], &dummy);
|
||||||
msr_array[i].info.reg.q = 0;
|
msr_array[i].info.reg.q = 0;
|
||||||
}
|
}
|
||||||
saved_msrs->num = total_num;
|
saved_msrs->num = total_num;
|
||||||
@@ -516,10 +519,24 @@ static int pm_cpu_check(const struct x86_cpu_id *c)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void pm_save_spec_msr(void)
|
||||||
|
{
|
||||||
|
u32 spec_msr_id[] = {
|
||||||
|
MSR_IA32_SPEC_CTRL,
|
||||||
|
MSR_IA32_TSX_CTRL,
|
||||||
|
MSR_TSX_FORCE_ABORT,
|
||||||
|
MSR_IA32_MCU_OPT_CTRL,
|
||||||
|
MSR_AMD64_LS_CFG,
|
||||||
|
};
|
||||||
|
|
||||||
|
msr_build_context(spec_msr_id, ARRAY_SIZE(spec_msr_id));
|
||||||
|
}
|
||||||
|
|
||||||
static int pm_check_save_msr(void)
|
static int pm_check_save_msr(void)
|
||||||
{
|
{
|
||||||
dmi_check_system(msr_save_dmi_table);
|
dmi_check_system(msr_save_dmi_table);
|
||||||
pm_cpu_check(msr_save_cpu_table);
|
pm_cpu_check(msr_save_cpu_table);
|
||||||
|
pm_save_spec_msr();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,12 @@ static void __init xen_hvm_smp_prepare_boot_cpu(void)
|
|||||||
*/
|
*/
|
||||||
xen_vcpu_setup(0);
|
xen_vcpu_setup(0);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Called again in case the kernel boots on vcpu >= MAX_VIRT_CPUS.
|
||||||
|
* Refer to comments in xen_hvm_init_time_ops().
|
||||||
|
*/
|
||||||
|
xen_hvm_init_time_ops();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The alternative logic (which patches the unlock/lock) runs before
|
* The alternative logic (which patches the unlock/lock) runs before
|
||||||
* the smp bootup up code is activated. Hence we need to set this up
|
* the smp bootup up code is activated. Hence we need to set this up
|
||||||
|
|||||||
@@ -556,6 +556,11 @@ static void xen_hvm_setup_cpu_clockevents(void)
|
|||||||
|
|
||||||
void __init xen_hvm_init_time_ops(void)
|
void __init xen_hvm_init_time_ops(void)
|
||||||
{
|
{
|
||||||
|
static bool hvm_time_initialized;
|
||||||
|
|
||||||
|
if (hvm_time_initialized)
|
||||||
|
return;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* vector callback is needed otherwise we cannot receive interrupts
|
* vector callback is needed otherwise we cannot receive interrupts
|
||||||
* on cpu > 0 and at this point we don't know how many cpus are
|
* on cpu > 0 and at this point we don't know how many cpus are
|
||||||
@@ -565,7 +570,22 @@ void __init xen_hvm_init_time_ops(void)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (!xen_feature(XENFEAT_hvm_safe_pvclock)) {
|
if (!xen_feature(XENFEAT_hvm_safe_pvclock)) {
|
||||||
pr_info("Xen doesn't support pvclock on HVM, disable pv timer");
|
pr_info_once("Xen doesn't support pvclock on HVM, disable pv timer");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Only MAX_VIRT_CPUS 'vcpu_info' are embedded inside 'shared_info'.
|
||||||
|
* The __this_cpu_read(xen_vcpu) is still NULL when Xen HVM guest
|
||||||
|
* boots on vcpu >= MAX_VIRT_CPUS (e.g., kexec), To access
|
||||||
|
* __this_cpu_read(xen_vcpu) via xen_clocksource_read() will panic.
|
||||||
|
*
|
||||||
|
* The xen_hvm_init_time_ops() should be called again later after
|
||||||
|
* __this_cpu_read(xen_vcpu) is available.
|
||||||
|
*/
|
||||||
|
if (!__this_cpu_read(xen_vcpu)) {
|
||||||
|
pr_info("Delay xen_init_time_common() as kernel is running on vcpu=%d\n",
|
||||||
|
xen_vcpu_nr(0));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -577,6 +597,8 @@ void __init xen_hvm_init_time_ops(void)
|
|||||||
x86_platform.calibrate_tsc = xen_tsc_khz;
|
x86_platform.calibrate_tsc = xen_tsc_khz;
|
||||||
x86_platform.get_wallclock = xen_get_wallclock;
|
x86_platform.get_wallclock = xen_get_wallclock;
|
||||||
x86_platform.set_wallclock = xen_set_wallclock;
|
x86_platform.set_wallclock = xen_set_wallclock;
|
||||||
|
|
||||||
|
hvm_time_initialized = true;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -8,19 +8,19 @@
|
|||||||
reg = <0x00000000 0x08000000>;
|
reg = <0x00000000 0x08000000>;
|
||||||
bank-width = <2>;
|
bank-width = <2>;
|
||||||
device-width = <2>;
|
device-width = <2>;
|
||||||
partition@0x0 {
|
partition@0 {
|
||||||
label = "data";
|
label = "data";
|
||||||
reg = <0x00000000 0x06000000>;
|
reg = <0x00000000 0x06000000>;
|
||||||
};
|
};
|
||||||
partition@0x6000000 {
|
partition@6000000 {
|
||||||
label = "boot loader area";
|
label = "boot loader area";
|
||||||
reg = <0x06000000 0x00800000>;
|
reg = <0x06000000 0x00800000>;
|
||||||
};
|
};
|
||||||
partition@0x6800000 {
|
partition@6800000 {
|
||||||
label = "kernel image";
|
label = "kernel image";
|
||||||
reg = <0x06800000 0x017e0000>;
|
reg = <0x06800000 0x017e0000>;
|
||||||
};
|
};
|
||||||
partition@0x7fe0000 {
|
partition@7fe0000 {
|
||||||
label = "boot environment";
|
label = "boot environment";
|
||||||
reg = <0x07fe0000 0x00020000>;
|
reg = <0x07fe0000 0x00020000>;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -8,19 +8,19 @@
|
|||||||
reg = <0x08000000 0x01000000>;
|
reg = <0x08000000 0x01000000>;
|
||||||
bank-width = <2>;
|
bank-width = <2>;
|
||||||
device-width = <2>;
|
device-width = <2>;
|
||||||
partition@0x0 {
|
partition@0 {
|
||||||
label = "boot loader area";
|
label = "boot loader area";
|
||||||
reg = <0x00000000 0x00400000>;
|
reg = <0x00000000 0x00400000>;
|
||||||
};
|
};
|
||||||
partition@0x400000 {
|
partition@400000 {
|
||||||
label = "kernel image";
|
label = "kernel image";
|
||||||
reg = <0x00400000 0x00600000>;
|
reg = <0x00400000 0x00600000>;
|
||||||
};
|
};
|
||||||
partition@0xa00000 {
|
partition@a00000 {
|
||||||
label = "data";
|
label = "data";
|
||||||
reg = <0x00a00000 0x005e0000>;
|
reg = <0x00a00000 0x005e0000>;
|
||||||
};
|
};
|
||||||
partition@0xfe0000 {
|
partition@fe0000 {
|
||||||
label = "boot environment";
|
label = "boot environment";
|
||||||
reg = <0x00fe0000 0x00020000>;
|
reg = <0x00fe0000 0x00020000>;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -8,11 +8,11 @@
|
|||||||
reg = <0x08000000 0x00400000>;
|
reg = <0x08000000 0x00400000>;
|
||||||
bank-width = <2>;
|
bank-width = <2>;
|
||||||
device-width = <2>;
|
device-width = <2>;
|
||||||
partition@0x0 {
|
partition@0 {
|
||||||
label = "boot loader area";
|
label = "boot loader area";
|
||||||
reg = <0x00000000 0x003f0000>;
|
reg = <0x00000000 0x003f0000>;
|
||||||
};
|
};
|
||||||
partition@0x3f0000 {
|
partition@3f0000 {
|
||||||
label = "boot environment";
|
label = "boot environment";
|
||||||
reg = <0x003f0000 0x00010000>;
|
reg = <0x003f0000 0x00010000>;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -145,7 +145,11 @@ struct sata_dwc_device {
|
|||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
#define SATA_DWC_QCMD_MAX 32
|
/*
|
||||||
|
* Allow one extra special slot for commands and DMA management
|
||||||
|
* to account for libata internal commands.
|
||||||
|
*/
|
||||||
|
#define SATA_DWC_QCMD_MAX (ATA_MAX_QUEUE + 1)
|
||||||
|
|
||||||
struct sata_dwc_device_port {
|
struct sata_dwc_device_port {
|
||||||
struct sata_dwc_device *hsdev;
|
struct sata_dwc_device *hsdev;
|
||||||
|
|||||||
@@ -1644,22 +1644,22 @@ struct sib_info {
|
|||||||
};
|
};
|
||||||
void drbd_bcast_event(struct drbd_device *device, const struct sib_info *sib);
|
void drbd_bcast_event(struct drbd_device *device, const struct sib_info *sib);
|
||||||
|
|
||||||
extern void notify_resource_state(struct sk_buff *,
|
extern int notify_resource_state(struct sk_buff *,
|
||||||
unsigned int,
|
unsigned int,
|
||||||
struct drbd_resource *,
|
struct drbd_resource *,
|
||||||
struct resource_info *,
|
struct resource_info *,
|
||||||
enum drbd_notification_type);
|
enum drbd_notification_type);
|
||||||
extern void notify_device_state(struct sk_buff *,
|
extern int notify_device_state(struct sk_buff *,
|
||||||
unsigned int,
|
unsigned int,
|
||||||
struct drbd_device *,
|
struct drbd_device *,
|
||||||
struct device_info *,
|
struct device_info *,
|
||||||
enum drbd_notification_type);
|
enum drbd_notification_type);
|
||||||
extern void notify_connection_state(struct sk_buff *,
|
extern int notify_connection_state(struct sk_buff *,
|
||||||
unsigned int,
|
unsigned int,
|
||||||
struct drbd_connection *,
|
struct drbd_connection *,
|
||||||
struct connection_info *,
|
struct connection_info *,
|
||||||
enum drbd_notification_type);
|
enum drbd_notification_type);
|
||||||
extern void notify_peer_device_state(struct sk_buff *,
|
extern int notify_peer_device_state(struct sk_buff *,
|
||||||
unsigned int,
|
unsigned int,
|
||||||
struct drbd_peer_device *,
|
struct drbd_peer_device *,
|
||||||
struct peer_device_info *,
|
struct peer_device_info *,
|
||||||
|
|||||||
@@ -4614,7 +4614,7 @@ static int nla_put_notification_header(struct sk_buff *msg,
|
|||||||
return drbd_notification_header_to_skb(msg, &nh, true);
|
return drbd_notification_header_to_skb(msg, &nh, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void notify_resource_state(struct sk_buff *skb,
|
int notify_resource_state(struct sk_buff *skb,
|
||||||
unsigned int seq,
|
unsigned int seq,
|
||||||
struct drbd_resource *resource,
|
struct drbd_resource *resource,
|
||||||
struct resource_info *resource_info,
|
struct resource_info *resource_info,
|
||||||
@@ -4656,16 +4656,17 @@ void notify_resource_state(struct sk_buff *skb,
|
|||||||
if (err && err != -ESRCH)
|
if (err && err != -ESRCH)
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
return;
|
return 0;
|
||||||
|
|
||||||
nla_put_failure:
|
nla_put_failure:
|
||||||
nlmsg_free(skb);
|
nlmsg_free(skb);
|
||||||
failed:
|
failed:
|
||||||
drbd_err(resource, "Error %d while broadcasting event. Event seq:%u\n",
|
drbd_err(resource, "Error %d while broadcasting event. Event seq:%u\n",
|
||||||
err, seq);
|
err, seq);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
void notify_device_state(struct sk_buff *skb,
|
int notify_device_state(struct sk_buff *skb,
|
||||||
unsigned int seq,
|
unsigned int seq,
|
||||||
struct drbd_device *device,
|
struct drbd_device *device,
|
||||||
struct device_info *device_info,
|
struct device_info *device_info,
|
||||||
@@ -4705,16 +4706,17 @@ void notify_device_state(struct sk_buff *skb,
|
|||||||
if (err && err != -ESRCH)
|
if (err && err != -ESRCH)
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
return;
|
return 0;
|
||||||
|
|
||||||
nla_put_failure:
|
nla_put_failure:
|
||||||
nlmsg_free(skb);
|
nlmsg_free(skb);
|
||||||
failed:
|
failed:
|
||||||
drbd_err(device, "Error %d while broadcasting event. Event seq:%u\n",
|
drbd_err(device, "Error %d while broadcasting event. Event seq:%u\n",
|
||||||
err, seq);
|
err, seq);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
void notify_connection_state(struct sk_buff *skb,
|
int notify_connection_state(struct sk_buff *skb,
|
||||||
unsigned int seq,
|
unsigned int seq,
|
||||||
struct drbd_connection *connection,
|
struct drbd_connection *connection,
|
||||||
struct connection_info *connection_info,
|
struct connection_info *connection_info,
|
||||||
@@ -4754,16 +4756,17 @@ void notify_connection_state(struct sk_buff *skb,
|
|||||||
if (err && err != -ESRCH)
|
if (err && err != -ESRCH)
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
return;
|
return 0;
|
||||||
|
|
||||||
nla_put_failure:
|
nla_put_failure:
|
||||||
nlmsg_free(skb);
|
nlmsg_free(skb);
|
||||||
failed:
|
failed:
|
||||||
drbd_err(connection, "Error %d while broadcasting event. Event seq:%u\n",
|
drbd_err(connection, "Error %d while broadcasting event. Event seq:%u\n",
|
||||||
err, seq);
|
err, seq);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
void notify_peer_device_state(struct sk_buff *skb,
|
int notify_peer_device_state(struct sk_buff *skb,
|
||||||
unsigned int seq,
|
unsigned int seq,
|
||||||
struct drbd_peer_device *peer_device,
|
struct drbd_peer_device *peer_device,
|
||||||
struct peer_device_info *peer_device_info,
|
struct peer_device_info *peer_device_info,
|
||||||
@@ -4804,13 +4807,14 @@ void notify_peer_device_state(struct sk_buff *skb,
|
|||||||
if (err && err != -ESRCH)
|
if (err && err != -ESRCH)
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
return;
|
return 0;
|
||||||
|
|
||||||
nla_put_failure:
|
nla_put_failure:
|
||||||
nlmsg_free(skb);
|
nlmsg_free(skb);
|
||||||
failed:
|
failed:
|
||||||
drbd_err(peer_device, "Error %d while broadcasting event. Event seq:%u\n",
|
drbd_err(peer_device, "Error %d while broadcasting event. Event seq:%u\n",
|
||||||
err, seq);
|
err, seq);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
void notify_helper(enum drbd_notification_type type,
|
void notify_helper(enum drbd_notification_type type,
|
||||||
@@ -4861,7 +4865,7 @@ fail:
|
|||||||
err, seq);
|
err, seq);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void notify_initial_state_done(struct sk_buff *skb, unsigned int seq)
|
static int notify_initial_state_done(struct sk_buff *skb, unsigned int seq)
|
||||||
{
|
{
|
||||||
struct drbd_genlmsghdr *dh;
|
struct drbd_genlmsghdr *dh;
|
||||||
int err;
|
int err;
|
||||||
@@ -4875,11 +4879,12 @@ static void notify_initial_state_done(struct sk_buff *skb, unsigned int seq)
|
|||||||
if (nla_put_notification_header(skb, NOTIFY_EXISTS))
|
if (nla_put_notification_header(skb, NOTIFY_EXISTS))
|
||||||
goto nla_put_failure;
|
goto nla_put_failure;
|
||||||
genlmsg_end(skb, dh);
|
genlmsg_end(skb, dh);
|
||||||
return;
|
return 0;
|
||||||
|
|
||||||
nla_put_failure:
|
nla_put_failure:
|
||||||
nlmsg_free(skb);
|
nlmsg_free(skb);
|
||||||
pr_err("Error %d sending event. Event seq:%u\n", err, seq);
|
pr_err("Error %d sending event. Event seq:%u\n", err, seq);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void free_state_changes(struct list_head *list)
|
static void free_state_changes(struct list_head *list)
|
||||||
@@ -4906,6 +4911,7 @@ static int get_initial_state(struct sk_buff *skb, struct netlink_callback *cb)
|
|||||||
unsigned int seq = cb->args[2];
|
unsigned int seq = cb->args[2];
|
||||||
unsigned int n;
|
unsigned int n;
|
||||||
enum drbd_notification_type flags = 0;
|
enum drbd_notification_type flags = 0;
|
||||||
|
int err = 0;
|
||||||
|
|
||||||
/* There is no need for taking notification_mutex here: it doesn't
|
/* There is no need for taking notification_mutex here: it doesn't
|
||||||
matter if the initial state events mix with later state chage
|
matter if the initial state events mix with later state chage
|
||||||
@@ -4914,32 +4920,32 @@ static int get_initial_state(struct sk_buff *skb, struct netlink_callback *cb)
|
|||||||
|
|
||||||
cb->args[5]--;
|
cb->args[5]--;
|
||||||
if (cb->args[5] == 1) {
|
if (cb->args[5] == 1) {
|
||||||
notify_initial_state_done(skb, seq);
|
err = notify_initial_state_done(skb, seq);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
n = cb->args[4]++;
|
n = cb->args[4]++;
|
||||||
if (cb->args[4] < cb->args[3])
|
if (cb->args[4] < cb->args[3])
|
||||||
flags |= NOTIFY_CONTINUES;
|
flags |= NOTIFY_CONTINUES;
|
||||||
if (n < 1) {
|
if (n < 1) {
|
||||||
notify_resource_state_change(skb, seq, state_change->resource,
|
err = notify_resource_state_change(skb, seq, state_change->resource,
|
||||||
NOTIFY_EXISTS | flags);
|
NOTIFY_EXISTS | flags);
|
||||||
goto next;
|
goto next;
|
||||||
}
|
}
|
||||||
n--;
|
n--;
|
||||||
if (n < state_change->n_connections) {
|
if (n < state_change->n_connections) {
|
||||||
notify_connection_state_change(skb, seq, &state_change->connections[n],
|
err = notify_connection_state_change(skb, seq, &state_change->connections[n],
|
||||||
NOTIFY_EXISTS | flags);
|
NOTIFY_EXISTS | flags);
|
||||||
goto next;
|
goto next;
|
||||||
}
|
}
|
||||||
n -= state_change->n_connections;
|
n -= state_change->n_connections;
|
||||||
if (n < state_change->n_devices) {
|
if (n < state_change->n_devices) {
|
||||||
notify_device_state_change(skb, seq, &state_change->devices[n],
|
err = notify_device_state_change(skb, seq, &state_change->devices[n],
|
||||||
NOTIFY_EXISTS | flags);
|
NOTIFY_EXISTS | flags);
|
||||||
goto next;
|
goto next;
|
||||||
}
|
}
|
||||||
n -= state_change->n_devices;
|
n -= state_change->n_devices;
|
||||||
if (n < state_change->n_devices * state_change->n_connections) {
|
if (n < state_change->n_devices * state_change->n_connections) {
|
||||||
notify_peer_device_state_change(skb, seq, &state_change->peer_devices[n],
|
err = notify_peer_device_state_change(skb, seq, &state_change->peer_devices[n],
|
||||||
NOTIFY_EXISTS | flags);
|
NOTIFY_EXISTS | flags);
|
||||||
goto next;
|
goto next;
|
||||||
}
|
}
|
||||||
@@ -4954,7 +4960,10 @@ next:
|
|||||||
cb->args[4] = 0;
|
cb->args[4] = 0;
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
return skb->len;
|
if (err)
|
||||||
|
return err;
|
||||||
|
else
|
||||||
|
return skb->len;
|
||||||
}
|
}
|
||||||
|
|
||||||
int drbd_adm_get_initial_state(struct sk_buff *skb, struct netlink_callback *cb)
|
int drbd_adm_get_initial_state(struct sk_buff *skb, struct netlink_callback *cb)
|
||||||
|
|||||||
@@ -1537,7 +1537,7 @@ int drbd_bitmap_io_from_worker(struct drbd_device *device,
|
|||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
void notify_resource_state_change(struct sk_buff *skb,
|
int notify_resource_state_change(struct sk_buff *skb,
|
||||||
unsigned int seq,
|
unsigned int seq,
|
||||||
struct drbd_resource_state_change *resource_state_change,
|
struct drbd_resource_state_change *resource_state_change,
|
||||||
enum drbd_notification_type type)
|
enum drbd_notification_type type)
|
||||||
@@ -1550,10 +1550,10 @@ void notify_resource_state_change(struct sk_buff *skb,
|
|||||||
.res_susp_fen = resource_state_change->susp_fen[NEW],
|
.res_susp_fen = resource_state_change->susp_fen[NEW],
|
||||||
};
|
};
|
||||||
|
|
||||||
notify_resource_state(skb, seq, resource, &resource_info, type);
|
return notify_resource_state(skb, seq, resource, &resource_info, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
void notify_connection_state_change(struct sk_buff *skb,
|
int notify_connection_state_change(struct sk_buff *skb,
|
||||||
unsigned int seq,
|
unsigned int seq,
|
||||||
struct drbd_connection_state_change *connection_state_change,
|
struct drbd_connection_state_change *connection_state_change,
|
||||||
enum drbd_notification_type type)
|
enum drbd_notification_type type)
|
||||||
@@ -1564,10 +1564,10 @@ void notify_connection_state_change(struct sk_buff *skb,
|
|||||||
.conn_role = connection_state_change->peer_role[NEW],
|
.conn_role = connection_state_change->peer_role[NEW],
|
||||||
};
|
};
|
||||||
|
|
||||||
notify_connection_state(skb, seq, connection, &connection_info, type);
|
return notify_connection_state(skb, seq, connection, &connection_info, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
void notify_device_state_change(struct sk_buff *skb,
|
int notify_device_state_change(struct sk_buff *skb,
|
||||||
unsigned int seq,
|
unsigned int seq,
|
||||||
struct drbd_device_state_change *device_state_change,
|
struct drbd_device_state_change *device_state_change,
|
||||||
enum drbd_notification_type type)
|
enum drbd_notification_type type)
|
||||||
@@ -1577,10 +1577,10 @@ void notify_device_state_change(struct sk_buff *skb,
|
|||||||
.dev_disk_state = device_state_change->disk_state[NEW],
|
.dev_disk_state = device_state_change->disk_state[NEW],
|
||||||
};
|
};
|
||||||
|
|
||||||
notify_device_state(skb, seq, device, &device_info, type);
|
return notify_device_state(skb, seq, device, &device_info, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
void notify_peer_device_state_change(struct sk_buff *skb,
|
int notify_peer_device_state_change(struct sk_buff *skb,
|
||||||
unsigned int seq,
|
unsigned int seq,
|
||||||
struct drbd_peer_device_state_change *p,
|
struct drbd_peer_device_state_change *p,
|
||||||
enum drbd_notification_type type)
|
enum drbd_notification_type type)
|
||||||
@@ -1594,7 +1594,7 @@ void notify_peer_device_state_change(struct sk_buff *skb,
|
|||||||
.peer_resync_susp_dependency = p->resync_susp_dependency[NEW],
|
.peer_resync_susp_dependency = p->resync_susp_dependency[NEW],
|
||||||
};
|
};
|
||||||
|
|
||||||
notify_peer_device_state(skb, seq, peer_device, &peer_device_info, type);
|
return notify_peer_device_state(skb, seq, peer_device, &peer_device_info, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void broadcast_state_change(struct drbd_state_change *state_change)
|
static void broadcast_state_change(struct drbd_state_change *state_change)
|
||||||
@@ -1602,7 +1602,7 @@ static void broadcast_state_change(struct drbd_state_change *state_change)
|
|||||||
struct drbd_resource_state_change *resource_state_change = &state_change->resource[0];
|
struct drbd_resource_state_change *resource_state_change = &state_change->resource[0];
|
||||||
bool resource_state_has_changed;
|
bool resource_state_has_changed;
|
||||||
unsigned int n_device, n_connection, n_peer_device, n_peer_devices;
|
unsigned int n_device, n_connection, n_peer_device, n_peer_devices;
|
||||||
void (*last_func)(struct sk_buff *, unsigned int, void *,
|
int (*last_func)(struct sk_buff *, unsigned int, void *,
|
||||||
enum drbd_notification_type) = NULL;
|
enum drbd_notification_type) = NULL;
|
||||||
void *last_arg = NULL;
|
void *last_arg = NULL;
|
||||||
|
|
||||||
|
|||||||
@@ -44,19 +44,19 @@ extern struct drbd_state_change *remember_old_state(struct drbd_resource *, gfp_
|
|||||||
extern void copy_old_to_new_state_change(struct drbd_state_change *);
|
extern void copy_old_to_new_state_change(struct drbd_state_change *);
|
||||||
extern void forget_state_change(struct drbd_state_change *);
|
extern void forget_state_change(struct drbd_state_change *);
|
||||||
|
|
||||||
extern void notify_resource_state_change(struct sk_buff *,
|
extern int notify_resource_state_change(struct sk_buff *,
|
||||||
unsigned int,
|
unsigned int,
|
||||||
struct drbd_resource_state_change *,
|
struct drbd_resource_state_change *,
|
||||||
enum drbd_notification_type type);
|
enum drbd_notification_type type);
|
||||||
extern void notify_connection_state_change(struct sk_buff *,
|
extern int notify_connection_state_change(struct sk_buff *,
|
||||||
unsigned int,
|
unsigned int,
|
||||||
struct drbd_connection_state_change *,
|
struct drbd_connection_state_change *,
|
||||||
enum drbd_notification_type type);
|
enum drbd_notification_type type);
|
||||||
extern void notify_device_state_change(struct sk_buff *,
|
extern int notify_device_state_change(struct sk_buff *,
|
||||||
unsigned int,
|
unsigned int,
|
||||||
struct drbd_device_state_change *,
|
struct drbd_device_state_change *,
|
||||||
enum drbd_notification_type type);
|
enum drbd_notification_type type);
|
||||||
extern void notify_peer_device_state_change(struct sk_buff *,
|
extern int notify_peer_device_state_change(struct sk_buff *,
|
||||||
unsigned int,
|
unsigned int,
|
||||||
struct drbd_peer_device_state_change *,
|
struct drbd_peer_device_state_change *,
|
||||||
enum drbd_notification_type type);
|
enum drbd_notification_type type);
|
||||||
|
|||||||
@@ -2248,7 +2248,7 @@ static struct virtio_driver virtio_rproc_serial = {
|
|||||||
.remove = virtcons_remove,
|
.remove = virtcons_remove,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init init(void)
|
static int __init virtio_console_init(void)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
@@ -2285,7 +2285,7 @@ free:
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __exit fini(void)
|
static void __exit virtio_console_fini(void)
|
||||||
{
|
{
|
||||||
reclaim_dma_bufs();
|
reclaim_dma_bufs();
|
||||||
|
|
||||||
@@ -2295,8 +2295,8 @@ static void __exit fini(void)
|
|||||||
class_destroy(pdrvdata.class);
|
class_destroy(pdrvdata.class);
|
||||||
debugfs_remove_recursive(pdrvdata.debugfs_dir);
|
debugfs_remove_recursive(pdrvdata.debugfs_dir);
|
||||||
}
|
}
|
||||||
module_init(init);
|
module_init(virtio_console_init);
|
||||||
module_exit(fini);
|
module_exit(virtio_console_fini);
|
||||||
|
|
||||||
MODULE_DESCRIPTION("Virtio console driver");
|
MODULE_DESCRIPTION("Virtio console driver");
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
|
|||||||
@@ -789,6 +789,15 @@ static unsigned long si5341_output_clk_recalc_rate(struct clk_hw *hw,
|
|||||||
u32 r_divider;
|
u32 r_divider;
|
||||||
u8 r[3];
|
u8 r[3];
|
||||||
|
|
||||||
|
err = regmap_read(output->data->regmap,
|
||||||
|
SI5341_OUT_CONFIG(output), &val);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
/* If SI5341_OUT_CFG_RDIV_FORCE2 is set, r_divider is 2 */
|
||||||
|
if (val & SI5341_OUT_CFG_RDIV_FORCE2)
|
||||||
|
return parent_rate / 2;
|
||||||
|
|
||||||
err = regmap_bulk_read(output->data->regmap,
|
err = regmap_bulk_read(output->data->regmap,
|
||||||
SI5341_OUT_R_REG(output), r, 3);
|
SI5341_OUT_R_REG(output), r, 3);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
@@ -805,13 +814,6 @@ static unsigned long si5341_output_clk_recalc_rate(struct clk_hw *hw,
|
|||||||
r_divider += 1;
|
r_divider += 1;
|
||||||
r_divider <<= 1;
|
r_divider <<= 1;
|
||||||
|
|
||||||
err = regmap_read(output->data->regmap,
|
|
||||||
SI5341_OUT_CONFIG(output), &val);
|
|
||||||
if (err < 0)
|
|
||||||
return err;
|
|
||||||
|
|
||||||
if (val & SI5341_OUT_CFG_RDIV_FORCE2)
|
|
||||||
r_divider = 2;
|
|
||||||
|
|
||||||
return parent_rate / r_divider;
|
return parent_rate / r_divider;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -633,6 +633,24 @@ static void clk_core_get_boundaries(struct clk_core *core,
|
|||||||
*max_rate = min(*max_rate, clk_user->max_rate);
|
*max_rate = min(*max_rate, clk_user->max_rate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool clk_core_check_boundaries(struct clk_core *core,
|
||||||
|
unsigned long min_rate,
|
||||||
|
unsigned long max_rate)
|
||||||
|
{
|
||||||
|
struct clk *user;
|
||||||
|
|
||||||
|
lockdep_assert_held(&prepare_lock);
|
||||||
|
|
||||||
|
if (min_rate > core->max_rate || max_rate < core->min_rate)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
hlist_for_each_entry(user, &core->clks, clks_node)
|
||||||
|
if (min_rate > user->max_rate || max_rate < user->min_rate)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void clk_hw_set_rate_range(struct clk_hw *hw, unsigned long min_rate,
|
void clk_hw_set_rate_range(struct clk_hw *hw, unsigned long min_rate,
|
||||||
unsigned long max_rate)
|
unsigned long max_rate)
|
||||||
{
|
{
|
||||||
@@ -2411,6 +2429,11 @@ int clk_set_rate_range(struct clk *clk, unsigned long min, unsigned long max)
|
|||||||
clk->min_rate = min;
|
clk->min_rate = min;
|
||||||
clk->max_rate = max;
|
clk->max_rate = max;
|
||||||
|
|
||||||
|
if (!clk_core_check_boundaries(clk->core, min, max)) {
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
rate = clk_core_get_rate_nolock(clk->core);
|
rate = clk_core_get_rate_nolock(clk->core);
|
||||||
if (rate < min || rate > max) {
|
if (rate < min || rate > max) {
|
||||||
/*
|
/*
|
||||||
@@ -2439,6 +2462,7 @@ int clk_set_rate_range(struct clk *clk, unsigned long min, unsigned long max)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
if (clk->exclusive_count)
|
if (clk->exclusive_count)
|
||||||
clk_core_rate_protect(clk->core);
|
clk_core_rate_protect(clk->core);
|
||||||
|
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ int ti_clk_setup_ll_ops(struct ti_clk_ll_ops *ops)
|
|||||||
void __init ti_dt_clocks_register(struct ti_dt_clk oclks[])
|
void __init ti_dt_clocks_register(struct ti_dt_clk oclks[])
|
||||||
{
|
{
|
||||||
struct ti_dt_clk *c;
|
struct ti_dt_clk *c;
|
||||||
struct device_node *node, *parent;
|
struct device_node *node, *parent, *child;
|
||||||
struct clk *clk;
|
struct clk *clk;
|
||||||
struct of_phandle_args clkspec;
|
struct of_phandle_args clkspec;
|
||||||
char buf[64];
|
char buf[64];
|
||||||
@@ -171,10 +171,13 @@ void __init ti_dt_clocks_register(struct ti_dt_clk oclks[])
|
|||||||
node = of_find_node_by_name(NULL, buf);
|
node = of_find_node_by_name(NULL, buf);
|
||||||
if (num_args && compat_mode) {
|
if (num_args && compat_mode) {
|
||||||
parent = node;
|
parent = node;
|
||||||
node = of_get_child_by_name(parent, "clock");
|
child = of_get_child_by_name(parent, "clock");
|
||||||
if (!node)
|
if (!child)
|
||||||
node = of_get_child_by_name(parent, "clk");
|
child = of_get_child_by_name(parent, "clk");
|
||||||
of_node_put(parent);
|
if (child) {
|
||||||
|
of_node_put(parent);
|
||||||
|
node = child;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
clkspec.np = node;
|
clkspec.np = node;
|
||||||
|
|||||||
@@ -115,10 +115,8 @@ static dma_cookie_t shdma_tx_submit(struct dma_async_tx_descriptor *tx)
|
|||||||
ret = pm_runtime_get(schan->dev);
|
ret = pm_runtime_get(schan->dev);
|
||||||
|
|
||||||
spin_unlock_irq(&schan->chan_lock);
|
spin_unlock_irq(&schan->chan_lock);
|
||||||
if (ret < 0) {
|
if (ret < 0)
|
||||||
dev_err(schan->dev, "%s(): GET = %d\n", __func__, ret);
|
dev_err(schan->dev, "%s(): GET = %d\n", __func__, ret);
|
||||||
pm_runtime_put(schan->dev);
|
|
||||||
}
|
|
||||||
|
|
||||||
pm_runtime_barrier(schan->dev);
|
pm_runtime_barrier(schan->dev);
|
||||||
|
|
||||||
|
|||||||
@@ -1412,6 +1412,16 @@ static int gpiochip_to_irq(struct gpio_chip *gc, unsigned offset)
|
|||||||
{
|
{
|
||||||
struct irq_domain *domain = gc->irq.domain;
|
struct irq_domain *domain = gc->irq.domain;
|
||||||
|
|
||||||
|
#ifdef CONFIG_GPIOLIB_IRQCHIP
|
||||||
|
/*
|
||||||
|
* Avoid race condition with other code, which tries to lookup
|
||||||
|
* an IRQ before the irqchip has been properly registered,
|
||||||
|
* i.e. while gpiochip is still being brought up.
|
||||||
|
*/
|
||||||
|
if (!gc->irq.initialized)
|
||||||
|
return -EPROBE_DEFER;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!gpiochip_irqchip_irq_valid(gc, offset))
|
if (!gpiochip_irqchip_irq_valid(gc, offset))
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
|
|
||||||
@@ -1605,6 +1615,15 @@ static int gpiochip_add_irqchip(struct gpio_chip *gc,
|
|||||||
|
|
||||||
acpi_gpiochip_request_interrupts(gc);
|
acpi_gpiochip_request_interrupts(gc);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Using barrier() here to prevent compiler from reordering
|
||||||
|
* gc->irq.initialized before initialization of above
|
||||||
|
* GPIO chip irq members.
|
||||||
|
*/
|
||||||
|
barrier();
|
||||||
|
|
||||||
|
gc->irq.initialized = true;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1484,6 +1484,7 @@ int amdgpu_cs_fence_to_handle_ioctl(struct drm_device *dev, void *data,
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
dma_fence_put(fence);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -263,7 +263,7 @@ static int amdgpu_gfx_kiq_acquire(struct amdgpu_device *adev,
|
|||||||
* adev->gfx.mec.num_pipe_per_mec
|
* adev->gfx.mec.num_pipe_per_mec
|
||||||
* adev->gfx.mec.num_queue_per_pipe;
|
* adev->gfx.mec.num_queue_per_pipe;
|
||||||
|
|
||||||
while (queue_bit-- >= 0) {
|
while (--queue_bit >= 0) {
|
||||||
if (test_bit(queue_bit, adev->gfx.mec.queue_bitmap))
|
if (test_bit(queue_bit, adev->gfx.mec.queue_bitmap))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|||||||
@@ -1338,7 +1338,8 @@ void amdgpu_bo_release_notify(struct ttm_buffer_object *bo)
|
|||||||
!(abo->flags & AMDGPU_GEM_CREATE_VRAM_WIPE_ON_RELEASE))
|
!(abo->flags & AMDGPU_GEM_CREATE_VRAM_WIPE_ON_RELEASE))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
dma_resv_lock(bo->base.resv, NULL);
|
if (WARN_ON_ONCE(!dma_resv_trylock(bo->base.resv)))
|
||||||
|
return;
|
||||||
|
|
||||||
r = amdgpu_fill_buffer(abo, AMDGPU_POISON, bo->base.resv, &fence);
|
r = amdgpu_fill_buffer(abo, AMDGPU_POISON, bo->base.resv, &fence);
|
||||||
if (!WARN_ON(r)) {
|
if (!WARN_ON(r)) {
|
||||||
|
|||||||
@@ -784,7 +784,7 @@ int kfd_create_crat_image_acpi(void **crat_image, size_t *size)
|
|||||||
/* Fetch the CRAT table from ACPI */
|
/* Fetch the CRAT table from ACPI */
|
||||||
status = acpi_get_table(CRAT_SIGNATURE, 0, &crat_table);
|
status = acpi_get_table(CRAT_SIGNATURE, 0, &crat_table);
|
||||||
if (status == AE_NOT_FOUND) {
|
if (status == AE_NOT_FOUND) {
|
||||||
pr_warn("CRAT table not found\n");
|
pr_info("CRAT table not found\n");
|
||||||
return -ENODATA;
|
return -ENODATA;
|
||||||
} else if (ACPI_FAILURE(status)) {
|
} else if (ACPI_FAILURE(status)) {
|
||||||
const char *err = acpi_format_exception(status);
|
const char *err = acpi_format_exception(status);
|
||||||
|
|||||||
@@ -270,15 +270,6 @@ int kfd_smi_event_open(struct kfd_dev *dev, uint32_t *fd)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = anon_inode_getfd(kfd_smi_name, &kfd_smi_ev_fops, (void *)client,
|
|
||||||
O_RDWR);
|
|
||||||
if (ret < 0) {
|
|
||||||
kfifo_free(&client->fifo);
|
|
||||||
kfree(client);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
*fd = ret;
|
|
||||||
|
|
||||||
init_waitqueue_head(&client->wait_queue);
|
init_waitqueue_head(&client->wait_queue);
|
||||||
spin_lock_init(&client->lock);
|
spin_lock_init(&client->lock);
|
||||||
client->events = 0;
|
client->events = 0;
|
||||||
@@ -288,5 +279,20 @@ int kfd_smi_event_open(struct kfd_dev *dev, uint32_t *fd)
|
|||||||
list_add_rcu(&client->list, &dev->smi_clients);
|
list_add_rcu(&client->list, &dev->smi_clients);
|
||||||
spin_unlock(&dev->smi_lock);
|
spin_unlock(&dev->smi_lock);
|
||||||
|
|
||||||
|
ret = anon_inode_getfd(kfd_smi_name, &kfd_smi_ev_fops, (void *)client,
|
||||||
|
O_RDWR);
|
||||||
|
if (ret < 0) {
|
||||||
|
spin_lock(&dev->smi_lock);
|
||||||
|
list_del_rcu(&client->list);
|
||||||
|
spin_unlock(&dev->smi_lock);
|
||||||
|
|
||||||
|
synchronize_rcu();
|
||||||
|
|
||||||
|
kfifo_free(&client->fifo);
|
||||||
|
kfree(client);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
*fd = ret;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1674,6 +1674,9 @@ static bool are_stream_backends_same(
|
|||||||
if (is_timing_changed(stream_a, stream_b))
|
if (is_timing_changed(stream_a, stream_b))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (stream_a->signal != stream_b->signal)
|
||||||
|
return false;
|
||||||
|
|
||||||
if (stream_a->dpms_off != stream_b->dpms_off)
|
if (stream_a->dpms_off != stream_b->dpms_off)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|||||||
@@ -709,13 +709,13 @@ static int smu10_dpm_force_dpm_level(struct pp_hwmgr *hwmgr,
|
|||||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||||
PPSMC_MSG_SetHardMinFclkByFreq,
|
PPSMC_MSG_SetHardMinFclkByFreq,
|
||||||
hwmgr->display_config->num_display > 3 ?
|
hwmgr->display_config->num_display > 3 ?
|
||||||
data->clock_vol_info.vdd_dep_on_fclk->entries[0].clk :
|
(data->clock_vol_info.vdd_dep_on_fclk->entries[0].clk / 100) :
|
||||||
min_mclk,
|
min_mclk,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||||
PPSMC_MSG_SetHardMinSocclkByFreq,
|
PPSMC_MSG_SetHardMinSocclkByFreq,
|
||||||
data->clock_vol_info.vdd_dep_on_socclk->entries[0].clk,
|
data->clock_vol_info.vdd_dep_on_socclk->entries[0].clk / 100,
|
||||||
NULL);
|
NULL);
|
||||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||||
PPSMC_MSG_SetHardMinVcn,
|
PPSMC_MSG_SetHardMinVcn,
|
||||||
@@ -728,11 +728,11 @@ static int smu10_dpm_force_dpm_level(struct pp_hwmgr *hwmgr,
|
|||||||
NULL);
|
NULL);
|
||||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||||
PPSMC_MSG_SetSoftMaxFclkByFreq,
|
PPSMC_MSG_SetSoftMaxFclkByFreq,
|
||||||
data->clock_vol_info.vdd_dep_on_fclk->entries[index_fclk].clk,
|
data->clock_vol_info.vdd_dep_on_fclk->entries[index_fclk].clk / 100,
|
||||||
NULL);
|
NULL);
|
||||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||||
PPSMC_MSG_SetSoftMaxSocclkByFreq,
|
PPSMC_MSG_SetSoftMaxSocclkByFreq,
|
||||||
data->clock_vol_info.vdd_dep_on_socclk->entries[index_socclk].clk,
|
data->clock_vol_info.vdd_dep_on_socclk->entries[index_socclk].clk / 100,
|
||||||
NULL);
|
NULL);
|
||||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||||
PPSMC_MSG_SetSoftMaxVcn,
|
PPSMC_MSG_SetSoftMaxVcn,
|
||||||
|
|||||||
@@ -166,6 +166,12 @@ static const struct dmi_system_id orientation_data[] = {
|
|||||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "MicroPC"),
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "MicroPC"),
|
||||||
},
|
},
|
||||||
.driver_data = (void *)&lcd720x1280_rightside_up,
|
.driver_data = (void *)&lcd720x1280_rightside_up,
|
||||||
|
}, { /* GPD Win Max */
|
||||||
|
.matches = {
|
||||||
|
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "GPD"),
|
||||||
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "G1619-01"),
|
||||||
|
},
|
||||||
|
.driver_data = (void *)&lcd800x1280_rightside_up,
|
||||||
}, { /*
|
}, { /*
|
||||||
* GPD Pocket, note that the the DMI data is less generic then
|
* GPD Pocket, note that the the DMI data is less generic then
|
||||||
* it seems, devices with a board-vendor of "AMI Corporation"
|
* it seems, devices with a board-vendor of "AMI Corporation"
|
||||||
|
|||||||
@@ -553,6 +553,8 @@ static int imx_ldb_panel_ddc(struct device *dev,
|
|||||||
edidp = of_get_property(child, "edid", &edid_len);
|
edidp = of_get_property(child, "edid", &edid_len);
|
||||||
if (edidp) {
|
if (edidp) {
|
||||||
channel->edid = kmemdup(edidp, edid_len, GFP_KERNEL);
|
channel->edid = kmemdup(edidp, edid_len, GFP_KERNEL);
|
||||||
|
if (!channel->edid)
|
||||||
|
return -ENOMEM;
|
||||||
} else if (!channel->panel) {
|
} else if (!channel->panel) {
|
||||||
/* fallback to display-timings node */
|
/* fallback to display-timings node */
|
||||||
ret = of_get_drm_display_mode(child,
|
ret = of_get_drm_display_mode(child,
|
||||||
|
|||||||
@@ -70,8 +70,10 @@ static int imx_pd_connector_get_modes(struct drm_connector *connector)
|
|||||||
ret = of_get_drm_display_mode(np, &imxpd->mode,
|
ret = of_get_drm_display_mode(np, &imxpd->mode,
|
||||||
&imxpd->bus_flags,
|
&imxpd->bus_flags,
|
||||||
OF_USE_NATIVE_MODE);
|
OF_USE_NATIVE_MODE);
|
||||||
if (ret)
|
if (ret) {
|
||||||
|
drm_mode_destroy(connector->dev, mode);
|
||||||
return ret;
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
drm_mode_copy(mode, &imxpd->mode);
|
drm_mode_copy(mode, &imxpd->mode);
|
||||||
mode->type |= DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED,
|
mode->type |= DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED,
|
||||||
|
|||||||
@@ -216,6 +216,7 @@ gm20b_pmu = {
|
|||||||
.intr = gt215_pmu_intr,
|
.intr = gt215_pmu_intr,
|
||||||
.recv = gm20b_pmu_recv,
|
.recv = gm20b_pmu_recv,
|
||||||
.initmsg = gm20b_pmu_initmsg,
|
.initmsg = gm20b_pmu_initmsg,
|
||||||
|
.reset = gf100_pmu_reset,
|
||||||
};
|
};
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_ARCH_TEGRA_210_SOC)
|
#if IS_ENABLED(CONFIG_ARCH_TEGRA_210_SOC)
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
*/
|
*/
|
||||||
#include "priv.h"
|
#include "priv.h"
|
||||||
|
|
||||||
static void
|
void
|
||||||
gp102_pmu_reset(struct nvkm_pmu *pmu)
|
gp102_pmu_reset(struct nvkm_pmu *pmu)
|
||||||
{
|
{
|
||||||
struct nvkm_device *device = pmu->subdev.device;
|
struct nvkm_device *device = pmu->subdev.device;
|
||||||
|
|||||||
@@ -83,6 +83,7 @@ gp10b_pmu = {
|
|||||||
.intr = gt215_pmu_intr,
|
.intr = gt215_pmu_intr,
|
||||||
.recv = gm20b_pmu_recv,
|
.recv = gm20b_pmu_recv,
|
||||||
.initmsg = gm20b_pmu_initmsg,
|
.initmsg = gm20b_pmu_initmsg,
|
||||||
|
.reset = gp102_pmu_reset,
|
||||||
};
|
};
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_ARCH_TEGRA_210_SOC)
|
#if IS_ENABLED(CONFIG_ARCH_TEGRA_210_SOC)
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ int gt215_pmu_send(struct nvkm_pmu *, u32[2], u32, u32, u32, u32);
|
|||||||
|
|
||||||
bool gf100_pmu_enabled(struct nvkm_pmu *);
|
bool gf100_pmu_enabled(struct nvkm_pmu *);
|
||||||
void gf100_pmu_reset(struct nvkm_pmu *);
|
void gf100_pmu_reset(struct nvkm_pmu *);
|
||||||
|
void gp102_pmu_reset(struct nvkm_pmu *pmu);
|
||||||
|
|
||||||
void gk110_pmu_pgob(struct nvkm_pmu *, bool);
|
void gk110_pmu_pgob(struct nvkm_pmu *, bool);
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ config HYPERV_TIMER
|
|||||||
config HYPERV_UTILS
|
config HYPERV_UTILS
|
||||||
tristate "Microsoft Hyper-V Utilities driver"
|
tristate "Microsoft Hyper-V Utilities driver"
|
||||||
depends on HYPERV && CONNECTOR && NLS
|
depends on HYPERV && CONNECTOR && NLS
|
||||||
depends on PTP_1588_CLOCK_OPTIONAL
|
|
||||||
help
|
help
|
||||||
Select this option to enable the Hyper-V Utilities.
|
Select this option to enable the Hyper-V Utilities.
|
||||||
|
|
||||||
|
|||||||
@@ -350,7 +350,7 @@ void vmbus_channel_map_relid(struct vmbus_channel *channel)
|
|||||||
* execute:
|
* execute:
|
||||||
*
|
*
|
||||||
* (a) In the "normal (i.e., not resuming from hibernation)" path,
|
* (a) In the "normal (i.e., not resuming from hibernation)" path,
|
||||||
* the full barrier in smp_store_mb() guarantees that the store
|
* the full barrier in virt_store_mb() guarantees that the store
|
||||||
* is propagated to all CPUs before the add_channel_work work
|
* is propagated to all CPUs before the add_channel_work work
|
||||||
* is queued. In turn, add_channel_work is queued before the
|
* is queued. In turn, add_channel_work is queued before the
|
||||||
* channel's ring buffer is allocated/initialized and the
|
* channel's ring buffer is allocated/initialized and the
|
||||||
@@ -362,14 +362,14 @@ void vmbus_channel_map_relid(struct vmbus_channel *channel)
|
|||||||
* recv_int_page before retrieving the channel pointer from the
|
* recv_int_page before retrieving the channel pointer from the
|
||||||
* array of channels.
|
* array of channels.
|
||||||
*
|
*
|
||||||
* (b) In the "resuming from hibernation" path, the smp_store_mb()
|
* (b) In the "resuming from hibernation" path, the virt_store_mb()
|
||||||
* guarantees that the store is propagated to all CPUs before
|
* guarantees that the store is propagated to all CPUs before
|
||||||
* the VMBus connection is marked as ready for the resume event
|
* the VMBus connection is marked as ready for the resume event
|
||||||
* (cf. check_ready_for_resume_event()). The interrupt handler
|
* (cf. check_ready_for_resume_event()). The interrupt handler
|
||||||
* of the VMBus driver and vmbus_chan_sched() can not run before
|
* of the VMBus driver and vmbus_chan_sched() can not run before
|
||||||
* vmbus_bus_resume() has completed execution (cf. resume_noirq).
|
* vmbus_bus_resume() has completed execution (cf. resume_noirq).
|
||||||
*/
|
*/
|
||||||
smp_store_mb(
|
virt_store_mb(
|
||||||
vmbus_connection.channels[channel->offermsg.child_relid],
|
vmbus_connection.channels[channel->offermsg.child_relid],
|
||||||
channel);
|
channel);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2673,10 +2673,15 @@ static void __exit vmbus_exit(void)
|
|||||||
if (ms_hyperv.misc_features & HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE) {
|
if (ms_hyperv.misc_features & HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE) {
|
||||||
kmsg_dump_unregister(&hv_kmsg_dumper);
|
kmsg_dump_unregister(&hv_kmsg_dumper);
|
||||||
unregister_die_notifier(&hyperv_die_block);
|
unregister_die_notifier(&hyperv_die_block);
|
||||||
atomic_notifier_chain_unregister(&panic_notifier_list,
|
|
||||||
&hyperv_panic_block);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The panic notifier is always registered, hence we should
|
||||||
|
* also unconditionally unregister it here as well.
|
||||||
|
*/
|
||||||
|
atomic_notifier_chain_unregister(&panic_notifier_list,
|
||||||
|
&hyperv_panic_block);
|
||||||
|
|
||||||
free_page((unsigned long)hv_panic_page);
|
free_page((unsigned long)hv_panic_page);
|
||||||
unregister_sysctl_table(hv_ctl_table_hdr);
|
unregister_sysctl_table(hv_ctl_table_hdr);
|
||||||
hv_ctl_table_hdr = NULL;
|
hv_ctl_table_hdr = NULL;
|
||||||
|
|||||||
@@ -121,6 +121,9 @@ void hfi1_mmu_rb_unregister(struct mmu_rb_handler *handler)
|
|||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
struct list_head del_list;
|
struct list_head del_list;
|
||||||
|
|
||||||
|
/* Prevent freeing of mm until we are completely finished. */
|
||||||
|
mmgrab(handler->mn.mm);
|
||||||
|
|
||||||
/* Unregister first so we don't get any more notifications. */
|
/* Unregister first so we don't get any more notifications. */
|
||||||
mmu_notifier_unregister(&handler->mn, handler->mn.mm);
|
mmu_notifier_unregister(&handler->mn, handler->mn.mm);
|
||||||
|
|
||||||
@@ -143,6 +146,9 @@ void hfi1_mmu_rb_unregister(struct mmu_rb_handler *handler)
|
|||||||
|
|
||||||
do_remove(handler, &del_list);
|
do_remove(handler, &del_list);
|
||||||
|
|
||||||
|
/* Now the mm may be freed. */
|
||||||
|
mmdrop(handler->mn.mm);
|
||||||
|
|
||||||
kfree(handler);
|
kfree(handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -531,8 +531,10 @@ static void __cache_work_func(struct mlx5_cache_ent *ent)
|
|||||||
spin_lock_irq(&ent->lock);
|
spin_lock_irq(&ent->lock);
|
||||||
if (ent->disabled)
|
if (ent->disabled)
|
||||||
goto out;
|
goto out;
|
||||||
if (need_delay)
|
if (need_delay) {
|
||||||
queue_delayed_work(cache->wq, &ent->dwork, 300 * HZ);
|
queue_delayed_work(cache->wq, &ent->dwork, 300 * HZ);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
remove_cache_mr_locked(ent);
|
remove_cache_mr_locked(ent);
|
||||||
queue_adjust_cache_locked(ent);
|
queue_adjust_cache_locked(ent);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3241,7 +3241,11 @@ serr_no_r_lock:
|
|||||||
spin_lock_irqsave(&sqp->s_lock, flags);
|
spin_lock_irqsave(&sqp->s_lock, flags);
|
||||||
rvt_send_complete(sqp, wqe, send_status);
|
rvt_send_complete(sqp, wqe, send_status);
|
||||||
if (sqp->ibqp.qp_type == IB_QPT_RC) {
|
if (sqp->ibqp.qp_type == IB_QPT_RC) {
|
||||||
int lastwqe = rvt_error_qp(sqp, IB_WC_WR_FLUSH_ERR);
|
int lastwqe;
|
||||||
|
|
||||||
|
spin_lock(&sqp->r_lock);
|
||||||
|
lastwqe = rvt_error_qp(sqp, IB_WC_WR_FLUSH_ERR);
|
||||||
|
spin_unlock(&sqp->r_lock);
|
||||||
|
|
||||||
sqp->s_flags &= ~RVT_S_BUSY;
|
sqp->s_flags &= ~RVT_S_BUSY;
|
||||||
spin_unlock_irqrestore(&sqp->s_lock, flags);
|
spin_unlock_irqrestore(&sqp->s_lock, flags);
|
||||||
|
|||||||
@@ -1368,6 +1368,7 @@ static irqreturn_t arm_smmu_evtq_thread(int irq, void *dev)
|
|||||||
dev_info(smmu->dev, "\t0x%016llx\n",
|
dev_info(smmu->dev, "\t0x%016llx\n",
|
||||||
(unsigned long long)evt[i]);
|
(unsigned long long)evt[i]);
|
||||||
|
|
||||||
|
cond_resched();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -1665,7 +1665,7 @@ static struct iommu_device *omap_iommu_probe_device(struct device *dev)
|
|||||||
num_iommus = of_property_count_elems_of_size(dev->of_node, "iommus",
|
num_iommus = of_property_count_elems_of_size(dev->of_node, "iommus",
|
||||||
sizeof(phandle));
|
sizeof(phandle));
|
||||||
if (num_iommus < 0)
|
if (num_iommus < 0)
|
||||||
return 0;
|
return ERR_PTR(-ENODEV);
|
||||||
|
|
||||||
arch_data = kcalloc(num_iommus + 1, sizeof(*arch_data), GFP_KERNEL);
|
arch_data = kcalloc(num_iommus + 1, sizeof(*arch_data), GFP_KERNEL);
|
||||||
if (!arch_data)
|
if (!arch_data)
|
||||||
|
|||||||
@@ -198,11 +198,11 @@ static inline void __iomem *gic_dist_base(struct irq_data *d)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gic_do_wait_for_rwp(void __iomem *base)
|
static void gic_do_wait_for_rwp(void __iomem *base, u32 bit)
|
||||||
{
|
{
|
||||||
u32 count = 1000000; /* 1s! */
|
u32 count = 1000000; /* 1s! */
|
||||||
|
|
||||||
while (readl_relaxed(base + GICD_CTLR) & GICD_CTLR_RWP) {
|
while (readl_relaxed(base + GICD_CTLR) & bit) {
|
||||||
count--;
|
count--;
|
||||||
if (!count) {
|
if (!count) {
|
||||||
pr_err_ratelimited("RWP timeout, gone fishing\n");
|
pr_err_ratelimited("RWP timeout, gone fishing\n");
|
||||||
@@ -216,13 +216,13 @@ static void gic_do_wait_for_rwp(void __iomem *base)
|
|||||||
/* Wait for completion of a distributor change */
|
/* Wait for completion of a distributor change */
|
||||||
static void gic_dist_wait_for_rwp(void)
|
static void gic_dist_wait_for_rwp(void)
|
||||||
{
|
{
|
||||||
gic_do_wait_for_rwp(gic_data.dist_base);
|
gic_do_wait_for_rwp(gic_data.dist_base, GICD_CTLR_RWP);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Wait for completion of a redistributor change */
|
/* Wait for completion of a redistributor change */
|
||||||
static void gic_redist_wait_for_rwp(void)
|
static void gic_redist_wait_for_rwp(void)
|
||||||
{
|
{
|
||||||
gic_do_wait_for_rwp(gic_data_rdist_rd_base());
|
gic_do_wait_for_rwp(gic_data_rdist_rd_base(), GICR_CTLR_RWP);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_ARM64
|
#ifdef CONFIG_ARM64
|
||||||
@@ -1487,6 +1487,12 @@ static int gic_irq_domain_translate(struct irq_domain *d,
|
|||||||
if(fwspec->param_count != 2)
|
if(fwspec->param_count != 2)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (fwspec->param[0] < 16) {
|
||||||
|
pr_err(FW_BUG "Illegal GSI%d translation request\n",
|
||||||
|
fwspec->param[0]);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
*hwirq = fwspec->param[0];
|
*hwirq = fwspec->param[0];
|
||||||
*type = fwspec->param[1];
|
*type = fwspec->param[1];
|
||||||
|
|
||||||
|
|||||||
@@ -1094,6 +1094,12 @@ static int gic_irq_domain_translate(struct irq_domain *d,
|
|||||||
if(fwspec->param_count != 2)
|
if(fwspec->param_count != 2)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (fwspec->param[0] < 16) {
|
||||||
|
pr_err(FW_BUG "Illegal GSI%d translation request\n",
|
||||||
|
fwspec->param[0]);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
*hwirq = fwspec->param[0];
|
*hwirq = fwspec->param[0];
|
||||||
*type = fwspec->param[1];
|
*type = fwspec->param[1];
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
#include <linux/dm-ioctl.h>
|
#include <linux/dm-ioctl.h>
|
||||||
#include <linux/hdreg.h>
|
#include <linux/hdreg.h>
|
||||||
#include <linux/compat.h>
|
#include <linux/compat.h>
|
||||||
|
#include <linux/nospec.h>
|
||||||
|
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
|
|
||||||
@@ -1696,6 +1697,7 @@ static ioctl_fn lookup_ioctl(unsigned int cmd, int *ioctl_flags)
|
|||||||
if (unlikely(cmd >= ARRAY_SIZE(_ioctls)))
|
if (unlikely(cmd >= ARRAY_SIZE(_ioctls)))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
cmd = array_index_nospec(cmd, ARRAY_SIZE(_ioctls));
|
||||||
*ioctl_flags = _ioctls[cmd].flags;
|
*ioctl_flags = _ioctls[cmd].flags;
|
||||||
return _ioctls[cmd].fn;
|
return _ioctls[cmd].fn;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -492,8 +492,13 @@ static blk_status_t dm_mq_queue_rq(struct blk_mq_hw_ctx *hctx,
|
|||||||
|
|
||||||
if (unlikely(!ti)) {
|
if (unlikely(!ti)) {
|
||||||
int srcu_idx;
|
int srcu_idx;
|
||||||
struct dm_table *map = dm_get_live_table(md, &srcu_idx);
|
struct dm_table *map;
|
||||||
|
|
||||||
|
map = dm_get_live_table(md, &srcu_idx);
|
||||||
|
if (unlikely(!map)) {
|
||||||
|
dm_put_live_table(md, srcu_idx);
|
||||||
|
return BLK_STS_RESOURCE;
|
||||||
|
}
|
||||||
ti = dm_table_find_target(map, 0);
|
ti = dm_table_find_target(map, 0);
|
||||||
dm_put_live_table(md, srcu_idx);
|
dm_put_live_table(md, srcu_idx);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1696,15 +1696,10 @@ static blk_qc_t dm_submit_bio(struct bio *bio)
|
|||||||
struct dm_table *map;
|
struct dm_table *map;
|
||||||
|
|
||||||
map = dm_get_live_table(md, &srcu_idx);
|
map = dm_get_live_table(md, &srcu_idx);
|
||||||
if (unlikely(!map)) {
|
|
||||||
DMERR_LIMIT("%s: mapping table unavailable, erroring io",
|
|
||||||
dm_device_name(md));
|
|
||||||
bio_io_error(bio);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If suspended, queue this IO for later */
|
/* If suspended, or map not yet available, queue this IO for later */
|
||||||
if (unlikely(test_bit(DMF_BLOCK_IO_FOR_SUSPEND, &md->flags))) {
|
if (unlikely(test_bit(DMF_BLOCK_IO_FOR_SUSPEND, &md->flags)) ||
|
||||||
|
unlikely(!map)) {
|
||||||
if (bio->bi_opf & REQ_NOWAIT)
|
if (bio->bi_opf & REQ_NOWAIT)
|
||||||
bio_wouldblock_error(bio);
|
bio_wouldblock_error(bio);
|
||||||
else if (bio->bi_opf & REQ_RAHEAD)
|
else if (bio->bi_opf & REQ_RAHEAD)
|
||||||
|
|||||||
@@ -62,8 +62,8 @@ static int sdmmc_idma_validate_data(struct mmci_host *host,
|
|||||||
* excepted the last element which has no constraint on idmasize
|
* excepted the last element which has no constraint on idmasize
|
||||||
*/
|
*/
|
||||||
for_each_sg(data->sg, sg, data->sg_len - 1, i) {
|
for_each_sg(data->sg, sg, data->sg_len - 1, i) {
|
||||||
if (!IS_ALIGNED(data->sg->offset, sizeof(u32)) ||
|
if (!IS_ALIGNED(sg->offset, sizeof(u32)) ||
|
||||||
!IS_ALIGNED(data->sg->length, SDMMC_IDMA_BURST)) {
|
!IS_ALIGNED(sg->length, SDMMC_IDMA_BURST)) {
|
||||||
dev_err(mmc_dev(host->mmc),
|
dev_err(mmc_dev(host->mmc),
|
||||||
"unaligned scatterlist: ofst:%x length:%d\n",
|
"unaligned scatterlist: ofst:%x length:%d\n",
|
||||||
data->sg->offset, data->sg->length);
|
data->sg->offset, data->sg->length);
|
||||||
@@ -71,7 +71,7 @@ static int sdmmc_idma_validate_data(struct mmci_host *host,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!IS_ALIGNED(data->sg->offset, sizeof(u32))) {
|
if (!IS_ALIGNED(sg->offset, sizeof(u32))) {
|
||||||
dev_err(mmc_dev(host->mmc),
|
dev_err(mmc_dev(host->mmc),
|
||||||
"unaligned last scatterlist: ofst:%x length:%d\n",
|
"unaligned last scatterlist: ofst:%x length:%d\n",
|
||||||
data->sg->offset, data->sg->length);
|
data->sg->offset, data->sg->length);
|
||||||
|
|||||||
@@ -390,10 +390,10 @@ static void renesas_sdhi_hs400_complete(struct mmc_host *mmc)
|
|||||||
SH_MOBILE_SDHI_SCC_TMPPORT2_HS400OSEL) |
|
SH_MOBILE_SDHI_SCC_TMPPORT2_HS400OSEL) |
|
||||||
sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2));
|
sd_scc_read32(host, priv, SH_MOBILE_SDHI_SCC_TMPPORT2));
|
||||||
|
|
||||||
/* Set the sampling clock selection range of HS400 mode */
|
|
||||||
sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_DTCNTL,
|
sd_scc_write32(host, priv, SH_MOBILE_SDHI_SCC_DTCNTL,
|
||||||
SH_MOBILE_SDHI_SCC_DTCNTL_TAPEN |
|
SH_MOBILE_SDHI_SCC_DTCNTL_TAPEN |
|
||||||
0x4 << SH_MOBILE_SDHI_SCC_DTCNTL_TAPNUM_SHIFT);
|
sd_scc_read32(host, priv,
|
||||||
|
SH_MOBILE_SDHI_SCC_DTCNTL));
|
||||||
|
|
||||||
/* Avoid bad TAP */
|
/* Avoid bad TAP */
|
||||||
if (bad_taps & BIT(priv->tap_set)) {
|
if (bad_taps & BIT(priv->tap_set)) {
|
||||||
|
|||||||
@@ -240,16 +240,6 @@ static void xenon_voltage_switch(struct sdhci_host *host)
|
|||||||
{
|
{
|
||||||
/* Wait for 5ms after set 1.8V signal enable bit */
|
/* Wait for 5ms after set 1.8V signal enable bit */
|
||||||
usleep_range(5000, 5500);
|
usleep_range(5000, 5500);
|
||||||
|
|
||||||
/*
|
|
||||||
* For some reason the controller's Host Control2 register reports
|
|
||||||
* the bit representing 1.8V signaling as 0 when read after it was
|
|
||||||
* written as 1. Subsequent read reports 1.
|
|
||||||
*
|
|
||||||
* Since this may cause some issues, do an empty read of the Host
|
|
||||||
* Control2 register here to circumvent this.
|
|
||||||
*/
|
|
||||||
sdhci_readw(host, SDHCI_HOST_CONTROL2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct sdhci_ops sdhci_xenon_ops = {
|
static const struct sdhci_ops sdhci_xenon_ops = {
|
||||||
|
|||||||
@@ -569,7 +569,8 @@ struct nqe_cn {
|
|||||||
#define BNXT_MAX_MTU 9500
|
#define BNXT_MAX_MTU 9500
|
||||||
#define BNXT_MAX_PAGE_MODE_MTU \
|
#define BNXT_MAX_PAGE_MODE_MTU \
|
||||||
((unsigned int)PAGE_SIZE - VLAN_ETH_HLEN - NET_IP_ALIGN - \
|
((unsigned int)PAGE_SIZE - VLAN_ETH_HLEN - NET_IP_ALIGN - \
|
||||||
XDP_PACKET_HEADROOM)
|
XDP_PACKET_HEADROOM - \
|
||||||
|
SKB_DATA_ALIGN((unsigned int)sizeof(struct skb_shared_info)))
|
||||||
|
|
||||||
#define BNXT_MIN_PKT_SIZE 52
|
#define BNXT_MIN_PKT_SIZE 52
|
||||||
|
|
||||||
|
|||||||
@@ -2041,9 +2041,7 @@ static int bnxt_set_pauseparam(struct net_device *dev,
|
|||||||
}
|
}
|
||||||
|
|
||||||
link_info->autoneg |= BNXT_AUTONEG_FLOW_CTRL;
|
link_info->autoneg |= BNXT_AUTONEG_FLOW_CTRL;
|
||||||
if (bp->hwrm_spec_code >= 0x10201)
|
link_info->req_flow_ctrl = 0;
|
||||||
link_info->req_flow_ctrl =
|
|
||||||
PORT_PHY_CFG_REQ_AUTO_PAUSE_AUTONEG_PAUSE;
|
|
||||||
} else {
|
} else {
|
||||||
/* when transition from auto pause to force pause,
|
/* when transition from auto pause to force pause,
|
||||||
* force a link change
|
* force a link change
|
||||||
|
|||||||
@@ -168,7 +168,7 @@ static int dpaa2_ptp_probe(struct fsl_mc_device *mc_dev)
|
|||||||
base = of_iomap(node, 0);
|
base = of_iomap(node, 0);
|
||||||
if (!base) {
|
if (!base) {
|
||||||
err = -ENOMEM;
|
err = -ENOMEM;
|
||||||
goto err_close;
|
goto err_put;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = fsl_mc_allocate_irqs(mc_dev);
|
err = fsl_mc_allocate_irqs(mc_dev);
|
||||||
@@ -212,6 +212,8 @@ err_free_mc_irq:
|
|||||||
fsl_mc_free_irqs(mc_dev);
|
fsl_mc_free_irqs(mc_dev);
|
||||||
err_unmap:
|
err_unmap:
|
||||||
iounmap(base);
|
iounmap(base);
|
||||||
|
err_put:
|
||||||
|
of_node_put(node);
|
||||||
err_close:
|
err_close:
|
||||||
dprtc_close(mc_dev->mc_io, 0, mc_dev->mc_handle);
|
dprtc_close(mc_dev->mc_io, 0, mc_dev->mc_handle);
|
||||||
err_free_mcp:
|
err_free_mcp:
|
||||||
|
|||||||
@@ -498,7 +498,7 @@ static inline struct ice_pf *ice_netdev_to_pf(struct net_device *netdev)
|
|||||||
|
|
||||||
static inline bool ice_is_xdp_ena_vsi(struct ice_vsi *vsi)
|
static inline bool ice_is_xdp_ena_vsi(struct ice_vsi *vsi)
|
||||||
{
|
{
|
||||||
return !!vsi->xdp_prog;
|
return !!READ_ONCE(vsi->xdp_prog);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void ice_set_ring_xdp(struct ice_ring *ring)
|
static inline void ice_set_ring_xdp(struct ice_ring *ring)
|
||||||
|
|||||||
@@ -1265,6 +1265,7 @@ static int ice_vsi_alloc_rings(struct ice_vsi *vsi)
|
|||||||
ring->vsi = vsi;
|
ring->vsi = vsi;
|
||||||
ring->dev = dev;
|
ring->dev = dev;
|
||||||
ring->count = vsi->num_tx_desc;
|
ring->count = vsi->num_tx_desc;
|
||||||
|
ring->txq_teid = ICE_INVAL_TEID;
|
||||||
WRITE_ONCE(vsi->tx_rings[i], ring);
|
WRITE_ONCE(vsi->tx_rings[i], ring);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2667,6 +2668,8 @@ int ice_vsi_release(struct ice_vsi *vsi)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ice_is_vsi_dflt_vsi(pf->first_sw, vsi))
|
||||||
|
ice_clear_dflt_vsi(pf->first_sw);
|
||||||
ice_fltr_remove_all(vsi);
|
ice_fltr_remove_all(vsi);
|
||||||
ice_rm_vsi_lan_cfg(vsi->port_info, vsi->idx);
|
ice_rm_vsi_lan_cfg(vsi->port_info, vsi->idx);
|
||||||
ice_vsi_delete(vsi);
|
ice_vsi_delete(vsi);
|
||||||
|
|||||||
@@ -2475,8 +2475,10 @@ free_qmap:
|
|||||||
|
|
||||||
for (i = 0; i < vsi->num_xdp_txq; i++)
|
for (i = 0; i < vsi->num_xdp_txq; i++)
|
||||||
if (vsi->xdp_rings[i]) {
|
if (vsi->xdp_rings[i]) {
|
||||||
if (vsi->xdp_rings[i]->desc)
|
if (vsi->xdp_rings[i]->desc) {
|
||||||
|
synchronize_rcu();
|
||||||
ice_free_tx_ring(vsi->xdp_rings[i]);
|
ice_free_tx_ring(vsi->xdp_rings[i]);
|
||||||
|
}
|
||||||
kfree_rcu(vsi->xdp_rings[i], rcu);
|
kfree_rcu(vsi->xdp_rings[i], rcu);
|
||||||
vsi->xdp_rings[i] = NULL;
|
vsi->xdp_rings[i] = NULL;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2723,9 +2723,9 @@ static int ice_vc_dis_qs_msg(struct ice_vf *vf, u8 *msg)
|
|||||||
goto error_param;
|
goto error_param;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Skip queue if not enabled */
|
|
||||||
if (!test_bit(vf_q_id, vf->txq_ena))
|
if (!test_bit(vf_q_id, vf->txq_ena))
|
||||||
continue;
|
dev_dbg(ice_pf_to_dev(vsi->back), "Queue %u on VSI %u is not enabled, but stopping it anyway\n",
|
||||||
|
vf_q_id, vsi->vsi_num);
|
||||||
|
|
||||||
ice_fill_txq_meta(vsi, ring, &txq_meta);
|
ice_fill_txq_meta(vsi, ring, &txq_meta);
|
||||||
|
|
||||||
|
|||||||
@@ -36,8 +36,10 @@ static void ice_qp_reset_stats(struct ice_vsi *vsi, u16 q_idx)
|
|||||||
static void ice_qp_clean_rings(struct ice_vsi *vsi, u16 q_idx)
|
static void ice_qp_clean_rings(struct ice_vsi *vsi, u16 q_idx)
|
||||||
{
|
{
|
||||||
ice_clean_tx_ring(vsi->tx_rings[q_idx]);
|
ice_clean_tx_ring(vsi->tx_rings[q_idx]);
|
||||||
if (ice_is_xdp_ena_vsi(vsi))
|
if (ice_is_xdp_ena_vsi(vsi)) {
|
||||||
|
synchronize_rcu();
|
||||||
ice_clean_tx_ring(vsi->xdp_rings[q_idx]);
|
ice_clean_tx_ring(vsi->xdp_rings[q_idx]);
|
||||||
|
}
|
||||||
ice_clean_rx_ring(vsi->rx_rings[q_idx]);
|
ice_clean_rx_ring(vsi->rx_rings[q_idx]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -752,6 +752,9 @@ qede_build_skb(struct qede_rx_queue *rxq,
|
|||||||
buf = page_address(bd->data) + bd->page_offset;
|
buf = page_address(bd->data) + bd->page_offset;
|
||||||
skb = build_skb(buf, rxq->rx_buf_seg_size);
|
skb = build_skb(buf, rxq->rx_buf_seg_size);
|
||||||
|
|
||||||
|
if (unlikely(!skb))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
skb_reserve(skb, pad);
|
skb_reserve(skb, pad);
|
||||||
skb_put(skb, len);
|
skb_put(skb, len);
|
||||||
|
|
||||||
|
|||||||
@@ -166,6 +166,9 @@ static void efx_fini_rx_recycle_ring(struct efx_rx_queue *rx_queue)
|
|||||||
struct efx_nic *efx = rx_queue->efx;
|
struct efx_nic *efx = rx_queue->efx;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
if (unlikely(!rx_queue->page_ring))
|
||||||
|
return;
|
||||||
|
|
||||||
/* Unmap and release the pages in the recycle ring. Remove the ring. */
|
/* Unmap and release the pages in the recycle ring. Remove the ring. */
|
||||||
for (i = 0; i <= rx_queue->page_ptr_mask; i++) {
|
for (i = 0; i <= rx_queue->page_ptr_mask; i++) {
|
||||||
struct page *page = rx_queue->page_ring[i];
|
struct page *page = rx_queue->page_ring[i];
|
||||||
|
|||||||
@@ -432,8 +432,7 @@ stmmac_probe_config_dt(struct platform_device *pdev, const char **mac)
|
|||||||
plat->phylink_node = np;
|
plat->phylink_node = np;
|
||||||
|
|
||||||
/* Get max speed of operation from device tree */
|
/* Get max speed of operation from device tree */
|
||||||
if (of_property_read_u32(np, "max-speed", &plat->max_speed))
|
of_property_read_u32(np, "max-speed", &plat->max_speed);
|
||||||
plat->max_speed = -1;
|
|
||||||
|
|
||||||
plat->bus_id = of_alias_get_id(np, "ethernet");
|
plat->bus_id = of_alias_get_id(np, "ethernet");
|
||||||
if (plat->bus_id < 0)
|
if (plat->bus_id < 0)
|
||||||
|
|||||||
@@ -133,11 +133,17 @@ static void macvtap_setup(struct net_device *dev)
|
|||||||
dev->tx_queue_len = TUN_READQ_SIZE;
|
dev->tx_queue_len = TUN_READQ_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct net *macvtap_link_net(const struct net_device *dev)
|
||||||
|
{
|
||||||
|
return dev_net(macvlan_dev_real_dev(dev));
|
||||||
|
}
|
||||||
|
|
||||||
static struct rtnl_link_ops macvtap_link_ops __read_mostly = {
|
static struct rtnl_link_ops macvtap_link_ops __read_mostly = {
|
||||||
.kind = "macvtap",
|
.kind = "macvtap",
|
||||||
.setup = macvtap_setup,
|
.setup = macvtap_setup,
|
||||||
.newlink = macvtap_newlink,
|
.newlink = macvtap_newlink,
|
||||||
.dellink = macvtap_dellink,
|
.dellink = macvtap_dellink,
|
||||||
|
.get_link_net = macvtap_link_net,
|
||||||
.priv_size = sizeof(struct macvtap_dev),
|
.priv_size = sizeof(struct macvtap_dev),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -76,6 +76,9 @@ static int mscc_miim_read(struct mii_bus *bus, int mii_id, int regnum)
|
|||||||
u32 val;
|
u32 val;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (regnum & MII_ADDR_C45)
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
ret = mscc_miim_wait_pending(bus);
|
ret = mscc_miim_wait_pending(bus);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out;
|
goto out;
|
||||||
@@ -105,6 +108,9 @@ static int mscc_miim_write(struct mii_bus *bus, int mii_id,
|
|||||||
struct mscc_miim_dev *miim = bus->priv;
|
struct mscc_miim_dev *miim = bus->priv;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (regnum & MII_ADDR_C45)
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
ret = mscc_miim_wait_pending(bus);
|
ret = mscc_miim_wait_pending(bus);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|||||||
@@ -74,6 +74,12 @@ static const struct sfp_quirk sfp_quirks[] = {
|
|||||||
.vendor = "HUAWEI",
|
.vendor = "HUAWEI",
|
||||||
.part = "MA5671A",
|
.part = "MA5671A",
|
||||||
.modes = sfp_quirk_2500basex,
|
.modes = sfp_quirk_2500basex,
|
||||||
|
}, {
|
||||||
|
// Lantech 8330-262D-E can operate at 2500base-X, but
|
||||||
|
// incorrectly report 2500MBd NRZ in their EEPROM
|
||||||
|
.vendor = "Lantech",
|
||||||
|
.part = "8330-262D-E",
|
||||||
|
.modes = sfp_quirk_2500basex,
|
||||||
}, {
|
}, {
|
||||||
.vendor = "UBNT",
|
.vendor = "UBNT",
|
||||||
.part = "UF-INSTANT",
|
.part = "UF-INSTANT",
|
||||||
|
|||||||
@@ -1202,7 +1202,8 @@ static int tap_sendmsg(struct socket *sock, struct msghdr *m,
|
|||||||
struct xdp_buff *xdp;
|
struct xdp_buff *xdp;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (ctl && (ctl->type == TUN_MSG_PTR)) {
|
if (m->msg_controllen == sizeof(struct tun_msg_ctl) &&
|
||||||
|
ctl && ctl->type == TUN_MSG_PTR) {
|
||||||
for (i = 0; i < ctl->num; i++) {
|
for (i = 0; i < ctl->num; i++) {
|
||||||
xdp = &((struct xdp_buff *)ctl->ptr)[i];
|
xdp = &((struct xdp_buff *)ctl->ptr)[i];
|
||||||
tap_get_user_xdp(q, xdp);
|
tap_get_user_xdp(q, xdp);
|
||||||
|
|||||||
@@ -2499,7 +2499,8 @@ static int tun_sendmsg(struct socket *sock, struct msghdr *m, size_t total_len)
|
|||||||
if (!tun)
|
if (!tun)
|
||||||
return -EBADFD;
|
return -EBADFD;
|
||||||
|
|
||||||
if (ctl && (ctl->type == TUN_MSG_PTR)) {
|
if (m->msg_controllen == sizeof(struct tun_msg_ctl) &&
|
||||||
|
ctl && ctl->type == TUN_MSG_PTR) {
|
||||||
struct tun_page tpage;
|
struct tun_page tpage;
|
||||||
int n = ctl->num;
|
int n = ctl->num;
|
||||||
int flush = 0;
|
int flush = 0;
|
||||||
|
|||||||
@@ -366,6 +366,8 @@ static void ath11k_ahb_free_ext_irq(struct ath11k_base *ab)
|
|||||||
|
|
||||||
for (j = 0; j < irq_grp->num_irq; j++)
|
for (j = 0; j < irq_grp->num_irq; j++)
|
||||||
free_irq(ab->irq_num[irq_grp->irqs[j]], irq_grp);
|
free_irq(ab->irq_num[irq_grp->irqs[j]], irq_grp);
|
||||||
|
|
||||||
|
netif_napi_del(&irq_grp->napi);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -402,7 +402,7 @@ static int ath11k_mhi_set_state(struct ath11k_pci *ab_pci,
|
|||||||
ret = 0;
|
ret = 0;
|
||||||
break;
|
break;
|
||||||
case ATH11K_MHI_POWER_ON:
|
case ATH11K_MHI_POWER_ON:
|
||||||
ret = mhi_async_power_up(ab_pci->mhi_ctrl);
|
ret = mhi_sync_power_up(ab_pci->mhi_ctrl);
|
||||||
break;
|
break;
|
||||||
case ATH11K_MHI_POWER_OFF:
|
case ATH11K_MHI_POWER_OFF:
|
||||||
mhi_power_down(ab_pci->mhi_ctrl, true);
|
mhi_power_down(ab_pci->mhi_ctrl, true);
|
||||||
|
|||||||
@@ -746,6 +746,9 @@ ath5k_eeprom_convert_pcal_info_5111(struct ath5k_hw *ah, int mode,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (idx == AR5K_EEPROM_N_PD_CURVES)
|
||||||
|
goto err_out;
|
||||||
|
|
||||||
ee->ee_pd_gains[mode] = 1;
|
ee->ee_pd_gains[mode] = 1;
|
||||||
|
|
||||||
pd = &chinfo[pier].pd_curves[idx];
|
pd = &chinfo[pier].pd_curves[idx];
|
||||||
|
|||||||
@@ -1706,7 +1706,10 @@ static u8 iwl_mvm_scan_umac_chan_flags_v2(struct iwl_mvm *mvm,
|
|||||||
IWL_SCAN_CHANNEL_FLAG_CACHE_ADD;
|
IWL_SCAN_CHANNEL_FLAG_CACHE_ADD;
|
||||||
|
|
||||||
/* set fragmented ebs for fragmented scan on HB channels */
|
/* set fragmented ebs for fragmented scan on HB channels */
|
||||||
if (iwl_mvm_is_scan_fragmented(params->hb_type))
|
if ((!iwl_mvm_is_cdb_supported(mvm) &&
|
||||||
|
iwl_mvm_is_scan_fragmented(params->type)) ||
|
||||||
|
(iwl_mvm_is_cdb_supported(mvm) &&
|
||||||
|
iwl_mvm_is_scan_fragmented(params->hb_type)))
|
||||||
flags |= IWL_SCAN_CHANNEL_FLAG_EBS_FRAG;
|
flags |= IWL_SCAN_CHANNEL_FLAG_EBS_FRAG;
|
||||||
|
|
||||||
return flags;
|
return flags;
|
||||||
|
|||||||
@@ -455,6 +455,7 @@ mt76_dma_rx_fill(struct mt76_dev *dev, struct mt76_queue *q)
|
|||||||
|
|
||||||
qbuf.addr = addr + offset;
|
qbuf.addr = addr + offset;
|
||||||
qbuf.len = len - offset;
|
qbuf.len = len - offset;
|
||||||
|
qbuf.skip_unmap = false;
|
||||||
mt76_dma_add_buf(dev, q, &qbuf, 1, 0, buf, NULL);
|
mt76_dma_add_buf(dev, q, &qbuf, 1, 0, buf, NULL);
|
||||||
frames++;
|
frames++;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1626,7 +1626,7 @@ mt7615_mac_adjust_sensitivity(struct mt7615_phy *phy,
|
|||||||
struct mt7615_dev *dev = phy->dev;
|
struct mt7615_dev *dev = phy->dev;
|
||||||
int false_cca = ofdm ? phy->false_cca_ofdm : phy->false_cca_cck;
|
int false_cca = ofdm ? phy->false_cca_ofdm : phy->false_cca_cck;
|
||||||
bool ext_phy = phy != &dev->phy;
|
bool ext_phy = phy != &dev->phy;
|
||||||
u16 def_th = ofdm ? -98 : -110;
|
s16 def_th = ofdm ? -98 : -110;
|
||||||
bool update = false;
|
bool update = false;
|
||||||
s8 *sensitivity;
|
s8 *sensitivity;
|
||||||
int signal;
|
int signal;
|
||||||
|
|||||||
@@ -142,9 +142,8 @@ struct dino_device
|
|||||||
{
|
{
|
||||||
struct pci_hba_data hba; /* 'C' inheritance - must be first */
|
struct pci_hba_data hba; /* 'C' inheritance - must be first */
|
||||||
spinlock_t dinosaur_pen;
|
spinlock_t dinosaur_pen;
|
||||||
unsigned long txn_addr; /* EIR addr to generate interrupt */
|
|
||||||
u32 txn_data; /* EIR data assign to each dino */
|
|
||||||
u32 imr; /* IRQ's which are enabled */
|
u32 imr; /* IRQ's which are enabled */
|
||||||
|
struct gsc_irq gsc_irq;
|
||||||
int global_irq[DINO_LOCAL_IRQS]; /* map IMR bit to global irq */
|
int global_irq[DINO_LOCAL_IRQS]; /* map IMR bit to global irq */
|
||||||
#ifdef DINO_DEBUG
|
#ifdef DINO_DEBUG
|
||||||
unsigned int dino_irr0; /* save most recent IRQ line stat */
|
unsigned int dino_irr0; /* save most recent IRQ line stat */
|
||||||
@@ -339,14 +338,43 @@ static void dino_unmask_irq(struct irq_data *d)
|
|||||||
if (tmp & DINO_MASK_IRQ(local_irq)) {
|
if (tmp & DINO_MASK_IRQ(local_irq)) {
|
||||||
DBG(KERN_WARNING "%s(): IRQ asserted! (ILR 0x%x)\n",
|
DBG(KERN_WARNING "%s(): IRQ asserted! (ILR 0x%x)\n",
|
||||||
__func__, tmp);
|
__func__, tmp);
|
||||||
gsc_writel(dino_dev->txn_data, dino_dev->txn_addr);
|
gsc_writel(dino_dev->gsc_irq.txn_data, dino_dev->gsc_irq.txn_addr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
static int dino_set_affinity_irq(struct irq_data *d, const struct cpumask *dest,
|
||||||
|
bool force)
|
||||||
|
{
|
||||||
|
struct dino_device *dino_dev = irq_data_get_irq_chip_data(d);
|
||||||
|
struct cpumask tmask;
|
||||||
|
int cpu_irq;
|
||||||
|
u32 eim;
|
||||||
|
|
||||||
|
if (!cpumask_and(&tmask, dest, cpu_online_mask))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
cpu_irq = cpu_check_affinity(d, &tmask);
|
||||||
|
if (cpu_irq < 0)
|
||||||
|
return cpu_irq;
|
||||||
|
|
||||||
|
dino_dev->gsc_irq.txn_addr = txn_affinity_addr(d->irq, cpu_irq);
|
||||||
|
eim = ((u32) dino_dev->gsc_irq.txn_addr) | dino_dev->gsc_irq.txn_data;
|
||||||
|
__raw_writel(eim, dino_dev->hba.base_addr+DINO_IAR0);
|
||||||
|
|
||||||
|
irq_data_update_effective_affinity(d, &tmask);
|
||||||
|
|
||||||
|
return IRQ_SET_MASK_OK;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static struct irq_chip dino_interrupt_type = {
|
static struct irq_chip dino_interrupt_type = {
|
||||||
.name = "GSC-PCI",
|
.name = "GSC-PCI",
|
||||||
.irq_unmask = dino_unmask_irq,
|
.irq_unmask = dino_unmask_irq,
|
||||||
.irq_mask = dino_mask_irq,
|
.irq_mask = dino_mask_irq,
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
.irq_set_affinity = dino_set_affinity_irq,
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -806,7 +834,6 @@ static int __init dino_common_init(struct parisc_device *dev,
|
|||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
u32 eim;
|
u32 eim;
|
||||||
struct gsc_irq gsc_irq;
|
|
||||||
struct resource *res;
|
struct resource *res;
|
||||||
|
|
||||||
pcibios_register_hba(&dino_dev->hba);
|
pcibios_register_hba(&dino_dev->hba);
|
||||||
@@ -821,10 +848,8 @@ static int __init dino_common_init(struct parisc_device *dev,
|
|||||||
** still only has 11 IRQ input lines - just map some of them
|
** still only has 11 IRQ input lines - just map some of them
|
||||||
** to a different processor.
|
** to a different processor.
|
||||||
*/
|
*/
|
||||||
dev->irq = gsc_alloc_irq(&gsc_irq);
|
dev->irq = gsc_alloc_irq(&dino_dev->gsc_irq);
|
||||||
dino_dev->txn_addr = gsc_irq.txn_addr;
|
eim = ((u32) dino_dev->gsc_irq.txn_addr) | dino_dev->gsc_irq.txn_data;
|
||||||
dino_dev->txn_data = gsc_irq.txn_data;
|
|
||||||
eim = ((u32) gsc_irq.txn_addr) | gsc_irq.txn_data;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Dino needs a PA "IRQ" to get a processor's attention.
|
** Dino needs a PA "IRQ" to get a processor's attention.
|
||||||
|
|||||||
@@ -135,10 +135,41 @@ static void gsc_asic_unmask_irq(struct irq_data *d)
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
static int gsc_set_affinity_irq(struct irq_data *d, const struct cpumask *dest,
|
||||||
|
bool force)
|
||||||
|
{
|
||||||
|
struct gsc_asic *gsc_dev = irq_data_get_irq_chip_data(d);
|
||||||
|
struct cpumask tmask;
|
||||||
|
int cpu_irq;
|
||||||
|
|
||||||
|
if (!cpumask_and(&tmask, dest, cpu_online_mask))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
cpu_irq = cpu_check_affinity(d, &tmask);
|
||||||
|
if (cpu_irq < 0)
|
||||||
|
return cpu_irq;
|
||||||
|
|
||||||
|
gsc_dev->gsc_irq.txn_addr = txn_affinity_addr(d->irq, cpu_irq);
|
||||||
|
gsc_dev->eim = ((u32) gsc_dev->gsc_irq.txn_addr) | gsc_dev->gsc_irq.txn_data;
|
||||||
|
|
||||||
|
/* switch IRQ's for devices below LASI/WAX to other CPU */
|
||||||
|
gsc_writel(gsc_dev->eim, gsc_dev->hpa + OFFSET_IAR);
|
||||||
|
|
||||||
|
irq_data_update_effective_affinity(d, &tmask);
|
||||||
|
|
||||||
|
return IRQ_SET_MASK_OK;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static struct irq_chip gsc_asic_interrupt_type = {
|
static struct irq_chip gsc_asic_interrupt_type = {
|
||||||
.name = "GSC-ASIC",
|
.name = "GSC-ASIC",
|
||||||
.irq_unmask = gsc_asic_unmask_irq,
|
.irq_unmask = gsc_asic_unmask_irq,
|
||||||
.irq_mask = gsc_asic_mask_irq,
|
.irq_mask = gsc_asic_mask_irq,
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
.irq_set_affinity = gsc_set_affinity_irq,
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
int gsc_assign_irq(struct irq_chip *type, void *data)
|
int gsc_assign_irq(struct irq_chip *type, void *data)
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ struct gsc_asic {
|
|||||||
int version;
|
int version;
|
||||||
int type;
|
int type;
|
||||||
int eim;
|
int eim;
|
||||||
|
struct gsc_irq gsc_irq;
|
||||||
int global_irq[32];
|
int global_irq[32];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -163,7 +163,6 @@ static int __init lasi_init_chip(struct parisc_device *dev)
|
|||||||
{
|
{
|
||||||
extern void (*chassis_power_off)(void);
|
extern void (*chassis_power_off)(void);
|
||||||
struct gsc_asic *lasi;
|
struct gsc_asic *lasi;
|
||||||
struct gsc_irq gsc_irq;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
lasi = kzalloc(sizeof(*lasi), GFP_KERNEL);
|
lasi = kzalloc(sizeof(*lasi), GFP_KERNEL);
|
||||||
@@ -185,7 +184,7 @@ static int __init lasi_init_chip(struct parisc_device *dev)
|
|||||||
lasi_init_irq(lasi);
|
lasi_init_irq(lasi);
|
||||||
|
|
||||||
/* the IRQ lasi should use */
|
/* the IRQ lasi should use */
|
||||||
dev->irq = gsc_alloc_irq(&gsc_irq);
|
dev->irq = gsc_alloc_irq(&lasi->gsc_irq);
|
||||||
if (dev->irq < 0) {
|
if (dev->irq < 0) {
|
||||||
printk(KERN_ERR "%s(): cannot get GSC irq\n",
|
printk(KERN_ERR "%s(): cannot get GSC irq\n",
|
||||||
__func__);
|
__func__);
|
||||||
@@ -193,9 +192,9 @@ static int __init lasi_init_chip(struct parisc_device *dev)
|
|||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
lasi->eim = ((u32) gsc_irq.txn_addr) | gsc_irq.txn_data;
|
lasi->eim = ((u32) lasi->gsc_irq.txn_addr) | lasi->gsc_irq.txn_data;
|
||||||
|
|
||||||
ret = request_irq(gsc_irq.irq, gsc_asic_intr, 0, "lasi", lasi);
|
ret = request_irq(lasi->gsc_irq.irq, gsc_asic_intr, 0, "lasi", lasi);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
kfree(lasi);
|
kfree(lasi);
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
@@ -68,7 +68,6 @@ static int __init wax_init_chip(struct parisc_device *dev)
|
|||||||
{
|
{
|
||||||
struct gsc_asic *wax;
|
struct gsc_asic *wax;
|
||||||
struct parisc_device *parent;
|
struct parisc_device *parent;
|
||||||
struct gsc_irq gsc_irq;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
wax = kzalloc(sizeof(*wax), GFP_KERNEL);
|
wax = kzalloc(sizeof(*wax), GFP_KERNEL);
|
||||||
@@ -85,7 +84,7 @@ static int __init wax_init_chip(struct parisc_device *dev)
|
|||||||
wax_init_irq(wax);
|
wax_init_irq(wax);
|
||||||
|
|
||||||
/* the IRQ wax should use */
|
/* the IRQ wax should use */
|
||||||
dev->irq = gsc_claim_irq(&gsc_irq, WAX_GSC_IRQ);
|
dev->irq = gsc_claim_irq(&wax->gsc_irq, WAX_GSC_IRQ);
|
||||||
if (dev->irq < 0) {
|
if (dev->irq < 0) {
|
||||||
printk(KERN_ERR "%s(): cannot get GSC irq\n",
|
printk(KERN_ERR "%s(): cannot get GSC irq\n",
|
||||||
__func__);
|
__func__);
|
||||||
@@ -93,9 +92,9 @@ static int __init wax_init_chip(struct parisc_device *dev)
|
|||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
wax->eim = ((u32) gsc_irq.txn_addr) | gsc_irq.txn_data;
|
wax->eim = ((u32) wax->gsc_irq.txn_addr) | wax->gsc_irq.txn_data;
|
||||||
|
|
||||||
ret = request_irq(gsc_irq.irq, gsc_asic_intr, 0, "wax", wax);
|
ret = request_irq(wax->gsc_irq.irq, gsc_asic_intr, 0, "wax", wax);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
kfree(wax);
|
kfree(wax);
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
@@ -1186,7 +1186,7 @@ static void advk_msi_irq_compose_msi_msg(struct irq_data *data,
|
|||||||
|
|
||||||
msg->address_lo = lower_32_bits(msi_msg);
|
msg->address_lo = lower_32_bits(msi_msg);
|
||||||
msg->address_hi = upper_32_bits(msi_msg);
|
msg->address_hi = upper_32_bits(msi_msg);
|
||||||
msg->data = data->irq;
|
msg->data = data->hwirq;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int advk_msi_set_affinity(struct irq_data *irq_data,
|
static int advk_msi_set_affinity(struct irq_data *irq_data,
|
||||||
@@ -1203,15 +1203,11 @@ static int advk_msi_irq_domain_alloc(struct irq_domain *domain,
|
|||||||
int hwirq, i;
|
int hwirq, i;
|
||||||
|
|
||||||
mutex_lock(&pcie->msi_used_lock);
|
mutex_lock(&pcie->msi_used_lock);
|
||||||
hwirq = bitmap_find_next_zero_area(pcie->msi_used, MSI_IRQ_NUM,
|
hwirq = bitmap_find_free_region(pcie->msi_used, MSI_IRQ_NUM,
|
||||||
0, nr_irqs, 0);
|
order_base_2(nr_irqs));
|
||||||
if (hwirq >= MSI_IRQ_NUM) {
|
|
||||||
mutex_unlock(&pcie->msi_used_lock);
|
|
||||||
return -ENOSPC;
|
|
||||||
}
|
|
||||||
|
|
||||||
bitmap_set(pcie->msi_used, hwirq, nr_irqs);
|
|
||||||
mutex_unlock(&pcie->msi_used_lock);
|
mutex_unlock(&pcie->msi_used_lock);
|
||||||
|
if (hwirq < 0)
|
||||||
|
return -ENOSPC;
|
||||||
|
|
||||||
for (i = 0; i < nr_irqs; i++)
|
for (i = 0; i < nr_irqs; i++)
|
||||||
irq_domain_set_info(domain, virq + i, hwirq + i,
|
irq_domain_set_info(domain, virq + i, hwirq + i,
|
||||||
@@ -1229,7 +1225,7 @@ static void advk_msi_irq_domain_free(struct irq_domain *domain,
|
|||||||
struct advk_pcie *pcie = domain->host_data;
|
struct advk_pcie *pcie = domain->host_data;
|
||||||
|
|
||||||
mutex_lock(&pcie->msi_used_lock);
|
mutex_lock(&pcie->msi_used_lock);
|
||||||
bitmap_clear(pcie->msi_used, d->hwirq, nr_irqs);
|
bitmap_release_region(pcie->msi_used, d->hwirq, order_base_2(nr_irqs));
|
||||||
mutex_unlock(&pcie->msi_used_lock);
|
mutex_unlock(&pcie->msi_used_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -285,7 +285,17 @@ static int pci_epf_test_copy(struct pci_epf_test *epf_test)
|
|||||||
if (ret)
|
if (ret)
|
||||||
dev_err(dev, "Data transfer failed\n");
|
dev_err(dev, "Data transfer failed\n");
|
||||||
} else {
|
} else {
|
||||||
memcpy(dst_addr, src_addr, reg->size);
|
void *buf;
|
||||||
|
|
||||||
|
buf = kzalloc(reg->size, GFP_KERNEL);
|
||||||
|
if (!buf) {
|
||||||
|
ret = -ENOMEM;
|
||||||
|
goto err_map_addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy_fromio(buf, src_addr, reg->size);
|
||||||
|
memcpy_toio(dst_addr, buf, reg->size);
|
||||||
|
kfree(buf);
|
||||||
}
|
}
|
||||||
ktime_get_ts64(&end);
|
ktime_get_ts64(&end);
|
||||||
pci_epf_test_print_rate("COPY", reg->size, &start, &end, use_dma);
|
pci_epf_test_print_rate("COPY", reg->size, &start, &end, use_dma);
|
||||||
@@ -441,7 +451,7 @@ static int pci_epf_test_write(struct pci_epf_test *epf_test)
|
|||||||
if (!epf_test->dma_supported) {
|
if (!epf_test->dma_supported) {
|
||||||
dev_err(dev, "Cannot transfer data using DMA\n");
|
dev_err(dev, "Cannot transfer data using DMA\n");
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto err_map_addr;
|
goto err_dma_map;
|
||||||
}
|
}
|
||||||
|
|
||||||
src_phys_addr = dma_map_single(dma_dev, buf, reg->size,
|
src_phys_addr = dma_map_single(dma_dev, buf, reg->size,
|
||||||
|
|||||||
@@ -1060,6 +1060,8 @@ static void quirk_cmd_compl(struct pci_dev *pdev)
|
|||||||
}
|
}
|
||||||
DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, PCI_ANY_ID,
|
DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, PCI_ANY_ID,
|
||||||
PCI_CLASS_BRIDGE_PCI, 8, quirk_cmd_compl);
|
PCI_CLASS_BRIDGE_PCI, 8, quirk_cmd_compl);
|
||||||
|
DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_QCOM, 0x0110,
|
||||||
|
PCI_CLASS_BRIDGE_PCI, 8, quirk_cmd_compl);
|
||||||
DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_QCOM, 0x0400,
|
DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_QCOM, 0x0400,
|
||||||
PCI_CLASS_BRIDGE_PCI, 8, quirk_cmd_compl);
|
PCI_CLASS_BRIDGE_PCI, 8, quirk_cmd_compl);
|
||||||
DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_QCOM, 0x0401,
|
DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_QCOM, 0x0401,
|
||||||
|
|||||||
@@ -739,7 +739,7 @@ static struct cluster_pmu *l2_cache_associate_cpu_with_cluster(
|
|||||||
{
|
{
|
||||||
u64 mpidr;
|
u64 mpidr;
|
||||||
int cpu_cluster_id;
|
int cpu_cluster_id;
|
||||||
struct cluster_pmu *cluster = NULL;
|
struct cluster_pmu *cluster;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This assumes that the cluster_id is in MPIDR[aff1] for
|
* This assumes that the cluster_id is in MPIDR[aff1] for
|
||||||
@@ -761,10 +761,10 @@ static struct cluster_pmu *l2_cache_associate_cpu_with_cluster(
|
|||||||
cluster->cluster_id);
|
cluster->cluster_id);
|
||||||
cpumask_set_cpu(cpu, &cluster->cluster_cpus);
|
cpumask_set_cpu(cpu, &cluster->cluster_cpus);
|
||||||
*per_cpu_ptr(l2cache_pmu->pmu_cluster, cpu) = cluster;
|
*per_cpu_ptr(l2cache_pmu->pmu_cluster, cpu) = cluster;
|
||||||
break;
|
return cluster;
|
||||||
}
|
}
|
||||||
|
|
||||||
return cluster;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int l2cache_pmu_online_cpu(unsigned int cpu, struct hlist_node *node)
|
static int l2cache_pmu_online_cpu(unsigned int cpu, struct hlist_node *node)
|
||||||
|
|||||||
@@ -261,8 +261,9 @@ static int phy_meson8b_usb2_probe(struct platform_device *pdev)
|
|||||||
return PTR_ERR(priv->clk_usb);
|
return PTR_ERR(priv->clk_usb);
|
||||||
|
|
||||||
priv->reset = devm_reset_control_get_optional_shared(&pdev->dev, NULL);
|
priv->reset = devm_reset_control_get_optional_shared(&pdev->dev, NULL);
|
||||||
if (PTR_ERR(priv->reset) == -EPROBE_DEFER)
|
if (IS_ERR(priv->reset))
|
||||||
return PTR_ERR(priv->reset);
|
return dev_err_probe(&pdev->dev, PTR_ERR(priv->reset),
|
||||||
|
"Failed to get the reset line");
|
||||||
|
|
||||||
priv->dr_mode = of_usb_get_dr_mode_by_phy(pdev->dev.of_node, -1);
|
priv->dr_mode = of_usb_get_dr_mode_by_phy(pdev->dev.of_node, -1);
|
||||||
if (priv->dr_mode == USB_DR_MODE_UNKNOWN) {
|
if (priv->dr_mode == USB_DR_MODE_UNKNOWN) {
|
||||||
|
|||||||
@@ -185,7 +185,6 @@ static int axp20x_battery_get_prop(struct power_supply *psy,
|
|||||||
union power_supply_propval *val)
|
union power_supply_propval *val)
|
||||||
{
|
{
|
||||||
struct axp20x_batt_ps *axp20x_batt = power_supply_get_drvdata(psy);
|
struct axp20x_batt_ps *axp20x_batt = power_supply_get_drvdata(psy);
|
||||||
struct iio_channel *chan;
|
|
||||||
int ret = 0, reg, val1;
|
int ret = 0, reg, val1;
|
||||||
|
|
||||||
switch (psp) {
|
switch (psp) {
|
||||||
@@ -265,12 +264,12 @@ static int axp20x_battery_get_prop(struct power_supply *psy,
|
|||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (reg & AXP20X_PWR_STATUS_BAT_CHARGING)
|
if (reg & AXP20X_PWR_STATUS_BAT_CHARGING) {
|
||||||
chan = axp20x_batt->batt_chrg_i;
|
ret = iio_read_channel_processed(axp20x_batt->batt_chrg_i, &val->intval);
|
||||||
else
|
} else {
|
||||||
chan = axp20x_batt->batt_dischrg_i;
|
ret = iio_read_channel_processed(axp20x_batt->batt_dischrg_i, &val1);
|
||||||
|
val->intval = -val1;
|
||||||
ret = iio_read_channel_processed(chan, &val->intval);
|
}
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user