mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 10:58:48 +09:00
Merge 6.1.93 into android14-6.1-lts
Changes in 6.1.93
SUNRPC: Fix loop termination condition in gss_free_in_token_pages()
x86/tsc: Trust initial offset in architectural TSC-adjust MSRs
ftrace: Fix possible use-after-free issue in ftrace_location()
tty: n_gsm: fix possible out-of-bounds in gsm0_receive()
tty: n_gsm: fix missing receive state reset after mode switch
speakup: Fix sizeof() vs ARRAY_SIZE() bug
serial: 8250_bcm7271: use default_mux_rate if possible
serial: 8520_mtk: Set RTS on shutdown for Rx in-band wakeup
io_uring: fail NOP if non-zero op flags is passed in
Revert "r8169: don't try to disable interrupts if NAPI is, scheduled already"
r8169: Fix possible ring buffer corruption on fragmented Tx packets.
ring-buffer: Fix a race between readers and resize checks
tools/latency-collector: Fix -Wformat-security compile warns
tools/nolibc/stdlib: fix memory error in realloc()
net: smc91x: Fix m68k kernel compilation for ColdFire CPU
nilfs2: fix unexpected freezing of nilfs_segctor_sync()
nilfs2: fix potential hang in nilfs_detach_log_writer()
fs/ntfs3: Remove max link count info display during driver init
fs/ntfs3: Taking DOS names into account during link counting
fs/ntfs3: Fix case when index is reused during tree transformation
fs/ntfs3: Break dir enumeration if directory contents error
ksmbd: avoid to send duplicate oplock break notifications
ksmbd: ignore trailing slashes in share paths
ALSA: hda/realtek: fix mute/micmute LEDs don't work for ProBook 440/460 G11.
ALSA: core: Fix NULL module pointer assignment at card init
ALSA: Fix deadlocks with kctl removals at disconnection
KEYS: asymmetric: Add missing dependencies of FIPS_SIGNATURE_SELFTEST
wifi: mac80211: don't use rate mask for scanning
wifi: mac80211: ensure beacon is non-S1G prior to extracting the beacon timestamp field
wifi: cfg80211: fix the order of arguments for trace events of the tx_rx_evt class
dt-bindings: rockchip: grf: Add missing type to 'pcie-phy' node
net: usb: qmi_wwan: add Telit FN920C04 compositions
drm/amd/display: Set color_mgmt_changed to true on unsuspend
drm/amdgpu: Update BO eviction priorities
drm/amdgpu: Fix the ring buffer size for queue VM flush
drm/amdgpu/mes: fix use-after-free issue
LoongArch: Lately init pmu after smp is online
selftests: sud_test: return correct emulated syscall value on RISC-V
sched/isolation: Fix boot crash when maxcpus < first housekeeping CPU
ASoC: Intel: bytcr_rt5640: Apply Asus T100TA quirk to Asus T100TAM too
regulator: irq_helpers: duplicate IRQ name
ASoC: rt5645: Fix the electric noise due to the CBJ contacts floating
ASoC: dt-bindings: rt5645: add cbj sleeve gpio property
regulator: vqmmc-ipq4019: fix module autoloading
ASoC: rt715: add vendor clear control register
ASoC: rt715-sdca: volume step modification
KVM: selftests: Add test for uaccesses to non-existent vgic-v2 CPUIF
x86/efistub: Omit physical KASLR when memory reservations exist
efi: libstub: only free priv.runtime_map when allocated
KVM: x86: Don't advertise guest.MAXPHYADDR as host.MAXPHYADDR in CPUID
genirq/cpuhotplug, x86/vector: Prevent vector leak during CPU offline
fpga: dfl-pci: add PCI subdevice ID for Intel D5005 card
softirq: Fix suspicious RCU usage in __do_softirq()
ASoC: da7219-aad: fix usage of device_get_named_child_node()
ALSA: hda: intel-dsp-config: harden I2C/I2S codec detection
drm/amd/display: Add dtbclk access to dcn315
drm/amd/display: Add VCO speed parameter for DCN31 FPU
drm/amdkfd: Flush the process wq before creating a kfd_process
x86/mm: Remove broken vsyscall emulation code from the page fault code
nvme: find numa distance only if controller has valid numa id
nvmet-auth: return the error code to the nvmet_auth_host_hash() callers
nvmet-auth: replace pr_debug() with pr_err() to report an error.
nvmet-tcp: fix possible memory leak when tearing down a controller
nvmet: fix nvme status code when namespace is disabled
epoll: be better about file lifetimes
nvmet: prevent sprintf() overflow in nvmet_subsys_nsid_exists()
openpromfs: finish conversion to the new mount API
crypto: bcm - Fix pointer arithmetic
mm/slub, kunit: Use inverted data to corrupt kmem cache
firmware: raspberrypi: Use correct device for DMA mappings
ecryptfs: Fix buffer size for tag 66 packet
nilfs2: fix out-of-range warning
parisc: add missing export of __cmpxchg_u8()
crypto: ccp - drop platform ifdef checks
crypto: x86/nh-avx2 - add missing vzeroupper
crypto: x86/sha256-avx2 - add missing vzeroupper
crypto: x86/sha512-avx2 - add missing vzeroupper
s390/cio: fix tracepoint subchannel type field
io_uring: don't use TIF_NOTIFY_SIGNAL to test for availability of task_work
io_uring: use the right type for work_llist empty check
rcu-tasks: Fix show_rcu_tasks_trace_gp_kthread buffer overflow
rcu: Fix buffer overflow in print_cpu_stall_info()
ARM: configs: sunxi: Enable DRM_DW_HDMI
jffs2: prevent xattr node from overflowing the eraseblock
soc: mediatek: cmdq: Fix typo of CMDQ_JUMP_RELATIVE
null_blk: Fix missing mutex_destroy() at module removal
md: fix resync softlockup when bitmap size is less than array size
block: open code __blk_account_io_start()
block: open code __blk_account_io_done()
block: support to account io_ticks precisely
wifi: ath10k: poll service ready message before failing
wifi: brcmfmac: pcie: handle randbuf allocation failure
wifi: ath11k: don't force enable power save on non-running vdevs
bpftool: Fix missing pids during link show
x86/boot: Ignore relocations in .notes sections in walk_relocs() too
sched/fair: Add EAS checks before updating root_domain::overutilized
ACPI: Fix Generic Initiator Affinity _OSC bit
qed: avoid truncating work queue length
net/mlx5e: Fail with messages when params are not valid for XSK
mlx5: stop warning for 64KB pages
bitops: add missing prototype check
wifi: carl9170: re-fix fortified-memset warning
bpf: Pack struct bpf_fib_lookup
scsi: ufs: qcom: Perform read back after writing reset bit
scsi: ufs: qcom: Perform read back after writing REG_UFS_SYS1CLK_1US
scsi: ufs: ufs-qcom: Fix the Qcom register name for offset 0xD0
scsi: ufs: ufs-qcom: Clear qunipro_g4_sel for HW version major 5
scsi: ufs: qcom: Perform read back after writing unipro mode
scsi: ufs: qcom: Perform read back after writing CGC enable
scsi: ufs: cdns-pltfrm: Perform read back after writing HCLKDIV
scsi: ufs: core: Perform read back after disabling interrupts
scsi: ufs: core: Perform read back after disabling UIC_COMMAND_COMPL
ACPI: LPSS: Advertise number of chip selects via property
irqchip/alpine-msi: Fix off-by-one in allocation error path
irqchip/loongson-pch-msi: Fix off-by-one on allocation error path
ACPI: disable -Wstringop-truncation
gfs2: Don't forget to complete delayed withdraw
gfs2: Fix "ignore unlock failures after withdraw"
x86/boot/64: Clear most of CR4 in startup_64(), except PAE, MCE and LA57
selftests/bpf: Fix umount cgroup2 error in test_sockmap
cpufreq: exit() callback is optional
x86/pat: Introduce lookup_address_in_pgd_attr()
x86/pat: Restructure _lookup_address_cpa()
x86/pat: Fix W^X violation false-positives when running as Xen PV guest
net: export inet_lookup_reuseport and inet6_lookup_reuseport
net: remove duplicate reuseport_lookup functions
udp: Avoid call to compute_score on multiple sites
cppc_cpufreq: Fix possible null pointer dereference
scsi: libsas: Fix the failure of adding phy with zero-address to port
scsi: hpsa: Fix allocation size for Scsi_Host private data
x86/purgatory: Switch to the position-independent small code model
thermal/drivers/tsens: Fix null pointer dereference
wifi: ath10k: Fix an error code problem in ath10k_dbg_sta_write_peer_debug_trigger()
selftests/bpf: Fix a fd leak in error paths in open_netns
wifi: ath10k: populate board data for WCN3990
net: dsa: mv88e6xxx: Add support for model-specific pre- and post-reset handlers
net: dsa: mv88e6xxx: Avoid EEPROM timeout without EEPROM on 88E6250-family switches
tcp: avoid premature drops in tcp_add_backlog()
pwm: sti: Convert to platform remove callback returning void
pwm: sti: Prepare removing pwm_chip from driver data
pwm: sti: Simplify probe function using devm functions
drivers/perf: hisi_pcie: Fix out-of-bound access when valid event group
drivers/perf: hisi: hns3: Fix out-of-bound access when valid event group
drivers/perf: hisi: hns3: Actually use devm_add_action_or_reset()
net: give more chances to rcu in netdev_wait_allrefs_any()
macintosh/via-macii: Fix "BUG: sleeping function called from invalid context"
wifi: carl9170: add a proper sanity check for endpoints
wifi: ar5523: enable proper endpoint verification
sh: kprobes: Merge arch_copy_kprobe() into arch_prepare_kprobe()
Revert "sh: Handle calling csum_partial with misaligned data"
wifi: mt76: mt7603: add wpdma tx eof flag for PSE client reset
libbpf: Fix error message in attach_kprobe_multi
selftests/binderfs: use the Makefile's rules, not Make's implicit rules
selftests/resctrl: fix clang build failure: use LOCAL_HDRS
selftests: default to host arch for LLVM builds
kunit: Fix kthread reference
HID: intel-ish-hid: ipc: Add check for pci_alloc_irq_vectors
scsi: bfa: Ensure the copied buf is NUL terminated
scsi: qedf: Ensure the copied buf is NUL terminated
scsi: qla2xxx: Fix debugfs output for fw_resource_count
kernel/numa.c: Move logging out of numa.h
x86/numa: Fix SRAT lookup of CFMWS ranges with numa_fill_memblks()
wifi: mwl8k: initialize cmd->addr[] properly
HID: amd_sfh: Handle "no sensors" in PM operations
usb: aqc111: stop lying about skb->truesize
net: usb: sr9700: stop lying about skb->truesize
m68k: Fix spinlock race in kernel thread creation
m68k: mac: Fix reboot hang on Mac IIci
net: ipv6: fix wrong start position when receive hop-by-hop fragment
eth: sungem: remove .ndo_poll_controller to avoid deadlocks
selftests: net: move amt to socat for better compatibility
net: ethernet: cortina: Locking fixes
af_unix: Fix data races in unix_release_sock/unix_stream_sendmsg
net: usb: smsc95xx: stop lying about skb->truesize
net: openvswitch: fix overwriting ct original tuple for ICMPv6
ipv6: sr: add missing seg6_local_exit
ipv6: sr: fix incorrect unregister order
ipv6: sr: fix invalid unregister error path
net/mlx5: Add a timeout to acquire the command queue semaphore
net/mlx5: Discard command completions in internal error
s390/bpf: Emit a barrier for BPF_FETCH instructions
riscv, bpf: make some atomic operations fully ordered
ax25: Use kernel universal linked list to implement ax25_dev_list
ax25: Fix reference count leak issues of ax25_dev
ax25: Fix reference count leak issue of net_device
mptcp: SO_KEEPALIVE: fix getsockopt support
Bluetooth: Consolidate code around sk_alloc into a helper function
Bluetooth: compute LE flow credits based on recvbuf space
Bluetooth: qca: Fix error code in qca_read_fw_build_info()
drm/bridge: Fix improper bridge init order with pre_enable_prev_first
printk: Let no_printk() use _printk()
dev_printk: Add and use dev_no_printk()
drm/lcdif: Do not disable clocks on already suspended hardware
drm/panel-samsung-atna33xc20: Use ktime_get_boottime for delays
drm/dp: Don't attempt AUX transfers when eDP panels are not powered
drm/panel: atna33xc20: Fix unbalanced regulator in the case HPD doesn't assert
drm/amd/display: Fix potential index out of bounds in color transformation function
ASoC: Intel: Disable route checks for Skylake boards
ASoC: Intel: avs: ssm4567: Do not ignore route checks
mtd: core: Report error if first mtd_otp_size() call fails in mtd_otp_nvmem_add()
mtd: rawnand: hynix: fixed typo
fbdev: shmobile: fix snprintf truncation
ASoC: kirkwood: Fix potential NULL dereference
drm/meson: vclk: fix calculation of 59.94 fractional rates
drm/mediatek: Add 0 size check to mtk_drm_gem_obj
powerpc/fsl-soc: hide unused const variable
fbdev: sisfb: hide unused variables
ASoC: Intel: avs: Fix ASRC module initialization
ASoC: Intel: avs: Fix potential integer overflow
media: ngene: Add dvb_ca_en50221_init return value check
media: rcar-vin: work around -Wenum-compare-conditional warning
media: radio-shark2: Avoid led_names truncations
drm: bridge: cdns-mhdp8546: Fix possible null pointer dereference
drm/msm/dp: allow voltage swing / pre emphasis of 3
drm/msm/dp: Return IRQ_NONE for unhandled interrupts
drm/msm/dp: Avoid a long timeout for AUX transfer if nothing connected
media: ipu3-cio2: Request IRQ earlier
media: dt-bindings: ovti,ov2680: Fix the power supply names
fbdev: sh7760fb: allow modular build
media: atomisp: ssh_css: Fix a null-pointer dereference in load_video_binaries
drm/arm/malidp: fix a possible null pointer dereference
drm: vc4: Fix possible null pointer dereference
ASoC: tracing: Export SND_SOC_DAPM_DIR_OUT to its value
drm/bridge: anx7625: Don't log an error when DSI host can't be found
drm/bridge: icn6211: Don't log an error when DSI host can't be found
drm/bridge: lt8912b: Don't log an error when DSI host can't be found
drm/bridge: lt9611: Don't log an error when DSI host can't be found
drm/bridge: lt9611uxc: Don't log an error when DSI host can't be found
drm/bridge: tc358775: Don't log an error when DSI host can't be found
drm/bridge: dpc3433: Don't log an error when DSI host can't be found
drm/panel: novatek-nt35950: Don't log an error when DSI host can't be found
drm/panel: simple: Add missing Innolux G121X1-L03 format, flags, connector
drm/mipi-dsi: use correct return type for the DSC functions
drm/rockchip: vop2: Do not divide height twice for YUV
clk: samsung: exynosautov9: fix wrong pll clock id value
RDMA/mlx5: Adding remote atomic access flag to updatable flags
RDMA/hns: Fix return value in hns_roce_map_mr_sg
RDMA/hns: Fix deadlock on SRQ async events.
RDMA/hns: Fix UAF for cq async event
RDMA/hns: Fix GMV table pagesize
RDMA/hns: Use complete parentheses in macros
RDMA/hns: Modify the print level of CQE error
clk: mediatek: mt8365-mm: fix DPI0 parent
clk: rs9: fix wrong default value for clock amplitude
RDMA/rxe: Fix seg fault in rxe_comp_queue_pkt
RDMA/rxe: Replace pr_xxx by rxe_dbg_xxx in rxe_net.c
RDMA/rxe: Fix incorrect rxe_put in error path
IB/mlx5: Use __iowrite64_copy() for write combining stores
clk: renesas: r8a779a0: Fix CANFD parent clock
clk: renesas: r9a07g043: Add clock and reset entry for PLIC
lib/test_hmm.c: handle src_pfns and dst_pfns allocation failure
clk: qcom: dispcc-sm8450: fix DisplayPort clocks
clk: qcom: dispcc-sm6350: fix DisplayPort clocks
clk: qcom: mmcc-msm8998: fix venus clock issue
x86/insn: Fix PUSH instruction in x86 instruction decoder opcode map
x86/insn: Add VEX versions of VPDPBUSD, VPDPBUSDS, VPDPWSSD and VPDPWSSDS
ext4: avoid excessive credit estimate in ext4_tmpfile()
virt: acrn: stop using follow_pfn
drivers/virt/acrn: fix PFNMAP PTE checks in acrn_vm_ram_map()
sunrpc: removed redundant procp check
ext4: simplify calculation of blkoff in ext4_mb_new_blocks_simple
ext4: fix unit mismatch in ext4_mb_new_blocks_simple
ext4: try all groups in ext4_mb_new_blocks_simple
ext4: remove unused parameter from ext4_mb_new_blocks_simple()
ext4: fix potential unnitialized variable
SUNRPC: Fix gss_free_in_token_pages()
selftests/kcmp: remove unused open mode
RDMA/IPoIB: Fix format truncation compilation errors
net: add pskb_may_pull_reason() helper
net: bridge: xmit: make sure we have at least eth header len bytes
selftests: net: bridge: increase IGMP/MLD exclude timeout membership interval
net: bridge: mst: fix vlan use-after-free
net: qrtr: ns: Fix module refcnt
netrom: fix possible dead-lock in nr_rt_ioctl()
af_packet: do not call packet_read_pending() from tpacket_destruct_skb()
sched/fair: Allow disabling sched_balance_newidle with sched_relax_domain_level
sched/core: Fix incorrect initialization of the 'burst' parameter in cpu_max_write()
scsi: ufs: ufs-qcom: Clear qunipro_g4_sel for HW major version > 5
perf record: Delete session after stopping sideband thread
perf probe: Add missing libgen.h header needed for using basename()
iio: core: Leave private pointer NULL when no private data supplied
greybus: lights: check return of get_channel_from_mode
f2fs: multidev: fix to recognize valid zero block address
f2fs: fix to wait on page writeback in __clone_blkaddrs()
counter: linux/counter.h: fix Excess kernel-doc description warning
perf annotate: Get rid of duplicate --group option item
soundwire: cadence: fix invalid PDI offset
dmaengine: idma64: Add check for dma_set_max_seg_size
firmware: dmi-id: add a release callback function
serial: max3100: Lock port->lock when calling uart_handle_cts_change()
serial: max3100: Update uart_driver_registered on driver removal
serial: max3100: Fix bitwise types
greybus: arche-ctrl: move device table to its right location
PCI: tegra194: Fix probe path for Endpoint mode
serial: sc16is7xx: add proper sched.h include for sched_set_fifo()
interconnect: qcom: qcm2290: Fix mas_snoc_bimc QoS port assignment
arm64: dts: meson: fix S4 power-controller node
perf test: Add -w/--workload option
perf test: Add 'thloop' test workload
perf test: Add 'leafloop' test workload
perf test: Add 'sqrtloop' test workload
perf test: Add 'brstack' test workload
perf test: Add 'datasym' test workload
perf tests: Make "test data symbol" more robust on Neoverse N1
dt-bindings: PCI: rcar-pci-host: Add optional regulators
dt-bindings: PCI: rcar-pci-host: Add missing IOMMU properties
f2fs: compress: fix to relocate check condition in f2fs_{release,reserve}_compress_blocks()
f2fs: compress: fix to relocate check condition in f2fs_ioc_{,de}compress_file()
f2fs: fix typos in comments
f2fs: fix to relocate check condition in f2fs_fallocate()
f2fs: fix to check pinfile flag in f2fs_move_file_range()
iio: adc: stm32: Fixing err code to not indicate success
coresight: etm4x: Fix unbalanced pm_runtime_enable()
perf docs: Document bpf event modifier
iio: pressure: dps310: support negative temperature values
coresight: etm4x: Do not hardcode IOMEM access for register restore
coresight: etm4x: Do not save/restore Data trace control registers
coresight: etm4x: Safe access for TRCQCLTR
coresight: etm4x: Fix access to resource selector registers
fpga: region: add owner module and take its refcount
microblaze: Remove gcc flag for non existing early_printk.c file
microblaze: Remove early printk call from cpuinfo-static.c
perf intel-pt: Fix unassigned instruction op (discovered by MemorySanitizer)
ovl: remove upper umask handling from ovl_create_upper()
VMCI: Fix an error handling path in vmci_guest_probe_device()
dt-bindings: pinctrl: mediatek: mt7622: fix array properties
watchdog: bd9576: Drop "always-running" property
watchdog: sa1100: Fix PTR_ERR_OR_ZERO() vs NULL check in sa1100dog_probe()
usb: gadget: u_audio: Fix race condition use of controls after free during gadget unbind.
usb: gadget: u_audio: Clear uac pointer when freed.
stm class: Fix a double free in stm_register_device()
ppdev: Remove usage of the deprecated ida_simple_xx() API
ppdev: Add an error check in register_device
perf bench internals inject-build-id: Fix trap divide when collecting just one DSO
perf ui browser: Don't save pointer to stack memory
extcon: max8997: select IRQ_DOMAIN instead of depending on it
PCI/EDR: Align EDR_PORT_DPC_ENABLE_DSM with PCI Firmware r3.3
PCI/EDR: Align EDR_PORT_LOCATE_DSM with PCI Firmware r3.3
perf ui browser: Avoid SEGV on title
perf report: Avoid SEGV in report__setup_sample_type()
f2fs: compress: fix to update i_compr_blocks correctly
f2fs: compress: fix to cover {reserve,release}_compress_blocks() w/ cp_rwsem lock
f2fs: fix to release node block count in error path of f2fs_new_node_page()
f2fs: compress: don't allow unaligned truncation on released compress inode
serial: sh-sci: protect invalidating RXDMA on shutdown
libsubcmd: Fix parse-options memory leak
perf daemon: Fix file leak in daemon_session__control
f2fs: fix to add missing iput() in gc_data_segment()
perf stat: Don't display metric header for non-leader uncore events
LoongArch: Fix callchain parse error with kernel tracepoint events again
s390/vdso: filter out mno-pic-data-is-text-relative cflag
s390/vdso64: filter out munaligned-symbols flag for vdso
s390/vdso: Generate unwind information for C modules
s390/vdso: Use standard stack frame layout
s390/ipl: Fix incorrect initialization of len fields in nvme reipl block
s390/ipl: Fix incorrect initialization of nvme dump block
s390/boot: Remove alt_stfle_fac_list from decompressor
Input: ims-pcu - fix printf string overflow
Input: ioc3kbd - convert to platform remove callback returning void
Input: ioc3kbd - add device table
mmc: sdhci_am654: Add tuning algorithm for delay chain
mmc: sdhci_am654: Write ITAPDLY for DDR52 timing
mmc: sdhci_am654: Drop lookup for deprecated ti,otap-del-sel
mmc: sdhci_am654: Add OTAP/ITAP delay enable
mmc: sdhci_am654: Add ITAPDLYSEL in sdhci_j721e_4bit_set_clock
mmc: sdhci_am654: Fix ITAPDLY for HS400 timing
Input: pm8xxx-vibrator - correct VIB_MAX_LEVELS calculation
drm/msm/dsi: Print dual-DSI-adjusted pclk instead of original mode pclk
drm/msm/dpu: Always flush the slave INTF on the CTL
drm/mediatek: dp: Move PHY registration to new function
drm/mediatek: dp: Add support for embedded DisplayPort aux-bus
drm/mediatek: dp: Fix mtk_dp_aux_transfer return value
um: Fix return value in ubd_init()
um: Add winch to winch_handlers before registering winch IRQ
um: vector: fix bpfflash parameter evaluation
fs/ntfs3: Use 64 bit variable to avoid 32 bit overflow
fs/ntfs3: Use variable length array instead of fixed size
drm/bridge: tc358775: fix support for jeida-18 and jeida-24
media: stk1160: fix bounds checking in stk1160_copy_video()
scsi: qla2xxx: Replace all non-returning strlcpy() with strscpy()
Input: cyapa - add missing input core locking to suspend/resume functions
media: flexcop-usb: fix sanity check of bNumEndpoints
powerpc/pseries: Add failure related checks for h_get_mpp and h_get_ppp
um: Fix the -Wmissing-prototypes warning for __switch_mm
um: Fix the -Wmissing-prototypes warning for get_thread_reg
um: Fix the declaration of kasan_map_memory
media: sunxi: a83-mips-csi2: also select GENERIC_PHY
media: cec: cec-adap: always cancel work in cec_transmit_msg_fh
media: cec: cec-api: add locking in cec_release()
media: cec: core: avoid recursive cec_claim_log_addrs
media: cec: core: avoid confusing "transmit timed out" message
Revert "drm/bridge: ti-sn65dsi83: Fix enable error path"
drm/msm: Enable clamp_to_idle for 7c3
drm/msm/a6xx: Avoid a nullptr dereference when speedbin setting fails
null_blk: Fix the WARNING: modpost: missing MODULE_DESCRIPTION()
ALSA: hda/cs_dsp_ctl: Use private_free for control cleanup
ASoC: mediatek: mt8192: fix register configuration for tdm
regulator: bd71828: Don't overwrite runtime voltages
perf/arm-dmc620: Fix lockdep assert in ->event_init()
x86/kconfig: Select ARCH_WANT_FRAME_POINTERS again when UNWINDER_FRAME_POINTER=y
net: Always descend into dsa/ folder with CONFIG_NET_DSA enabled
ipv6: sr: fix missing sk_buff release in seg6_input_core
selftests: net: kill smcrouted in the cleanup logic in amt.sh
nfc: nci: Fix uninit-value in nci_rx_work
ASoC: tas2552: Add TX path for capturing AUDIO-OUT data
NFSv4: Fixup smatch warning for ambiguous return
nfs: keep server info for remounts
sunrpc: fix NFSACL RPC retry on soft mount
rpcrdma: fix handling for RDMA_CM_EVENT_DEVICE_REMOVAL
af_unix: Update unix_sk(sk)->oob_skb under sk_receive_queue lock.
ipv6: sr: fix memleak in seg6_hmac_init_algo
tcp: Fix shift-out-of-bounds in dctcp_update_alpha().
pNFS/filelayout: fixup pNfs allocation modes
openvswitch: Set the skbuff pkt_type for proper pmtud support.
arm64: asm-bug: Add .align 2 to the end of __BUG_ENTRY
rv: Update rv_en(dis)able_monitor doc to match kernel-doc
virtio: delete vq in vp_find_vqs_msix() when request_irq() fails
riscv: stacktrace: Make walk_stackframe cross pt_regs frame
riscv: stacktrace: fixed walk_stackframe()
Revert "ixgbe: Manual AN-37 for troublesome link partners for X550 SFI"
net: fec: avoid lock evasion when reading pps_enable
tls: fix missing memory barrier in tls_init
inet: factor out locked section of inet_accept() in a new helper
net: relax socket state check at accept time.
nfc: nci: Fix kcov check in nci_rx_work()
nfc: nci: Fix handling of zero-length payload packets in nci_rx_work()
drivers/xen: Improve the late XenStore init protocol
ice: Interpret .set_channels() input differently
netfilter: nfnetlink_queue: acquire rcu_read_lock() in instance_destroy_rcu()
netfilter: nft_payload: restore vlan q-in-q match support
spi: Don't mark message DMA mapped when no transfer in it is
dma-mapping: benchmark: fix node id validation
dma-mapping: benchmark: handle NUMA_NO_NODE correctly
nvmet: fix ns enable/disable possible hang
net: phy: micrel: set soft_reset callback to genphy_soft_reset for KSZ8061
net/mlx5: Lag, do bond only if slaves agree on roce state
net/mlx5e: Fix IPsec tunnel mode offload feature check
net/mlx5e: Use rx_missed_errors instead of rx_dropped for reporting buffer exhaustion
net/mlx5e: Fix UDP GSO for encapsulated packets
dma-buf/sw-sync: don't enable IRQ from sync_print_obj()
bpf: Fix potential integer overflow in resolve_btfids
ALSA: jack: Use guard() for locking
ALSA: core: Remove debugfs at disconnection
ALSA: hda/realtek: Add quirk for ASUS ROG G634Z
ALSA: hda/realtek: Amend G634 quirk to enable rear speakers
ALSA: hda/realtek: Adjust G814JZR to use SPI init for amp
enic: Validate length of nl attributes in enic_set_vf_port
af_unix: Read sk->sk_hash under bindlock during bind().
net: usb: smsc95xx: fix changing LED_SEL bit value updated from EEPROM
bpf: Allow delete from sockmap/sockhash only if update is allowed
net:fec: Add fec_enet_deinit()
ice: fix accounting if a VLAN already exists
netfilter: nft_payload: move struct nft_payload_set definition where it belongs
netfilter: nft_payload: rebuild vlan header when needed
netfilter: nft_payload: rebuild vlan header on h_proto access
netfilter: nft_payload: skbuff vlan metadata mangle support
netfilter: tproxy: bail out if IP has been disabled on the device
netfilter: nft_fib: allow from forward/input without iif selector
kconfig: fix comparison to constant symbols, 'm', 'n'
drm/i915/guc: avoid FIELD_PREP warning
spi: stm32: Don't warn about spurious interrupts
net: dsa: microchip: fix RGMII error in KSZ DSA driver
net: ena: Add dynamic recycling mechanism for rx buffers
net: ena: Reduce lines with longer column width boundary
net: ena: Fix redundant device NUMA node override
ipvlan: Dont Use skb->sk in ipvlan_process_v{4,6}_outbound
powerpc/pseries/lparcfg: drop error message from guest name lookup
hwmon: (shtc1) Fix property misspelling
riscv: prevent pt_regs corruption for secondary idle threads
ALSA: timer: Set lower bound of start tick time
net: ena: Fix DMA syncing in XDP path when SWIOTLB is on
Linux 6.1.93
Change-Id: I15fdbacdaee5a6d68347a7fd5218929488d594af
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -37,15 +37,15 @@ properties:
|
|||||||
active low.
|
active low.
|
||||||
maxItems: 1
|
maxItems: 1
|
||||||
|
|
||||||
dovdd-supply:
|
DOVDD-supply:
|
||||||
description:
|
description:
|
||||||
Definition of the regulator used as interface power supply.
|
Definition of the regulator used as interface power supply.
|
||||||
|
|
||||||
avdd-supply:
|
AVDD-supply:
|
||||||
description:
|
description:
|
||||||
Definition of the regulator used as analog power supply.
|
Definition of the regulator used as analog power supply.
|
||||||
|
|
||||||
dvdd-supply:
|
DVDD-supply:
|
||||||
description:
|
description:
|
||||||
Definition of the regulator used as digital power supply.
|
Definition of the regulator used as digital power supply.
|
||||||
|
|
||||||
@@ -59,9 +59,9 @@ required:
|
|||||||
- reg
|
- reg
|
||||||
- clocks
|
- clocks
|
||||||
- clock-names
|
- clock-names
|
||||||
- dovdd-supply
|
- DOVDD-supply
|
||||||
- avdd-supply
|
- AVDD-supply
|
||||||
- dvdd-supply
|
- DVDD-supply
|
||||||
- reset-gpios
|
- reset-gpios
|
||||||
- port
|
- port
|
||||||
|
|
||||||
@@ -82,9 +82,9 @@ examples:
|
|||||||
clock-names = "xvclk";
|
clock-names = "xvclk";
|
||||||
reset-gpios = <&gpio1 3 GPIO_ACTIVE_LOW>;
|
reset-gpios = <&gpio1 3 GPIO_ACTIVE_LOW>;
|
||||||
|
|
||||||
dovdd-supply = <&sw2_reg>;
|
DOVDD-supply = <&sw2_reg>;
|
||||||
dvdd-supply = <&sw2_reg>;
|
DVDD-supply = <&sw2_reg>;
|
||||||
avdd-supply = <®_peri_3p15v>;
|
AVDD-supply = <®_peri_3p15v>;
|
||||||
|
|
||||||
port {
|
port {
|
||||||
ov2680_to_mipi: endpoint {
|
ov2680_to_mipi: endpoint {
|
||||||
|
|||||||
@@ -68,6 +68,18 @@ properties:
|
|||||||
phy-names:
|
phy-names:
|
||||||
const: pcie
|
const: pcie
|
||||||
|
|
||||||
|
vpcie1v5-supply:
|
||||||
|
description: The 1.5v regulator to use for PCIe.
|
||||||
|
|
||||||
|
vpcie3v3-supply:
|
||||||
|
description: The 3.3v regulator to use for PCIe.
|
||||||
|
|
||||||
|
vpcie12v-supply:
|
||||||
|
description: The 12v regulator to use for PCIe.
|
||||||
|
|
||||||
|
iommu-map: true
|
||||||
|
iommu-map-mask: true
|
||||||
|
|
||||||
required:
|
required:
|
||||||
- compatible
|
- compatible
|
||||||
- reg
|
- reg
|
||||||
@@ -121,5 +133,7 @@ examples:
|
|||||||
clock-names = "pcie", "pcie_bus";
|
clock-names = "pcie", "pcie_bus";
|
||||||
power-domains = <&sysc R8A7791_PD_ALWAYS_ON>;
|
power-domains = <&sysc R8A7791_PD_ALWAYS_ON>;
|
||||||
resets = <&cpg 319>;
|
resets = <&cpg 319>;
|
||||||
|
vpcie3v3-supply = <&pcie_3v3>;
|
||||||
|
vpcie12v-supply = <&pcie_12v>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -97,7 +97,8 @@ patternProperties:
|
|||||||
then:
|
then:
|
||||||
properties:
|
properties:
|
||||||
groups:
|
groups:
|
||||||
enum: [emmc, emmc_rst]
|
items:
|
||||||
|
enum: [emmc, emmc_rst]
|
||||||
- if:
|
- if:
|
||||||
properties:
|
properties:
|
||||||
function:
|
function:
|
||||||
@@ -105,8 +106,9 @@ patternProperties:
|
|||||||
then:
|
then:
|
||||||
properties:
|
properties:
|
||||||
groups:
|
groups:
|
||||||
enum: [esw, esw_p0_p1, esw_p2_p3_p4, rgmii_via_esw,
|
items:
|
||||||
rgmii_via_gmac1, rgmii_via_gmac2, mdc_mdio]
|
enum: [esw, esw_p0_p1, esw_p2_p3_p4, rgmii_via_esw,
|
||||||
|
rgmii_via_gmac1, rgmii_via_gmac2, mdc_mdio]
|
||||||
- if:
|
- if:
|
||||||
properties:
|
properties:
|
||||||
function:
|
function:
|
||||||
@@ -123,10 +125,11 @@ patternProperties:
|
|||||||
then:
|
then:
|
||||||
properties:
|
properties:
|
||||||
groups:
|
groups:
|
||||||
enum: [i2s_in_mclk_bclk_ws, i2s1_in_data, i2s2_in_data,
|
items:
|
||||||
i2s3_in_data, i2s4_in_data, i2s_out_mclk_bclk_ws,
|
enum: [i2s_in_mclk_bclk_ws, i2s1_in_data, i2s2_in_data,
|
||||||
i2s1_out_data, i2s2_out_data, i2s3_out_data,
|
i2s3_in_data, i2s4_in_data, i2s_out_mclk_bclk_ws,
|
||||||
i2s4_out_data]
|
i2s1_out_data, i2s2_out_data, i2s3_out_data,
|
||||||
|
i2s4_out_data]
|
||||||
- if:
|
- if:
|
||||||
properties:
|
properties:
|
||||||
function:
|
function:
|
||||||
@@ -159,10 +162,11 @@ patternProperties:
|
|||||||
then:
|
then:
|
||||||
properties:
|
properties:
|
||||||
groups:
|
groups:
|
||||||
enum: [pcie0_0_waken, pcie0_1_waken, pcie1_0_waken,
|
items:
|
||||||
pcie0_0_clkreq, pcie0_1_clkreq, pcie1_0_clkreq,
|
enum: [pcie0_0_waken, pcie0_1_waken, pcie1_0_waken,
|
||||||
pcie0_pad_perst, pcie1_pad_perst, pcie_pereset,
|
pcie0_0_clkreq, pcie0_1_clkreq, pcie1_0_clkreq,
|
||||||
pcie_wake, pcie_clkreq]
|
pcie0_pad_perst, pcie1_pad_perst, pcie_pereset,
|
||||||
|
pcie_wake, pcie_clkreq]
|
||||||
- if:
|
- if:
|
||||||
properties:
|
properties:
|
||||||
function:
|
function:
|
||||||
@@ -178,11 +182,12 @@ patternProperties:
|
|||||||
then:
|
then:
|
||||||
properties:
|
properties:
|
||||||
groups:
|
groups:
|
||||||
enum: [pwm_ch1_0, pwm_ch1_1, pwm_ch1_2, pwm_ch2_0, pwm_ch2_1,
|
items:
|
||||||
pwm_ch2_2, pwm_ch3_0, pwm_ch3_1, pwm_ch3_2, pwm_ch4_0,
|
enum: [pwm_ch1_0, pwm_ch1_1, pwm_ch1_2, pwm_ch2_0, pwm_ch2_1,
|
||||||
pwm_ch4_1, pwm_ch4_2, pwm_ch4_3, pwm_ch5_0, pwm_ch5_1,
|
pwm_ch2_2, pwm_ch3_0, pwm_ch3_1, pwm_ch3_2, pwm_ch4_0,
|
||||||
pwm_ch5_2, pwm_ch6_0, pwm_ch6_1, pwm_ch6_2, pwm_ch6_3,
|
pwm_ch4_1, pwm_ch4_2, pwm_ch4_3, pwm_ch5_0, pwm_ch5_1,
|
||||||
pwm_ch7_0, pwm_0, pwm_1]
|
pwm_ch5_2, pwm_ch6_0, pwm_ch6_1, pwm_ch6_2, pwm_ch6_3,
|
||||||
|
pwm_ch7_0, pwm_0, pwm_1]
|
||||||
- if:
|
- if:
|
||||||
properties:
|
properties:
|
||||||
function:
|
function:
|
||||||
@@ -260,33 +265,34 @@ patternProperties:
|
|||||||
pins:
|
pins:
|
||||||
description: |
|
description: |
|
||||||
An array of strings. Each string contains the name of a pin.
|
An array of strings. Each string contains the name of a pin.
|
||||||
enum: [GPIO_A, I2S1_IN, I2S1_OUT, I2S_BCLK, I2S_WS, I2S_MCLK, TXD0,
|
items:
|
||||||
RXD0, SPI_WP, SPI_HOLD, SPI_CLK, SPI_MOSI, SPI_MISO, SPI_CS,
|
enum: [GPIO_A, I2S1_IN, I2S1_OUT, I2S_BCLK, I2S_WS, I2S_MCLK, TXD0,
|
||||||
I2C_SDA, I2C_SCL, I2S2_IN, I2S3_IN, I2S4_IN, I2S2_OUT,
|
RXD0, SPI_WP, SPI_HOLD, SPI_CLK, SPI_MOSI, SPI_MISO, SPI_CS,
|
||||||
I2S3_OUT, I2S4_OUT, GPIO_B, MDC, MDIO, G2_TXD0, G2_TXD1,
|
I2C_SDA, I2C_SCL, I2S2_IN, I2S3_IN, I2S4_IN, I2S2_OUT,
|
||||||
G2_TXD2, G2_TXD3, G2_TXEN, G2_TXC, G2_RXD0, G2_RXD1, G2_RXD2,
|
I2S3_OUT, I2S4_OUT, GPIO_B, MDC, MDIO, G2_TXD0, G2_TXD1,
|
||||||
G2_RXD3, G2_RXDV, G2_RXC, NCEB, NWEB, NREB, NDL4, NDL5, NDL6,
|
G2_TXD2, G2_TXD3, G2_TXEN, G2_TXC, G2_RXD0, G2_RXD1, G2_RXD2,
|
||||||
NDL7, NRB, NCLE, NALE, NDL0, NDL1, NDL2, NDL3, MDI_TP_P0,
|
G2_RXD3, G2_RXDV, G2_RXC, NCEB, NWEB, NREB, NDL4, NDL5, NDL6,
|
||||||
MDI_TN_P0, MDI_RP_P0, MDI_RN_P0, MDI_TP_P1, MDI_TN_P1,
|
NDL7, NRB, NCLE, NALE, NDL0, NDL1, NDL2, NDL3, MDI_TP_P0,
|
||||||
MDI_RP_P1, MDI_RN_P1, MDI_RP_P2, MDI_RN_P2, MDI_TP_P2,
|
MDI_TN_P0, MDI_RP_P0, MDI_RN_P0, MDI_TP_P1, MDI_TN_P1,
|
||||||
MDI_TN_P2, MDI_TP_P3, MDI_TN_P3, MDI_RP_P3, MDI_RN_P3,
|
MDI_RP_P1, MDI_RN_P1, MDI_RP_P2, MDI_RN_P2, MDI_TP_P2,
|
||||||
MDI_RP_P4, MDI_RN_P4, MDI_TP_P4, MDI_TN_P4, PMIC_SCL,
|
MDI_TN_P2, MDI_TP_P3, MDI_TN_P3, MDI_RP_P3, MDI_RN_P3,
|
||||||
PMIC_SDA, SPIC1_CLK, SPIC1_MOSI, SPIC1_MISO, SPIC1_CS,
|
MDI_RP_P4, MDI_RN_P4, MDI_TP_P4, MDI_TN_P4, PMIC_SCL,
|
||||||
GPIO_D, WATCHDOG, RTS3_N, CTS3_N, TXD3, RXD3, PERST0_N,
|
PMIC_SDA, SPIC1_CLK, SPIC1_MOSI, SPIC1_MISO, SPIC1_CS,
|
||||||
PERST1_N, WLED_N, EPHY_LED0_N, AUXIN0, AUXIN1, AUXIN2,
|
GPIO_D, WATCHDOG, RTS3_N, CTS3_N, TXD3, RXD3, PERST0_N,
|
||||||
AUXIN3, TXD4, RXD4, RTS4_N, CST4_N, PWM1, PWM2, PWM3, PWM4,
|
PERST1_N, WLED_N, EPHY_LED0_N, AUXIN0, AUXIN1, AUXIN2,
|
||||||
PWM5, PWM6, PWM7, GPIO_E, TOP_5G_CLK, TOP_5G_DATA,
|
AUXIN3, TXD4, RXD4, RTS4_N, CST4_N, PWM1, PWM2, PWM3, PWM4,
|
||||||
WF0_5G_HB0, WF0_5G_HB1, WF0_5G_HB2, WF0_5G_HB3, WF0_5G_HB4,
|
PWM5, PWM6, PWM7, GPIO_E, TOP_5G_CLK, TOP_5G_DATA,
|
||||||
WF0_5G_HB5, WF0_5G_HB6, XO_REQ, TOP_RST_N, SYS_WATCHDOG,
|
WF0_5G_HB0, WF0_5G_HB1, WF0_5G_HB2, WF0_5G_HB3, WF0_5G_HB4,
|
||||||
EPHY_LED0_N_JTDO, EPHY_LED1_N_JTDI, EPHY_LED2_N_JTMS,
|
WF0_5G_HB5, WF0_5G_HB6, XO_REQ, TOP_RST_N, SYS_WATCHDOG,
|
||||||
EPHY_LED3_N_JTCLK, EPHY_LED4_N_JTRST_N, WF2G_LED_N,
|
EPHY_LED0_N_JTDO, EPHY_LED1_N_JTDI, EPHY_LED2_N_JTMS,
|
||||||
WF5G_LED_N, GPIO_9, GPIO_10, GPIO_11, GPIO_12, UART1_TXD,
|
EPHY_LED3_N_JTCLK, EPHY_LED4_N_JTRST_N, WF2G_LED_N,
|
||||||
UART1_RXD, UART1_CTS, UART1_RTS, UART2_TXD, UART2_RXD,
|
WF5G_LED_N, GPIO_9, GPIO_10, GPIO_11, GPIO_12, UART1_TXD,
|
||||||
UART2_CTS, UART2_RTS, SMI_MDC, SMI_MDIO, PCIE_PERESET_N,
|
UART1_RXD, UART1_CTS, UART1_RTS, UART2_TXD, UART2_RXD,
|
||||||
PWM_0, GPIO_0, GPIO_1, GPIO_2, GPIO_3, GPIO_4, GPIO_5,
|
UART2_CTS, UART2_RTS, SMI_MDC, SMI_MDIO, PCIE_PERESET_N,
|
||||||
GPIO_6, GPIO_7, GPIO_8, UART0_TXD, UART0_RXD, TOP_2G_CLK,
|
PWM_0, GPIO_0, GPIO_1, GPIO_2, GPIO_3, GPIO_4, GPIO_5,
|
||||||
TOP_2G_DATA, WF0_2G_HB0, WF0_2G_HB1, WF0_2G_HB2, WF0_2G_HB3,
|
GPIO_6, GPIO_7, GPIO_8, UART0_TXD, UART0_RXD, TOP_2G_CLK,
|
||||||
WF0_2G_HB4, WF0_2G_HB5, WF0_2G_HB6]
|
TOP_2G_DATA, WF0_2G_HB0, WF0_2G_HB1, WF0_2G_HB2, WF0_2G_HB3,
|
||||||
|
WF0_2G_HB4, WF0_2G_HB5, WF0_2G_HB6]
|
||||||
|
|
||||||
bias-disable: true
|
bias-disable: true
|
||||||
|
|
||||||
|
|||||||
@@ -151,6 +151,7 @@ allOf:
|
|||||||
unevaluatedProperties: false
|
unevaluatedProperties: false
|
||||||
|
|
||||||
pcie-phy:
|
pcie-phy:
|
||||||
|
type: object
|
||||||
description:
|
description:
|
||||||
Documentation/devicetree/bindings/phy/rockchip-pcie-phy.txt
|
Documentation/devicetree/bindings/phy/rockchip-pcie-phy.txt
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,11 @@ Optional properties:
|
|||||||
a GPIO spec for the external headphone detect pin. If jd-mode = 0,
|
a GPIO spec for the external headphone detect pin. If jd-mode = 0,
|
||||||
we will get the JD status by getting the value of hp-detect-gpios.
|
we will get the JD status by getting the value of hp-detect-gpios.
|
||||||
|
|
||||||
|
- cbj-sleeve-gpios:
|
||||||
|
a GPIO spec to control the external combo jack circuit to tie the sleeve/ring2
|
||||||
|
contacts to the ground or floating. It could avoid some electric noise from the
|
||||||
|
active speaker jacks.
|
||||||
|
|
||||||
- realtek,in2-differential
|
- realtek,in2-differential
|
||||||
Boolean. Indicate MIC2 input are differential, rather than single-ended.
|
Boolean. Indicate MIC2 input are differential, rather than single-ended.
|
||||||
|
|
||||||
@@ -68,6 +73,7 @@ codec: rt5650@1a {
|
|||||||
compatible = "realtek,rt5650";
|
compatible = "realtek,rt5650";
|
||||||
reg = <0x1a>;
|
reg = <0x1a>;
|
||||||
hp-detect-gpios = <&gpio 19 0>;
|
hp-detect-gpios = <&gpio 19 0>;
|
||||||
|
cbj-sleeve-gpios = <&gpio 20 0>;
|
||||||
interrupt-parent = <&gpio>;
|
interrupt-parent = <&gpio>;
|
||||||
interrupts = <7 IRQ_TYPE_EDGE_FALLING>;
|
interrupts = <7 IRQ_TYPE_EDGE_FALLING>;
|
||||||
realtek,dmic-en = "true";
|
realtek,dmic-en = "true";
|
||||||
|
|||||||
@@ -46,13 +46,16 @@ API to add a new FPGA region
|
|||||||
----------------------------
|
----------------------------
|
||||||
|
|
||||||
* struct fpga_region - The FPGA region struct
|
* struct fpga_region - The FPGA region struct
|
||||||
* struct fpga_region_info - Parameter structure for fpga_region_register_full()
|
* struct fpga_region_info - Parameter structure for __fpga_region_register_full()
|
||||||
* fpga_region_register_full() - Create and register an FPGA region using the
|
* __fpga_region_register_full() - Create and register an FPGA region using the
|
||||||
fpga_region_info structure to provide the full flexibility of options
|
fpga_region_info structure to provide the full flexibility of options
|
||||||
* fpga_region_register() - Create and register an FPGA region using standard
|
* __fpga_region_register() - Create and register an FPGA region using standard
|
||||||
arguments
|
arguments
|
||||||
* fpga_region_unregister() - Unregister an FPGA region
|
* fpga_region_unregister() - Unregister an FPGA region
|
||||||
|
|
||||||
|
Helper macros ``fpga_region_register()`` and ``fpga_region_register_full()``
|
||||||
|
automatically set the module that registers the FPGA region as the owner.
|
||||||
|
|
||||||
The FPGA region's probe function will need to get a reference to the FPGA
|
The FPGA region's probe function will need to get a reference to the FPGA
|
||||||
Manager it will be using to do the programming. This usually would happen
|
Manager it will be using to do the programming. This usually would happen
|
||||||
during the region's probe function.
|
during the region's probe function.
|
||||||
@@ -82,10 +85,10 @@ following APIs to handle building or tearing down that list.
|
|||||||
:functions: fpga_region_info
|
:functions: fpga_region_info
|
||||||
|
|
||||||
.. kernel-doc:: drivers/fpga/fpga-region.c
|
.. kernel-doc:: drivers/fpga/fpga-region.c
|
||||||
:functions: fpga_region_register_full
|
:functions: __fpga_region_register_full
|
||||||
|
|
||||||
.. kernel-doc:: drivers/fpga/fpga-region.c
|
.. kernel-doc:: drivers/fpga/fpga-region.c
|
||||||
:functions: fpga_region_register
|
:functions: __fpga_region_register
|
||||||
|
|
||||||
.. kernel-doc:: drivers/fpga/fpga-region.c
|
.. kernel-doc:: drivers/fpga/fpga-region.c
|
||||||
:functions: fpga_region_unregister
|
:functions: fpga_region_unregister
|
||||||
|
|||||||
@@ -205,6 +205,7 @@ Adaptive coalescing can be switched on/off through `ethtool(8)`'s
|
|||||||
More information about Adaptive Interrupt Moderation (DIM) can be found in
|
More information about Adaptive Interrupt Moderation (DIM) can be found in
|
||||||
Documentation/networking/net_dim.rst
|
Documentation/networking/net_dim.rst
|
||||||
|
|
||||||
|
.. _`RX copybreak`:
|
||||||
RX copybreak
|
RX copybreak
|
||||||
============
|
============
|
||||||
The rx_copybreak is initialized by default to ENA_DEFAULT_RX_COPYBREAK
|
The rx_copybreak is initialized by default to ENA_DEFAULT_RX_COPYBREAK
|
||||||
@@ -315,3 +316,34 @@ Rx
|
|||||||
- The new SKB is updated with the necessary information (protocol,
|
- The new SKB is updated with the necessary information (protocol,
|
||||||
checksum hw verify result, etc), and then passed to the network
|
checksum hw verify result, etc), and then passed to the network
|
||||||
stack, using the NAPI interface function :code:`napi_gro_receive()`.
|
stack, using the NAPI interface function :code:`napi_gro_receive()`.
|
||||||
|
|
||||||
|
Dynamic RX Buffers (DRB)
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
Each RX descriptor in the RX ring is a single memory page (which is either 4KB
|
||||||
|
or 16KB long depending on system's configurations).
|
||||||
|
To reduce the memory allocations required when dealing with a high rate of small
|
||||||
|
packets, the driver tries to reuse the remaining RX descriptor's space if more
|
||||||
|
than 2KB of this page remain unused.
|
||||||
|
|
||||||
|
A simple example of this mechanism is the following sequence of events:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
1. Driver allocates page-sized RX buffer and passes it to hardware
|
||||||
|
+----------------------+
|
||||||
|
|4KB RX Buffer |
|
||||||
|
+----------------------+
|
||||||
|
|
||||||
|
2. A 300Bytes packet is received on this buffer
|
||||||
|
|
||||||
|
3. The driver increases the ref count on this page and returns it back to
|
||||||
|
HW as an RX buffer of size 4KB - 300Bytes = 3796 Bytes
|
||||||
|
+----+--------------------+
|
||||||
|
|****|3796 Bytes RX Buffer|
|
||||||
|
+----+--------------------+
|
||||||
|
|
||||||
|
This mechanism isn't used when an XDP program is loaded, or when the
|
||||||
|
RX packet is less than rx_copybreak bytes (in which case the packet is
|
||||||
|
copied out of the RX buffer into the linear part of a new skb allocated
|
||||||
|
for it and the RX buffer remains the same size, see `RX copybreak`_).
|
||||||
|
|||||||
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
VERSION = 6
|
VERSION = 6
|
||||||
PATCHLEVEL = 1
|
PATCHLEVEL = 1
|
||||||
SUBLEVEL = 92
|
SUBLEVEL = 93
|
||||||
EXTRAVERSION =
|
EXTRAVERSION =
|
||||||
NAME = Curry Ramen
|
NAME = Curry Ramen
|
||||||
|
|
||||||
|
|||||||
@@ -110,6 +110,7 @@ CONFIG_DRM_PANEL_LVDS=y
|
|||||||
CONFIG_DRM_PANEL_SIMPLE=y
|
CONFIG_DRM_PANEL_SIMPLE=y
|
||||||
CONFIG_DRM_PANEL_EDP=y
|
CONFIG_DRM_PANEL_EDP=y
|
||||||
CONFIG_DRM_SIMPLE_BRIDGE=y
|
CONFIG_DRM_SIMPLE_BRIDGE=y
|
||||||
|
CONFIG_DRM_DW_HDMI=y
|
||||||
CONFIG_DRM_LIMA=y
|
CONFIG_DRM_LIMA=y
|
||||||
CONFIG_FB_SIMPLE=y
|
CONFIG_FB_SIMPLE=y
|
||||||
CONFIG_BACKLIGHT_CLASS_DEVICE=y
|
CONFIG_BACKLIGHT_CLASS_DEVICE=y
|
||||||
|
|||||||
@@ -61,10 +61,15 @@
|
|||||||
#clock-cells = <0>;
|
#clock-cells = <0>;
|
||||||
};
|
};
|
||||||
|
|
||||||
pwrc: power-controller {
|
firmware {
|
||||||
compatible = "amlogic,meson-s4-pwrc";
|
sm: secure-monitor {
|
||||||
#power-domain-cells = <1>;
|
compatible = "amlogic,meson-gxbb-sm";
|
||||||
status = "okay";
|
|
||||||
|
pwrc: power-controller {
|
||||||
|
compatible = "amlogic,meson-s4-pwrc";
|
||||||
|
#power-domain-cells = <1>;
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
soc {
|
soc {
|
||||||
|
|||||||
@@ -28,6 +28,7 @@
|
|||||||
14470: .long 14471f - .; \
|
14470: .long 14471f - .; \
|
||||||
_BUGVERBOSE_LOCATION(__FILE__, __LINE__) \
|
_BUGVERBOSE_LOCATION(__FILE__, __LINE__) \
|
||||||
.short flags; \
|
.short flags; \
|
||||||
|
.align 2; \
|
||||||
.popsection; \
|
.popsection; \
|
||||||
14471:
|
14471:
|
||||||
#else
|
#else
|
||||||
|
|||||||
@@ -13,8 +13,7 @@
|
|||||||
|
|
||||||
#define perf_arch_fetch_caller_regs(regs, __ip) { \
|
#define perf_arch_fetch_caller_regs(regs, __ip) { \
|
||||||
(regs)->csr_era = (__ip); \
|
(regs)->csr_era = (__ip); \
|
||||||
(regs)->regs[3] = current_stack_pointer; \
|
(regs)->regs[3] = (unsigned long) __builtin_frame_address(0); \
|
||||||
(regs)->regs[22] = (unsigned long) __builtin_frame_address(0); \
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* __LOONGARCH_PERF_EVENT_H__ */
|
#endif /* __LOONGARCH_PERF_EVENT_H__ */
|
||||||
|
|||||||
@@ -884,4 +884,4 @@ static int __init init_hw_perf_events(void)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
early_initcall(init_hw_perf_events);
|
pure_initcall(init_hw_perf_events);
|
||||||
|
|||||||
@@ -430,7 +430,9 @@ resume:
|
|||||||
movec %a0,%dfc
|
movec %a0,%dfc
|
||||||
|
|
||||||
/* restore status register */
|
/* restore status register */
|
||||||
movew %a1@(TASK_THREAD+THREAD_SR),%sr
|
movew %a1@(TASK_THREAD+THREAD_SR),%d0
|
||||||
|
oriw #0x0700,%d0
|
||||||
|
movew %d0,%sr
|
||||||
|
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
|||||||
@@ -451,30 +451,18 @@ void mac_poweroff(void)
|
|||||||
|
|
||||||
void mac_reset(void)
|
void mac_reset(void)
|
||||||
{
|
{
|
||||||
if (macintosh_config->adb_type == MAC_ADB_II &&
|
|
||||||
macintosh_config->ident != MAC_MODEL_SE30) {
|
|
||||||
/* need ROMBASE in booter */
|
|
||||||
/* indeed, plus need to MAP THE ROM !! */
|
|
||||||
|
|
||||||
if (mac_bi_data.rombase == 0)
|
|
||||||
mac_bi_data.rombase = 0x40800000;
|
|
||||||
|
|
||||||
/* works on some */
|
|
||||||
rom_reset = (void *) (mac_bi_data.rombase + 0xa);
|
|
||||||
|
|
||||||
local_irq_disable();
|
|
||||||
rom_reset();
|
|
||||||
#ifdef CONFIG_ADB_CUDA
|
#ifdef CONFIG_ADB_CUDA
|
||||||
} else if (macintosh_config->adb_type == MAC_ADB_EGRET ||
|
if (macintosh_config->adb_type == MAC_ADB_EGRET ||
|
||||||
macintosh_config->adb_type == MAC_ADB_CUDA) {
|
macintosh_config->adb_type == MAC_ADB_CUDA) {
|
||||||
cuda_restart();
|
cuda_restart();
|
||||||
|
} else
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_ADB_PMU
|
#ifdef CONFIG_ADB_PMU
|
||||||
} else if (macintosh_config->adb_type == MAC_ADB_PB2) {
|
if (macintosh_config->adb_type == MAC_ADB_PB2) {
|
||||||
pmu_restart();
|
pmu_restart();
|
||||||
|
} else
|
||||||
#endif
|
#endif
|
||||||
} else if (CPU_IS_030) {
|
if (CPU_IS_030) {
|
||||||
|
|
||||||
/* 030-specific reset routine. The idea is general, but the
|
/* 030-specific reset routine. The idea is general, but the
|
||||||
* specific registers to reset are '030-specific. Until I
|
* specific registers to reset are '030-specific. Until I
|
||||||
* have a non-030 machine, I can't test anything else.
|
* have a non-030 machine, I can't test anything else.
|
||||||
@@ -522,6 +510,18 @@ void mac_reset(void)
|
|||||||
"jmp %/a0@\n\t" /* jump to the reset vector */
|
"jmp %/a0@\n\t" /* jump to the reset vector */
|
||||||
".chip 68k"
|
".chip 68k"
|
||||||
: : "r" (offset), "a" (rombase) : "a0");
|
: : "r" (offset), "a" (rombase) : "a0");
|
||||||
|
} else {
|
||||||
|
/* need ROMBASE in booter */
|
||||||
|
/* indeed, plus need to MAP THE ROM !! */
|
||||||
|
|
||||||
|
if (mac_bi_data.rombase == 0)
|
||||||
|
mac_bi_data.rombase = 0x40800000;
|
||||||
|
|
||||||
|
/* works on some */
|
||||||
|
rom_reset = (void *)(mac_bi_data.rombase + 0xa);
|
||||||
|
|
||||||
|
local_irq_disable();
|
||||||
|
rom_reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* should never get here */
|
/* should never get here */
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ ifdef CONFIG_FUNCTION_TRACER
|
|||||||
# Do not trace early boot code and low level code
|
# Do not trace early boot code and low level code
|
||||||
CFLAGS_REMOVE_timer.o = -pg
|
CFLAGS_REMOVE_timer.o = -pg
|
||||||
CFLAGS_REMOVE_intc.o = -pg
|
CFLAGS_REMOVE_intc.o = -pg
|
||||||
CFLAGS_REMOVE_early_printk.o = -pg
|
|
||||||
CFLAGS_REMOVE_ftrace.o = -pg
|
CFLAGS_REMOVE_ftrace.o = -pg
|
||||||
CFLAGS_REMOVE_process.o = -pg
|
CFLAGS_REMOVE_process.o = -pg
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ static const char family_string[] = CONFIG_XILINX_MICROBLAZE0_FAMILY;
|
|||||||
static const char cpu_ver_string[] = CONFIG_XILINX_MICROBLAZE0_HW_VER;
|
static const char cpu_ver_string[] = CONFIG_XILINX_MICROBLAZE0_HW_VER;
|
||||||
|
|
||||||
#define err_printk(x) \
|
#define err_printk(x) \
|
||||||
early_printk("ERROR: Microblaze " x "-different for kernel and DTS\n");
|
pr_err("ERROR: Microblaze " x "-different for kernel and DTS\n");
|
||||||
|
|
||||||
void __init set_cpuinfo_static(struct cpuinfo *ci, struct device_node *cpu)
|
void __init set_cpuinfo_static(struct cpuinfo *ci, struct device_node *cpu)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ EXPORT_SYMBOL(memset);
|
|||||||
#include <linux/atomic.h>
|
#include <linux/atomic.h>
|
||||||
EXPORT_SYMBOL(__xchg8);
|
EXPORT_SYMBOL(__xchg8);
|
||||||
EXPORT_SYMBOL(__xchg32);
|
EXPORT_SYMBOL(__xchg32);
|
||||||
|
EXPORT_SYMBOL(__cmpxchg_u8);
|
||||||
EXPORT_SYMBOL(__cmpxchg_u32);
|
EXPORT_SYMBOL(__cmpxchg_u32);
|
||||||
EXPORT_SYMBOL(__cmpxchg_u64);
|
EXPORT_SYMBOL(__cmpxchg_u64);
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
|
|||||||
@@ -539,7 +539,7 @@ struct hvcall_mpp_data {
|
|||||||
unsigned long backing_mem;
|
unsigned long backing_mem;
|
||||||
};
|
};
|
||||||
|
|
||||||
int h_get_mpp(struct hvcall_mpp_data *);
|
long h_get_mpp(struct hvcall_mpp_data *mpp_data);
|
||||||
|
|
||||||
struct hvcall_mpp_x_data {
|
struct hvcall_mpp_x_data {
|
||||||
unsigned long coalesced_bytes;
|
unsigned long coalesced_bytes;
|
||||||
|
|||||||
@@ -1904,10 +1904,10 @@ out:
|
|||||||
* h_get_mpp
|
* h_get_mpp
|
||||||
* H_GET_MPP hcall returns info in 7 parms
|
* H_GET_MPP hcall returns info in 7 parms
|
||||||
*/
|
*/
|
||||||
int h_get_mpp(struct hvcall_mpp_data *mpp_data)
|
long h_get_mpp(struct hvcall_mpp_data *mpp_data)
|
||||||
{
|
{
|
||||||
int rc;
|
unsigned long retbuf[PLPAR_HCALL9_BUFSIZE] = {0};
|
||||||
unsigned long retbuf[PLPAR_HCALL9_BUFSIZE];
|
long rc;
|
||||||
|
|
||||||
rc = plpar_hcall9(H_GET_MPP, retbuf);
|
rc = plpar_hcall9(H_GET_MPP, retbuf);
|
||||||
|
|
||||||
|
|||||||
@@ -112,8 +112,8 @@ struct hvcall_ppp_data {
|
|||||||
*/
|
*/
|
||||||
static unsigned int h_get_ppp(struct hvcall_ppp_data *ppp_data)
|
static unsigned int h_get_ppp(struct hvcall_ppp_data *ppp_data)
|
||||||
{
|
{
|
||||||
unsigned long rc;
|
unsigned long retbuf[PLPAR_HCALL9_BUFSIZE] = {0};
|
||||||
unsigned long retbuf[PLPAR_HCALL9_BUFSIZE];
|
long rc;
|
||||||
|
|
||||||
rc = plpar_hcall9(H_GET_PPP, retbuf);
|
rc = plpar_hcall9(H_GET_PPP, retbuf);
|
||||||
|
|
||||||
@@ -192,7 +192,7 @@ static void parse_ppp_data(struct seq_file *m)
|
|||||||
struct hvcall_ppp_data ppp_data;
|
struct hvcall_ppp_data ppp_data;
|
||||||
struct device_node *root;
|
struct device_node *root;
|
||||||
const __be32 *perf_level;
|
const __be32 *perf_level;
|
||||||
int rc;
|
long rc;
|
||||||
|
|
||||||
rc = h_get_ppp(&ppp_data);
|
rc = h_get_ppp(&ppp_data);
|
||||||
if (rc)
|
if (rc)
|
||||||
@@ -393,8 +393,8 @@ static int read_dt_lpar_name(struct seq_file *m)
|
|||||||
|
|
||||||
static void read_lpar_name(struct seq_file *m)
|
static void read_lpar_name(struct seq_file *m)
|
||||||
{
|
{
|
||||||
if (read_rtas_lpar_name(m) && read_dt_lpar_name(m))
|
if (read_rtas_lpar_name(m))
|
||||||
pr_err_once("Error can't get the LPAR name");
|
read_dt_lpar_name(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SPLPAR_CHARACTERISTICS_TOKEN 20
|
#define SPLPAR_CHARACTERISTICS_TOKEN 20
|
||||||
|
|||||||
@@ -567,10 +567,12 @@ static const struct fsl_msi_feature ipic_msi_feature = {
|
|||||||
.msiir_offset = 0x38,
|
.msiir_offset = 0x38,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_EPAPR_PARAVIRT
|
||||||
static const struct fsl_msi_feature vmpic_msi_feature = {
|
static const struct fsl_msi_feature vmpic_msi_feature = {
|
||||||
.fsl_pic_ip = FSL_PIC_IP_VMPIC,
|
.fsl_pic_ip = FSL_PIC_IP_VMPIC,
|
||||||
.msiir_offset = 0,
|
.msiir_offset = 0,
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
static const struct of_device_id fsl_of_msi_ids[] = {
|
static const struct of_device_id fsl_of_msi_ids[] = {
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ static int sbi_cpu_start(unsigned int cpuid, struct task_struct *tidle)
|
|||||||
/* Make sure tidle is updated */
|
/* Make sure tidle is updated */
|
||||||
smp_mb();
|
smp_mb();
|
||||||
bdata->task_ptr = tidle;
|
bdata->task_ptr = tidle;
|
||||||
bdata->stack_ptr = task_stack_page(tidle) + THREAD_SIZE;
|
bdata->stack_ptr = task_pt_regs(tidle);
|
||||||
/* Make sure boot data is updated */
|
/* Make sure boot data is updated */
|
||||||
smp_mb();
|
smp_mb();
|
||||||
hsm_data = __pa(bdata);
|
hsm_data = __pa(bdata);
|
||||||
|
|||||||
@@ -34,8 +34,7 @@ static void cpu_update_secondary_bootdata(unsigned int cpuid,
|
|||||||
|
|
||||||
/* Make sure tidle is updated */
|
/* Make sure tidle is updated */
|
||||||
smp_mb();
|
smp_mb();
|
||||||
WRITE_ONCE(__cpu_spinwait_stack_pointer[hartid],
|
WRITE_ONCE(__cpu_spinwait_stack_pointer[hartid], task_pt_regs(tidle));
|
||||||
task_stack_page(tidle) + THREAD_SIZE);
|
|
||||||
WRITE_ONCE(__cpu_spinwait_task_pointer[hartid], tidle);
|
WRITE_ONCE(__cpu_spinwait_task_pointer[hartid], tidle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -248,7 +248,7 @@ ret_from_syscall_rejected:
|
|||||||
andi t0, t0, _TIF_SYSCALL_WORK
|
andi t0, t0, _TIF_SYSCALL_WORK
|
||||||
bnez t0, handle_syscall_trace_exit
|
bnez t0, handle_syscall_trace_exit
|
||||||
|
|
||||||
ret_from_exception:
|
SYM_CODE_START_NOALIGN(ret_from_exception)
|
||||||
REG_L s0, PT_STATUS(sp)
|
REG_L s0, PT_STATUS(sp)
|
||||||
csrc CSR_STATUS, SR_IE
|
csrc CSR_STATUS, SR_IE
|
||||||
#ifdef CONFIG_TRACE_IRQFLAGS
|
#ifdef CONFIG_TRACE_IRQFLAGS
|
||||||
@@ -262,6 +262,7 @@ ret_from_exception:
|
|||||||
andi s0, s0, SR_SPP
|
andi s0, s0, SR_SPP
|
||||||
#endif
|
#endif
|
||||||
bnez s0, resume_kernel
|
bnez s0, resume_kernel
|
||||||
|
SYM_CODE_END(ret_from_exception)
|
||||||
|
|
||||||
/* Interrupts must be disabled here so flags are checked atomically */
|
/* Interrupts must be disabled here so flags are checked atomically */
|
||||||
REG_L s0, TASK_TI_FLAGS(tp) /* current_thread_info->flags */
|
REG_L s0, TASK_TI_FLAGS(tp) /* current_thread_info->flags */
|
||||||
|
|||||||
@@ -16,6 +16,18 @@
|
|||||||
|
|
||||||
#ifdef CONFIG_FRAME_POINTER
|
#ifdef CONFIG_FRAME_POINTER
|
||||||
|
|
||||||
|
extern asmlinkage void ret_from_exception(void);
|
||||||
|
|
||||||
|
static inline int fp_is_valid(unsigned long fp, unsigned long sp)
|
||||||
|
{
|
||||||
|
unsigned long low, high;
|
||||||
|
|
||||||
|
low = sp + sizeof(struct stackframe);
|
||||||
|
high = ALIGN(sp, THREAD_SIZE);
|
||||||
|
|
||||||
|
return !(fp < low || fp > high || fp & 0x07);
|
||||||
|
}
|
||||||
|
|
||||||
void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs,
|
void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs,
|
||||||
bool (*fn)(void *, unsigned long), void *arg)
|
bool (*fn)(void *, unsigned long), void *arg)
|
||||||
{
|
{
|
||||||
@@ -39,27 +51,32 @@ void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs,
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
unsigned long low, high;
|
|
||||||
struct stackframe *frame;
|
struct stackframe *frame;
|
||||||
|
|
||||||
if (unlikely(!__kernel_text_address(pc) || (level++ >= 0 && !fn(arg, pc))))
|
if (unlikely(!__kernel_text_address(pc) || (level++ >= 0 && !fn(arg, pc))))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Validate frame pointer */
|
if (unlikely(!fp_is_valid(fp, sp)))
|
||||||
low = sp + sizeof(struct stackframe);
|
|
||||||
high = ALIGN(sp, THREAD_SIZE);
|
|
||||||
if (unlikely(fp < low || fp > high || fp & 0x7))
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Unwind stack frame */
|
/* Unwind stack frame */
|
||||||
frame = (struct stackframe *)fp - 1;
|
frame = (struct stackframe *)fp - 1;
|
||||||
sp = fp;
|
sp = fp;
|
||||||
if (regs && (regs->epc == pc) && (frame->fp & 0x7)) {
|
if (regs && (regs->epc == pc) && fp_is_valid(frame->ra, sp)) {
|
||||||
|
/* We hit function where ra is not saved on the stack */
|
||||||
fp = frame->ra;
|
fp = frame->ra;
|
||||||
pc = regs->ra;
|
pc = regs->ra;
|
||||||
} else {
|
} else {
|
||||||
fp = frame->fp;
|
fp = frame->fp;
|
||||||
pc = ftrace_graph_ret_addr(current, NULL, frame->ra,
|
pc = ftrace_graph_ret_addr(current, NULL, frame->ra,
|
||||||
&frame->ra);
|
&frame->ra);
|
||||||
|
if (pc == (unsigned long)ret_from_exception) {
|
||||||
|
if (unlikely(!__kernel_text_address(pc) || !fn(arg, pc)))
|
||||||
|
break;
|
||||||
|
|
||||||
|
pc = ((struct pt_regs *)sp)->epc;
|
||||||
|
fp = ((struct pt_regs *)sp)->s0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -503,33 +503,33 @@ static void emit_atomic(u8 rd, u8 rs, s16 off, s32 imm, bool is64,
|
|||||||
break;
|
break;
|
||||||
/* src_reg = atomic_fetch_<op>(dst_reg + off16, src_reg) */
|
/* src_reg = atomic_fetch_<op>(dst_reg + off16, src_reg) */
|
||||||
case BPF_ADD | BPF_FETCH:
|
case BPF_ADD | BPF_FETCH:
|
||||||
emit(is64 ? rv_amoadd_d(rs, rs, rd, 0, 0) :
|
emit(is64 ? rv_amoadd_d(rs, rs, rd, 1, 1) :
|
||||||
rv_amoadd_w(rs, rs, rd, 0, 0), ctx);
|
rv_amoadd_w(rs, rs, rd, 1, 1), ctx);
|
||||||
if (!is64)
|
if (!is64)
|
||||||
emit_zext_32(rs, ctx);
|
emit_zext_32(rs, ctx);
|
||||||
break;
|
break;
|
||||||
case BPF_AND | BPF_FETCH:
|
case BPF_AND | BPF_FETCH:
|
||||||
emit(is64 ? rv_amoand_d(rs, rs, rd, 0, 0) :
|
emit(is64 ? rv_amoand_d(rs, rs, rd, 1, 1) :
|
||||||
rv_amoand_w(rs, rs, rd, 0, 0), ctx);
|
rv_amoand_w(rs, rs, rd, 1, 1), ctx);
|
||||||
if (!is64)
|
if (!is64)
|
||||||
emit_zext_32(rs, ctx);
|
emit_zext_32(rs, ctx);
|
||||||
break;
|
break;
|
||||||
case BPF_OR | BPF_FETCH:
|
case BPF_OR | BPF_FETCH:
|
||||||
emit(is64 ? rv_amoor_d(rs, rs, rd, 0, 0) :
|
emit(is64 ? rv_amoor_d(rs, rs, rd, 1, 1) :
|
||||||
rv_amoor_w(rs, rs, rd, 0, 0), ctx);
|
rv_amoor_w(rs, rs, rd, 1, 1), ctx);
|
||||||
if (!is64)
|
if (!is64)
|
||||||
emit_zext_32(rs, ctx);
|
emit_zext_32(rs, ctx);
|
||||||
break;
|
break;
|
||||||
case BPF_XOR | BPF_FETCH:
|
case BPF_XOR | BPF_FETCH:
|
||||||
emit(is64 ? rv_amoxor_d(rs, rs, rd, 0, 0) :
|
emit(is64 ? rv_amoxor_d(rs, rs, rd, 1, 1) :
|
||||||
rv_amoxor_w(rs, rs, rd, 0, 0), ctx);
|
rv_amoxor_w(rs, rs, rd, 1, 1), ctx);
|
||||||
if (!is64)
|
if (!is64)
|
||||||
emit_zext_32(rs, ctx);
|
emit_zext_32(rs, ctx);
|
||||||
break;
|
break;
|
||||||
/* src_reg = atomic_xchg(dst_reg + off16, src_reg); */
|
/* src_reg = atomic_xchg(dst_reg + off16, src_reg); */
|
||||||
case BPF_XCHG:
|
case BPF_XCHG:
|
||||||
emit(is64 ? rv_amoswap_d(rs, rs, rd, 0, 0) :
|
emit(is64 ? rv_amoswap_d(rs, rs, rd, 1, 1) :
|
||||||
rv_amoswap_w(rs, rs, rd, 0, 0), ctx);
|
rv_amoswap_w(rs, rs, rd, 1, 1), ctx);
|
||||||
if (!is64)
|
if (!is64)
|
||||||
emit_zext_32(rs, ctx);
|
emit_zext_32(rs, ctx);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -30,7 +30,6 @@ int __bootdata(is_full_image) = 1;
|
|||||||
struct initrd_data __bootdata(initrd_data);
|
struct initrd_data __bootdata(initrd_data);
|
||||||
|
|
||||||
u64 __bootdata_preserved(stfle_fac_list[16]);
|
u64 __bootdata_preserved(stfle_fac_list[16]);
|
||||||
u64 __bootdata_preserved(alt_stfle_fac_list[16]);
|
|
||||||
struct oldmem_data __bootdata_preserved(oldmem_data);
|
struct oldmem_data __bootdata_preserved(oldmem_data);
|
||||||
|
|
||||||
void error(char *x)
|
void error(char *x)
|
||||||
|
|||||||
@@ -834,8 +834,8 @@ static ssize_t reipl_nvme_scpdata_write(struct file *filp, struct kobject *kobj,
|
|||||||
scpdata_len += padding;
|
scpdata_len += padding;
|
||||||
}
|
}
|
||||||
|
|
||||||
reipl_block_nvme->hdr.len = IPL_BP_FCP_LEN + scpdata_len;
|
reipl_block_nvme->hdr.len = IPL_BP_NVME_LEN + scpdata_len;
|
||||||
reipl_block_nvme->nvme.len = IPL_BP0_FCP_LEN + scpdata_len;
|
reipl_block_nvme->nvme.len = IPL_BP0_NVME_LEN + scpdata_len;
|
||||||
reipl_block_nvme->nvme.scp_data_len = scpdata_len;
|
reipl_block_nvme->nvme.scp_data_len = scpdata_len;
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
@@ -1604,9 +1604,9 @@ static int __init dump_nvme_init(void)
|
|||||||
}
|
}
|
||||||
dump_block_nvme->hdr.len = IPL_BP_NVME_LEN;
|
dump_block_nvme->hdr.len = IPL_BP_NVME_LEN;
|
||||||
dump_block_nvme->hdr.version = IPL_PARM_BLOCK_VERSION;
|
dump_block_nvme->hdr.version = IPL_PARM_BLOCK_VERSION;
|
||||||
dump_block_nvme->fcp.len = IPL_BP0_NVME_LEN;
|
dump_block_nvme->nvme.len = IPL_BP0_NVME_LEN;
|
||||||
dump_block_nvme->fcp.pbt = IPL_PBT_NVME;
|
dump_block_nvme->nvme.pbt = IPL_PBT_NVME;
|
||||||
dump_block_nvme->fcp.opt = IPL_PB0_NVME_OPT_DUMP;
|
dump_block_nvme->nvme.opt = IPL_PB0_NVME_OPT_DUMP;
|
||||||
dump_capabilities |= DUMP_TYPE_NVME;
|
dump_capabilities |= DUMP_TYPE_NVME;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -155,7 +155,7 @@ unsigned int __bootdata_preserved(zlib_dfltcc_support);
|
|||||||
EXPORT_SYMBOL(zlib_dfltcc_support);
|
EXPORT_SYMBOL(zlib_dfltcc_support);
|
||||||
u64 __bootdata_preserved(stfle_fac_list[16]);
|
u64 __bootdata_preserved(stfle_fac_list[16]);
|
||||||
EXPORT_SYMBOL(stfle_fac_list);
|
EXPORT_SYMBOL(stfle_fac_list);
|
||||||
u64 __bootdata_preserved(alt_stfle_fac_list[16]);
|
u64 alt_stfle_fac_list[16];
|
||||||
struct oldmem_data __bootdata_preserved(oldmem_data);
|
struct oldmem_data __bootdata_preserved(oldmem_data);
|
||||||
|
|
||||||
unsigned long VMALLOC_START;
|
unsigned long VMALLOC_START;
|
||||||
|
|||||||
@@ -20,7 +20,10 @@ KBUILD_AFLAGS_32 := $(filter-out -m64,$(KBUILD_AFLAGS))
|
|||||||
KBUILD_AFLAGS_32 += -m31 -s
|
KBUILD_AFLAGS_32 += -m31 -s
|
||||||
|
|
||||||
KBUILD_CFLAGS_32 := $(filter-out -m64,$(KBUILD_CFLAGS))
|
KBUILD_CFLAGS_32 := $(filter-out -m64,$(KBUILD_CFLAGS))
|
||||||
KBUILD_CFLAGS_32 += -m31 -fPIC -shared -fno-common -fno-builtin
|
KBUILD_CFLAGS_32 := $(filter-out -mpacked-stack,$(KBUILD_CFLAGS))
|
||||||
|
KBUILD_CFLAGS_32 := $(filter-out -mno-pic-data-is-text-relative,$(KBUILD_CFLAGS_32))
|
||||||
|
KBUILD_CFLAGS_32 := $(filter-out -fno-asynchronous-unwind-tables,$(KBUILD_CFLAGS_32))
|
||||||
|
KBUILD_CFLAGS_32 += -m31 -fPIC -shared -fno-common -fno-builtin -fasynchronous-unwind-tables
|
||||||
|
|
||||||
LDFLAGS_vdso32.so.dbg += -shared -soname=linux-vdso32.so.1 \
|
LDFLAGS_vdso32.so.dbg += -shared -soname=linux-vdso32.so.1 \
|
||||||
--hash-style=both --build-id=sha1 -melf_s390 -T
|
--hash-style=both --build-id=sha1 -melf_s390 -T
|
||||||
|
|||||||
@@ -25,7 +25,11 @@ KBUILD_AFLAGS_64 := $(filter-out -m64,$(KBUILD_AFLAGS))
|
|||||||
KBUILD_AFLAGS_64 += -m64 -s
|
KBUILD_AFLAGS_64 += -m64 -s
|
||||||
|
|
||||||
KBUILD_CFLAGS_64 := $(filter-out -m64,$(KBUILD_CFLAGS))
|
KBUILD_CFLAGS_64 := $(filter-out -m64,$(KBUILD_CFLAGS))
|
||||||
KBUILD_CFLAGS_64 += -m64 -fPIC -fno-common -fno-builtin
|
KBUILD_CFLAGS_64 := $(filter-out -mpacked-stack,$(KBUILD_CFLAGS_64))
|
||||||
|
KBUILD_CFLAGS_64 := $(filter-out -mno-pic-data-is-text-relative,$(KBUILD_CFLAGS_64))
|
||||||
|
KBUILD_CFLAGS_64 := $(filter-out -munaligned-symbols,$(KBUILD_CFLAGS_64))
|
||||||
|
KBUILD_CFLAGS_64 := $(filter-out -fno-asynchronous-unwind-tables,$(KBUILD_CFLAGS_64))
|
||||||
|
KBUILD_CFLAGS_64 += -m64 -fPIC -fno-common -fno-builtin -fasynchronous-unwind-tables
|
||||||
ldflags-y := -shared -soname=linux-vdso64.so.1 \
|
ldflags-y := -shared -soname=linux-vdso64.so.1 \
|
||||||
--hash-style=both --build-id=sha1 -T
|
--hash-style=both --build-id=sha1 -T
|
||||||
|
|
||||||
|
|||||||
@@ -1207,8 +1207,12 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp,
|
|||||||
EMIT6_DISP_LH(0xeb000000, is32 ? (op32) : (op64), \
|
EMIT6_DISP_LH(0xeb000000, is32 ? (op32) : (op64), \
|
||||||
(insn->imm & BPF_FETCH) ? src_reg : REG_W0, \
|
(insn->imm & BPF_FETCH) ? src_reg : REG_W0, \
|
||||||
src_reg, dst_reg, off); \
|
src_reg, dst_reg, off); \
|
||||||
if (is32 && (insn->imm & BPF_FETCH)) \
|
if (insn->imm & BPF_FETCH) { \
|
||||||
EMIT_ZERO(src_reg); \
|
/* bcr 14,0 - see atomic_fetch_{add,and,or,xor}() */ \
|
||||||
|
_EMIT2(0x07e0); \
|
||||||
|
if (is32) \
|
||||||
|
EMIT_ZERO(src_reg); \
|
||||||
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
case BPF_ADD:
|
case BPF_ADD:
|
||||||
case BPF_ADD | BPF_FETCH:
|
case BPF_ADD | BPF_FETCH:
|
||||||
|
|||||||
@@ -44,17 +44,12 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p)
|
|||||||
if (OPCODE_RTE(opcode))
|
if (OPCODE_RTE(opcode))
|
||||||
return -EFAULT; /* Bad breakpoint */
|
return -EFAULT; /* Bad breakpoint */
|
||||||
|
|
||||||
|
memcpy(p->ainsn.insn, p->addr, MAX_INSN_SIZE * sizeof(kprobe_opcode_t));
|
||||||
p->opcode = opcode;
|
p->opcode = opcode;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void __kprobes arch_copy_kprobe(struct kprobe *p)
|
|
||||||
{
|
|
||||||
memcpy(p->ainsn.insn, p->addr, MAX_INSN_SIZE * sizeof(kprobe_opcode_t));
|
|
||||||
p->opcode = *p->addr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void __kprobes arch_arm_kprobe(struct kprobe *p)
|
void __kprobes arch_arm_kprobe(struct kprobe *p)
|
||||||
{
|
{
|
||||||
*p->addr = BREAKPOINT_INSTRUCTION;
|
*p->addr = BREAKPOINT_INSTRUCTION;
|
||||||
|
|||||||
@@ -33,7 +33,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* asmlinkage __wsum csum_partial(const void *buf, int len, __wsum sum);
|
* unsigned int csum_partial(const unsigned char *buf, int len,
|
||||||
|
* unsigned int sum);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.text
|
.text
|
||||||
@@ -45,31 +46,11 @@ ENTRY(csum_partial)
|
|||||||
* Fortunately, it is easy to convert 2-byte alignment to 4-byte
|
* Fortunately, it is easy to convert 2-byte alignment to 4-byte
|
||||||
* alignment for the unrolled loop.
|
* alignment for the unrolled loop.
|
||||||
*/
|
*/
|
||||||
|
mov r5, r1
|
||||||
mov r4, r0
|
mov r4, r0
|
||||||
tst #3, r0 ! Check alignment.
|
tst #2, r0 ! Check alignment.
|
||||||
bt/s 2f ! Jump if alignment is ok.
|
bt 2f ! Jump if alignment is ok.
|
||||||
mov r4, r7 ! Keep a copy to check for alignment
|
|
||||||
!
|
!
|
||||||
tst #1, r0 ! Check alignment.
|
|
||||||
bt 21f ! Jump if alignment is boundary of 2bytes.
|
|
||||||
|
|
||||||
! buf is odd
|
|
||||||
tst r5, r5
|
|
||||||
add #-1, r5
|
|
||||||
bt 9f
|
|
||||||
mov.b @r4+, r0
|
|
||||||
extu.b r0, r0
|
|
||||||
addc r0, r6 ! t=0 from previous tst
|
|
||||||
mov r6, r0
|
|
||||||
shll8 r6
|
|
||||||
shlr16 r0
|
|
||||||
shlr8 r0
|
|
||||||
or r0, r6
|
|
||||||
mov r4, r0
|
|
||||||
tst #2, r0
|
|
||||||
bt 2f
|
|
||||||
21:
|
|
||||||
! buf is 2 byte aligned (len could be 0)
|
|
||||||
add #-2, r5 ! Alignment uses up two bytes.
|
add #-2, r5 ! Alignment uses up two bytes.
|
||||||
cmp/pz r5 !
|
cmp/pz r5 !
|
||||||
bt/s 1f ! Jump if we had at least two bytes.
|
bt/s 1f ! Jump if we had at least two bytes.
|
||||||
@@ -77,17 +58,16 @@ ENTRY(csum_partial)
|
|||||||
bra 6f
|
bra 6f
|
||||||
add #2, r5 ! r5 was < 2. Deal with it.
|
add #2, r5 ! r5 was < 2. Deal with it.
|
||||||
1:
|
1:
|
||||||
|
mov r5, r1 ! Save new len for later use.
|
||||||
mov.w @r4+, r0
|
mov.w @r4+, r0
|
||||||
extu.w r0, r0
|
extu.w r0, r0
|
||||||
addc r0, r6
|
addc r0, r6
|
||||||
bf 2f
|
bf 2f
|
||||||
add #1, r6
|
add #1, r6
|
||||||
2:
|
2:
|
||||||
! buf is 4 byte aligned (len could be 0)
|
|
||||||
mov r5, r1
|
|
||||||
mov #-5, r0
|
mov #-5, r0
|
||||||
shld r0, r1
|
shld r0, r5
|
||||||
tst r1, r1
|
tst r5, r5
|
||||||
bt/s 4f ! if it's =0, go to 4f
|
bt/s 4f ! if it's =0, go to 4f
|
||||||
clrt
|
clrt
|
||||||
.align 2
|
.align 2
|
||||||
@@ -109,31 +89,30 @@ ENTRY(csum_partial)
|
|||||||
addc r0, r6
|
addc r0, r6
|
||||||
addc r2, r6
|
addc r2, r6
|
||||||
movt r0
|
movt r0
|
||||||
dt r1
|
dt r5
|
||||||
bf/s 3b
|
bf/s 3b
|
||||||
cmp/eq #1, r0
|
cmp/eq #1, r0
|
||||||
! here, we know r1==0
|
! here, we know r5==0
|
||||||
addc r1, r6 ! add carry to r6
|
addc r5, r6 ! add carry to r6
|
||||||
4:
|
4:
|
||||||
mov r5, r0
|
mov r1, r0
|
||||||
and #0x1c, r0
|
and #0x1c, r0
|
||||||
tst r0, r0
|
tst r0, r0
|
||||||
bt 6f
|
bt/s 6f
|
||||||
! 4 bytes or more remaining
|
mov r0, r5
|
||||||
mov r0, r1
|
shlr2 r5
|
||||||
shlr2 r1
|
|
||||||
mov #0, r2
|
mov #0, r2
|
||||||
5:
|
5:
|
||||||
addc r2, r6
|
addc r2, r6
|
||||||
mov.l @r4+, r2
|
mov.l @r4+, r2
|
||||||
movt r0
|
movt r0
|
||||||
dt r1
|
dt r5
|
||||||
bf/s 5b
|
bf/s 5b
|
||||||
cmp/eq #1, r0
|
cmp/eq #1, r0
|
||||||
addc r2, r6
|
addc r2, r6
|
||||||
addc r1, r6 ! r1==0 here, so it means add carry-bit
|
addc r5, r6 ! r5==0 here, so it means add carry-bit
|
||||||
6:
|
6:
|
||||||
! 3 bytes or less remaining
|
mov r1, r5
|
||||||
mov #3, r0
|
mov #3, r0
|
||||||
and r0, r5
|
and r0, r5
|
||||||
tst r5, r5
|
tst r5, r5
|
||||||
@@ -159,16 +138,6 @@ ENTRY(csum_partial)
|
|||||||
mov #0, r0
|
mov #0, r0
|
||||||
addc r0, r6
|
addc r0, r6
|
||||||
9:
|
9:
|
||||||
! Check if the buffer was misaligned, if so realign sum
|
|
||||||
mov r7, r0
|
|
||||||
tst #1, r0
|
|
||||||
bt 10f
|
|
||||||
mov r6, r0
|
|
||||||
shll8 r6
|
|
||||||
shlr16 r0
|
|
||||||
shlr8 r0
|
|
||||||
or r0, r6
|
|
||||||
10:
|
|
||||||
rts
|
rts
|
||||||
mov r6, r0
|
mov r6, r0
|
||||||
|
|
||||||
|
|||||||
@@ -673,24 +673,26 @@ void register_winch_irq(int fd, int tty_fd, int pid, struct tty_port *port,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
*winch = ((struct winch) { .list = LIST_HEAD_INIT(winch->list),
|
*winch = ((struct winch) { .fd = fd,
|
||||||
.fd = fd,
|
|
||||||
.tty_fd = tty_fd,
|
.tty_fd = tty_fd,
|
||||||
.pid = pid,
|
.pid = pid,
|
||||||
.port = port,
|
.port = port,
|
||||||
.stack = stack });
|
.stack = stack });
|
||||||
|
|
||||||
|
spin_lock(&winch_handler_lock);
|
||||||
|
list_add(&winch->list, &winch_handlers);
|
||||||
|
spin_unlock(&winch_handler_lock);
|
||||||
|
|
||||||
if (um_request_irq(WINCH_IRQ, fd, IRQ_READ, winch_interrupt,
|
if (um_request_irq(WINCH_IRQ, fd, IRQ_READ, winch_interrupt,
|
||||||
IRQF_SHARED, "winch", winch) < 0) {
|
IRQF_SHARED, "winch", winch) < 0) {
|
||||||
printk(KERN_ERR "register_winch_irq - failed to register "
|
printk(KERN_ERR "register_winch_irq - failed to register "
|
||||||
"IRQ\n");
|
"IRQ\n");
|
||||||
|
spin_lock(&winch_handler_lock);
|
||||||
|
list_del(&winch->list);
|
||||||
|
spin_unlock(&winch_handler_lock);
|
||||||
goto out_free;
|
goto out_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_lock(&winch_handler_lock);
|
|
||||||
list_add(&winch->list, &winch_handlers);
|
|
||||||
spin_unlock(&winch_handler_lock);
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
out_free:
|
out_free:
|
||||||
|
|||||||
@@ -1099,7 +1099,7 @@ static int __init ubd_init(void)
|
|||||||
|
|
||||||
if (irq_req_buffer == NULL) {
|
if (irq_req_buffer == NULL) {
|
||||||
printk(KERN_ERR "Failed to initialize ubd buffering\n");
|
printk(KERN_ERR "Failed to initialize ubd buffering\n");
|
||||||
return -1;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
io_req_buffer = kmalloc_array(UBD_REQ_BUFFER_SIZE,
|
io_req_buffer = kmalloc_array(UBD_REQ_BUFFER_SIZE,
|
||||||
sizeof(struct io_thread_req *),
|
sizeof(struct io_thread_req *),
|
||||||
@@ -1110,7 +1110,7 @@ static int __init ubd_init(void)
|
|||||||
|
|
||||||
if (io_req_buffer == NULL) {
|
if (io_req_buffer == NULL) {
|
||||||
printk(KERN_ERR "Failed to initialize ubd buffering\n");
|
printk(KERN_ERR "Failed to initialize ubd buffering\n");
|
||||||
return -1;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
platform_driver_register(&ubd_driver);
|
platform_driver_register(&ubd_driver);
|
||||||
mutex_lock(&ubd_lock);
|
mutex_lock(&ubd_lock);
|
||||||
|
|||||||
@@ -141,7 +141,7 @@ static bool get_bpf_flash(struct arglist *def)
|
|||||||
|
|
||||||
if (allow != NULL) {
|
if (allow != NULL) {
|
||||||
if (kstrtoul(allow, 10, &result) == 0)
|
if (kstrtoul(allow, 10, &result) == 0)
|
||||||
return (allow > 0);
|
return result > 0;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,6 @@
|
|||||||
|
|
||||||
#ifdef CONFIG_KASAN
|
#ifdef CONFIG_KASAN
|
||||||
void kasan_init(void);
|
void kasan_init(void);
|
||||||
void kasan_map_memory(void *start, unsigned long len);
|
|
||||||
extern int kasan_um_is_ready;
|
extern int kasan_um_is_ready;
|
||||||
|
|
||||||
#ifdef CONFIG_STATIC_LINK
|
#ifdef CONFIG_STATIC_LINK
|
||||||
|
|||||||
@@ -15,8 +15,6 @@ typedef struct mm_context {
|
|||||||
struct page *stub_pages[2];
|
struct page *stub_pages[2];
|
||||||
} mm_context_t;
|
} mm_context_t;
|
||||||
|
|
||||||
extern void __switch_mm(struct mm_id * mm_idp);
|
|
||||||
|
|
||||||
/* Avoid tangled inclusion with asm/ldt.h */
|
/* Avoid tangled inclusion with asm/ldt.h */
|
||||||
extern long init_new_ldt(struct mm_context *to_mm, struct mm_context *from_mm);
|
extern long init_new_ldt(struct mm_context *to_mm, struct mm_context *from_mm);
|
||||||
extern void free_ldt(struct mm_context *mm);
|
extern void free_ldt(struct mm_context *mm);
|
||||||
|
|||||||
@@ -95,7 +95,6 @@ extern struct cpuinfo_um boot_cpu_data;
|
|||||||
#define current_cpu_data boot_cpu_data
|
#define current_cpu_data boot_cpu_data
|
||||||
#define cache_line_size() (boot_cpu_data.cache_alignment)
|
#define cache_line_size() (boot_cpu_data.cache_alignment)
|
||||||
|
|
||||||
extern unsigned long get_thread_reg(int reg, jmp_buf *buf);
|
|
||||||
#define KSTK_REG(tsk, reg) get_thread_reg(reg, &tsk->thread.switch_buf)
|
#define KSTK_REG(tsk, reg) get_thread_reg(reg, &tsk->thread.switch_buf)
|
||||||
extern unsigned long __get_wchan(struct task_struct *p);
|
extern unsigned long __get_wchan(struct task_struct *p);
|
||||||
|
|
||||||
|
|||||||
@@ -67,4 +67,6 @@ extern void fatal_sigsegv(void) __attribute__ ((noreturn));
|
|||||||
|
|
||||||
void um_idle_sleep(void);
|
void um_idle_sleep(void);
|
||||||
|
|
||||||
|
void kasan_map_memory(void *start, size_t len);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -15,4 +15,6 @@ struct mm_id {
|
|||||||
int kill;
|
int kill;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void __switch_mm(struct mm_id *mm_idp);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
#include <sys/vfs.h>
|
#include <sys/vfs.h>
|
||||||
#include <linux/magic.h>
|
#include <linux/magic.h>
|
||||||
#include <init.h>
|
#include <init.h>
|
||||||
|
#include <kern_util.h>
|
||||||
#include <os.h>
|
#include <os.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -248,6 +248,7 @@ config UNWINDER_ORC
|
|||||||
|
|
||||||
config UNWINDER_FRAME_POINTER
|
config UNWINDER_FRAME_POINTER
|
||||||
bool "Frame pointer unwinder"
|
bool "Frame pointer unwinder"
|
||||||
|
select ARCH_WANT_FRAME_POINTERS
|
||||||
select FRAME_POINTER
|
select FRAME_POINTER
|
||||||
help
|
help
|
||||||
This option enables the frame pointer unwinder for unwinding kernel
|
This option enables the frame pointer unwinder for unwinding kernel
|
||||||
@@ -271,7 +272,3 @@ config UNWINDER_GUESS
|
|||||||
overhead.
|
overhead.
|
||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
config FRAME_POINTER
|
|
||||||
depends on !UNWINDER_ORC && !UNWINDER_GUESS
|
|
||||||
bool
|
|
||||||
|
|||||||
@@ -390,6 +390,11 @@ SYM_CODE_START(startup_64)
|
|||||||
call sev_enable
|
call sev_enable
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Preserve only the CR4 bits that must be preserved, and clear the rest */
|
||||||
|
movq %cr4, %rax
|
||||||
|
andl $(X86_CR4_PAE | X86_CR4_MCE | X86_CR4_LA57), %eax
|
||||||
|
movq %rax, %cr4
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* configure_5level_paging() updates the number of paging levels using
|
* configure_5level_paging() updates the number of paging levels using
|
||||||
* a trampoline in 32-bit addressable memory if the current number does
|
* a trampoline in 32-bit addressable memory if the current number does
|
||||||
|
|||||||
@@ -153,5 +153,6 @@ SYM_FUNC_START(nh_avx2)
|
|||||||
vpaddq T1, T0, T0
|
vpaddq T1, T0, T0
|
||||||
vpaddq T4, T0, T0
|
vpaddq T4, T0, T0
|
||||||
vmovdqu T0, (HASH)
|
vmovdqu T0, (HASH)
|
||||||
|
vzeroupper
|
||||||
RET
|
RET
|
||||||
SYM_FUNC_END(nh_avx2)
|
SYM_FUNC_END(nh_avx2)
|
||||||
|
|||||||
@@ -711,6 +711,7 @@ done_hash:
|
|||||||
popq %r13
|
popq %r13
|
||||||
popq %r12
|
popq %r12
|
||||||
popq %rbx
|
popq %rbx
|
||||||
|
vzeroupper
|
||||||
RET
|
RET
|
||||||
SYM_FUNC_END(sha256_transform_rorx)
|
SYM_FUNC_END(sha256_transform_rorx)
|
||||||
|
|
||||||
|
|||||||
@@ -680,6 +680,7 @@ done_hash:
|
|||||||
pop %r12
|
pop %r12
|
||||||
pop %rbx
|
pop %rbx
|
||||||
|
|
||||||
|
vzeroupper
|
||||||
RET
|
RET
|
||||||
SYM_FUNC_END(sha512_transform_rorx)
|
SYM_FUNC_END(sha512_transform_rorx)
|
||||||
|
|
||||||
|
|||||||
@@ -98,11 +98,6 @@ static int addr_to_vsyscall_nr(unsigned long addr)
|
|||||||
|
|
||||||
static bool write_ok_or_segv(unsigned long ptr, size_t size)
|
static bool write_ok_or_segv(unsigned long ptr, size_t size)
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
* XXX: if access_ok, get_user, and put_user handled
|
|
||||||
* sig_on_uaccess_err, this could go away.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!access_ok((void __user *)ptr, size)) {
|
if (!access_ok((void __user *)ptr, size)) {
|
||||||
struct thread_struct *thread = ¤t->thread;
|
struct thread_struct *thread = ¤t->thread;
|
||||||
|
|
||||||
@@ -120,10 +115,8 @@ static bool write_ok_or_segv(unsigned long ptr, size_t size)
|
|||||||
bool emulate_vsyscall(unsigned long error_code,
|
bool emulate_vsyscall(unsigned long error_code,
|
||||||
struct pt_regs *regs, unsigned long address)
|
struct pt_regs *regs, unsigned long address)
|
||||||
{
|
{
|
||||||
struct task_struct *tsk;
|
|
||||||
unsigned long caller;
|
unsigned long caller;
|
||||||
int vsyscall_nr, syscall_nr, tmp;
|
int vsyscall_nr, syscall_nr, tmp;
|
||||||
int prev_sig_on_uaccess_err;
|
|
||||||
long ret;
|
long ret;
|
||||||
unsigned long orig_dx;
|
unsigned long orig_dx;
|
||||||
|
|
||||||
@@ -172,8 +165,6 @@ bool emulate_vsyscall(unsigned long error_code,
|
|||||||
goto sigsegv;
|
goto sigsegv;
|
||||||
}
|
}
|
||||||
|
|
||||||
tsk = current;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check for access_ok violations and find the syscall nr.
|
* Check for access_ok violations and find the syscall nr.
|
||||||
*
|
*
|
||||||
@@ -234,12 +225,8 @@ bool emulate_vsyscall(unsigned long error_code,
|
|||||||
goto do_ret; /* skip requested */
|
goto do_ret; /* skip requested */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* With a real vsyscall, page faults cause SIGSEGV. We want to
|
* With a real vsyscall, page faults cause SIGSEGV.
|
||||||
* preserve that behavior to make writing exploits harder.
|
|
||||||
*/
|
*/
|
||||||
prev_sig_on_uaccess_err = current->thread.sig_on_uaccess_err;
|
|
||||||
current->thread.sig_on_uaccess_err = 1;
|
|
||||||
|
|
||||||
ret = -EFAULT;
|
ret = -EFAULT;
|
||||||
switch (vsyscall_nr) {
|
switch (vsyscall_nr) {
|
||||||
case 0:
|
case 0:
|
||||||
@@ -262,23 +249,12 @@ bool emulate_vsyscall(unsigned long error_code,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
current->thread.sig_on_uaccess_err = prev_sig_on_uaccess_err;
|
|
||||||
|
|
||||||
check_fault:
|
check_fault:
|
||||||
if (ret == -EFAULT) {
|
if (ret == -EFAULT) {
|
||||||
/* Bad news -- userspace fed a bad pointer to a vsyscall. */
|
/* Bad news -- userspace fed a bad pointer to a vsyscall. */
|
||||||
warn_bad_vsyscall(KERN_INFO, regs,
|
warn_bad_vsyscall(KERN_INFO, regs,
|
||||||
"vsyscall fault (exploit attempt?)");
|
"vsyscall fault (exploit attempt?)");
|
||||||
|
goto sigsegv;
|
||||||
/*
|
|
||||||
* If we failed to generate a signal for any reason,
|
|
||||||
* generate one here. (This should be impossible.)
|
|
||||||
*/
|
|
||||||
if (WARN_ON_ONCE(!sigismember(&tsk->pending.signal, SIGBUS) &&
|
|
||||||
!sigismember(&tsk->pending.signal, SIGSEGV)))
|
|
||||||
goto sigsegv;
|
|
||||||
|
|
||||||
return true; /* Don't emulate the ret. */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
regs->ax = ret;
|
regs->ax = ret;
|
||||||
|
|||||||
@@ -544,6 +544,8 @@ static inline void update_page_count(int level, unsigned long pages) { }
|
|||||||
extern pte_t *lookup_address(unsigned long address, unsigned int *level);
|
extern pte_t *lookup_address(unsigned long address, unsigned int *level);
|
||||||
extern pte_t *lookup_address_in_pgd(pgd_t *pgd, unsigned long address,
|
extern pte_t *lookup_address_in_pgd(pgd_t *pgd, unsigned long address,
|
||||||
unsigned int *level);
|
unsigned int *level);
|
||||||
|
pte_t *lookup_address_in_pgd_attr(pgd_t *pgd, unsigned long address,
|
||||||
|
unsigned int *level, bool *nx, bool *rw);
|
||||||
extern pmd_t *lookup_pmd_address(unsigned long address);
|
extern pmd_t *lookup_pmd_address(unsigned long address);
|
||||||
extern phys_addr_t slow_virt_to_phys(void *__address);
|
extern phys_addr_t slow_virt_to_phys(void *__address);
|
||||||
extern int __init kernel_map_pages_in_pgd(pgd_t *pgd, u64 pfn,
|
extern int __init kernel_map_pages_in_pgd(pgd_t *pgd, u64 pfn,
|
||||||
|
|||||||
@@ -519,7 +519,6 @@ struct thread_struct {
|
|||||||
unsigned long iopl_emul;
|
unsigned long iopl_emul;
|
||||||
|
|
||||||
unsigned int iopl_warn:1;
|
unsigned int iopl_warn:1;
|
||||||
unsigned int sig_on_uaccess_err:1;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Protection Keys Register for Userspace. Loaded immediately on
|
* Protection Keys Register for Userspace. Loaded immediately on
|
||||||
|
|||||||
@@ -37,8 +37,6 @@ extern int phys_to_target_node(phys_addr_t start);
|
|||||||
#define phys_to_target_node phys_to_target_node
|
#define phys_to_target_node phys_to_target_node
|
||||||
extern int memory_add_physaddr_to_nid(u64 start);
|
extern int memory_add_physaddr_to_nid(u64 start);
|
||||||
#define memory_add_physaddr_to_nid memory_add_physaddr_to_nid
|
#define memory_add_physaddr_to_nid memory_add_physaddr_to_nid
|
||||||
extern int numa_fill_memblks(u64 start, u64 end);
|
|
||||||
#define numa_fill_memblks numa_fill_memblks
|
|
||||||
#endif
|
#endif
|
||||||
#endif /* __ASSEMBLY__ */
|
#endif /* __ASSEMBLY__ */
|
||||||
|
|
||||||
|
|||||||
@@ -982,7 +982,8 @@ static void __send_cleanup_vector(struct apic_chip_data *apicd)
|
|||||||
hlist_add_head(&apicd->clist, per_cpu_ptr(&cleanup_list, cpu));
|
hlist_add_head(&apicd->clist, per_cpu_ptr(&cleanup_list, cpu));
|
||||||
apic->send_IPI(cpu, IRQ_MOVE_CLEANUP_VECTOR);
|
apic->send_IPI(cpu, IRQ_MOVE_CLEANUP_VECTOR);
|
||||||
} else {
|
} else {
|
||||||
apicd->prev_vector = 0;
|
pr_warn("IRQ %u schedule cleanup for offline CPU %u\n", apicd->irq, cpu);
|
||||||
|
free_moved_vector(apicd);
|
||||||
}
|
}
|
||||||
raw_spin_unlock(&vector_lock);
|
raw_spin_unlock(&vector_lock);
|
||||||
}
|
}
|
||||||
@@ -1019,6 +1020,7 @@ void irq_complete_move(struct irq_cfg *cfg)
|
|||||||
*/
|
*/
|
||||||
void irq_force_complete_move(struct irq_desc *desc)
|
void irq_force_complete_move(struct irq_desc *desc)
|
||||||
{
|
{
|
||||||
|
unsigned int cpu = smp_processor_id();
|
||||||
struct apic_chip_data *apicd;
|
struct apic_chip_data *apicd;
|
||||||
struct irq_data *irqd;
|
struct irq_data *irqd;
|
||||||
unsigned int vector;
|
unsigned int vector;
|
||||||
@@ -1043,10 +1045,11 @@ void irq_force_complete_move(struct irq_desc *desc)
|
|||||||
goto unlock;
|
goto unlock;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If prev_vector is empty, no action required.
|
* If prev_vector is empty or the descriptor is neither currently
|
||||||
|
* nor previously on the outgoing CPU no action required.
|
||||||
*/
|
*/
|
||||||
vector = apicd->prev_vector;
|
vector = apicd->prev_vector;
|
||||||
if (!vector)
|
if (!vector || (apicd->cpu != cpu && apicd->prev_cpu != cpu))
|
||||||
goto unlock;
|
goto unlock;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -192,11 +192,9 @@ bool tsc_store_and_check_tsc_adjust(bool bootcpu)
|
|||||||
cur->warned = false;
|
cur->warned = false;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If a non-zero TSC value for socket 0 may be valid then the default
|
* The default adjust value cannot be assumed to be zero on any socket.
|
||||||
* adjusted value cannot assumed to be zero either.
|
|
||||||
*/
|
*/
|
||||||
if (tsc_async_resets)
|
cur->adjusted = bootval;
|
||||||
cur->adjusted = bootval;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check whether this CPU is the first in a package to come up. In
|
* Check whether this CPU is the first in a package to come up. In
|
||||||
|
|||||||
@@ -1157,9 +1157,8 @@ static inline int __do_cpuid_func(struct kvm_cpuid_array *array, u32 function)
|
|||||||
entry->eax = entry->ebx = entry->ecx = 0;
|
entry->eax = entry->ebx = entry->ecx = 0;
|
||||||
break;
|
break;
|
||||||
case 0x80000008: {
|
case 0x80000008: {
|
||||||
unsigned g_phys_as = (entry->eax >> 16) & 0xff;
|
unsigned int virt_as = max((entry->eax >> 8) & 0xff, 48U);
|
||||||
unsigned virt_as = max((entry->eax >> 8) & 0xff, 48U);
|
unsigned int phys_as;
|
||||||
unsigned phys_as = entry->eax & 0xff;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If TDP (NPT) is disabled use the adjusted host MAXPHYADDR as
|
* If TDP (NPT) is disabled use the adjusted host MAXPHYADDR as
|
||||||
@@ -1167,16 +1166,16 @@ static inline int __do_cpuid_func(struct kvm_cpuid_array *array, u32 function)
|
|||||||
* reductions in MAXPHYADDR for memory encryption affect shadow
|
* reductions in MAXPHYADDR for memory encryption affect shadow
|
||||||
* paging, too.
|
* paging, too.
|
||||||
*
|
*
|
||||||
* If TDP is enabled but an explicit guest MAXPHYADDR is not
|
* If TDP is enabled, use the raw bare metal MAXPHYADDR as
|
||||||
* provided, use the raw bare metal MAXPHYADDR as reductions to
|
* reductions to the HPAs do not affect GPAs.
|
||||||
* the HPAs do not affect GPAs.
|
|
||||||
*/
|
*/
|
||||||
if (!tdp_enabled)
|
if (!tdp_enabled) {
|
||||||
g_phys_as = boot_cpu_data.x86_phys_bits;
|
phys_as = boot_cpu_data.x86_phys_bits;
|
||||||
else if (!g_phys_as)
|
} else {
|
||||||
g_phys_as = phys_as;
|
phys_as = entry->eax & 0xff;
|
||||||
|
}
|
||||||
|
|
||||||
entry->eax = g_phys_as | (virt_as << 8);
|
entry->eax = phys_as | (virt_as << 8);
|
||||||
entry->ecx &= ~(GENMASK(31, 16) | GENMASK(11, 8));
|
entry->ecx &= ~(GENMASK(31, 16) | GENMASK(11, 8));
|
||||||
entry->edx = 0;
|
entry->edx = 0;
|
||||||
cpuid_entry_override(entry, CPUID_8000_0008_EBX);
|
cpuid_entry_override(entry, CPUID_8000_0008_EBX);
|
||||||
|
|||||||
@@ -148,7 +148,7 @@ AVXcode:
|
|||||||
65: SEG=GS (Prefix)
|
65: SEG=GS (Prefix)
|
||||||
66: Operand-Size (Prefix)
|
66: Operand-Size (Prefix)
|
||||||
67: Address-Size (Prefix)
|
67: Address-Size (Prefix)
|
||||||
68: PUSH Iz (d64)
|
68: PUSH Iz
|
||||||
69: IMUL Gv,Ev,Iz
|
69: IMUL Gv,Ev,Iz
|
||||||
6a: PUSH Ib (d64)
|
6a: PUSH Ib (d64)
|
||||||
6b: IMUL Gv,Ev,Ib
|
6b: IMUL Gv,Ev,Ib
|
||||||
@@ -698,10 +698,10 @@ AVXcode: 2
|
|||||||
4d: vrcp14ss/d Vsd,Hpd,Wsd (66),(ev)
|
4d: vrcp14ss/d Vsd,Hpd,Wsd (66),(ev)
|
||||||
4e: vrsqrt14ps/d Vpd,Wpd (66),(ev)
|
4e: vrsqrt14ps/d Vpd,Wpd (66),(ev)
|
||||||
4f: vrsqrt14ss/d Vsd,Hsd,Wsd (66),(ev)
|
4f: vrsqrt14ss/d Vsd,Hsd,Wsd (66),(ev)
|
||||||
50: vpdpbusd Vx,Hx,Wx (66),(ev)
|
50: vpdpbusd Vx,Hx,Wx (66)
|
||||||
51: vpdpbusds Vx,Hx,Wx (66),(ev)
|
51: vpdpbusds Vx,Hx,Wx (66)
|
||||||
52: vdpbf16ps Vx,Hx,Wx (F3),(ev) | vpdpwssd Vx,Hx,Wx (66),(ev) | vp4dpwssd Vdqq,Hdqq,Wdq (F2),(ev)
|
52: vdpbf16ps Vx,Hx,Wx (F3),(ev) | vpdpwssd Vx,Hx,Wx (66) | vp4dpwssd Vdqq,Hdqq,Wdq (F2),(ev)
|
||||||
53: vpdpwssds Vx,Hx,Wx (66),(ev) | vp4dpwssds Vdqq,Hdqq,Wdq (F2),(ev)
|
53: vpdpwssds Vx,Hx,Wx (66) | vp4dpwssds Vdqq,Hdqq,Wdq (F2),(ev)
|
||||||
54: vpopcntb/w Vx,Wx (66),(ev)
|
54: vpopcntb/w Vx,Wx (66),(ev)
|
||||||
55: vpopcntd/q Vx,Wx (66),(ev)
|
55: vpopcntd/q Vx,Wx (66),(ev)
|
||||||
58: vpbroadcastd Vx,Wx (66),(v)
|
58: vpbroadcastd Vx,Wx (66),(v)
|
||||||
|
|||||||
@@ -738,39 +738,8 @@ kernelmode_fixup_or_oops(struct pt_regs *regs, unsigned long error_code,
|
|||||||
WARN_ON_ONCE(user_mode(regs));
|
WARN_ON_ONCE(user_mode(regs));
|
||||||
|
|
||||||
/* Are we prepared to handle this kernel fault? */
|
/* Are we prepared to handle this kernel fault? */
|
||||||
if (fixup_exception(regs, X86_TRAP_PF, error_code, address)) {
|
if (fixup_exception(regs, X86_TRAP_PF, error_code, address))
|
||||||
/*
|
|
||||||
* Any interrupt that takes a fault gets the fixup. This makes
|
|
||||||
* the below recursive fault logic only apply to a faults from
|
|
||||||
* task context.
|
|
||||||
*/
|
|
||||||
if (in_interrupt())
|
|
||||||
return;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Per the above we're !in_interrupt(), aka. task context.
|
|
||||||
*
|
|
||||||
* In this case we need to make sure we're not recursively
|
|
||||||
* faulting through the emulate_vsyscall() logic.
|
|
||||||
*/
|
|
||||||
if (current->thread.sig_on_uaccess_err && signal) {
|
|
||||||
sanitize_error_code(address, &error_code);
|
|
||||||
|
|
||||||
set_signal_archinfo(address, error_code);
|
|
||||||
|
|
||||||
if (si_code == SEGV_PKUERR) {
|
|
||||||
force_sig_pkuerr((void __user *)address, pkey);
|
|
||||||
} else {
|
|
||||||
/* XXX: hwpoison faults will set the wrong code. */
|
|
||||||
force_sig_fault(signal, si_code, (void __user *)address);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Barring that, we can do the fixup and be happy.
|
|
||||||
*/
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* AMD erratum #91 manifests as a spurious page fault on a PREFETCH
|
* AMD erratum #91 manifests as a spurious page fault on a PREFETCH
|
||||||
|
|||||||
@@ -956,6 +956,8 @@ int memory_add_physaddr_to_nid(u64 start)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(memory_add_physaddr_to_nid);
|
EXPORT_SYMBOL_GPL(memory_add_physaddr_to_nid);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
static int __init cmp_memblk(const void *a, const void *b)
|
static int __init cmp_memblk(const void *a, const void *b)
|
||||||
{
|
{
|
||||||
const struct numa_memblk *ma = *(const struct numa_memblk **)a;
|
const struct numa_memblk *ma = *(const struct numa_memblk **)a;
|
||||||
@@ -1028,5 +1030,3 @@ int __init numa_fill_memblks(u64 start, u64 end)
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -583,7 +583,8 @@ static inline pgprot_t static_protections(pgprot_t prot, unsigned long start,
|
|||||||
* Validate strict W^X semantics.
|
* Validate strict W^X semantics.
|
||||||
*/
|
*/
|
||||||
static inline pgprot_t verify_rwx(pgprot_t old, pgprot_t new, unsigned long start,
|
static inline pgprot_t verify_rwx(pgprot_t old, pgprot_t new, unsigned long start,
|
||||||
unsigned long pfn, unsigned long npg)
|
unsigned long pfn, unsigned long npg,
|
||||||
|
bool nx, bool rw)
|
||||||
{
|
{
|
||||||
unsigned long end;
|
unsigned long end;
|
||||||
|
|
||||||
@@ -609,6 +610,10 @@ static inline pgprot_t verify_rwx(pgprot_t old, pgprot_t new, unsigned long star
|
|||||||
if ((pgprot_val(new) & (_PAGE_RW | _PAGE_NX)) != _PAGE_RW)
|
if ((pgprot_val(new) & (_PAGE_RW | _PAGE_NX)) != _PAGE_RW)
|
||||||
return new;
|
return new;
|
||||||
|
|
||||||
|
/* Non-leaf translation entries can disable writing or execution. */
|
||||||
|
if (!rw || nx)
|
||||||
|
return new;
|
||||||
|
|
||||||
end = start + npg * PAGE_SIZE - 1;
|
end = start + npg * PAGE_SIZE - 1;
|
||||||
WARN_ONCE(1, "CPA detected W^X violation: %016llx -> %016llx range: 0x%016lx - 0x%016lx PFN %lx\n",
|
WARN_ONCE(1, "CPA detected W^X violation: %016llx -> %016llx range: 0x%016lx - 0x%016lx PFN %lx\n",
|
||||||
(unsigned long long)pgprot_val(old),
|
(unsigned long long)pgprot_val(old),
|
||||||
@@ -625,20 +630,26 @@ static inline pgprot_t verify_rwx(pgprot_t old, pgprot_t new, unsigned long star
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Lookup the page table entry for a virtual address in a specific pgd.
|
* Lookup the page table entry for a virtual address in a specific pgd.
|
||||||
* Return a pointer to the entry and the level of the mapping.
|
* Return a pointer to the entry, the level of the mapping, and the effective
|
||||||
|
* NX and RW bits of all page table levels.
|
||||||
*/
|
*/
|
||||||
pte_t *lookup_address_in_pgd(pgd_t *pgd, unsigned long address,
|
pte_t *lookup_address_in_pgd_attr(pgd_t *pgd, unsigned long address,
|
||||||
unsigned int *level)
|
unsigned int *level, bool *nx, bool *rw)
|
||||||
{
|
{
|
||||||
p4d_t *p4d;
|
p4d_t *p4d;
|
||||||
pud_t *pud;
|
pud_t *pud;
|
||||||
pmd_t *pmd;
|
pmd_t *pmd;
|
||||||
|
|
||||||
*level = PG_LEVEL_NONE;
|
*level = PG_LEVEL_NONE;
|
||||||
|
*nx = false;
|
||||||
|
*rw = true;
|
||||||
|
|
||||||
if (pgd_none(*pgd))
|
if (pgd_none(*pgd))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
*nx |= pgd_flags(*pgd) & _PAGE_NX;
|
||||||
|
*rw &= pgd_flags(*pgd) & _PAGE_RW;
|
||||||
|
|
||||||
p4d = p4d_offset(pgd, address);
|
p4d = p4d_offset(pgd, address);
|
||||||
if (p4d_none(*p4d))
|
if (p4d_none(*p4d))
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -647,6 +658,9 @@ pte_t *lookup_address_in_pgd(pgd_t *pgd, unsigned long address,
|
|||||||
if (p4d_large(*p4d) || !p4d_present(*p4d))
|
if (p4d_large(*p4d) || !p4d_present(*p4d))
|
||||||
return (pte_t *)p4d;
|
return (pte_t *)p4d;
|
||||||
|
|
||||||
|
*nx |= p4d_flags(*p4d) & _PAGE_NX;
|
||||||
|
*rw &= p4d_flags(*p4d) & _PAGE_RW;
|
||||||
|
|
||||||
pud = pud_offset(p4d, address);
|
pud = pud_offset(p4d, address);
|
||||||
if (pud_none(*pud))
|
if (pud_none(*pud))
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -655,6 +669,9 @@ pte_t *lookup_address_in_pgd(pgd_t *pgd, unsigned long address,
|
|||||||
if (pud_large(*pud) || !pud_present(*pud))
|
if (pud_large(*pud) || !pud_present(*pud))
|
||||||
return (pte_t *)pud;
|
return (pte_t *)pud;
|
||||||
|
|
||||||
|
*nx |= pud_flags(*pud) & _PAGE_NX;
|
||||||
|
*rw &= pud_flags(*pud) & _PAGE_RW;
|
||||||
|
|
||||||
pmd = pmd_offset(pud, address);
|
pmd = pmd_offset(pud, address);
|
||||||
if (pmd_none(*pmd))
|
if (pmd_none(*pmd))
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -663,11 +680,26 @@ pte_t *lookup_address_in_pgd(pgd_t *pgd, unsigned long address,
|
|||||||
if (pmd_large(*pmd) || !pmd_present(*pmd))
|
if (pmd_large(*pmd) || !pmd_present(*pmd))
|
||||||
return (pte_t *)pmd;
|
return (pte_t *)pmd;
|
||||||
|
|
||||||
|
*nx |= pmd_flags(*pmd) & _PAGE_NX;
|
||||||
|
*rw &= pmd_flags(*pmd) & _PAGE_RW;
|
||||||
|
|
||||||
*level = PG_LEVEL_4K;
|
*level = PG_LEVEL_4K;
|
||||||
|
|
||||||
return pte_offset_kernel(pmd, address);
|
return pte_offset_kernel(pmd, address);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Lookup the page table entry for a virtual address in a specific pgd.
|
||||||
|
* Return a pointer to the entry and the level of the mapping.
|
||||||
|
*/
|
||||||
|
pte_t *lookup_address_in_pgd(pgd_t *pgd, unsigned long address,
|
||||||
|
unsigned int *level)
|
||||||
|
{
|
||||||
|
bool nx, rw;
|
||||||
|
|
||||||
|
return lookup_address_in_pgd_attr(pgd, address, level, &nx, &rw);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Lookup the page table entry for a virtual address. Return a pointer
|
* Lookup the page table entry for a virtual address. Return a pointer
|
||||||
* to the entry and the level of the mapping.
|
* to the entry and the level of the mapping.
|
||||||
@@ -683,13 +715,16 @@ pte_t *lookup_address(unsigned long address, unsigned int *level)
|
|||||||
EXPORT_SYMBOL_GPL(lookup_address);
|
EXPORT_SYMBOL_GPL(lookup_address);
|
||||||
|
|
||||||
static pte_t *_lookup_address_cpa(struct cpa_data *cpa, unsigned long address,
|
static pte_t *_lookup_address_cpa(struct cpa_data *cpa, unsigned long address,
|
||||||
unsigned int *level)
|
unsigned int *level, bool *nx, bool *rw)
|
||||||
{
|
{
|
||||||
if (cpa->pgd)
|
pgd_t *pgd;
|
||||||
return lookup_address_in_pgd(cpa->pgd + pgd_index(address),
|
|
||||||
address, level);
|
|
||||||
|
|
||||||
return lookup_address(address, level);
|
if (!cpa->pgd)
|
||||||
|
pgd = pgd_offset_k(address);
|
||||||
|
else
|
||||||
|
pgd = cpa->pgd + pgd_index(address);
|
||||||
|
|
||||||
|
return lookup_address_in_pgd_attr(pgd, address, level, nx, rw);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -813,12 +848,13 @@ static int __should_split_large_page(pte_t *kpte, unsigned long address,
|
|||||||
pgprot_t old_prot, new_prot, req_prot, chk_prot;
|
pgprot_t old_prot, new_prot, req_prot, chk_prot;
|
||||||
pte_t new_pte, *tmp;
|
pte_t new_pte, *tmp;
|
||||||
enum pg_level level;
|
enum pg_level level;
|
||||||
|
bool nx, rw;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check for races, another CPU might have split this page
|
* Check for races, another CPU might have split this page
|
||||||
* up already:
|
* up already:
|
||||||
*/
|
*/
|
||||||
tmp = _lookup_address_cpa(cpa, address, &level);
|
tmp = _lookup_address_cpa(cpa, address, &level, &nx, &rw);
|
||||||
if (tmp != kpte)
|
if (tmp != kpte)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
@@ -929,7 +965,8 @@ static int __should_split_large_page(pte_t *kpte, unsigned long address,
|
|||||||
new_prot = static_protections(req_prot, lpaddr, old_pfn, numpages,
|
new_prot = static_protections(req_prot, lpaddr, old_pfn, numpages,
|
||||||
psize, CPA_DETECT);
|
psize, CPA_DETECT);
|
||||||
|
|
||||||
new_prot = verify_rwx(old_prot, new_prot, lpaddr, old_pfn, numpages);
|
new_prot = verify_rwx(old_prot, new_prot, lpaddr, old_pfn, numpages,
|
||||||
|
nx, rw);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If there is a conflict, split the large page.
|
* If there is a conflict, split the large page.
|
||||||
@@ -1010,6 +1047,7 @@ __split_large_page(struct cpa_data *cpa, pte_t *kpte, unsigned long address,
|
|||||||
pte_t *pbase = (pte_t *)page_address(base);
|
pte_t *pbase = (pte_t *)page_address(base);
|
||||||
unsigned int i, level;
|
unsigned int i, level;
|
||||||
pgprot_t ref_prot;
|
pgprot_t ref_prot;
|
||||||
|
bool nx, rw;
|
||||||
pte_t *tmp;
|
pte_t *tmp;
|
||||||
|
|
||||||
spin_lock(&pgd_lock);
|
spin_lock(&pgd_lock);
|
||||||
@@ -1017,7 +1055,7 @@ __split_large_page(struct cpa_data *cpa, pte_t *kpte, unsigned long address,
|
|||||||
* Check for races, another CPU might have split this page
|
* Check for races, another CPU might have split this page
|
||||||
* up for us already:
|
* up for us already:
|
||||||
*/
|
*/
|
||||||
tmp = _lookup_address_cpa(cpa, address, &level);
|
tmp = _lookup_address_cpa(cpa, address, &level, &nx, &rw);
|
||||||
if (tmp != kpte) {
|
if (tmp != kpte) {
|
||||||
spin_unlock(&pgd_lock);
|
spin_unlock(&pgd_lock);
|
||||||
return 1;
|
return 1;
|
||||||
@@ -1558,10 +1596,11 @@ static int __change_page_attr(struct cpa_data *cpa, int primary)
|
|||||||
int do_split, err;
|
int do_split, err;
|
||||||
unsigned int level;
|
unsigned int level;
|
||||||
pte_t *kpte, old_pte;
|
pte_t *kpte, old_pte;
|
||||||
|
bool nx, rw;
|
||||||
|
|
||||||
address = __cpa_addr(cpa, cpa->curpage);
|
address = __cpa_addr(cpa, cpa->curpage);
|
||||||
repeat:
|
repeat:
|
||||||
kpte = _lookup_address_cpa(cpa, address, &level);
|
kpte = _lookup_address_cpa(cpa, address, &level, &nx, &rw);
|
||||||
if (!kpte)
|
if (!kpte)
|
||||||
return __cpa_process_fault(cpa, address, primary);
|
return __cpa_process_fault(cpa, address, primary);
|
||||||
|
|
||||||
@@ -1583,7 +1622,8 @@ repeat:
|
|||||||
new_prot = static_protections(new_prot, address, pfn, 1, 0,
|
new_prot = static_protections(new_prot, address, pfn, 1, 0,
|
||||||
CPA_PROTECT);
|
CPA_PROTECT);
|
||||||
|
|
||||||
new_prot = verify_rwx(old_prot, new_prot, address, pfn, 1);
|
new_prot = verify_rwx(old_prot, new_prot, address, pfn, 1,
|
||||||
|
nx, rw);
|
||||||
|
|
||||||
new_prot = pgprot_clear_protnone_bits(new_prot);
|
new_prot = pgprot_clear_protnone_bits(new_prot);
|
||||||
|
|
||||||
|
|||||||
@@ -42,7 +42,8 @@ KCOV_INSTRUMENT := n
|
|||||||
# make up the standalone purgatory.ro
|
# make up the standalone purgatory.ro
|
||||||
|
|
||||||
PURGATORY_CFLAGS_REMOVE := -mcmodel=kernel
|
PURGATORY_CFLAGS_REMOVE := -mcmodel=kernel
|
||||||
PURGATORY_CFLAGS := -mcmodel=large -ffreestanding -fno-zero-initialized-in-bss -g0
|
PURGATORY_CFLAGS := -mcmodel=small -ffreestanding -fno-zero-initialized-in-bss -g0
|
||||||
|
PURGATORY_CFLAGS += -fpic -fvisibility=hidden
|
||||||
PURGATORY_CFLAGS += $(DISABLE_STACKLEAK_PLUGIN) -DDISABLE_BRANCH_PROFILING
|
PURGATORY_CFLAGS += $(DISABLE_STACKLEAK_PLUGIN) -DDISABLE_BRANCH_PROFILING
|
||||||
PURGATORY_CFLAGS += -fno-stack-protector
|
PURGATORY_CFLAGS += -fno-stack-protector
|
||||||
|
|
||||||
|
|||||||
@@ -746,6 +746,15 @@ static void walk_relocs(int (*process)(struct section *sec, Elf_Rel *rel,
|
|||||||
if (!(sec_applies->shdr.sh_flags & SHF_ALLOC)) {
|
if (!(sec_applies->shdr.sh_flags & SHF_ALLOC)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Do not perform relocations in .notes sections; any
|
||||||
|
* values there are meant for pre-boot consumption (e.g.
|
||||||
|
* startup_xen).
|
||||||
|
*/
|
||||||
|
if (sec_applies->shdr.sh_type == SHT_NOTE)
|
||||||
|
continue;
|
||||||
|
|
||||||
sh_symtab = sec_symtab->symtab;
|
sh_symtab = sec_symtab->symtab;
|
||||||
sym_strtab = sec_symtab->link->strtab;
|
sym_strtab = sec_symtab->link->strtab;
|
||||||
for (j = 0; j < sec->shdr.sh_size/sizeof(Elf_Rel); j++) {
|
for (j = 0; j < sec->shdr.sh_size/sizeof(Elf_Rel); j++) {
|
||||||
|
|||||||
@@ -1,6 +1,13 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0 */
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
#ifndef __X86_UM_SYSDEP_ARCHSETJMP_H
|
||||||
|
#define __X86_UM_SYSDEP_ARCHSETJMP_H
|
||||||
|
|
||||||
#ifdef __i386__
|
#ifdef __i386__
|
||||||
#include "archsetjmp_32.h"
|
#include "archsetjmp_32.h"
|
||||||
#else
|
#else
|
||||||
#include "archsetjmp_64.h"
|
#include "archsetjmp_64.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
unsigned long get_thread_reg(int reg, jmp_buf *buf);
|
||||||
|
|
||||||
|
#endif /* __X86_UM_SYSDEP_ARCHSETJMP_H */
|
||||||
|
|||||||
@@ -942,10 +942,11 @@ void update_io_ticks(struct block_device *part, unsigned long now, bool end)
|
|||||||
unsigned long stamp;
|
unsigned long stamp;
|
||||||
again:
|
again:
|
||||||
stamp = READ_ONCE(part->bd_stamp);
|
stamp = READ_ONCE(part->bd_stamp);
|
||||||
if (unlikely(time_after(now, stamp))) {
|
if (unlikely(time_after(now, stamp)) &&
|
||||||
if (likely(try_cmpxchg(&part->bd_stamp, &stamp, now)))
|
likely(try_cmpxchg(&part->bd_stamp, &stamp, now)) &&
|
||||||
__part_stat_add(part, io_ticks, end ? now - stamp : 1);
|
(end || part_in_flight(part)))
|
||||||
}
|
__part_stat_add(part, io_ticks, now - stamp);
|
||||||
|
|
||||||
if (part->bd_partno) {
|
if (part->bd_partno) {
|
||||||
part = bdev_whole(part);
|
part = bdev_whole(part);
|
||||||
goto again;
|
goto again;
|
||||||
|
|||||||
@@ -783,6 +783,8 @@ static void blk_account_io_merge_request(struct request *req)
|
|||||||
if (blk_do_io_stat(req)) {
|
if (blk_do_io_stat(req)) {
|
||||||
part_stat_lock();
|
part_stat_lock();
|
||||||
part_stat_inc(req->part, merges[op_stat_group(req_op(req))]);
|
part_stat_inc(req->part, merges[op_stat_group(req_op(req))]);
|
||||||
|
part_stat_local_dec(req->part,
|
||||||
|
in_flight[op_is_write(req_op(req))]);
|
||||||
part_stat_unlock();
|
part_stat_unlock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -971,17 +971,6 @@ bool blk_update_request(struct request *req, blk_status_t error,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(blk_update_request);
|
EXPORT_SYMBOL_GPL(blk_update_request);
|
||||||
|
|
||||||
static void __blk_account_io_done(struct request *req, u64 now)
|
|
||||||
{
|
|
||||||
const int sgrp = op_stat_group(req_op(req));
|
|
||||||
|
|
||||||
part_stat_lock();
|
|
||||||
update_io_ticks(req->part, jiffies, true);
|
|
||||||
part_stat_inc(req->part, ios[sgrp]);
|
|
||||||
part_stat_add(req->part, nsecs[sgrp], now - req->start_time_ns);
|
|
||||||
part_stat_unlock();
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void blk_account_io_done(struct request *req, u64 now)
|
static inline void blk_account_io_done(struct request *req, u64 now)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@@ -990,32 +979,39 @@ static inline void blk_account_io_done(struct request *req, u64 now)
|
|||||||
* containing request is enough.
|
* containing request is enough.
|
||||||
*/
|
*/
|
||||||
if (blk_do_io_stat(req) && req->part &&
|
if (blk_do_io_stat(req) && req->part &&
|
||||||
!(req->rq_flags & RQF_FLUSH_SEQ))
|
!(req->rq_flags & RQF_FLUSH_SEQ)) {
|
||||||
__blk_account_io_done(req, now);
|
const int sgrp = op_stat_group(req_op(req));
|
||||||
}
|
|
||||||
|
|
||||||
static void __blk_account_io_start(struct request *rq)
|
part_stat_lock();
|
||||||
{
|
update_io_ticks(req->part, jiffies, true);
|
||||||
/*
|
part_stat_inc(req->part, ios[sgrp]);
|
||||||
* All non-passthrough requests are created from a bio with one
|
part_stat_add(req->part, nsecs[sgrp], now - req->start_time_ns);
|
||||||
* exception: when a flush command that is part of a flush sequence
|
part_stat_local_dec(req->part,
|
||||||
* generated by the state machine in blk-flush.c is cloned onto the
|
in_flight[op_is_write(req_op(req))]);
|
||||||
* lower device by dm-multipath we can get here without a bio.
|
part_stat_unlock();
|
||||||
*/
|
}
|
||||||
if (rq->bio)
|
|
||||||
rq->part = rq->bio->bi_bdev;
|
|
||||||
else
|
|
||||||
rq->part = rq->q->disk->part0;
|
|
||||||
|
|
||||||
part_stat_lock();
|
|
||||||
update_io_ticks(rq->part, jiffies, false);
|
|
||||||
part_stat_unlock();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void blk_account_io_start(struct request *req)
|
static inline void blk_account_io_start(struct request *req)
|
||||||
{
|
{
|
||||||
if (blk_do_io_stat(req))
|
if (blk_do_io_stat(req)) {
|
||||||
__blk_account_io_start(req);
|
/*
|
||||||
|
* All non-passthrough requests are created from a bio with one
|
||||||
|
* exception: when a flush command that is part of a flush sequence
|
||||||
|
* generated by the state machine in blk-flush.c is cloned onto the
|
||||||
|
* lower device by dm-multipath we can get here without a bio.
|
||||||
|
*/
|
||||||
|
if (req->bio)
|
||||||
|
req->part = req->bio->bi_bdev;
|
||||||
|
else
|
||||||
|
req->part = req->q->disk->part0;
|
||||||
|
|
||||||
|
part_stat_lock();
|
||||||
|
update_io_ticks(req->part, jiffies, false);
|
||||||
|
part_stat_local_inc(req->part,
|
||||||
|
in_flight[op_is_write(req_op(req))]);
|
||||||
|
part_stat_unlock();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void __blk_mq_end_request_acct(struct request *rq, u64 now)
|
static inline void __blk_mq_end_request_acct(struct request *rq, u64 now)
|
||||||
|
|||||||
@@ -373,6 +373,7 @@ static inline bool blk_do_io_stat(struct request *rq)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void update_io_ticks(struct block_device *part, unsigned long now, bool end);
|
void update_io_ticks(struct block_device *part, unsigned long now, bool end);
|
||||||
|
unsigned int part_in_flight(struct block_device *part);
|
||||||
|
|
||||||
static inline void req_set_nomerge(struct request_queue *q, struct request *req)
|
static inline void req_set_nomerge(struct request_queue *q, struct request *req)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -125,7 +125,7 @@ static void part_stat_read_all(struct block_device *part,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int part_in_flight(struct block_device *part)
|
unsigned int part_in_flight(struct block_device *part)
|
||||||
{
|
{
|
||||||
unsigned int inflight = 0;
|
unsigned int inflight = 0;
|
||||||
int cpu;
|
int cpu;
|
||||||
|
|||||||
@@ -84,5 +84,7 @@ config FIPS_SIGNATURE_SELFTEST
|
|||||||
depends on KEYS
|
depends on KEYS
|
||||||
depends on ASYMMETRIC_KEY_TYPE
|
depends on ASYMMETRIC_KEY_TYPE
|
||||||
depends on PKCS7_MESSAGE_PARSER
|
depends on PKCS7_MESSAGE_PARSER
|
||||||
|
depends on CRYPTO_RSA
|
||||||
|
depends on CRYPTO_SHA256
|
||||||
|
|
||||||
endif # ASYMMETRIC_KEY_TYPE
|
endif # ASYMMETRIC_KEY_TYPE
|
||||||
|
|||||||
@@ -573,7 +573,7 @@ static u_long get_word(struct vc_data *vc)
|
|||||||
}
|
}
|
||||||
attr_ch = get_char(vc, (u_short *)tmp_pos, &spk_attr);
|
attr_ch = get_char(vc, (u_short *)tmp_pos, &spk_attr);
|
||||||
buf[cnt++] = attr_ch;
|
buf[cnt++] = attr_ch;
|
||||||
while (tmpx < vc->vc_cols - 1 && cnt < sizeof(buf) - 1) {
|
while (tmpx < vc->vc_cols - 1 && cnt < ARRAY_SIZE(buf) - 1) {
|
||||||
tmp_pos += 2;
|
tmp_pos += 2;
|
||||||
tmpx++;
|
tmpx++;
|
||||||
ch = get_char(vc, (u_short *)tmp_pos, &temp);
|
ch = get_char(vc, (u_short *)tmp_pos, &temp);
|
||||||
|
|||||||
@@ -319,6 +319,7 @@ static const struct lpss_device_desc bsw_i2c_dev_desc = {
|
|||||||
|
|
||||||
static const struct property_entry bsw_spi_properties[] = {
|
static const struct property_entry bsw_spi_properties[] = {
|
||||||
PROPERTY_ENTRY_U32("intel,spi-pxa2xx-type", LPSS_BSW_SSP),
|
PROPERTY_ENTRY_U32("intel,spi-pxa2xx-type", LPSS_BSW_SSP),
|
||||||
|
PROPERTY_ENTRY_U32("num-cs", 2),
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
ccflags-y := -D_LINUX -DBUILDING_ACPICA
|
ccflags-y := -D_LINUX -DBUILDING_ACPICA
|
||||||
ccflags-$(CONFIG_ACPI_DEBUG) += -DACPI_DEBUG_OUTPUT
|
ccflags-$(CONFIG_ACPI_DEBUG) += -DACPI_DEBUG_OUTPUT
|
||||||
|
CFLAGS_tbfind.o += $(call cc-disable-warning, stringop-truncation)
|
||||||
|
|
||||||
# use acpi.o to put all files here into acpi.o modparam namespace
|
# use acpi.o to put all files here into acpi.o modparam namespace
|
||||||
obj-y += acpi.o
|
obj-y += acpi.o
|
||||||
|
|||||||
@@ -206,6 +206,11 @@ int __init srat_disabled(void)
|
|||||||
return acpi_numa < 0;
|
return acpi_numa < 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__weak int __init numa_fill_memblks(u64 start, u64 end)
|
||||||
|
{
|
||||||
|
return NUMA_NO_MEMBLK;
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(CONFIG_X86) || defined(CONFIG_ARM64) || defined(CONFIG_LOONGARCH)
|
#if defined(CONFIG_X86) || defined(CONFIG_ARM64) || defined(CONFIG_LOONGARCH)
|
||||||
/*
|
/*
|
||||||
* Callback for SLIT parsing. pxm_to_node() returns NUMA_NO_NODE for
|
* Callback for SLIT parsing. pxm_to_node() returns NUMA_NO_NODE for
|
||||||
|
|||||||
@@ -2311,10 +2311,13 @@ static void __exit null_exit(void)
|
|||||||
|
|
||||||
if (g_queue_mode == NULL_Q_MQ && shared_tags)
|
if (g_queue_mode == NULL_Q_MQ && shared_tags)
|
||||||
blk_mq_free_tag_set(&tag_set);
|
blk_mq_free_tag_set(&tag_set);
|
||||||
|
|
||||||
|
mutex_destroy(&lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
module_init(null_init);
|
module_init(null_init);
|
||||||
module_exit(null_exit);
|
module_exit(null_exit);
|
||||||
|
|
||||||
MODULE_AUTHOR("Jens Axboe <axboe@kernel.dk>");
|
MODULE_AUTHOR("Jens Axboe <axboe@kernel.dk>");
|
||||||
|
MODULE_DESCRIPTION("multi queue aware block test driver");
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
|
|||||||
@@ -148,8 +148,10 @@ static int qca_read_fw_build_info(struct hci_dev *hdev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
build_label = kstrndup(&edl->data[1], build_lbl_len, GFP_KERNEL);
|
build_label = kstrndup(&edl->data[1], build_lbl_len, GFP_KERNEL);
|
||||||
if (!build_label)
|
if (!build_label) {
|
||||||
|
err = -ENOMEM;
|
||||||
goto out;
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
hci_set_fw_info(hdev, "%s", build_label);
|
hci_set_fw_info(hdev, "%s", build_label);
|
||||||
|
|
||||||
|
|||||||
@@ -296,28 +296,35 @@ static int register_device(int minor, struct pp_struct *pp)
|
|||||||
if (!port) {
|
if (!port) {
|
||||||
pr_warn("%s: no associated port!\n", name);
|
pr_warn("%s: no associated port!\n", name);
|
||||||
rc = -ENXIO;
|
rc = -ENXIO;
|
||||||
goto err;
|
goto err_free_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
index = ida_alloc(&ida_index, GFP_KERNEL);
|
||||||
|
if (index < 0) {
|
||||||
|
pr_warn("%s: failed to get index!\n", name);
|
||||||
|
rc = index;
|
||||||
|
goto err_put_port;
|
||||||
}
|
}
|
||||||
|
|
||||||
index = ida_simple_get(&ida_index, 0, 0, GFP_KERNEL);
|
|
||||||
memset(&ppdev_cb, 0, sizeof(ppdev_cb));
|
memset(&ppdev_cb, 0, sizeof(ppdev_cb));
|
||||||
ppdev_cb.irq_func = pp_irq;
|
ppdev_cb.irq_func = pp_irq;
|
||||||
ppdev_cb.flags = (pp->flags & PP_EXCL) ? PARPORT_FLAG_EXCL : 0;
|
ppdev_cb.flags = (pp->flags & PP_EXCL) ? PARPORT_FLAG_EXCL : 0;
|
||||||
ppdev_cb.private = pp;
|
ppdev_cb.private = pp;
|
||||||
pdev = parport_register_dev_model(port, name, &ppdev_cb, index);
|
pdev = parport_register_dev_model(port, name, &ppdev_cb, index);
|
||||||
parport_put_port(port);
|
|
||||||
|
|
||||||
if (!pdev) {
|
if (!pdev) {
|
||||||
pr_warn("%s: failed to register device!\n", name);
|
pr_warn("%s: failed to register device!\n", name);
|
||||||
rc = -ENXIO;
|
rc = -ENXIO;
|
||||||
ida_simple_remove(&ida_index, index);
|
ida_free(&ida_index, index);
|
||||||
goto err;
|
goto err_put_port;
|
||||||
}
|
}
|
||||||
|
|
||||||
pp->pdev = pdev;
|
pp->pdev = pdev;
|
||||||
pp->index = index;
|
pp->index = index;
|
||||||
dev_dbg(&pdev->dev, "registered pardevice\n");
|
dev_dbg(&pdev->dev, "registered pardevice\n");
|
||||||
err:
|
err_put_port:
|
||||||
|
parport_put_port(port);
|
||||||
|
err_free_name:
|
||||||
kfree(name);
|
kfree(name);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@@ -750,7 +757,7 @@ static int pp_release(struct inode *inode, struct file *file)
|
|||||||
|
|
||||||
if (pp->pdev) {
|
if (pp->pdev) {
|
||||||
parport_unregister_device(pp->pdev);
|
parport_unregister_device(pp->pdev);
|
||||||
ida_simple_remove(&ida_index, pp->index);
|
ida_free(&ida_index, pp->index);
|
||||||
pp->pdev = NULL;
|
pp->pdev = NULL;
|
||||||
pr_debug(CHRDEV "%x: unregistered pardevice\n", minor);
|
pr_debug(CHRDEV "%x: unregistered pardevice\n", minor);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,10 +24,12 @@
|
|||||||
#define RS9_REG_SS_AMP_0V7 0x1
|
#define RS9_REG_SS_AMP_0V7 0x1
|
||||||
#define RS9_REG_SS_AMP_0V8 0x2
|
#define RS9_REG_SS_AMP_0V8 0x2
|
||||||
#define RS9_REG_SS_AMP_0V9 0x3
|
#define RS9_REG_SS_AMP_0V9 0x3
|
||||||
|
#define RS9_REG_SS_AMP_DEFAULT RS9_REG_SS_AMP_0V8
|
||||||
#define RS9_REG_SS_AMP_MASK 0x3
|
#define RS9_REG_SS_AMP_MASK 0x3
|
||||||
#define RS9_REG_SS_SSC_100 0
|
#define RS9_REG_SS_SSC_100 0
|
||||||
#define RS9_REG_SS_SSC_M025 (1 << 3)
|
#define RS9_REG_SS_SSC_M025 (1 << 3)
|
||||||
#define RS9_REG_SS_SSC_M050 (3 << 3)
|
#define RS9_REG_SS_SSC_M050 (3 << 3)
|
||||||
|
#define RS9_REG_SS_SSC_DEFAULT RS9_REG_SS_SSC_100
|
||||||
#define RS9_REG_SS_SSC_MASK (3 << 3)
|
#define RS9_REG_SS_SSC_MASK (3 << 3)
|
||||||
#define RS9_REG_SS_SSC_LOCK BIT(5)
|
#define RS9_REG_SS_SSC_LOCK BIT(5)
|
||||||
#define RS9_REG_SR 0x2
|
#define RS9_REG_SR 0x2
|
||||||
@@ -196,8 +198,8 @@ static int rs9_get_common_config(struct rs9_driver_data *rs9)
|
|||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* Set defaults */
|
/* Set defaults */
|
||||||
rs9->pll_amplitude = RS9_REG_SS_AMP_0V7;
|
rs9->pll_amplitude = RS9_REG_SS_AMP_DEFAULT;
|
||||||
rs9->pll_ssc = RS9_REG_SS_SSC_100;
|
rs9->pll_ssc = RS9_REG_SS_SSC_DEFAULT;
|
||||||
|
|
||||||
/* Output clock amplitude */
|
/* Output clock amplitude */
|
||||||
ret = of_property_read_u32(np, "renesas,out-amplitude-microvolt",
|
ret = of_property_read_u32(np, "renesas,out-amplitude-microvolt",
|
||||||
@@ -238,13 +240,13 @@ static void rs9_update_config(struct rs9_driver_data *rs9)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* If amplitude is non-default, update it. */
|
/* If amplitude is non-default, update it. */
|
||||||
if (rs9->pll_amplitude != RS9_REG_SS_AMP_0V7) {
|
if (rs9->pll_amplitude != RS9_REG_SS_AMP_DEFAULT) {
|
||||||
regmap_update_bits(rs9->regmap, RS9_REG_SS, RS9_REG_SS_AMP_MASK,
|
regmap_update_bits(rs9->regmap, RS9_REG_SS, RS9_REG_SS_AMP_MASK,
|
||||||
rs9->pll_amplitude);
|
rs9->pll_amplitude);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If SSC is non-default, update it. */
|
/* If SSC is non-default, update it. */
|
||||||
if (rs9->pll_ssc != RS9_REG_SS_SSC_100) {
|
if (rs9->pll_ssc != RS9_REG_SS_SSC_DEFAULT) {
|
||||||
regmap_update_bits(rs9->regmap, RS9_REG_SS, RS9_REG_SS_SSC_MASK,
|
regmap_update_bits(rs9->regmap, RS9_REG_SS, RS9_REG_SS_SSC_MASK,
|
||||||
rs9->pll_ssc);
|
rs9->pll_ssc);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ static const struct mtk_gate mm_clks[] = {
|
|||||||
GATE_MM0(CLK_MM_MM_DSI0, "mm_dsi0", "mm_sel", 17),
|
GATE_MM0(CLK_MM_MM_DSI0, "mm_dsi0", "mm_sel", 17),
|
||||||
GATE_MM0(CLK_MM_MM_DISP_RDMA1, "mm_disp_rdma1", "mm_sel", 18),
|
GATE_MM0(CLK_MM_MM_DISP_RDMA1, "mm_disp_rdma1", "mm_sel", 18),
|
||||||
GATE_MM0(CLK_MM_MM_MDP_RDMA1, "mm_mdp_rdma1", "mm_sel", 19),
|
GATE_MM0(CLK_MM_MM_MDP_RDMA1, "mm_mdp_rdma1", "mm_sel", 19),
|
||||||
GATE_MM0(CLK_MM_DPI0_DPI0, "mm_dpi0_dpi0", "vpll_dpix", 20),
|
GATE_MM0(CLK_MM_DPI0_DPI0, "mm_dpi0_dpi0", "dpi0_sel", 20),
|
||||||
GATE_MM0(CLK_MM_MM_FAKE, "mm_fake", "mm_sel", 21),
|
GATE_MM0(CLK_MM_MM_FAKE, "mm_fake", "mm_sel", 21),
|
||||||
GATE_MM0(CLK_MM_MM_SMI_COMMON, "mm_smi_common", "mm_sel", 22),
|
GATE_MM0(CLK_MM_MM_SMI_COMMON, "mm_smi_common", "mm_sel", 22),
|
||||||
GATE_MM0(CLK_MM_MM_SMI_LARB0, "mm_smi_larb0", "mm_sel", 23),
|
GATE_MM0(CLK_MM_MM_SMI_LARB0, "mm_smi_larb0", "mm_sel", 23),
|
||||||
|
|||||||
@@ -221,26 +221,17 @@ static struct clk_rcg2 disp_cc_mdss_dp_crypto_clk_src = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct freq_tbl ftbl_disp_cc_mdss_dp_link_clk_src[] = {
|
|
||||||
F(162000, P_DP_PHY_PLL_LINK_CLK, 1, 0, 0),
|
|
||||||
F(270000, P_DP_PHY_PLL_LINK_CLK, 1, 0, 0),
|
|
||||||
F(540000, P_DP_PHY_PLL_LINK_CLK, 1, 0, 0),
|
|
||||||
F(810000, P_DP_PHY_PLL_LINK_CLK, 1, 0, 0),
|
|
||||||
{ }
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct clk_rcg2 disp_cc_mdss_dp_link_clk_src = {
|
static struct clk_rcg2 disp_cc_mdss_dp_link_clk_src = {
|
||||||
.cmd_rcgr = 0x10f8,
|
.cmd_rcgr = 0x10f8,
|
||||||
.mnd_width = 0,
|
.mnd_width = 0,
|
||||||
.hid_width = 5,
|
.hid_width = 5,
|
||||||
.parent_map = disp_cc_parent_map_0,
|
.parent_map = disp_cc_parent_map_0,
|
||||||
.freq_tbl = ftbl_disp_cc_mdss_dp_link_clk_src,
|
|
||||||
.clkr.hw.init = &(struct clk_init_data){
|
.clkr.hw.init = &(struct clk_init_data){
|
||||||
.name = "disp_cc_mdss_dp_link_clk_src",
|
.name = "disp_cc_mdss_dp_link_clk_src",
|
||||||
.parent_data = disp_cc_parent_data_0,
|
.parent_data = disp_cc_parent_data_0,
|
||||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
|
.num_parents = ARRAY_SIZE(disp_cc_parent_data_0),
|
||||||
.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
|
.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
|
||||||
.ops = &clk_rcg2_ops,
|
.ops = &clk_byte2_ops,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -309,26 +309,17 @@ static struct clk_rcg2 disp_cc_mdss_dptx0_aux_clk_src = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct freq_tbl ftbl_disp_cc_mdss_dptx0_link_clk_src[] = {
|
|
||||||
F(162000, P_DP0_PHY_PLL_LINK_CLK, 1, 0, 0),
|
|
||||||
F(270000, P_DP0_PHY_PLL_LINK_CLK, 1, 0, 0),
|
|
||||||
F(540000, P_DP0_PHY_PLL_LINK_CLK, 1, 0, 0),
|
|
||||||
F(810000, P_DP0_PHY_PLL_LINK_CLK, 1, 0, 0),
|
|
||||||
{ }
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct clk_rcg2 disp_cc_mdss_dptx0_link_clk_src = {
|
static struct clk_rcg2 disp_cc_mdss_dptx0_link_clk_src = {
|
||||||
.cmd_rcgr = 0x819c,
|
.cmd_rcgr = 0x819c,
|
||||||
.mnd_width = 0,
|
.mnd_width = 0,
|
||||||
.hid_width = 5,
|
.hid_width = 5,
|
||||||
.parent_map = disp_cc_parent_map_3,
|
.parent_map = disp_cc_parent_map_3,
|
||||||
.freq_tbl = ftbl_disp_cc_mdss_dptx0_link_clk_src,
|
|
||||||
.clkr.hw.init = &(struct clk_init_data) {
|
.clkr.hw.init = &(struct clk_init_data) {
|
||||||
.name = "disp_cc_mdss_dptx0_link_clk_src",
|
.name = "disp_cc_mdss_dptx0_link_clk_src",
|
||||||
.parent_data = disp_cc_parent_data_3,
|
.parent_data = disp_cc_parent_data_3,
|
||||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
|
.num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
|
||||||
.flags = CLK_SET_RATE_PARENT,
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
.ops = &clk_rcg2_ops,
|
.ops = &clk_byte2_ops,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -382,13 +373,12 @@ static struct clk_rcg2 disp_cc_mdss_dptx1_link_clk_src = {
|
|||||||
.mnd_width = 0,
|
.mnd_width = 0,
|
||||||
.hid_width = 5,
|
.hid_width = 5,
|
||||||
.parent_map = disp_cc_parent_map_3,
|
.parent_map = disp_cc_parent_map_3,
|
||||||
.freq_tbl = ftbl_disp_cc_mdss_dptx0_link_clk_src,
|
|
||||||
.clkr.hw.init = &(struct clk_init_data) {
|
.clkr.hw.init = &(struct clk_init_data) {
|
||||||
.name = "disp_cc_mdss_dptx1_link_clk_src",
|
.name = "disp_cc_mdss_dptx1_link_clk_src",
|
||||||
.parent_data = disp_cc_parent_data_3,
|
.parent_data = disp_cc_parent_data_3,
|
||||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
|
.num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
|
||||||
.flags = CLK_SET_RATE_PARENT,
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
.ops = &clk_rcg2_ops,
|
.ops = &clk_byte2_ops,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -442,13 +432,12 @@ static struct clk_rcg2 disp_cc_mdss_dptx2_link_clk_src = {
|
|||||||
.mnd_width = 0,
|
.mnd_width = 0,
|
||||||
.hid_width = 5,
|
.hid_width = 5,
|
||||||
.parent_map = disp_cc_parent_map_3,
|
.parent_map = disp_cc_parent_map_3,
|
||||||
.freq_tbl = ftbl_disp_cc_mdss_dptx0_link_clk_src,
|
|
||||||
.clkr.hw.init = &(struct clk_init_data) {
|
.clkr.hw.init = &(struct clk_init_data) {
|
||||||
.name = "disp_cc_mdss_dptx2_link_clk_src",
|
.name = "disp_cc_mdss_dptx2_link_clk_src",
|
||||||
.parent_data = disp_cc_parent_data_3,
|
.parent_data = disp_cc_parent_data_3,
|
||||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
|
.num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
|
||||||
.flags = CLK_SET_RATE_PARENT,
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
.ops = &clk_rcg2_ops,
|
.ops = &clk_byte2_ops,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -502,13 +491,12 @@ static struct clk_rcg2 disp_cc_mdss_dptx3_link_clk_src = {
|
|||||||
.mnd_width = 0,
|
.mnd_width = 0,
|
||||||
.hid_width = 5,
|
.hid_width = 5,
|
||||||
.parent_map = disp_cc_parent_map_3,
|
.parent_map = disp_cc_parent_map_3,
|
||||||
.freq_tbl = ftbl_disp_cc_mdss_dptx0_link_clk_src,
|
|
||||||
.clkr.hw.init = &(struct clk_init_data) {
|
.clkr.hw.init = &(struct clk_init_data) {
|
||||||
.name = "disp_cc_mdss_dptx3_link_clk_src",
|
.name = "disp_cc_mdss_dptx3_link_clk_src",
|
||||||
.parent_data = disp_cc_parent_data_3,
|
.parent_data = disp_cc_parent_data_3,
|
||||||
.num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
|
.num_parents = ARRAY_SIZE(disp_cc_parent_data_3),
|
||||||
.flags = CLK_SET_RATE_PARENT,
|
.flags = CLK_SET_RATE_PARENT,
|
||||||
.ops = &clk_rcg2_ops,
|
.ops = &clk_byte2_ops,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -2578,6 +2578,8 @@ static struct clk_hw *mmcc_msm8998_hws[] = {
|
|||||||
|
|
||||||
static struct gdsc video_top_gdsc = {
|
static struct gdsc video_top_gdsc = {
|
||||||
.gdscr = 0x1024,
|
.gdscr = 0x1024,
|
||||||
|
.cxcs = (unsigned int []){ 0x1028, 0x1034, 0x1038 },
|
||||||
|
.cxc_count = 3,
|
||||||
.pd = {
|
.pd = {
|
||||||
.name = "video_top",
|
.name = "video_top",
|
||||||
},
|
},
|
||||||
@@ -2586,20 +2588,26 @@ static struct gdsc video_top_gdsc = {
|
|||||||
|
|
||||||
static struct gdsc video_subcore0_gdsc = {
|
static struct gdsc video_subcore0_gdsc = {
|
||||||
.gdscr = 0x1040,
|
.gdscr = 0x1040,
|
||||||
|
.cxcs = (unsigned int []){ 0x1048 },
|
||||||
|
.cxc_count = 1,
|
||||||
.pd = {
|
.pd = {
|
||||||
.name = "video_subcore0",
|
.name = "video_subcore0",
|
||||||
},
|
},
|
||||||
.parent = &video_top_gdsc.pd,
|
.parent = &video_top_gdsc.pd,
|
||||||
.pwrsts = PWRSTS_OFF_ON,
|
.pwrsts = PWRSTS_OFF_ON,
|
||||||
|
.flags = HW_CTRL,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct gdsc video_subcore1_gdsc = {
|
static struct gdsc video_subcore1_gdsc = {
|
||||||
.gdscr = 0x1044,
|
.gdscr = 0x1044,
|
||||||
|
.cxcs = (unsigned int []){ 0x104c },
|
||||||
|
.cxc_count = 1,
|
||||||
.pd = {
|
.pd = {
|
||||||
.name = "video_subcore1",
|
.name = "video_subcore1",
|
||||||
},
|
},
|
||||||
.parent = &video_top_gdsc.pd,
|
.parent = &video_top_gdsc.pd,
|
||||||
.pwrsts = PWRSTS_OFF_ON,
|
.pwrsts = PWRSTS_OFF_ON,
|
||||||
|
.flags = HW_CTRL,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct gdsc mdss_gdsc = {
|
static struct gdsc mdss_gdsc = {
|
||||||
|
|||||||
@@ -139,7 +139,7 @@ static const struct mssr_mod_clk r8a779a0_mod_clks[] __initconst = {
|
|||||||
DEF_MOD("avb3", 214, R8A779A0_CLK_S3D2),
|
DEF_MOD("avb3", 214, R8A779A0_CLK_S3D2),
|
||||||
DEF_MOD("avb4", 215, R8A779A0_CLK_S3D2),
|
DEF_MOD("avb4", 215, R8A779A0_CLK_S3D2),
|
||||||
DEF_MOD("avb5", 216, R8A779A0_CLK_S3D2),
|
DEF_MOD("avb5", 216, R8A779A0_CLK_S3D2),
|
||||||
DEF_MOD("canfd0", 328, R8A779A0_CLK_CANFD),
|
DEF_MOD("canfd0", 328, R8A779A0_CLK_S3D2),
|
||||||
DEF_MOD("csi40", 331, R8A779A0_CLK_CSI0),
|
DEF_MOD("csi40", 331, R8A779A0_CLK_CSI0),
|
||||||
DEF_MOD("csi41", 400, R8A779A0_CLK_CSI0),
|
DEF_MOD("csi41", 400, R8A779A0_CLK_CSI0),
|
||||||
DEF_MOD("csi42", 401, R8A779A0_CLK_CSI0),
|
DEF_MOD("csi42", 401, R8A779A0_CLK_CSI0),
|
||||||
|
|||||||
@@ -252,6 +252,10 @@ static struct rzg2l_mod_clk r9a07g043_mod_clks[] = {
|
|||||||
0x5a8, 1),
|
0x5a8, 1),
|
||||||
DEF_MOD("tsu_pclk", R9A07G043_TSU_PCLK, R9A07G043_CLK_TSU,
|
DEF_MOD("tsu_pclk", R9A07G043_TSU_PCLK, R9A07G043_CLK_TSU,
|
||||||
0x5ac, 0),
|
0x5ac, 0),
|
||||||
|
#ifdef CONFIG_RISCV
|
||||||
|
DEF_MOD("nceplic_aclk", R9A07G043_NCEPLIC_ACLK, R9A07G043_CLK_P1,
|
||||||
|
0x608, 0),
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct rzg2l_reset r9a07g043_resets[] = {
|
static struct rzg2l_reset r9a07g043_resets[] = {
|
||||||
@@ -305,6 +309,10 @@ static struct rzg2l_reset r9a07g043_resets[] = {
|
|||||||
DEF_RST(R9A07G043_ADC_PRESETN, 0x8a8, 0),
|
DEF_RST(R9A07G043_ADC_PRESETN, 0x8a8, 0),
|
||||||
DEF_RST(R9A07G043_ADC_ADRST_N, 0x8a8, 1),
|
DEF_RST(R9A07G043_ADC_ADRST_N, 0x8a8, 1),
|
||||||
DEF_RST(R9A07G043_TSU_PRESETN, 0x8ac, 0),
|
DEF_RST(R9A07G043_TSU_PRESETN, 0x8ac, 0),
|
||||||
|
#ifdef CONFIG_RISCV
|
||||||
|
DEF_RST(R9A07G043_NCEPLIC_ARESETN, 0x908, 0),
|
||||||
|
#endif
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const unsigned int r9a07g043_crit_mod_clks[] __initconst = {
|
static const unsigned int r9a07g043_crit_mod_clks[] __initconst = {
|
||||||
@@ -314,6 +322,7 @@ static const unsigned int r9a07g043_crit_mod_clks[] __initconst = {
|
|||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_RISCV
|
#ifdef CONFIG_RISCV
|
||||||
MOD_CLK_BASE + R9A07G043_IAX45_CLK,
|
MOD_CLK_BASE + R9A07G043_IAX45_CLK,
|
||||||
|
MOD_CLK_BASE + R9A07G043_NCEPLIC_ACLK,
|
||||||
#endif
|
#endif
|
||||||
MOD_CLK_BASE + R9A07G043_DMAC_ACLK,
|
MOD_CLK_BASE + R9A07G043_DMAC_ACLK,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -343,13 +343,13 @@ static const struct samsung_pll_clock top_pll_clks[] __initconst = {
|
|||||||
/* CMU_TOP_PURECLKCOMP */
|
/* CMU_TOP_PURECLKCOMP */
|
||||||
PLL(pll_0822x, FOUT_SHARED0_PLL, "fout_shared0_pll", "oscclk",
|
PLL(pll_0822x, FOUT_SHARED0_PLL, "fout_shared0_pll", "oscclk",
|
||||||
PLL_LOCKTIME_PLL_SHARED0, PLL_CON3_PLL_SHARED0, NULL),
|
PLL_LOCKTIME_PLL_SHARED0, PLL_CON3_PLL_SHARED0, NULL),
|
||||||
PLL(pll_0822x, FOUT_SHARED0_PLL, "fout_shared1_pll", "oscclk",
|
PLL(pll_0822x, FOUT_SHARED1_PLL, "fout_shared1_pll", "oscclk",
|
||||||
PLL_LOCKTIME_PLL_SHARED1, PLL_CON3_PLL_SHARED1, NULL),
|
PLL_LOCKTIME_PLL_SHARED1, PLL_CON3_PLL_SHARED1, NULL),
|
||||||
PLL(pll_0822x, FOUT_SHARED0_PLL, "fout_shared2_pll", "oscclk",
|
PLL(pll_0822x, FOUT_SHARED2_PLL, "fout_shared2_pll", "oscclk",
|
||||||
PLL_LOCKTIME_PLL_SHARED2, PLL_CON3_PLL_SHARED2, NULL),
|
PLL_LOCKTIME_PLL_SHARED2, PLL_CON3_PLL_SHARED2, NULL),
|
||||||
PLL(pll_0822x, FOUT_SHARED0_PLL, "fout_shared3_pll", "oscclk",
|
PLL(pll_0822x, FOUT_SHARED3_PLL, "fout_shared3_pll", "oscclk",
|
||||||
PLL_LOCKTIME_PLL_SHARED3, PLL_CON3_PLL_SHARED3, NULL),
|
PLL_LOCKTIME_PLL_SHARED3, PLL_CON3_PLL_SHARED3, NULL),
|
||||||
PLL(pll_0822x, FOUT_SHARED0_PLL, "fout_shared4_pll", "oscclk",
|
PLL(pll_0822x, FOUT_SHARED4_PLL, "fout_shared4_pll", "oscclk",
|
||||||
PLL_LOCKTIME_PLL_SHARED4, PLL_CON3_PLL_SHARED4, NULL),
|
PLL_LOCKTIME_PLL_SHARED4, PLL_CON3_PLL_SHARED4, NULL),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -841,10 +841,15 @@ static unsigned int cppc_cpufreq_get_rate(unsigned int cpu)
|
|||||||
{
|
{
|
||||||
struct cppc_perf_fb_ctrs fb_ctrs_t0 = {0}, fb_ctrs_t1 = {0};
|
struct cppc_perf_fb_ctrs fb_ctrs_t0 = {0}, fb_ctrs_t1 = {0};
|
||||||
struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
|
struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
|
||||||
struct cppc_cpudata *cpu_data = policy->driver_data;
|
struct cppc_cpudata *cpu_data;
|
||||||
u64 delivered_perf;
|
u64 delivered_perf;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (!policy)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
cpu_data = policy->driver_data;
|
||||||
|
|
||||||
cpufreq_cpu_put(policy);
|
cpufreq_cpu_put(policy);
|
||||||
|
|
||||||
ret = cppc_get_perf_ctrs(cpu, &fb_ctrs_t0);
|
ret = cppc_get_perf_ctrs(cpu, &fb_ctrs_t0);
|
||||||
@@ -924,10 +929,15 @@ static struct cpufreq_driver cppc_cpufreq_driver = {
|
|||||||
static unsigned int hisi_cppc_cpufreq_get_rate(unsigned int cpu)
|
static unsigned int hisi_cppc_cpufreq_get_rate(unsigned int cpu)
|
||||||
{
|
{
|
||||||
struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
|
struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
|
||||||
struct cppc_cpudata *cpu_data = policy->driver_data;
|
struct cppc_cpudata *cpu_data;
|
||||||
u64 desired_perf;
|
u64 desired_perf;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (!policy)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
cpu_data = policy->driver_data;
|
||||||
|
|
||||||
cpufreq_cpu_put(policy);
|
cpufreq_cpu_put(policy);
|
||||||
|
|
||||||
ret = cppc_get_desired_perf(cpu, &desired_perf);
|
ret = cppc_get_desired_perf(cpu, &desired_perf);
|
||||||
|
|||||||
@@ -1636,10 +1636,13 @@ static void __cpufreq_offline(unsigned int cpu, struct cpufreq_policy *policy)
|
|||||||
*/
|
*/
|
||||||
if (cpufreq_driver->offline) {
|
if (cpufreq_driver->offline) {
|
||||||
cpufreq_driver->offline(policy);
|
cpufreq_driver->offline(policy);
|
||||||
} else if (cpufreq_driver->exit) {
|
return;
|
||||||
cpufreq_driver->exit(policy);
|
|
||||||
policy->freq_table = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cpufreq_driver->exit)
|
||||||
|
cpufreq_driver->exit(policy);
|
||||||
|
|
||||||
|
policy->freq_table = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cpufreq_offline(unsigned int cpu)
|
static int cpufreq_offline(unsigned int cpu)
|
||||||
@@ -1698,7 +1701,7 @@ static void cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* We did light-weight exit earlier, do full tear down now */
|
/* We did light-weight exit earlier, do full tear down now */
|
||||||
if (cpufreq_driver->offline)
|
if (cpufreq_driver->offline && cpufreq_driver->exit)
|
||||||
cpufreq_driver->exit(policy);
|
cpufreq_driver->exit(policy);
|
||||||
|
|
||||||
up_write(&policy->rwsem);
|
up_write(&policy->rwsem);
|
||||||
|
|||||||
@@ -495,7 +495,7 @@ static void spu2_dump_omd(u8 *omd, u16 hash_key_len, u16 ciph_key_len,
|
|||||||
if (hash_iv_len) {
|
if (hash_iv_len) {
|
||||||
packet_log(" Hash IV Length %u bytes\n", hash_iv_len);
|
packet_log(" Hash IV Length %u bytes\n", hash_iv_len);
|
||||||
packet_dump(" hash IV: ", ptr, hash_iv_len);
|
packet_dump(" hash IV: ", ptr, hash_iv_len);
|
||||||
ptr += ciph_key_len;
|
ptr += hash_iv_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ciph_iv_len) {
|
if (ciph_iv_len) {
|
||||||
|
|||||||
@@ -39,44 +39,38 @@ static const struct sp_dev_vdata dev_vdata[] = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_ACPI
|
|
||||||
static const struct acpi_device_id sp_acpi_match[] = {
|
static const struct acpi_device_id sp_acpi_match[] = {
|
||||||
{ "AMDI0C00", (kernel_ulong_t)&dev_vdata[0] },
|
{ "AMDI0C00", (kernel_ulong_t)&dev_vdata[0] },
|
||||||
{ },
|
{ },
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(acpi, sp_acpi_match);
|
MODULE_DEVICE_TABLE(acpi, sp_acpi_match);
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_OF
|
|
||||||
static const struct of_device_id sp_of_match[] = {
|
static const struct of_device_id sp_of_match[] = {
|
||||||
{ .compatible = "amd,ccp-seattle-v1a",
|
{ .compatible = "amd,ccp-seattle-v1a",
|
||||||
.data = (const void *)&dev_vdata[0] },
|
.data = (const void *)&dev_vdata[0] },
|
||||||
{ },
|
{ },
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(of, sp_of_match);
|
MODULE_DEVICE_TABLE(of, sp_of_match);
|
||||||
#endif
|
|
||||||
|
|
||||||
static struct sp_dev_vdata *sp_get_of_version(struct platform_device *pdev)
|
static struct sp_dev_vdata *sp_get_of_version(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_OF
|
|
||||||
const struct of_device_id *match;
|
const struct of_device_id *match;
|
||||||
|
|
||||||
match = of_match_node(sp_of_match, pdev->dev.of_node);
|
match = of_match_node(sp_of_match, pdev->dev.of_node);
|
||||||
if (match && match->data)
|
if (match && match->data)
|
||||||
return (struct sp_dev_vdata *)match->data;
|
return (struct sp_dev_vdata *)match->data;
|
||||||
#endif
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct sp_dev_vdata *sp_get_acpi_version(struct platform_device *pdev)
|
static struct sp_dev_vdata *sp_get_acpi_version(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_ACPI
|
|
||||||
const struct acpi_device_id *match;
|
const struct acpi_device_id *match;
|
||||||
|
|
||||||
match = acpi_match_device(sp_acpi_match, &pdev->dev);
|
match = acpi_match_device(sp_acpi_match, &pdev->dev);
|
||||||
if (match && match->driver_data)
|
if (match && match->driver_data)
|
||||||
return (struct sp_dev_vdata *)match->driver_data;
|
return (struct sp_dev_vdata *)match->driver_data;
|
||||||
#endif
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -214,12 +208,8 @@ static int sp_platform_resume(struct platform_device *pdev)
|
|||||||
static struct platform_driver sp_platform_driver = {
|
static struct platform_driver sp_platform_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "ccp",
|
.name = "ccp",
|
||||||
#ifdef CONFIG_ACPI
|
|
||||||
.acpi_match_table = sp_acpi_match,
|
.acpi_match_table = sp_acpi_match,
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_OF
|
|
||||||
.of_match_table = sp_of_match,
|
.of_match_table = sp_of_match,
|
||||||
#endif
|
|
||||||
},
|
},
|
||||||
.probe = sp_platform_probe,
|
.probe = sp_platform_probe,
|
||||||
.remove = sp_platform_remove,
|
.remove = sp_platform_remove,
|
||||||
|
|||||||
@@ -110,12 +110,12 @@ static void sync_print_obj(struct seq_file *s, struct sync_timeline *obj)
|
|||||||
|
|
||||||
seq_printf(s, "%s: %d\n", obj->name, obj->value);
|
seq_printf(s, "%s: %d\n", obj->name, obj->value);
|
||||||
|
|
||||||
spin_lock_irq(&obj->lock);
|
spin_lock(&obj->lock); /* Caller already disabled IRQ. */
|
||||||
list_for_each(pos, &obj->pt_list) {
|
list_for_each(pos, &obj->pt_list) {
|
||||||
struct sync_pt *pt = container_of(pos, struct sync_pt, link);
|
struct sync_pt *pt = container_of(pos, struct sync_pt, link);
|
||||||
sync_print_fence(s, &pt->base, false);
|
sync_print_fence(s, &pt->base, false);
|
||||||
}
|
}
|
||||||
spin_unlock_irq(&obj->lock);
|
spin_unlock(&obj->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sync_print_sync_file(struct seq_file *s,
|
static void sync_print_sync_file(struct seq_file *s,
|
||||||
|
|||||||
@@ -594,7 +594,9 @@ static int idma64_probe(struct idma64_chip *chip)
|
|||||||
|
|
||||||
idma64->dma.dev = chip->sysdev;
|
idma64->dma.dev = chip->sysdev;
|
||||||
|
|
||||||
dma_set_max_seg_size(idma64->dma.dev, IDMA64C_CTLH_BLOCK_TS_MASK);
|
ret = dma_set_max_seg_size(idma64->dma.dev, IDMA64C_CTLH_BLOCK_TS_MASK);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
ret = dma_async_device_register(&idma64->dma);
|
ret = dma_async_device_register(&idma64->dma);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|||||||
@@ -116,7 +116,8 @@ config EXTCON_MAX77843
|
|||||||
|
|
||||||
config EXTCON_MAX8997
|
config EXTCON_MAX8997
|
||||||
tristate "Maxim MAX8997 EXTCON Support"
|
tristate "Maxim MAX8997 EXTCON Support"
|
||||||
depends on MFD_MAX8997 && IRQ_DOMAIN
|
depends on MFD_MAX8997
|
||||||
|
select IRQ_DOMAIN
|
||||||
help
|
help
|
||||||
If you say yes here you get support for the MUIC device of
|
If you say yes here you get support for the MUIC device of
|
||||||
Maxim MAX8997 PMIC. The MAX8997 MUIC is a USB port accessory
|
Maxim MAX8997 PMIC. The MAX8997 MUIC is a USB port accessory
|
||||||
|
|||||||
@@ -169,9 +169,14 @@ static int dmi_dev_uevent(struct device *dev, struct kobj_uevent_env *env)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void dmi_dev_release(struct device *dev)
|
||||||
|
{
|
||||||
|
kfree(dev);
|
||||||
|
}
|
||||||
|
|
||||||
static struct class dmi_class = {
|
static struct class dmi_class = {
|
||||||
.name = "dmi",
|
.name = "dmi",
|
||||||
.dev_release = (void(*)(struct device *)) kfree,
|
.dev_release = dmi_dev_release,
|
||||||
.dev_uevent = dmi_dev_uevent,
|
.dev_uevent = dmi_dev_uevent,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -335,8 +335,8 @@ fail_free_new_fdt:
|
|||||||
|
|
||||||
fail:
|
fail:
|
||||||
efi_free(fdt_size, fdt_addr);
|
efi_free(fdt_size, fdt_addr);
|
||||||
|
if (!efi_novamap)
|
||||||
efi_bs_call(free_pool, priv.runtime_map);
|
efi_bs_call(free_pool, priv.runtime_map);
|
||||||
|
|
||||||
return EFI_LOAD_ERROR;
|
return EFI_LOAD_ERROR;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -736,6 +736,26 @@ static void error(char *str)
|
|||||||
efi_warn("Decompression failed: %s\n", str);
|
efi_warn("Decompression failed: %s\n", str);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char *cmdline_memmap_override;
|
||||||
|
|
||||||
|
static efi_status_t parse_options(const char *cmdline)
|
||||||
|
{
|
||||||
|
static const char opts[][14] = {
|
||||||
|
"mem=", "memmap=", "efi_fake_mem=", "hugepages="
|
||||||
|
};
|
||||||
|
|
||||||
|
for (int i = 0; i < ARRAY_SIZE(opts); i++) {
|
||||||
|
const char *p = strstr(cmdline, opts[i]);
|
||||||
|
|
||||||
|
if (p == cmdline || (p > cmdline && isspace(p[-1]))) {
|
||||||
|
cmdline_memmap_override = opts[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return efi_parse_options(cmdline);
|
||||||
|
}
|
||||||
|
|
||||||
static efi_status_t efi_decompress_kernel(unsigned long *kernel_entry)
|
static efi_status_t efi_decompress_kernel(unsigned long *kernel_entry)
|
||||||
{
|
{
|
||||||
unsigned long virt_addr = LOAD_PHYSICAL_ADDR;
|
unsigned long virt_addr = LOAD_PHYSICAL_ADDR;
|
||||||
@@ -767,6 +787,10 @@ static efi_status_t efi_decompress_kernel(unsigned long *kernel_entry)
|
|||||||
!memcmp(efistub_fw_vendor(), ami, sizeof(ami))) {
|
!memcmp(efistub_fw_vendor(), ami, sizeof(ami))) {
|
||||||
efi_debug("AMI firmware v2.0 or older detected - disabling physical KASLR\n");
|
efi_debug("AMI firmware v2.0 or older detected - disabling physical KASLR\n");
|
||||||
seed[0] = 0;
|
seed[0] = 0;
|
||||||
|
} else if (cmdline_memmap_override) {
|
||||||
|
efi_info("%s detected on the kernel command line - disabling physical KASLR\n",
|
||||||
|
cmdline_memmap_override);
|
||||||
|
seed[0] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
boot_params_ptr->hdr.loadflags |= KASLR_FLAG;
|
boot_params_ptr->hdr.loadflags |= KASLR_FLAG;
|
||||||
@@ -843,7 +867,7 @@ void __noreturn efi_stub_entry(efi_handle_t handle,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_CMDLINE_BOOL
|
#ifdef CONFIG_CMDLINE_BOOL
|
||||||
status = efi_parse_options(CONFIG_CMDLINE);
|
status = parse_options(CONFIG_CMDLINE);
|
||||||
if (status != EFI_SUCCESS) {
|
if (status != EFI_SUCCESS) {
|
||||||
efi_err("Failed to parse options\n");
|
efi_err("Failed to parse options\n");
|
||||||
goto fail;
|
goto fail;
|
||||||
@@ -852,7 +876,7 @@ void __noreturn efi_stub_entry(efi_handle_t handle,
|
|||||||
if (!IS_ENABLED(CONFIG_CMDLINE_OVERRIDE)) {
|
if (!IS_ENABLED(CONFIG_CMDLINE_OVERRIDE)) {
|
||||||
unsigned long cmdline_paddr = ((u64)hdr->cmd_line_ptr |
|
unsigned long cmdline_paddr = ((u64)hdr->cmd_line_ptr |
|
||||||
((u64)boot_params->ext_cmd_line_ptr << 32));
|
((u64)boot_params->ext_cmd_line_ptr << 32));
|
||||||
status = efi_parse_options((char *)cmdline_paddr);
|
status = parse_options((char *)cmdline_paddr);
|
||||||
if (status != EFI_SUCCESS) {
|
if (status != EFI_SUCCESS) {
|
||||||
efi_err("Failed to parse options\n");
|
efi_err("Failed to parse options\n");
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
#include <linux/dma-mapping.h>
|
#include <linux/dma-mapping.h>
|
||||||
#include <linux/kref.h>
|
#include <linux/kref.h>
|
||||||
#include <linux/mailbox_client.h>
|
#include <linux/mailbox_client.h>
|
||||||
|
#include <linux/mailbox_controller.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/of_platform.h>
|
#include <linux/of_platform.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
@@ -96,8 +97,8 @@ int rpi_firmware_property_list(struct rpi_firmware *fw,
|
|||||||
if (size & 3)
|
if (size & 3)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
buf = dma_alloc_coherent(fw->cl.dev, PAGE_ALIGN(size), &bus_addr,
|
buf = dma_alloc_coherent(fw->chan->mbox->dev, PAGE_ALIGN(size),
|
||||||
GFP_ATOMIC);
|
&bus_addr, GFP_ATOMIC);
|
||||||
if (!buf)
|
if (!buf)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
@@ -125,7 +126,7 @@ int rpi_firmware_property_list(struct rpi_firmware *fw,
|
|||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
dma_free_coherent(fw->cl.dev, PAGE_ALIGN(size), buf, bus_addr);
|
dma_free_coherent(fw->chan->mbox->dev, PAGE_ALIGN(size), buf, bus_addr);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,6 +79,7 @@ static void cci_pci_free_irq(struct pci_dev *pcidev)
|
|||||||
#define PCIE_DEVICE_ID_SILICOM_PAC_N5011 0x1001
|
#define PCIE_DEVICE_ID_SILICOM_PAC_N5011 0x1001
|
||||||
#define PCIE_DEVICE_ID_INTEL_DFL 0xbcce
|
#define PCIE_DEVICE_ID_INTEL_DFL 0xbcce
|
||||||
/* PCI Subdevice ID for PCIE_DEVICE_ID_INTEL_DFL */
|
/* PCI Subdevice ID for PCIE_DEVICE_ID_INTEL_DFL */
|
||||||
|
#define PCIE_SUBDEVICE_ID_INTEL_D5005 0x138d
|
||||||
#define PCIE_SUBDEVICE_ID_INTEL_N6000 0x1770
|
#define PCIE_SUBDEVICE_ID_INTEL_N6000 0x1770
|
||||||
#define PCIE_SUBDEVICE_ID_INTEL_N6001 0x1771
|
#define PCIE_SUBDEVICE_ID_INTEL_N6001 0x1771
|
||||||
#define PCIE_SUBDEVICE_ID_INTEL_C6100 0x17d4
|
#define PCIE_SUBDEVICE_ID_INTEL_C6100 0x17d4
|
||||||
@@ -102,6 +103,8 @@ static struct pci_device_id cci_pcie_id_tbl[] = {
|
|||||||
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIE_DEVICE_ID_INTEL_PAC_D5005_VF),},
|
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIE_DEVICE_ID_INTEL_PAC_D5005_VF),},
|
||||||
{PCI_DEVICE(PCI_VENDOR_ID_SILICOM_DENMARK, PCIE_DEVICE_ID_SILICOM_PAC_N5010),},
|
{PCI_DEVICE(PCI_VENDOR_ID_SILICOM_DENMARK, PCIE_DEVICE_ID_SILICOM_PAC_N5010),},
|
||||||
{PCI_DEVICE(PCI_VENDOR_ID_SILICOM_DENMARK, PCIE_DEVICE_ID_SILICOM_PAC_N5011),},
|
{PCI_DEVICE(PCI_VENDOR_ID_SILICOM_DENMARK, PCIE_DEVICE_ID_SILICOM_PAC_N5011),},
|
||||||
|
{PCI_DEVICE_SUB(PCI_VENDOR_ID_INTEL, PCIE_DEVICE_ID_INTEL_DFL,
|
||||||
|
PCI_VENDOR_ID_INTEL, PCIE_SUBDEVICE_ID_INTEL_D5005),},
|
||||||
{PCI_DEVICE_SUB(PCI_VENDOR_ID_INTEL, PCIE_DEVICE_ID_INTEL_DFL,
|
{PCI_DEVICE_SUB(PCI_VENDOR_ID_INTEL, PCIE_DEVICE_ID_INTEL_DFL,
|
||||||
PCI_VENDOR_ID_INTEL, PCIE_SUBDEVICE_ID_INTEL_N6000),},
|
PCI_VENDOR_ID_INTEL, PCIE_SUBDEVICE_ID_INTEL_N6000),},
|
||||||
{PCI_DEVICE_SUB(PCI_VENDOR_ID_INTEL, PCIE_DEVICE_ID_INTEL_DFL_VF,
|
{PCI_DEVICE_SUB(PCI_VENDOR_ID_INTEL, PCIE_DEVICE_ID_INTEL_DFL_VF,
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ static struct fpga_region *fpga_region_get(struct fpga_region *region)
|
|||||||
}
|
}
|
||||||
|
|
||||||
get_device(dev);
|
get_device(dev);
|
||||||
if (!try_module_get(dev->parent->driver->owner)) {
|
if (!try_module_get(region->ops_owner)) {
|
||||||
put_device(dev);
|
put_device(dev);
|
||||||
mutex_unlock(®ion->mutex);
|
mutex_unlock(®ion->mutex);
|
||||||
return ERR_PTR(-ENODEV);
|
return ERR_PTR(-ENODEV);
|
||||||
@@ -74,7 +74,7 @@ static void fpga_region_put(struct fpga_region *region)
|
|||||||
|
|
||||||
dev_dbg(dev, "put\n");
|
dev_dbg(dev, "put\n");
|
||||||
|
|
||||||
module_put(dev->parent->driver->owner);
|
module_put(region->ops_owner);
|
||||||
put_device(dev);
|
put_device(dev);
|
||||||
mutex_unlock(®ion->mutex);
|
mutex_unlock(®ion->mutex);
|
||||||
}
|
}
|
||||||
@@ -180,14 +180,16 @@ static struct attribute *fpga_region_attrs[] = {
|
|||||||
ATTRIBUTE_GROUPS(fpga_region);
|
ATTRIBUTE_GROUPS(fpga_region);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fpga_region_register_full - create and register an FPGA Region device
|
* __fpga_region_register_full - create and register an FPGA Region device
|
||||||
* @parent: device parent
|
* @parent: device parent
|
||||||
* @info: parameters for FPGA Region
|
* @info: parameters for FPGA Region
|
||||||
|
* @owner: module containing the get_bridges function
|
||||||
*
|
*
|
||||||
* Return: struct fpga_region or ERR_PTR()
|
* Return: struct fpga_region or ERR_PTR()
|
||||||
*/
|
*/
|
||||||
struct fpga_region *
|
struct fpga_region *
|
||||||
fpga_region_register_full(struct device *parent, const struct fpga_region_info *info)
|
__fpga_region_register_full(struct device *parent, const struct fpga_region_info *info,
|
||||||
|
struct module *owner)
|
||||||
{
|
{
|
||||||
struct fpga_region *region;
|
struct fpga_region *region;
|
||||||
int id, ret = 0;
|
int id, ret = 0;
|
||||||
@@ -212,6 +214,7 @@ fpga_region_register_full(struct device *parent, const struct fpga_region_info *
|
|||||||
region->compat_id = info->compat_id;
|
region->compat_id = info->compat_id;
|
||||||
region->priv = info->priv;
|
region->priv = info->priv;
|
||||||
region->get_bridges = info->get_bridges;
|
region->get_bridges = info->get_bridges;
|
||||||
|
region->ops_owner = owner;
|
||||||
|
|
||||||
mutex_init(®ion->mutex);
|
mutex_init(®ion->mutex);
|
||||||
INIT_LIST_HEAD(®ion->bridge_list);
|
INIT_LIST_HEAD(®ion->bridge_list);
|
||||||
@@ -240,13 +243,14 @@ err_free:
|
|||||||
|
|
||||||
return ERR_PTR(ret);
|
return ERR_PTR(ret);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(fpga_region_register_full);
|
EXPORT_SYMBOL_GPL(__fpga_region_register_full);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fpga_region_register - create and register an FPGA Region device
|
* __fpga_region_register - create and register an FPGA Region device
|
||||||
* @parent: device parent
|
* @parent: device parent
|
||||||
* @mgr: manager that programs this region
|
* @mgr: manager that programs this region
|
||||||
* @get_bridges: optional function to get bridges to a list
|
* @get_bridges: optional function to get bridges to a list
|
||||||
|
* @owner: module containing the get_bridges function
|
||||||
*
|
*
|
||||||
* This simple version of the register function should be sufficient for most users.
|
* This simple version of the register function should be sufficient for most users.
|
||||||
* The fpga_region_register_full() function is available for users that need to
|
* The fpga_region_register_full() function is available for users that need to
|
||||||
@@ -255,17 +259,17 @@ EXPORT_SYMBOL_GPL(fpga_region_register_full);
|
|||||||
* Return: struct fpga_region or ERR_PTR()
|
* Return: struct fpga_region or ERR_PTR()
|
||||||
*/
|
*/
|
||||||
struct fpga_region *
|
struct fpga_region *
|
||||||
fpga_region_register(struct device *parent, struct fpga_manager *mgr,
|
__fpga_region_register(struct device *parent, struct fpga_manager *mgr,
|
||||||
int (*get_bridges)(struct fpga_region *))
|
int (*get_bridges)(struct fpga_region *), struct module *owner)
|
||||||
{
|
{
|
||||||
struct fpga_region_info info = { 0 };
|
struct fpga_region_info info = { 0 };
|
||||||
|
|
||||||
info.mgr = mgr;
|
info.mgr = mgr;
|
||||||
info.get_bridges = get_bridges;
|
info.get_bridges = get_bridges;
|
||||||
|
|
||||||
return fpga_region_register_full(parent, &info);
|
return __fpga_region_register_full(parent, &info, owner);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(fpga_region_register);
|
EXPORT_SYMBOL_GPL(__fpga_region_register);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fpga_region_unregister - unregister an FPGA region
|
* fpga_region_unregister - unregister an FPGA region
|
||||||
|
|||||||
@@ -1083,6 +1083,7 @@ void amdgpu_mes_remove_ring(struct amdgpu_device *adev,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
amdgpu_mes_remove_hw_queue(adev, ring->hw_queue_id);
|
amdgpu_mes_remove_hw_queue(adev, ring->hw_queue_id);
|
||||||
|
del_timer_sync(&ring->fence_drv.fallback_timer);
|
||||||
amdgpu_ring_fini(ring);
|
amdgpu_ring_fini(ring);
|
||||||
kfree(ring);
|
kfree(ring);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -585,6 +585,8 @@ int amdgpu_bo_create(struct amdgpu_device *adev,
|
|||||||
else
|
else
|
||||||
amdgpu_bo_placement_from_domain(bo, bp->domain);
|
amdgpu_bo_placement_from_domain(bo, bp->domain);
|
||||||
if (bp->type == ttm_bo_type_kernel)
|
if (bp->type == ttm_bo_type_kernel)
|
||||||
|
bo->tbo.priority = 2;
|
||||||
|
else if (!(bp->flags & AMDGPU_GEM_CREATE_DISCARDABLE))
|
||||||
bo->tbo.priority = 1;
|
bo->tbo.priority = 1;
|
||||||
|
|
||||||
if (!bp->destroy)
|
if (!bp->destroy)
|
||||||
|
|||||||
@@ -9352,7 +9352,7 @@ static const struct amdgpu_ring_funcs gfx_v10_0_ring_funcs_gfx = {
|
|||||||
7 + /* PIPELINE_SYNC */
|
7 + /* PIPELINE_SYNC */
|
||||||
SOC15_FLUSH_GPU_TLB_NUM_WREG * 5 +
|
SOC15_FLUSH_GPU_TLB_NUM_WREG * 5 +
|
||||||
SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 7 +
|
SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 7 +
|
||||||
2 + /* VM_FLUSH */
|
4 + /* VM_FLUSH */
|
||||||
8 + /* FENCE for VM_FLUSH */
|
8 + /* FENCE for VM_FLUSH */
|
||||||
20 + /* GDS switch */
|
20 + /* GDS switch */
|
||||||
4 + /* double SWITCH_BUFFER,
|
4 + /* double SWITCH_BUFFER,
|
||||||
@@ -9445,7 +9445,6 @@ static const struct amdgpu_ring_funcs gfx_v10_0_ring_funcs_kiq = {
|
|||||||
7 + /* gfx_v10_0_ring_emit_pipeline_sync */
|
7 + /* gfx_v10_0_ring_emit_pipeline_sync */
|
||||||
SOC15_FLUSH_GPU_TLB_NUM_WREG * 5 +
|
SOC15_FLUSH_GPU_TLB_NUM_WREG * 5 +
|
||||||
SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 7 +
|
SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 7 +
|
||||||
2 + /* gfx_v10_0_ring_emit_vm_flush */
|
|
||||||
8 + 8 + 8, /* gfx_v10_0_ring_emit_fence_kiq x3 for user fence, vm fence */
|
8 + 8 + 8, /* gfx_v10_0_ring_emit_fence_kiq x3 for user fence, vm fence */
|
||||||
.emit_ib_size = 7, /* gfx_v10_0_ring_emit_ib_compute */
|
.emit_ib_size = 7, /* gfx_v10_0_ring_emit_ib_compute */
|
||||||
.emit_ib = gfx_v10_0_ring_emit_ib_compute,
|
.emit_ib = gfx_v10_0_ring_emit_ib_compute,
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user