Merge android-5.4.26 (0d3cca0c
) into msm-5.4
* refs/heads/tmp-0d3cca0c: UPSTREAM: driver core: Skip unnecessary work when device doesn't have sync_state() Linux 5.4.26 net/smc: cancel event worker during device removal net/smc: check for valid ib_client_data ipv6: restrict IPV6_ADDRFORM operation iommu/amd: Fix IOMMU AVIC not properly update the is_run bit in IRTE i2c: acpi: put device when verifying client fails iommu/vt-d: Ignore devices with out-of-spec domain number iommu/vt-d: Fix the wrong printing in RHSA parsing netfilter: nft_chain_nat: inet family is missing module ownership netfilter: nf_tables: dump NFTA_CHAIN_FLAGS attribute netfilter: nft_tunnel: add missing attribute validation for tunnels netfilter: nft_payload: add missing attribute validation for payload csum flags netfilter: cthelper: add missing attribute validation for cthelper perf bench futex-wake: Restore thread count default to online CPU count nl80211: add missing attribute validation for channel switch nl80211: add missing attribute validation for beacon report scanning nl80211: add missing attribute validation for critical protocol indication i2c: gpio: suppress error on probe defer iommu/vt-d: Fix RCU-list bugs in intel_iommu_init() driver code: clarify and fix platform device DMA mask allocation drm/i915/gvt: Fix unnecessary schedule timer when no vGPU exits pinctrl: core: Remove extra kref_get which blocks hogs being freed drm/i915/gvt: Fix dma-buf display blur issue on CFL virtio_ring: Fix mem leak with vring_new_virtqueue() pinctrl: imx: scu: Align imx sc msg structs to 4 pinctrl: meson-gxl: fix GPIOX sdio pins clk: imx8mn: Fix incorrect clock defines batman-adv: Don't schedule OGM for disabled interface iommu/vt-d: Fix a bug in intel_iommu_iova_to_phys() for huge page iommu/vt-d: Fix RCU list debugging warnings iommu/vt-d: dmar: replace WARN_TAINT with pr_warn + add_taint iommu/dma: Fix MSI reservation allocation x86/mce: Fix logic and comments around MSR_PPIN_CTL perf/amd/uncore: Replace manual sampling check with CAP_NO_INTERRUPT flag mt76: fix array overflow on receiving too many fragments for a packet i2c: designware-pci: Fix BUG_ON during device removal efi: Add a sanity check to efivar_store_raw() efi: Fix a race and a buffer overflow while reading efivars via sysfs x86/ioremap: Map EFI runtime services data as encrypted for SEV macintosh: windfarm: fix MODINFO regression fscrypt: don't evict dirty inodes after removing key blk-iocost: fix incorrect vtime comparison in iocg_is_idle() ipmi_si: Avoid spurious errors for optional IRQs s390/dasd: fix data corruption for thin provisioned devices fuse: fix stack use after return ARC: define __ALIGN_STR and __ALIGN symbols for ARC KVM: nVMX: avoid NULL pointer dereference with incorrect EVMCS GPAs KVM: x86: clear stale x86_emulate_ctxt->intercept value gfs2_atomic_open(): fix O_EXCL|O_CREAT handling on cold dcache cifs_atomic_open(): fix double-put on late allocation failure ktest: Add timeout for ssh sync testing pinctrl: falcon: fix syntax error mmc: sdhci-pci-gli: Enable MSI interrupt for GL975x drm/i915: Defer semaphore priority bumping to a workqueue drm/i915: be more solid in checking the alignment drm/amd/display: remove duplicated assignment to grph_obj_type workqueue: don't use wq_select_unbound_cpu() for bound works netfilter: x_tables: xt_mttg_seq_next should increase position index netfilter: xt_recent: recent_seq_next should increase position index netfilter: synproxy: synproxy_cpu_seq_next should increase position index netfilter: nf_conntrack: ct_cpu_seq_next should increase position index iommu/vt-d: quirk_ioat_snb_local_iommu: replace WARN_TAINT with pr_warn + add_taint virtio-blk: fix hw_queue stopped on arbitrary error iwlwifi: mvm: Do not require PHY_SKU NVM section for 3168 devices netfilter: nf_tables: fix infinite loop when expr is not available cgroup: Iterate tasks that did not finish do_exit() cgroup: cgroup_procs_next should increase position index net: phy: Avoid multiple suspends net: dsa: Don't instantiate phylink for CPU/DSA ports unless needed selftests/net/fib_tests: update addr_metric_test for peer route testing net/ipv6: remove the old peer route if change it to a new one net/ipv6: need update peer route when modify metric net: phy: fix MDIO bus PM PHY resuming net: phy: avoid clearing PHY interrupts twice in irq handler nfc: add missing attribute validation for vendor subcommand nfc: add missing attribute validation for deactivate target nfc: add missing attribute validation for SE API tipc: add missing attribute validation for MTU property team: add missing attribute validation for array index team: add missing attribute validation for port ifindex net: taprio: add missing attribute validation for txtime delay net: fq: add missing attribute validation for orphan mask macsec: add missing attribute validation for port can: add missing attribute validation for termination nl802154: add missing attribute validation for dev_type nl802154: add missing attribute validation fib: add missing attribute validation for tun_id devlink: validate length of region addr/len devlink: validate length of param values net: memcg: fix lockdep splat in inet_csk_accept() net: memcg: late association of sock to memcg cgroup: memcg: net: do not associate sock with unrelated cgroup bnxt_en: fix error handling when flashing from file bnxt_en: reinitialize IRQs when MTU is modified bonding/alb: make sure arp header is pulled before accessing it taprio: Fix sending packets without dequeueing them slip: make slhc_compress() more robust against malicious packets sfc: detach from cb_page in efx_copy_channel() r8152: check disconnect status after long sleep net: systemport: fix index check to avoid an array out of bounds access net: stmmac: dwmac1000: Disable ACS if enhanced descs are not used net: phy: bcm63xx: fix OOPS due to missing driver name net/packet: tpacket_rcv: do not increment ring index on drop net: nfc: fix bounds checking bugs on "pipe" net: macsec: update SCI upon MAC address change. netlink: Use netlink header as base to calculate bad attribute offset net/ipv6: use configured metric when add peer route net: hns3: fix a not link up issue when fibre port supports autoneg net: fec: validate the new settings in fec_enet_set_coalesce() net: dsa: mv88e6xxx: fix lockup on warm boot net: dsa: fix phylink_start()/phylink_stop() calls macvlan: add cond_resched() during multicast processing ipvlan: don't deref eth hdr before checking it's set ipvlan: do not use cond_resched_rcu() in ipvlan_process_multicast() ipvlan: do not add hardware address of master to its unicast filter list ipvlan: add cond_resched_rcu() while processing muticast backlog ipv6/addrconf: call ipv6_mc_up() for non-Ethernet interface inet_diag: return classid for all socket types gre: fix uninit-value in __iptunnel_pull_header cgroup, netclassid: periodically release file_lock on classid updating ALSA: hda/realtek - Fixed one of HP ALC671 platform Headset Mic supported ALSA: hda/realtek - Add Headset Mic supported for HP cPC ALSA: hda/realtek - More constifications virtio_balloon: Adjust label in virtballoon_probe ANDROID: GKI: Revert "mm: unexport free_reserved_area" ANDROID: Export functions to be used with dma_map_ops in modules ANDROID: GKI: add android_kabi.h ANDROID: GKI: update abi due to CONFIG_JUMP_LABEL being enabled ANDROID: GKI: enable CONFIG_JUMP_LABEL ANDROID: Add build.config.gki-debug.x86_64 ANDROID: update the abi signatures ANDROID: Add build.config.gki-debug.aarch64 Revert "ANDROID: drm: edid: add support for additional CEA extension blocks" Revert "ANDROID: drm: Parse Colorimetry data block from EDID" ANDROID: Add build.config files for ARM 32-bit ANDROID: Kconfig.gki: Add FRAME_VECTOR UPSTREAM: cgroup: Iterate tasks that did not finish do_exit() ANDROID: gki_defconfig: Enable more USB_CONFIGFS gadgets Revert "ANDROID: tty: serdev: Fix broken serial console input" ANDROID: serdev: restrict claim of platform devices ANDROID: Add TPM support and the vTPM proxy to Cuttlefish. FROMGIT: ASoC: sprd: Allow the MCDT driver to build into modules FROMGIT: thermal: sprd: Add Spreadtrum thermal driver support FROMGIT: dt-bindings: thermal: sprd: Add the Spreadtrum thermal documentation ANDROID: ABI update due to power supply patches being merged FROMGIT: pinctrl: sprd: Fix the kconfig warning FROMGIT: pinctrl: sprd: Allow the SPRD pinctrl driver building into a module FROMGIT: pinctrl: Export some needed symbols at module load time FROMGIT: power: reset: sc27xx: Allow the SC27XX poweroff driver building into a module FROMGIT: power: reset: sc27xx: Change to use cpu_down() FROMGIT: power: reset: sc27xx: Power off the external subsystems' connection FROMGIT: power: supply: sc27xx: Add POWER_SUPPLY_PROP_CHARGE_NOW attribute UPSTREAM: power: supply: sc27xx: Calibrate the resistance of coulomb counter UPSTREAM: dt-bindings: power: sc27xx: Add a new property to describe the real resistance of coulomb counter chip UPSTREAM: power: supply: sc27xx: Optimize the battery resistance with measuring temperature UPSTREAM: power: supply: core: Add battery internal resistance temperature table support UPSTREAM: dt-bindings: power: Introduce one property to describe the battery resistance with temperature changes ANDROID: abi_gki_aarch64_whitelist: update after whitelist changes ANDROID: update abi_gki_aarch64_cuttlefish_whitelist ANDROID: update abi_gki_aarch64_db845c_whitelist ANDROID: update abi due to interconnect changes UPSTREAM: interconnect: Handle memory allocation errors UPSTREAM: interconnect: Add basic tracepoints UPSTREAM: interconnect: Add a name to struct icc_path UPSTREAM: interconnect: Move internal structs into a separate file Linux 5.4.25 drm/virtio: module_param_named() requires linux/moduleparam.h csky: Implement copy_thread_tls block, bfq: remove ifdefs from around gets/puts of bfq groups block, bfq: get a ref to a group when adding it to a service tree efi: READ_ONCE rng seed size before munmap efi/x86: Handle by-ref arguments covering multiple pages in mixed mode efi/x86: Align GUIDs to their size in the mixed mode runtime wrapper powerpc: fix hardware PMU exception bug on PowerVM compatibility mode systems EDAC/synopsys: Do not print an error with back-to-back snprintf() calls bus: ti-sysc: Fix 1-wire reset quirk arm64: dts: meson: fix gxm-khadas-vim2 wifi dmaengine: coh901318: Fix a double lock bug in dma_tc_handle() dma-buf: free dmabuf->name in dma_buf_release() hwmon: (adt7462) Fix an error return in ADT7462_REG_VOLT() ARM: dts: imx7-colibri: Fix frequency for sd/mmc ARM: dts: dra7xx-clocks: Fixup IPU1 mux clock parent source ARM: dts: am437x-idk-evm: Fix incorrect OPP node names ARM: imx: build v7_cpu_resume() unconditionally IB/hfi1, qib: Ensure RCU is locked when accessing list RMDA/cm: Fix missing ib_cm_destroy_id() in ib_cm_insert_listen() regulator: stm32-vrefbuf: fix a possible overshoot when re-enabling RDMA/core: Fix protection fault in ib_mr_pool_destroy RDMA/iwcm: Fix iwcm work deallocation RDMA/siw: Fix failure handling during device creation RDMA/nldev: Fix crash when set a QP to a new counter but QPN is missing RDMA/rw: Fix error flow during RDMA context initialization Revert "RDMA/cma: Simplify rdma_resolve_addr() error flow" soc: imx-scu: Align imx sc msg structs to 4 firmware: imx: Align imx_sc_msg_req_cpu_start to 4 firmware: imx: scu-pd: Align imx sc msg structs to 4 firmware: imx: misc: Align imx sc msg structs to 4 arm64: dts: imx8qxp-mek: Remove unexisting Ethernet PHY ARM: dts: imx6: phycore-som: fix emmc supply phy: mapphone-mdm6600: Fix write timeouts with shorter GPIO toggle interval phy: mapphone-mdm6600: Fix timeouts by adding wake-up handling drm/i915/selftests: Fix return in assert_mmap_offset() drm/i915: Program MBUS with rmw during initialization drm/sun4i: de2/de3: Remove unsupported VI layer formats drm/sun4i: Fix DE2 VI layer format support drm/sun4i: Add separate DE3 VI layer formats drm: kirin: Revert "Fix for hikey620 display offset problem" drm/panfrost: Don't try to map on error faults spi: atmel-quadspi: fix possible MMIO window size overrun ASoC: dapm: Correct DAPM handling of active widgets during shutdown ASoC: Intel: Skylake: Fix available clock counter incrementation ASoC: pcm512x: Fix unbalanced regulator enable call in probe error path ASoC: pcm: Fix possible buffer overflow in dpcm state sysfs output powerpc/mm: Fix missing KUAP disable in flush_coherent_icache() powerpc: Convert flush_icache_range & friends to C powerpc: define helpers to get L1 icache sizes ASoC: intel: skl: Fix possible buffer overflow in debug outputs ASoC: intel: skl: Fix pin debug prints ASoC: SOF: Fix snd_sof_ipc_stream_posn() ASoC: topology: Fix memleak in soc_tplg_manifest_load() ASoC: topology: Fix memleak in soc_tplg_link_elems_load() drm/virtio: fix resource id creation race drm/virtio: make resource id workaround runtime switchable. spi: bcm63xx-hsspi: Really keep pll clk enabled ARM: dts: ls1021a: Restore MDIO compatible to gianfar arm64: dts: meson-sm1-sei610: add missing interrupt-names dm: fix congested_fn for request-based device dm zoned: Fix reference counter initial value of chunk works dm writecache: verify watermark during resume dm: report suspended device during destroy dm cache: fix a crash due to incorrect work item cancelling dm integrity: fix invalid table returned due to argument count mismatch dm integrity: fix a deadlock due to offloading to an incorrect workqueue dm integrity: fix recalculation when moving from journal mode to bitmap mode dmaengine: tegra-apb: Prevent race conditions of tasklet vs free list dmaengine: tegra-apb: Fix use-after-free dmaengine: imx-sdma: Fix the event id check to include RX event for UART6 dmaengine: imx-sdma: fix context cache s390/mm: fix panic in gup_fast on large pud s390/pci: Fix unexpected write combine on resource x86/pkeys: Manually set X86_FEATURE_OSPKE to preserve existing changes spi: spidev: Fix CS polarity if GPIO descriptors are used perf arm-spe: Fix endless record after being terminated perf cs-etm: Fix endless record after being terminated perf intel-bts: Fix endless record after being terminated perf intel-pt: Fix endless record after being terminated media: v4l2-mem2mem.c: fix broken links media: vicodec: process all 4 components for RGB32 formats media: mc-entity.c: use & to check pad flags, not == media: hantro: Fix broken media controller links vt: selection, push sel_lock up vt: selection, push console lock down vt: selection, close sel_buffer race serial: 8250_exar: add support for ACCES cards tty: serial: fsl_lpuart: free IDs allocated by IDA tty:serial:mvebu-uart:fix a wrong return arm: dts: dra76x: Fix mmc3 max-frequency arm64: dts: socfpga: agilex: Fix gmac compatible btrfs: fix RAID direct I/O reads with alternate csums fat: fix uninit-memory access for partial initialized inode mm, hotplug: fix page online with DEBUG_PAGEALLOC compiled but not enabled mm: fix possible PMD dirty bit lost in set_pmd_migration_entry() mm, numa: fix bad pmd by atomically check for pmd_trans_huge when marking page tables prot_numa vgacon: Fix a UAF in vgacon_invert_region usb: core: port: do error out if usb_autopm_get_interface() fails usb: core: hub: do error out if usb_autopm_get_interface() fails usb: core: hub: fix unhandled return by employing a void function usb: cdns3: gadget: toggle cycle bit before reset endpoint usb: cdns3: gadget: link trb should point to next request usb: dwc3: gadget: Update chain bit correctly when using sg list usb: quirks: add NO_LPM quirk for Logitech Screen Share usb: storage: Add quirk for Samsung Fit flash cifs: fix rename() by ensuring source handle opened with DELETE bit cifs: don't leak -EAGAIN for stat() during reconnect ALSA: hda/realtek - Enable the headset of ASUS B9450FA with ALC294 ALSA: hda/realtek - Fix silent output on Gigabyte X570 Aorus Master ALSA: hda/realtek - Add Headset Button supported for ThinkPad X1 ALSA: hda/realtek - Add Headset Mic supported binder: prevent UAF for binderfs devices II binder: prevent UAF for binderfs devices firmware: imx: scu: Ensure sequential TX selftests: forwarding: vxlan_bridge_1d: use more proper tos value arch/csky: fix some Kconfig typos csky: Fixup compile warning for three unimplemented syscalls csky: Fixup ftrace modify panic csky/smp: Fixup boot failed when CONFIG_SMP csky: Set regs->usp to kernel sp, when the exception is from kernel csky/mm: Fixup export invalid_pte_table symbol net: thunderx: workaround BGX TX Underflow issue x86/xen: Distribute switch variables for initialization ice: Don't tell the OS that link is going down nvme: Fix uninitialized-variable warning s390/qdio: fill SL with absolute addresses x86/boot/compressed: Don't declare __force_order in kaslr_64.c nvme-pci: Use single IRQ vector for old Apple models nvme/pci: Add sleep quirk for Samsung and Toshiba drives iommu/amd: Disable IOMMU on Stoney Ridge systems net/mlx5: DR, Fix matching on vport gvmi efi: Only print errors about failing to get certs if EFI vars are found s390: make 'install' not depend on vmlinux s390/cio: cio_ignore_proc_seq_next should increase position index watchdog: da9062: do not ping the hw during stop() net: ethernet: dm9000: Handle -EPROBE_DEFER in dm9000_parse_dt() net: ks8851-ml: Fix 16-bit IO operation net: ks8851-ml: Fix 16-bit data access net: ks8851-ml: Remove 8-bit bus accessors net: atlantic: check rpc result and wait for rpc address selftests: forwarding: vxlan_bridge_1d: fix tos value selftests: forwarding: use proto icmp for {gretap, ip6gretap}_mac testing drm/msm/dsi/pll: call vco set rate explicitly drm/msm/dsi: save pll state before dsi host is powered off scsi: megaraid_sas: silence a warning drm/modes: Allow DRM_MODE_ROTATE_0 when applying video mode parameters drm/modes: Make sure to parse valid rotation value from cmdline drm: msm: Fix return type of dsi_mgr_connector_mode_valid for kCFI drm/msm/mdp5: rate limit pp done timeout warnings habanalabs: patched cb equals user cb in device memset habanalabs: do not halt CoreSight during hard reset habanalabs: halt the engines before hard-reset usb: gadget: serial: fix Tx stall after buffer overflow usb: gadget: ffs: ffs_aio_cancel(): Save/restore IRQ flags usb: gadget: composite: Support more than 500mA MaxPower selftests: fix too long argument serial: ar933x_uart: set UART_CS_{RX,TX}_READY_ORIDE ALSA: hda: do not override bus codec_mask in link_get() blktrace: fix dereference after null check kprobes: Fix optimize_kprobe()/unoptimize_kprobe() cancellation logic kbuild: fix 'No such file or directory' warning when cleaning RDMA/core: Fix use of logical OR in get_new_pps RDMA/core: Fix pkey and port assignment in get_new_pps dm thin metadata: fix lockdep complaint net: stmmac: fix notifier registration net: dsa: bcm_sf2: Forcibly configure IMP port for 1Gb/sec ALSA: hda/realtek - Fix a regression for mute led on Lenovo Carbon X1 block, bfq: do not insert oom queue into position tree block, bfq: get extra ref to prevent a queue from being freed during a group move FROMGIT: kallsyms: unexport kallsyms_lookup_name() and kallsyms_on_each_symbol() FROMGIT: samples/hw_breakpoint: drop use of kallsyms_lookup_name() FROMGIT: samples/hw_breakpoint: drop HW_BREAKPOINT_R when reporting writes UPSTREAM: fscrypt: don't evict dirty inodes after removing key ANDROID: ABI/Whitelist: update whitelist of unisoc upstream code ANDROID: gki_defconfig: Enable CONFIG_VM_EVENT_COUNTERS ANDROID: gki_defconfig: Enable CONFIG_CLEANCACHE ANDROID: arm64: update the abi with the new gki_defconfig ANDROID: gki_defconfig: disable CONFIG_DEBUG_DEVRES ANDROID: Update the abi xml file ANDROID: GKI: arm64: reserve space in cpu_hwcaps and cpu_hwcap_keys arrays FROMGIT: power: supply: Allow charger manager can be built as a module ANDROID: arm64: gki_defconfig: disable CONFIG_DEBUG_PREEMPT ANDROID: iommu/iova: Fix to use __alloc_and_insert_iova_best_fit ANDROID: enable CONFIG_WATCHDOG_CORE=y ANDROID: kbuild: align UNUSED_KSYMS_WHITELIST with upstream FROMLIST: f2fs: fix wrong check on F2FS_IOC_FSSETXATTR ANDROID: gki_defconfig: enable CONFIG_TYPEC UPSTREAM: scsi: ufs: ufs-mediatek: add waiting time for reference clock UPSTREAM: scsi: ufs: introduce common function to disable host TX LCC UPSTREAM: scsi: ufs: ufs-mediatek: fix TX LCC disabling timing UPSTREAM: scsi: ufs: ufs-mediatek: gate ref-clk during Auto-Hibern8 UPSTREAM: scsi: ufs: fix Auto-Hibern8 error detection UPSTREAM: scsi: ufs: ufs-mediatek: support linkoff state during suspend UPSTREAM: scsi: ufs: ufs-mediatek: ensure UniPro is not powered down before linkup UPSTREAM: scsi: ufs: Move ufshcd_get_max_pwr_mode() to ufshcd_device_params_init() BACKPORT: scsi: ufs: Split ufshcd_probe_hba() based on its called flow FROMGIT: driver core: Reevaluate dev->links.need_for_probe as suppliers are added FROMGIT: driver core: Call sync_state() even if supplier has no consumers ANDROID: cpufreq: times: Remove per-UID time in state tracking Revert "ANDROID: proc: Add /proc/uid directory" Revert "ANDROID: cpufreq: Add time_in_state to /proc/uid directories" ANDROID: cpufreq: times: Remove /proc/uid_concurrent_{active,policy}_time ANDROID: drm: Add support for DP 1.4 Compliance edid corruption test Revert "ANDROID: drm: Add support for DP 1.4 Compliance edid corruption test" ANDROID: staging: ion: Add an in-kernel interface to request heap info. FROMLIST: lib: test_stackinit.c: XFAIL switch variable init tests UPSTREAM: scsi: ufs: Abort gating if clock on request is pending UPSTREAM: scsi: ufs: Fix irq return code UPSTREAM: scsi: ufs: Fix register dump caused sleep in atomic context UPSTREAM: scsi: ufs-qcom: Add reset control support for host controller UPSTREAM: scsi: ufs: Add device reset in link recovery path FROMGIT: scsi: ufs-qcom: Delay specific time before gate ref clk BACKPORT: FROMGIT: scsi: ufs: Add dev ref clock gating wait time support Revert "FROMLIST: scsi: ufs: Add dev ref clock gating wait time support" FROMGIT: scsi: ufs-qcom: Adjust bus bandwidth voting and unvoting Revert "FROMLIST: scsi: ufs-qcom: Adjust bus bandwidth voting and unvoting" ANDROID: CC_FLAGS_CFI add -fno-sanitize-blacklist Conflicts: Documentation/devicetree/bindings Documentation/devicetree/bindings/power/supply/battery.txt Documentation/devicetree/bindings/power/supply/sc27xx-fg.txt drivers/dma-buf/dma-buf.c drivers/interconnect/core.c drivers/interconnect/internal.h drivers/scsi/ufs/ufs-qcom.c drivers/scsi/ufs/ufs-qcom.h drivers/scsi/ufs/ufshcd.h drivers/thermal/Makefile drivers/usb/dwc3/gadget.c drivers/usb/gadget/composite.c drivers/usb/gadget/function/f_fs.c scripts/gen_autoksyms.sh Change-Id: Ic3227858328ceef3f34273428d1c4f81b78757b2 Signed-off-by: Blagovest Kolenichev <bkolenichev@codeaurora.org>
This commit is contained in:
commit
4e2b270d2c
@ -1,16 +0,0 @@
|
||||
What: /proc/uid_concurrent_active_time
|
||||
Date: December 2018
|
||||
Contact: Connor O'Brien <connoro@google.com>
|
||||
Description:
|
||||
The /proc/uid_concurrent_active_time file displays aggregated cputime
|
||||
numbers for each uid, broken down by the total number of cores that were
|
||||
active while the uid's task was running.
|
||||
|
||||
What: /proc/uid_concurrent_policy_time
|
||||
Date: December 2018
|
||||
Contact: Connor O'Brien <connoro@google.com>
|
||||
Description:
|
||||
The /proc/uid_concurrent_policy_time file displays aggregated cputime
|
||||
numbers for each uid, broken down based on the cpufreq policy
|
||||
of the core used by the uid's task and the number of cores associated
|
||||
with that policy that were active while the uid's task was running.
|
@ -850,3 +850,11 @@ business doing so.
|
||||
d_alloc_pseudo() is internal-only; uses outside of alloc_file_pseudo() are
|
||||
very suspect (and won't work in modules). Such uses are very likely to
|
||||
be misspelled d_alloc_anon().
|
||||
|
||||
---
|
||||
|
||||
**mandatory**
|
||||
|
||||
[should've been added in 2016] stale comment in finish_open() nonwithstanding,
|
||||
failure exits in ->atomic_open() instances should *NOT* fput() the file,
|
||||
no matter what. Everything is handled by the caller.
|
||||
|
9
Makefile
9
Makefile
@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 4
|
||||
SUBLEVEL = 24
|
||||
SUBLEVEL = 26
|
||||
EXTRAVERSION =
|
||||
NAME = Kleptomaniac Octopus
|
||||
|
||||
@ -901,7 +901,8 @@ endif
|
||||
|
||||
ifdef CONFIG_CFI_CLANG
|
||||
CC_FLAGS_CFI := -fsanitize=cfi \
|
||||
-fno-sanitize-cfi-canonical-jump-tables
|
||||
-fno-sanitize-cfi-canonical-jump-tables \
|
||||
-fno-sanitize-blacklist
|
||||
|
||||
ifdef CONFIG_MODULES
|
||||
CC_FLAGS_CFI += -fsanitize-cfi-cross-dso
|
||||
@ -1135,8 +1136,8 @@ endif
|
||||
autoksyms_h := $(if $(CONFIG_TRIM_UNUSED_KSYMS), include/generated/autoksyms.h)
|
||||
|
||||
quiet_cmd_autoksyms_h = GEN $@
|
||||
cmd_autoksyms_h = mkdir -p $(dir $@); $(CONFIG_SHELL) \
|
||||
$(srctree)/scripts/gen_autoksyms.sh $@
|
||||
cmd_autoksyms_h = mkdir -p $(dir $@); \
|
||||
$(CONFIG_SHELL) $(srctree)/scripts/gen_autoksyms.sh $@
|
||||
|
||||
$(autoksyms_h):
|
||||
$(call cmd,autoksyms_h)
|
||||
|
80367
abi_gki_aarch64.xml
80367
abi_gki_aarch64.xml
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -8,6 +8,7 @@
|
||||
__arch_copy_from_user
|
||||
__arch_copy_to_user
|
||||
arm64_const_caps_ready
|
||||
bcmp
|
||||
bus_register
|
||||
bus_unregister
|
||||
cancel_delayed_work_sync
|
||||
@ -21,9 +22,6 @@
|
||||
cpumask_next
|
||||
cpu_number
|
||||
__cpu_online_mask
|
||||
cpus_read_lock
|
||||
cpus_read_unlock
|
||||
debug_smp_processor_id
|
||||
delayed_work_timer_fn
|
||||
destroy_workqueue
|
||||
dev_driver_string
|
||||
@ -48,7 +46,6 @@
|
||||
ethtool_op_get_link
|
||||
eth_validate_addr
|
||||
event_triggers_call
|
||||
fd_install
|
||||
finish_wait
|
||||
flush_work
|
||||
fput
|
||||
@ -56,10 +53,8 @@
|
||||
free_netdev
|
||||
__free_pages
|
||||
get_random_bytes
|
||||
get_unused_fd_flags
|
||||
ida_alloc_range
|
||||
ida_free
|
||||
init_net
|
||||
init_timer_key
|
||||
init_wait_entry
|
||||
__init_waitqueue_head
|
||||
@ -68,8 +63,12 @@
|
||||
kfree_skb
|
||||
__kmalloc
|
||||
kmalloc_caches
|
||||
kmem_cache_alloc
|
||||
kmem_cache_alloc_trace
|
||||
kmemdup
|
||||
kmem_cache_create
|
||||
kmem_cache_destroy
|
||||
kmem_cache_free
|
||||
kstrdup
|
||||
kvfree
|
||||
kvmalloc_node
|
||||
__local_bh_enable_ip
|
||||
@ -77,6 +76,7 @@
|
||||
memcpy
|
||||
memset
|
||||
__module_get
|
||||
module_layout
|
||||
module_put
|
||||
msleep
|
||||
__mutex_init
|
||||
@ -94,7 +94,6 @@
|
||||
netif_device_detach
|
||||
netif_tx_stop_all_queues
|
||||
netif_tx_wake_queue
|
||||
noop_llseek
|
||||
nr_cpu_ids
|
||||
param_ops_bool
|
||||
param_ops_charp
|
||||
@ -103,11 +102,11 @@
|
||||
passthru_features_check
|
||||
pci_disable_device
|
||||
pci_enable_device
|
||||
pci_iomap
|
||||
pci_read_config_dword
|
||||
__pci_register_driver
|
||||
pci_set_master
|
||||
pci_unregister_driver
|
||||
__per_cpu_offset
|
||||
perf_trace_buf_alloc
|
||||
perf_trace_run_bpf_submit
|
||||
platform_device_add
|
||||
@ -117,18 +116,15 @@
|
||||
platform_device_unregister
|
||||
__platform_driver_register
|
||||
platform_driver_unregister
|
||||
preempt_count_add
|
||||
preempt_count_sub
|
||||
preempt_schedule
|
||||
preempt_schedule_notrace
|
||||
prepare_to_wait_event
|
||||
printk
|
||||
__put_cred
|
||||
put_device
|
||||
__put_page
|
||||
__put_task_struct
|
||||
queue_delayed_work_on
|
||||
queue_work_on
|
||||
_raw_read_lock
|
||||
_raw_read_unlock
|
||||
_raw_spin_lock
|
||||
_raw_spin_lock_bh
|
||||
_raw_spin_lock_irq
|
||||
@ -151,6 +147,7 @@
|
||||
schedule
|
||||
schedule_timeout
|
||||
schedule_timeout_uninterruptible
|
||||
scnprintf
|
||||
seq_printf
|
||||
sg_init_one
|
||||
sg_init_table
|
||||
@ -172,6 +169,7 @@
|
||||
strstr
|
||||
synchronize_irq
|
||||
synchronize_net
|
||||
synchronize_rcu
|
||||
system_wq
|
||||
trace_define_field
|
||||
trace_event_buffer_commit
|
||||
@ -193,54 +191,6 @@
|
||||
ww_mutex_lock_interruptible
|
||||
ww_mutex_unlock
|
||||
|
||||
# required by binfmt_misc.ko
|
||||
bin2hex
|
||||
bprm_change_interp
|
||||
clear_inode
|
||||
__close_fd
|
||||
copy_strings_kernel
|
||||
_ctype
|
||||
current_time
|
||||
d_drop
|
||||
default_llseek
|
||||
dentry_open
|
||||
d_instantiate
|
||||
down_write
|
||||
dput
|
||||
drop_nlink
|
||||
filp_close
|
||||
free_pages
|
||||
__get_free_pages
|
||||
get_next_ino
|
||||
get_tree_single
|
||||
iput
|
||||
kernel_read
|
||||
kill_litter_super
|
||||
kstrtoint
|
||||
lockref_get
|
||||
lookup_one_len
|
||||
new_inode
|
||||
open_exec
|
||||
prepare_binprm
|
||||
_raw_write_lock
|
||||
_raw_write_unlock
|
||||
__register_binfmt
|
||||
register_filesystem
|
||||
remove_arg_zero
|
||||
search_binary_handler
|
||||
simple_fill_super
|
||||
simple_pin_fs
|
||||
simple_read_from_buffer
|
||||
simple_release_fs
|
||||
simple_statfs
|
||||
strchr
|
||||
string_unescape
|
||||
strrchr
|
||||
unregister_binfmt
|
||||
unregister_filesystem
|
||||
up_write
|
||||
would_dump
|
||||
|
||||
# required by blk-mq-virtio.ko
|
||||
blk_mq_map_queues
|
||||
|
||||
@ -255,7 +205,6 @@
|
||||
ktime_get_ts64
|
||||
mod_timer
|
||||
platform_device_add_data
|
||||
scnprintf
|
||||
sg_miter_next
|
||||
sg_miter_start
|
||||
sg_miter_stop
|
||||
@ -289,7 +238,6 @@
|
||||
bus_find_device
|
||||
device_find_child
|
||||
device_match_name
|
||||
kstrdup
|
||||
platform_bus_type
|
||||
strsep
|
||||
|
||||
@ -347,6 +295,94 @@
|
||||
rtc_tm_to_time64
|
||||
rtc_update_irq
|
||||
|
||||
# required by sdcardfs.ko
|
||||
__break_lease
|
||||
call_rcu
|
||||
clear_inode
|
||||
clear_nlink
|
||||
configfs_register_subsystem
|
||||
configfs_unregister_subsystem
|
||||
config_group_init
|
||||
config_group_init_type_name
|
||||
config_item_init_type_name
|
||||
copy_fs_struct
|
||||
_ctype
|
||||
d_drop
|
||||
dentry_open
|
||||
dget_parent
|
||||
d_invalidate
|
||||
d_make_root
|
||||
down_write
|
||||
d_path
|
||||
dput
|
||||
d_rehash
|
||||
d_set_d_op
|
||||
d_splice_alias
|
||||
filemap_write_and_wait
|
||||
filp_close
|
||||
filp_open
|
||||
free_fs_struct
|
||||
fscrypt_register_key_removal_notifier
|
||||
fscrypt_unregister_key_removal_notifier
|
||||
fs_parse
|
||||
fsstack_copy_inode_size
|
||||
generic_delete_inode
|
||||
__generic_file_fsync
|
||||
generic_file_llseek
|
||||
generic_permission
|
||||
generic_read_dir
|
||||
iget5_locked
|
||||
igrab
|
||||
init_special_inode
|
||||
inode_init_once
|
||||
inode_newsize_ok
|
||||
iput
|
||||
iterate_dir
|
||||
kern_path
|
||||
kill_anon_super
|
||||
kstrtouint
|
||||
kstrtoull
|
||||
lockref_get
|
||||
lock_rename
|
||||
lookup_one_len_unlocked
|
||||
mntget
|
||||
names_cachep
|
||||
notify_change2
|
||||
override_creds
|
||||
path_get
|
||||
path_put
|
||||
prepare_creds
|
||||
___ratelimit
|
||||
register_filesystem
|
||||
revert_creds
|
||||
seq_puts
|
||||
setattr_prepare
|
||||
set_fs_pwd
|
||||
set_nlink
|
||||
shrink_dcache_sb
|
||||
strcasecmp
|
||||
strncasecmp
|
||||
strrchr
|
||||
touch_atime
|
||||
truncate_inode_pages
|
||||
truncate_setsize
|
||||
unlock_new_inode
|
||||
unlock_rename
|
||||
unregister_filesystem
|
||||
up_write
|
||||
vfs_create2
|
||||
vfs_fsync_range
|
||||
vfs_getattr
|
||||
vfs_get_super
|
||||
vfs_mkdir2
|
||||
vfs_path_lookup
|
||||
vfs_read
|
||||
vfs_rename2
|
||||
vfs_rmdir2
|
||||
vfs_statfs
|
||||
vfs_unlink2
|
||||
vfs_write
|
||||
|
||||
# required by snd-ac97-codec.ko
|
||||
pci_read_config_word
|
||||
simple_strtoul
|
||||
@ -369,7 +405,6 @@
|
||||
# required by snd-intel8x0.ko
|
||||
ktime_get
|
||||
param_ops_bint
|
||||
pci_iomap
|
||||
pci_release_regions
|
||||
pci_request_regions
|
||||
pci_write_config_dword
|
||||
@ -394,11 +429,17 @@
|
||||
snd_pcm_period_elapsed
|
||||
snd_pcm_set_ops
|
||||
|
||||
# required by test_meminit.ko
|
||||
kmem_cache_alloc_bulk
|
||||
kmem_cache_free_bulk
|
||||
vfree
|
||||
vmalloc
|
||||
|
||||
# required by ttm.ko
|
||||
clear_page
|
||||
copy_page
|
||||
devres_add
|
||||
__devres_alloc_node
|
||||
devres_alloc_node
|
||||
devres_destroy
|
||||
devres_free
|
||||
dma_fence_enable_sw_signaling
|
||||
@ -438,6 +479,9 @@
|
||||
__memset_io
|
||||
mutex_is_locked
|
||||
nr_swap_pages
|
||||
preempt_schedule
|
||||
_raw_read_lock
|
||||
_raw_read_unlock
|
||||
refcount_inc_not_zero_checked
|
||||
register_shrinker
|
||||
reservation_ww_class
|
||||
@ -563,13 +607,12 @@
|
||||
drm_release
|
||||
drm_set_preferred_mode
|
||||
drm_universal_plane_init
|
||||
fd_install
|
||||
__get_task_comm
|
||||
get_unused_fd_flags
|
||||
kmalloc_order_trace
|
||||
kmem_cache_alloc
|
||||
kmem_cache_create
|
||||
kmem_cache_destroy
|
||||
kmem_cache_free
|
||||
memdup_user
|
||||
noop_llseek
|
||||
put_unused_fd
|
||||
__sg_alloc_table_from_pages
|
||||
sg_free_table
|
||||
@ -639,23 +682,6 @@
|
||||
__sysfs_match_string
|
||||
unregister_blkdev
|
||||
|
||||
# required by virtio_crypto.ko
|
||||
cpu_bit_bitmap
|
||||
cpu_topology
|
||||
crypto_ablkcipher_type
|
||||
crypto_engine_alloc_init
|
||||
crypto_engine_exit
|
||||
crypto_engine_start
|
||||
crypto_finalize_ablkcipher_request
|
||||
crypto_register_alg
|
||||
crypto_transfer_ablkcipher_request_to_engine
|
||||
crypto_unregister_alg
|
||||
kzfree
|
||||
scatterwalk_map_and_copy
|
||||
sg_nents
|
||||
sg_nents_for_len
|
||||
try_module_get
|
||||
|
||||
# required by virtio_input.ko
|
||||
input_alloc_absinfo
|
||||
input_allocate_device
|
||||
@ -679,7 +705,6 @@
|
||||
|
||||
# required by virtio_net.ko
|
||||
arch_bpf_jit_check_func
|
||||
bcmp
|
||||
bpf_prog_add
|
||||
bpf_prog_put
|
||||
bpf_prog_sub
|
||||
@ -691,12 +716,15 @@
|
||||
__cpuhp_state_add_instance
|
||||
__cpuhp_state_remove_instance
|
||||
cpumask_next_wrap
|
||||
cpus_read_lock
|
||||
cpus_read_unlock
|
||||
eth_commit_mac_addr_change
|
||||
eth_prepare_mac_addr_change
|
||||
ethtool_op_get_ts_info
|
||||
eth_type_trans
|
||||
find_next_bit
|
||||
flow_keys_basic_dissector
|
||||
kmemdup
|
||||
__napi_alloc_skb
|
||||
napi_complete_done
|
||||
napi_consume_skb
|
||||
@ -727,7 +755,6 @@
|
||||
skb_to_sgvec
|
||||
skb_tstamp_tx
|
||||
softnet_data
|
||||
__this_cpu_preempt_check
|
||||
__tracepoint_xdp_exception
|
||||
xdp_convert_zc_to_xdp_frame
|
||||
xdp_do_flush_map
|
||||
@ -750,7 +777,9 @@
|
||||
pci_irq_get_affinity
|
||||
pci_irq_vector
|
||||
pci_read_config_byte
|
||||
pci_release_region
|
||||
pci_release_selected_regions
|
||||
pci_request_region
|
||||
pci_request_selected_regions
|
||||
|
||||
# required by virtio_pmem.ko
|
||||
@ -766,9 +795,6 @@
|
||||
physvirt_offset
|
||||
vabits_actual
|
||||
|
||||
# required by vmw_vsock_virtio_transport.ko
|
||||
synchronize_rcu
|
||||
|
||||
# required by vmw_vsock_virtio_transport_common.ko
|
||||
bpf_trace_run10
|
||||
bpf_trace_run8
|
||||
@ -786,7 +812,6 @@
|
||||
prepare_to_wait
|
||||
proto_register
|
||||
proto_unregister
|
||||
__put_cred
|
||||
_raw_write_lock_bh
|
||||
_raw_write_unlock_bh
|
||||
security_sock_graft
|
||||
|
@ -1,7 +1,6 @@
|
||||
[abi_whitelist]
|
||||
# commonly used symbols
|
||||
add_uevent_var
|
||||
alloc_chrdev_region
|
||||
__alloc_skb
|
||||
alloc_workqueue
|
||||
__arch_copy_from_user
|
||||
@ -15,25 +14,21 @@
|
||||
bt_info
|
||||
cancel_delayed_work_sync
|
||||
cancel_work_sync
|
||||
cdev_device_add
|
||||
cdev_device_del
|
||||
cdev_init
|
||||
__cfi_slowpath
|
||||
__check_object_size
|
||||
__class_register
|
||||
class_unregister
|
||||
clk_alpha_pll_regs
|
||||
clk_branch2_ops
|
||||
clk_bulk_disable
|
||||
clk_bulk_enable
|
||||
clk_bulk_prepare
|
||||
clk_bulk_unprepare
|
||||
clk_disable
|
||||
clk_enable
|
||||
clk_fixed_factor_ops
|
||||
clk_fixed_rate_ops
|
||||
clk_get_rate
|
||||
clk_hw_get_parent
|
||||
clk_hw_get_rate
|
||||
clk_prepare
|
||||
clk_put
|
||||
clk_rcg2_ops
|
||||
clk_round_rate
|
||||
clk_set_rate
|
||||
clk_sync_state
|
||||
@ -49,7 +44,7 @@
|
||||
cpu_number
|
||||
__cpu_online_mask
|
||||
crc32_le
|
||||
debug_smp_processor_id
|
||||
_ctype
|
||||
delayed_work_timer_fn
|
||||
del_timer
|
||||
del_timer_sync
|
||||
@ -58,7 +53,6 @@
|
||||
_dev_err
|
||||
dev_get_regmap
|
||||
device_create_file
|
||||
device_initialize
|
||||
device_init_wakeup
|
||||
device_property_present
|
||||
device_property_read_string
|
||||
@ -79,6 +73,7 @@
|
||||
devm_ioremap_resource
|
||||
devm_kfree
|
||||
devm_kmalloc
|
||||
devm_of_clk_add_hw_provider
|
||||
__devm_of_phy_provider_register
|
||||
devm_of_platform_populate
|
||||
devm_phy_create
|
||||
@ -92,13 +87,14 @@
|
||||
devm_reset_control_array_get
|
||||
__devm_reset_control_get
|
||||
devm_reset_controller_register
|
||||
devres_add
|
||||
__devres_alloc_node
|
||||
devres_free
|
||||
devm_watchdog_register_device
|
||||
dev_set_name
|
||||
_dev_warn
|
||||
disable_irq
|
||||
disable_irq_nosync
|
||||
divider_get_val
|
||||
divider_recalc_rate
|
||||
divider_round_rate_parent
|
||||
dma_alloc_attrs
|
||||
dma_direct_map_page
|
||||
dma_direct_map_sg
|
||||
@ -114,6 +110,7 @@
|
||||
dma_set_coherent_mask
|
||||
dma_set_mask
|
||||
do_SAK
|
||||
down_write
|
||||
driver_unregister
|
||||
drm_add_edid_modes
|
||||
drm_atomic_helper_connector_destroy_state
|
||||
@ -137,6 +134,7 @@
|
||||
extcon_unregister_notifier
|
||||
find_next_bit
|
||||
finish_wait
|
||||
fput
|
||||
free_irq
|
||||
generic_handle_irq
|
||||
generic_mii_ioctl
|
||||
@ -152,7 +150,6 @@
|
||||
__hci_cmd_sync
|
||||
hci_recv_frame
|
||||
hdmi_audio_infoframe_init
|
||||
hrtimer_cancel
|
||||
hrtimer_init
|
||||
hrtimer_start_range_ns
|
||||
i2c_add_adapter
|
||||
@ -172,6 +169,7 @@
|
||||
irq_set_chip_and_handler_name
|
||||
irq_set_chip_data
|
||||
irq_set_irq_wake
|
||||
irq_to_desc
|
||||
jiffies
|
||||
kfree
|
||||
kfree_skb
|
||||
@ -181,18 +179,15 @@
|
||||
kmem_cache_alloc_trace
|
||||
kmemdup
|
||||
kstrdup
|
||||
kthread_destroy_worker
|
||||
kthread_queue_work
|
||||
kstrtouint
|
||||
ktime_get
|
||||
ktime_get_mono_fast_ns
|
||||
memcpy
|
||||
memset
|
||||
mii_ethtool_gset
|
||||
mii_nway_restart
|
||||
misc_deregister
|
||||
misc_register
|
||||
mod_timer
|
||||
module_put
|
||||
module_layout
|
||||
__msecs_to_jiffies
|
||||
msleep
|
||||
msm_pinctrl_probe
|
||||
@ -241,7 +236,6 @@
|
||||
pci_set_mwi
|
||||
pci_unregister_driver
|
||||
pci_write_config_byte
|
||||
__per_cpu_offset
|
||||
perf_trace_buf_alloc
|
||||
perf_trace_run_bpf_submit
|
||||
phy_exit
|
||||
@ -279,14 +273,12 @@
|
||||
__pm_runtime_set_status
|
||||
__pm_runtime_suspend
|
||||
__pm_runtime_use_autosuspend
|
||||
preempt_count_sub
|
||||
preempt_schedule
|
||||
preempt_schedule_notrace
|
||||
prepare_to_wait_event
|
||||
printk
|
||||
put_device
|
||||
qcom_cc_map
|
||||
qcom_cc_really_probe
|
||||
__put_task_struct
|
||||
qcom_scm_is_available
|
||||
queue_delayed_work_on
|
||||
queue_work_on
|
||||
@ -320,7 +312,7 @@
|
||||
request_threaded_irq
|
||||
reset_control_assert
|
||||
reset_control_deassert
|
||||
sched_setscheduler
|
||||
rpmh_write_async
|
||||
schedule_timeout
|
||||
schedule_timeout_uninterruptible
|
||||
scnprintf
|
||||
@ -360,7 +352,6 @@
|
||||
trace_handle_return
|
||||
trace_raw_output_prep
|
||||
trace_seq_printf
|
||||
try_module_get
|
||||
tty_flip_buffer_push
|
||||
__tty_insert_flip_char
|
||||
tty_termios_encode_baud_rate
|
||||
@ -373,8 +364,8 @@
|
||||
uart_unregister_driver
|
||||
uart_update_timeout
|
||||
uart_write_wakeup
|
||||
unregister_chrdev_region
|
||||
unregister_reboot_notifier
|
||||
up_write
|
||||
usb_add_hcd
|
||||
usb_amd_dev_put
|
||||
usb_amd_quirk_pll_check
|
||||
@ -432,6 +423,7 @@
|
||||
wait_for_completion_timeout
|
||||
__wake_up
|
||||
__warn_printk
|
||||
watchdog_init_timeout
|
||||
|
||||
# required by asix.ko
|
||||
eth_mac_addr
|
||||
@ -475,20 +467,33 @@
|
||||
__hci_cmd_send
|
||||
__hci_cmd_sync_ev
|
||||
|
||||
# required by clk-qcom.ko
|
||||
__clk_determine_rate
|
||||
__clk_get_name
|
||||
clk_hw_get_flags
|
||||
clk_hw_get_name
|
||||
clk_hw_get_num_parents
|
||||
clk_hw_get_parent_by_index
|
||||
clk_hw_round_rate
|
||||
__clk_is_enabled
|
||||
__clk_mux_determine_rate_closest
|
||||
divider_ro_round_rate_parent
|
||||
of_find_node_opts_by_path
|
||||
of_genpd_add_provider_onecell
|
||||
of_genpd_del_provider
|
||||
of_prop_next_u32
|
||||
pm_genpd_add_subdomain
|
||||
pm_genpd_init
|
||||
pm_genpd_remove_subdomain
|
||||
|
||||
# required by clk-rpmh.ko
|
||||
clk_hw_is_prepared
|
||||
|
||||
# required by clk-scmi.ko
|
||||
clk_hw_set_rate_range
|
||||
devm_of_clk_add_hw_provider
|
||||
scmi_driver_register
|
||||
scmi_driver_unregister
|
||||
|
||||
# required by dispcc-sdm845.ko
|
||||
clk_alpha_pll_fabia_ops
|
||||
clk_byte2_ops
|
||||
clk_fabia_pll_configure
|
||||
clk_pixel_ops
|
||||
clk_rcg2_shared_ops
|
||||
clk_regmap_div_ops
|
||||
|
||||
# required by dwc3-qcom.ko
|
||||
devm_extcon_register_notifier
|
||||
of_clk_get_parent_count
|
||||
@ -516,11 +521,9 @@
|
||||
|
||||
# required by ehci-hcd.ko
|
||||
device_remove_file
|
||||
down_write
|
||||
ehci_cf_port_reset_rwsem
|
||||
kstrtouint
|
||||
hrtimer_cancel
|
||||
ktime_get_with_offset
|
||||
up_write
|
||||
usb_for_each_dev
|
||||
|
||||
# required by ehci-pci.ko
|
||||
@ -541,12 +544,6 @@
|
||||
gpiod_to_irq
|
||||
system_power_efficient_wq
|
||||
|
||||
# required by gcc-msm8998.ko
|
||||
clk_alpha_pll_ops
|
||||
clk_alpha_pll_postdiv_ops
|
||||
clk_fixed_factor_ops
|
||||
clk_rcg2_floor_ops
|
||||
|
||||
# required by hci_uart.ko
|
||||
bit_wait_timeout
|
||||
hci_alloc_dev
|
||||
@ -563,7 +560,6 @@
|
||||
__percpu_init_rwsem
|
||||
__percpu_up_read
|
||||
percpu_up_write
|
||||
preempt_count_add
|
||||
serdev_device_close
|
||||
__serdev_device_driver_register
|
||||
serdev_device_open
|
||||
@ -573,7 +569,6 @@
|
||||
serdev_device_wait_until_sent
|
||||
serdev_device_write_buf
|
||||
serdev_device_write_flush
|
||||
__this_cpu_preempt_check
|
||||
tty_driver_flush_buffer
|
||||
tty_ldisc_flush
|
||||
tty_register_ldisc
|
||||
@ -612,7 +607,6 @@
|
||||
request_firmware_into_buf
|
||||
|
||||
# required by msm.ko
|
||||
__alloc_pages_nodemask
|
||||
__bitmap_andnot
|
||||
__bitmap_weight
|
||||
bpf_trace_run5
|
||||
@ -620,8 +614,6 @@
|
||||
bpf_trace_run8
|
||||
clk_get
|
||||
clk_get_parent
|
||||
clk_hw_get_parent
|
||||
clk_hw_get_rate
|
||||
clk_hw_register
|
||||
clk_hw_register_divider
|
||||
clk_hw_register_fixed_factor
|
||||
@ -638,7 +630,6 @@
|
||||
component_master_add_with_match
|
||||
component_master_del
|
||||
component_unbind_all
|
||||
_ctype
|
||||
devfreq_recommended_opp
|
||||
devfreq_resume_device
|
||||
devfreq_suspend_device
|
||||
@ -661,9 +652,6 @@
|
||||
dev_pm_opp_of_add_table
|
||||
dev_pm_opp_put
|
||||
dev_pm_opp_set_supported_hw
|
||||
divider_get_val
|
||||
divider_recalc_rate
|
||||
divider_round_rate_parent
|
||||
dma_buf_vunmap
|
||||
dma_fence_context_alloc
|
||||
dma_fence_init
|
||||
@ -834,8 +822,6 @@
|
||||
fd_install
|
||||
find_next_zero_bit
|
||||
flush_workqueue
|
||||
fput
|
||||
__free_pages
|
||||
get_pid_task
|
||||
get_unused_fd_flags
|
||||
gpiod_direction_input
|
||||
@ -853,17 +839,17 @@
|
||||
iommu_detach_device
|
||||
iommu_domain_alloc
|
||||
iommu_domain_free
|
||||
iommu_map
|
||||
iommu_map_sg
|
||||
iommu_present
|
||||
iommu_set_fault_handler
|
||||
iommu_unmap
|
||||
irq_domain_xlate_onecell
|
||||
irq_to_desc
|
||||
kasprintf
|
||||
kstrdup_quotable_cmdline
|
||||
kthread_create_on_node
|
||||
kthread_destroy_worker
|
||||
__kthread_init_worker
|
||||
kthread_queue_work
|
||||
kthread_worker_fn
|
||||
ktime_get_real_ts64
|
||||
kvfree
|
||||
@ -899,7 +885,6 @@
|
||||
param_ops_charp
|
||||
platform_bus_type
|
||||
put_pid
|
||||
__put_task_struct
|
||||
put_unused_fd
|
||||
qcom_scm_hdcp_available
|
||||
qcom_scm_hdcp_req
|
||||
@ -916,6 +901,7 @@
|
||||
request_firmware_direct
|
||||
reservation_ww_class
|
||||
round_jiffies_up
|
||||
sched_setscheduler
|
||||
sg_free_table
|
||||
shmem_truncate_range
|
||||
strncpy
|
||||
@ -957,7 +943,6 @@
|
||||
usb_amd_prefetch_quirk
|
||||
|
||||
# required by phy-qcom-qmp.ko
|
||||
clk_fixed_rate_ops
|
||||
of_clk_get_by_name
|
||||
of_clk_hw_simple_get
|
||||
of_iomap
|
||||
@ -999,11 +984,13 @@
|
||||
of_node_name_eq
|
||||
regulator_list_voltage_linear_range
|
||||
rpmh_write
|
||||
rpmh_write_async
|
||||
|
||||
# required by qcom-spmi-pmic.ko
|
||||
__spmi_driver_register
|
||||
|
||||
# required by qcom-wdt.ko
|
||||
platform_get_irq_optional
|
||||
|
||||
# required by qcom_geni_serial.ko
|
||||
console_stop
|
||||
devm_platform_ioremap_resource
|
||||
@ -1045,6 +1032,8 @@
|
||||
|
||||
# required by qrtr-tun.ko
|
||||
_copy_to_iter
|
||||
misc_deregister
|
||||
misc_register
|
||||
schedule
|
||||
|
||||
# required by qrtr.ko
|
||||
@ -1088,6 +1077,9 @@
|
||||
sock_unregister
|
||||
|
||||
# required by reboot-mode.ko
|
||||
devres_add
|
||||
devres_alloc_node
|
||||
devres_free
|
||||
devres_release
|
||||
kfree_const
|
||||
kstrdup_const
|
||||
@ -1104,11 +1096,19 @@
|
||||
spmi_register_zero_write
|
||||
|
||||
# required by rmtfs_mem.ko
|
||||
alloc_chrdev_region
|
||||
cdev_device_add
|
||||
cdev_device_del
|
||||
cdev_init
|
||||
__class_register
|
||||
class_unregister
|
||||
default_llseek
|
||||
device_initialize
|
||||
devm_memremap
|
||||
of_reserved_mem_lookup
|
||||
qcom_scm_assign_mem
|
||||
remap_pfn_range
|
||||
unregister_chrdev_region
|
||||
|
||||
# required by roles.ko
|
||||
__class_create
|
||||
@ -1122,7 +1122,9 @@
|
||||
fwnode_get_parent
|
||||
fwnode_property_present
|
||||
kstrtobool
|
||||
module_put
|
||||
__sysfs_match_string
|
||||
try_module_get
|
||||
|
||||
# required by rtc-pm8xxx.ko
|
||||
devm_request_any_context_irq
|
||||
@ -1132,6 +1134,96 @@
|
||||
rtc_update_irq
|
||||
rtc_valid_tm
|
||||
|
||||
# required by sdcardfs.ko
|
||||
__break_lease
|
||||
call_rcu
|
||||
clear_inode
|
||||
clear_nlink
|
||||
configfs_register_subsystem
|
||||
configfs_unregister_subsystem
|
||||
config_group_init
|
||||
config_group_init_type_name
|
||||
config_item_init_type_name
|
||||
copy_fs_struct
|
||||
d_drop
|
||||
dentry_open
|
||||
dget_parent
|
||||
d_invalidate
|
||||
d_make_root
|
||||
d_path
|
||||
dput
|
||||
d_rehash
|
||||
d_set_d_op
|
||||
d_splice_alias
|
||||
filemap_write_and_wait
|
||||
filp_close
|
||||
filp_open
|
||||
free_fs_struct
|
||||
fscrypt_register_key_removal_notifier
|
||||
fscrypt_unregister_key_removal_notifier
|
||||
fs_parse
|
||||
fsstack_copy_inode_size
|
||||
generic_delete_inode
|
||||
__generic_file_fsync
|
||||
generic_file_llseek
|
||||
generic_permission
|
||||
generic_read_dir
|
||||
iget5_locked
|
||||
igrab
|
||||
init_special_inode
|
||||
inode_init_once
|
||||
inode_newsize_ok
|
||||
iput
|
||||
iterate_dir
|
||||
kern_path
|
||||
kill_anon_super
|
||||
kmem_cache_alloc
|
||||
kmem_cache_create
|
||||
kmem_cache_destroy
|
||||
kmem_cache_free
|
||||
kstrtoull
|
||||
lockref_get
|
||||
lock_rename
|
||||
lookup_one_len_unlocked
|
||||
mntget
|
||||
names_cachep
|
||||
notify_change2
|
||||
override_creds
|
||||
path_get
|
||||
path_put
|
||||
prepare_creds
|
||||
__put_cred
|
||||
__rcu_read_lock
|
||||
__rcu_read_unlock
|
||||
register_filesystem
|
||||
revert_creds
|
||||
setattr_prepare
|
||||
set_fs_pwd
|
||||
set_nlink
|
||||
shrink_dcache_sb
|
||||
strcasecmp
|
||||
strncasecmp
|
||||
strrchr
|
||||
synchronize_rcu
|
||||
touch_atime
|
||||
truncate_inode_pages
|
||||
truncate_setsize
|
||||
unlock_new_inode
|
||||
unlock_rename
|
||||
unregister_filesystem
|
||||
vfs_create2
|
||||
vfs_fsync_range
|
||||
vfs_getattr
|
||||
vfs_get_super
|
||||
vfs_mkdir2
|
||||
vfs_path_lookup
|
||||
vfs_read
|
||||
vfs_rename2
|
||||
vfs_rmdir2
|
||||
vfs_statfs
|
||||
vfs_unlink2
|
||||
vfs_write
|
||||
|
||||
# required by sdhci-msm.ko
|
||||
mmc_of_parse
|
||||
mmc_send_tuning
|
||||
@ -1207,18 +1299,6 @@
|
||||
of_device_uevent_modalias
|
||||
__request_module
|
||||
|
||||
# required by watchdog.ko
|
||||
devm_register_reboot_notifier
|
||||
ida_alloc_range
|
||||
ida_destroy
|
||||
ida_free
|
||||
kthread_cancel_work_sync
|
||||
kthread_create_worker
|
||||
__module_get
|
||||
register_restart_handler
|
||||
stream_open
|
||||
unregister_restart_handler
|
||||
|
||||
# required by xhci-hcd.ko
|
||||
add_timer
|
||||
cancel_delayed_work
|
||||
|
@ -495,6 +495,7 @@
|
||||
dev_remove_pack
|
||||
devres_add
|
||||
__devres_alloc_node
|
||||
devres_alloc_node
|
||||
devres_destroy
|
||||
devres_free
|
||||
devres_release
|
||||
@ -937,6 +938,20 @@
|
||||
get_cpu_device
|
||||
get_device
|
||||
__get_free_pages
|
||||
gether_cleanup
|
||||
gether_connect
|
||||
gether_disconnect
|
||||
gether_get_dev_addr
|
||||
gether_get_host_addr
|
||||
gether_get_host_addr_cdc
|
||||
gether_get_ifname
|
||||
gether_get_qmult
|
||||
gether_register_netdev
|
||||
gether_set_dev_addr
|
||||
gether_set_gadget
|
||||
gether_set_host_addr
|
||||
gether_set_qmult
|
||||
gether_setup_name_default
|
||||
get_next_ino
|
||||
get_option
|
||||
get_random_bytes
|
||||
@ -1892,6 +1907,17 @@
|
||||
rfkill_init_sw_state
|
||||
rfkill_register
|
||||
rfkill_unregister
|
||||
rndis_deregister
|
||||
rndis_free_response
|
||||
rndis_get_next_response
|
||||
rndis_msg_parser
|
||||
rndis_register
|
||||
rndis_set_host_mac
|
||||
rndis_set_param_dev
|
||||
rndis_set_param_medium
|
||||
rndis_set_param_vendor
|
||||
rndis_signal_connect
|
||||
rndis_uninit
|
||||
round_jiffies
|
||||
rpmh_flush
|
||||
rpmh_invalidate
|
||||
@ -2322,6 +2348,19 @@
|
||||
tty_flip_buffer_push
|
||||
__tty_insert_flip_char
|
||||
tty_insert_flip_string_fixed_flag
|
||||
typec_altmode_get_partner
|
||||
typec_altmode_update_active
|
||||
typec_get_drvdata
|
||||
typec_partner_register_altmode
|
||||
typec_port_register_altmode
|
||||
typec_register_partner
|
||||
typec_register_port
|
||||
typec_set_data_role
|
||||
typec_set_pwr_opmode
|
||||
typec_set_pwr_role
|
||||
typec_unregister_altmode
|
||||
typec_unregister_partner
|
||||
typec_unregister_port
|
||||
uart_add_one_port
|
||||
uart_console_device
|
||||
uart_console_write
|
||||
|
@ -92,8 +92,10 @@
|
||||
devm_backlight_device_register
|
||||
devm_clk_get
|
||||
devm_free_irq
|
||||
devm_gpiochip_add_data
|
||||
devm_gpiod_get
|
||||
devm_gpio_request
|
||||
devm_hwspin_lock_request_specific
|
||||
__devm_iio_device_register
|
||||
devm_ioremap_nocache
|
||||
devm_ioremap_resource
|
||||
@ -101,6 +103,7 @@
|
||||
devm_kmalloc
|
||||
devm_kmemdup
|
||||
devm_mfd_add_devices
|
||||
devm_nvmem_register
|
||||
devm_pinctrl_get
|
||||
devm_power_supply_register
|
||||
__devm_regmap_init
|
||||
@ -109,6 +112,7 @@
|
||||
devm_regulator_get
|
||||
devm_regulator_register
|
||||
devm_request_threaded_irq
|
||||
devm_spi_register_controller
|
||||
dev_queue_xmit
|
||||
dev_set_name
|
||||
_dev_warn
|
||||
@ -162,6 +166,7 @@
|
||||
fwnode_property_present
|
||||
fwnode_property_read_string
|
||||
generic_file_llseek
|
||||
generic_handle_irq
|
||||
genl_register_family
|
||||
genl_unregister_family
|
||||
gen_pool_add_owner
|
||||
@ -170,6 +175,7 @@
|
||||
gen_pool_free_owner
|
||||
__get_free_pages
|
||||
get_random_bytes
|
||||
gpiochip_get_data
|
||||
gpiod_direction_input
|
||||
gpiod_direction_output_raw
|
||||
gpiod_get_raw_value
|
||||
@ -178,6 +184,9 @@
|
||||
gpio_free
|
||||
gpio_request
|
||||
gpio_to_desc
|
||||
handle_bad_irq
|
||||
handle_edge_irq
|
||||
handle_level_irq
|
||||
i2c_del_driver
|
||||
i2c_register_driver
|
||||
i2c_smbus_read_byte_data
|
||||
@ -202,6 +211,7 @@
|
||||
__ioremap
|
||||
iounmap
|
||||
ip_route_output_flow
|
||||
irq_find_mapping
|
||||
irq_get_irq_data
|
||||
irq_modify_status
|
||||
irq_of_parse_and_map
|
||||
@ -330,6 +340,8 @@
|
||||
pm_runtime_allow
|
||||
__pm_runtime_disable
|
||||
pm_runtime_enable
|
||||
pm_runtime_force_resume
|
||||
pm_runtime_force_suspend
|
||||
pm_runtime_forbid
|
||||
__pm_runtime_idle
|
||||
__pm_runtime_resume
|
||||
@ -449,6 +461,7 @@
|
||||
snd_soc_register_component
|
||||
snd_soc_unregister_component
|
||||
snprintf
|
||||
__spi_alloc_controller
|
||||
sprintf
|
||||
sscanf
|
||||
__stack_chk_fail
|
||||
@ -586,6 +599,7 @@
|
||||
# required by clk-sprd.ko
|
||||
clk_hw_get_num_parents
|
||||
clk_hw_get_parent
|
||||
clk_hw_is_enabled
|
||||
__clk_mux_determine_rate
|
||||
devm_clk_hw_register
|
||||
devm_of_clk_add_hw_provider
|
||||
@ -650,6 +664,15 @@
|
||||
of_property_read_variable_u8_array
|
||||
request_firmware_nowait
|
||||
|
||||
# required by gpio-eic-sprd.ko
|
||||
gpiochip_find
|
||||
|
||||
# required by gpio-pmic-eic-sprd.ko
|
||||
handle_nested_irq
|
||||
|
||||
# required by gpio-sprd.ko
|
||||
__platform_driver_probe
|
||||
|
||||
# required by hid-generic.ko
|
||||
bus_for_each_drv
|
||||
hid_bus_type
|
||||
@ -659,6 +682,10 @@
|
||||
__hid_register_driver
|
||||
hid_unregister_driver
|
||||
|
||||
# required by i2c-sprd.ko
|
||||
i2c_add_numbered_adapter
|
||||
i2c_del_adapter
|
||||
|
||||
# required by ims_bridge.ko
|
||||
in4_pton
|
||||
in6_pton
|
||||
@ -684,6 +711,9 @@
|
||||
strim
|
||||
xfrm_lookup
|
||||
|
||||
# required by leds-sc27xx-bltc.ko
|
||||
devm_led_classdev_register_ext
|
||||
|
||||
# required by microarray_fp.ko
|
||||
cdev_alloc
|
||||
|
||||
@ -831,10 +861,22 @@
|
||||
vsscanf
|
||||
vzalloc
|
||||
|
||||
# required by pwm-sprd.ko
|
||||
pwmchip_add
|
||||
pwmchip_remove
|
||||
|
||||
# required by roles.ko
|
||||
fwnode_connection_find_match
|
||||
fwnode_get_parent
|
||||
|
||||
# required by rtc-sc27xx.ko
|
||||
devm_rtc_allocate_device
|
||||
rtc_ktime_to_tm
|
||||
__rtc_register_device
|
||||
rtc_time64_to_tm
|
||||
rtc_tm_to_time64
|
||||
rtc_update_irq
|
||||
|
||||
# required by sc2703-bl.ko
|
||||
of_pwm_get
|
||||
pwm_apply_state
|
||||
@ -866,9 +908,106 @@
|
||||
devm_extcon_register_notifier_all
|
||||
devm_regulator_get_optional
|
||||
|
||||
# required by sc27xx-vibra.ko
|
||||
input_ff_create_memless
|
||||
|
||||
# required by sc9863a-clk.ko
|
||||
device_get_match_data
|
||||
|
||||
# required by sdcardfs.ko
|
||||
__break_lease
|
||||
clear_inode
|
||||
clear_nlink
|
||||
configfs_register_subsystem
|
||||
configfs_unregister_subsystem
|
||||
config_group_init
|
||||
config_group_init_type_name
|
||||
config_item_init_type_name
|
||||
copy_fs_struct
|
||||
d_drop
|
||||
dentry_open
|
||||
dget_parent
|
||||
d_invalidate
|
||||
d_make_root
|
||||
d_path
|
||||
dput
|
||||
d_rehash
|
||||
d_set_d_op
|
||||
d_splice_alias
|
||||
filemap_write_and_wait
|
||||
filp_close
|
||||
filp_open
|
||||
free_fs_struct
|
||||
fscrypt_register_key_removal_notifier
|
||||
fscrypt_unregister_key_removal_notifier
|
||||
fs_parse
|
||||
fsstack_copy_inode_size
|
||||
generic_delete_inode
|
||||
__generic_file_fsync
|
||||
generic_permission
|
||||
generic_read_dir
|
||||
iget5_locked
|
||||
igrab
|
||||
init_special_inode
|
||||
inode_init_once
|
||||
inode_newsize_ok
|
||||
iput
|
||||
iterate_dir
|
||||
kern_path
|
||||
kill_anon_super
|
||||
lockref_get
|
||||
lock_rename
|
||||
lookup_one_len_unlocked
|
||||
mntget
|
||||
names_cachep
|
||||
notify_change2
|
||||
override_creds
|
||||
path_get
|
||||
path_put
|
||||
prepare_creds
|
||||
__put_cred
|
||||
register_filesystem
|
||||
revert_creds
|
||||
setattr_prepare
|
||||
set_fs_pwd
|
||||
set_nlink
|
||||
shrink_dcache_sb
|
||||
strrchr
|
||||
touch_atime
|
||||
truncate_inode_pages
|
||||
truncate_setsize
|
||||
unlock_new_inode
|
||||
unlock_rename
|
||||
unregister_filesystem
|
||||
vfs_create2
|
||||
vfs_fsync_range
|
||||
vfs_get_super
|
||||
vfs_mkdir2
|
||||
vfs_path_lookup
|
||||
vfs_rename2
|
||||
vfs_rmdir2
|
||||
vfs_statfs
|
||||
vfs_unlink2
|
||||
|
||||
# required by sdhci-sprd.ko
|
||||
clk_round_rate
|
||||
mmc_free_host
|
||||
mmc_of_parse
|
||||
mmc_regulator_set_vqmmc
|
||||
mmc_remove_host
|
||||
__sdhci_add_host
|
||||
sdhci_cleanup_host
|
||||
sdhci_enable_clk
|
||||
sdhci_enable_v4_mode
|
||||
sdhci_pltfm_free
|
||||
sdhci_pltfm_init
|
||||
sdhci_request
|
||||
sdhci_reset
|
||||
sdhci_runtime_resume_host
|
||||
sdhci_runtime_suspend_host
|
||||
sdhci_set_bus_width
|
||||
sdhci_setup_host
|
||||
|
||||
# required by sdiohal.ko
|
||||
mmc_detect_change
|
||||
mmc_set_data_timeout
|
||||
@ -1014,6 +1153,13 @@
|
||||
snd_soc_jack_report
|
||||
snd_soc_put_enum_double
|
||||
|
||||
# required by snd-soc-sprd-platform.ko
|
||||
devm_snd_soc_register_component
|
||||
dma_request_slave_channel
|
||||
of_reserved_mem_device_init_by_idx
|
||||
snd_dma_alloc_pages
|
||||
snd_dma_free_pages
|
||||
|
||||
# required by snd-soc-sprd-vbc-r1p0v3.ko
|
||||
snd_ctl_boolean_mono_info
|
||||
snd_pcm_hw_constraint_list
|
||||
@ -1149,6 +1295,26 @@
|
||||
try_wait_for_completion
|
||||
vfs_write
|
||||
|
||||
# required by spi-sprd.ko
|
||||
dma_request_chan
|
||||
spi_controller_suspend
|
||||
spi_finalize_current_transfer
|
||||
|
||||
# required by spi-sprd-adi.ko
|
||||
unregister_restart_handler
|
||||
|
||||
# required by sprd-dma.ko
|
||||
dma_async_device_register
|
||||
dma_async_device_unregister
|
||||
dma_async_tx_descriptor_init
|
||||
of_dma_controller_free
|
||||
of_dma_controller_register
|
||||
of_dma_simple_xlate
|
||||
|
||||
# required by sprd_hwspinlock.ko
|
||||
hwspin_lock_register
|
||||
hwspin_lock_unregister
|
||||
|
||||
# required by sprd-saudio.ko
|
||||
snd_card_free
|
||||
|
||||
@ -1186,6 +1352,10 @@
|
||||
# required by sprd_sdio_fm.ko
|
||||
vfs_llseek
|
||||
|
||||
# required by sprd_wdt.ko
|
||||
devm_watchdog_register_device
|
||||
watchdog_init_timeout
|
||||
|
||||
# required by sprdbt_sipc_tty.ko
|
||||
tty_schedule_flip
|
||||
|
||||
|
@ -29,6 +29,8 @@
|
||||
.endm
|
||||
|
||||
#define ASM_NL ` /* use '`' to mark new line in macro */
|
||||
#define __ALIGN .align 4
|
||||
#define __ALIGN_STR __stringify(__ALIGN)
|
||||
|
||||
/* annotation for data we want in DCCM - if enabled in .config */
|
||||
.macro ARCFP_DATA nm
|
||||
|
@ -526,11 +526,11 @@
|
||||
* Supply voltage supervisor on board will not allow opp50 so
|
||||
* disable it and set opp100 as suspend OPP.
|
||||
*/
|
||||
opp50@300000000 {
|
||||
opp50-300000000 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
opp100@600000000 {
|
||||
opp100-600000000 {
|
||||
opp-suspend;
|
||||
};
|
||||
};
|
||||
|
@ -86,3 +86,8 @@
|
||||
&usb4_tm {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&mmc3 {
|
||||
/* dra76x is not affected by i887 */
|
||||
max-frequency = <96000000>;
|
||||
};
|
||||
|
@ -796,16 +796,6 @@
|
||||
clock-div = <1>;
|
||||
};
|
||||
|
||||
ipu1_gfclk_mux: ipu1_gfclk_mux@520 {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,mux-clock";
|
||||
clocks = <&dpll_abe_m2x2_ck>, <&dpll_core_h22x2_ck>;
|
||||
ti,bit-shift = <24>;
|
||||
reg = <0x0520>;
|
||||
assigned-clocks = <&ipu1_gfclk_mux>;
|
||||
assigned-clock-parents = <&dpll_core_h22x2_ck>;
|
||||
};
|
||||
|
||||
dummy_ck: dummy_ck {
|
||||
#clock-cells = <0>;
|
||||
compatible = "fixed-clock";
|
||||
@ -1564,6 +1554,8 @@
|
||||
compatible = "ti,clkctrl";
|
||||
reg = <0x20 0x4>;
|
||||
#clock-cells = <2>;
|
||||
assigned-clocks = <&ipu1_clkctrl DRA7_IPU1_MMU_IPU1_CLKCTRL 24>;
|
||||
assigned-clock-parents = <&dpll_core_h22x2_ck>;
|
||||
};
|
||||
|
||||
ipu_clkctrl: ipu-clkctrl@50 {
|
||||
|
@ -183,7 +183,6 @@
|
||||
pinctrl-0 = <&pinctrl_usdhc4>;
|
||||
bus-width = <8>;
|
||||
non-removable;
|
||||
vmmc-supply = <&vdd_emmc_1p8>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -337,7 +337,6 @@
|
||||
assigned-clock-rates = <400000000>;
|
||||
bus-width = <8>;
|
||||
fsl,tuning-step = <2>;
|
||||
max-frequency = <100000000>;
|
||||
vmmc-supply = <®_module_3v3>;
|
||||
vqmmc-supply = <®_DCDC3>;
|
||||
non-removable;
|
||||
|
@ -728,7 +728,7 @@
|
||||
};
|
||||
|
||||
mdio0: mdio@2d24000 {
|
||||
compatible = "fsl,etsec2-mdio";
|
||||
compatible = "gianfar";
|
||||
device_type = "mdio";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
@ -737,7 +737,7 @@
|
||||
};
|
||||
|
||||
mdio1: mdio@2d64000 {
|
||||
compatible = "fsl,etsec2-mdio";
|
||||
compatible = "gianfar";
|
||||
device_type = "mdio";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
@ -91,6 +91,8 @@ AFLAGS_suspend-imx6.o :=-Wa,-march=armv7-a
|
||||
obj-$(CONFIG_SOC_IMX6) += suspend-imx6.o
|
||||
obj-$(CONFIG_SOC_IMX53) += suspend-imx53.o
|
||||
endif
|
||||
AFLAGS_resume-imx6.o :=-Wa,-march=armv7-a
|
||||
obj-$(CONFIG_SOC_IMX6) += resume-imx6.o
|
||||
obj-$(CONFIG_SOC_IMX6) += pm-imx6.o
|
||||
|
||||
obj-$(CONFIG_SOC_IMX1) += mach-imx1.o
|
||||
|
@ -109,17 +109,17 @@ void imx_cpu_die(unsigned int cpu);
|
||||
int imx_cpu_kill(unsigned int cpu);
|
||||
|
||||
#ifdef CONFIG_SUSPEND
|
||||
void v7_cpu_resume(void);
|
||||
void imx53_suspend(void __iomem *ocram_vbase);
|
||||
extern const u32 imx53_suspend_sz;
|
||||
void imx6_suspend(void __iomem *ocram_vbase);
|
||||
#else
|
||||
static inline void v7_cpu_resume(void) {}
|
||||
static inline void imx53_suspend(void __iomem *ocram_vbase) {}
|
||||
static const u32 imx53_suspend_sz;
|
||||
static inline void imx6_suspend(void __iomem *ocram_vbase) {}
|
||||
#endif
|
||||
|
||||
void v7_cpu_resume(void);
|
||||
|
||||
void imx6_pm_ccm_init(const char *ccm_compat);
|
||||
void imx6q_pm_init(void);
|
||||
void imx6dl_pm_init(void);
|
||||
|
24
arch/arm/mach-imx/resume-imx6.S
Normal file
24
arch/arm/mach-imx/resume-imx6.S
Normal file
@ -0,0 +1,24 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
/*
|
||||
* Copyright 2014 Freescale Semiconductor, Inc.
|
||||
*/
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/hardware/cache-l2x0.h>
|
||||
#include "hardware.h"
|
||||
|
||||
/*
|
||||
* The following code must assume it is running from physical address
|
||||
* where absolute virtual addresses to the data section have to be
|
||||
* turned into relative ones.
|
||||
*/
|
||||
|
||||
ENTRY(v7_cpu_resume)
|
||||
bl v7_invalidate_l1
|
||||
#ifdef CONFIG_CACHE_L2X0
|
||||
bl l2c310_early_resume
|
||||
#endif
|
||||
b cpu_resume
|
||||
ENDPROC(v7_cpu_resume)
|
@ -327,17 +327,3 @@ resume:
|
||||
|
||||
ret lr
|
||||
ENDPROC(imx6_suspend)
|
||||
|
||||
/*
|
||||
* The following code must assume it is running from physical address
|
||||
* where absolute virtual addresses to the data section have to be
|
||||
* turned into relative ones.
|
||||
*/
|
||||
|
||||
ENTRY(v7_cpu_resume)
|
||||
bl v7_invalidate_l1
|
||||
#ifdef CONFIG_CACHE_L2X0
|
||||
bl l2c310_early_resume
|
||||
#endif
|
||||
b cpu_resume
|
||||
ENDPROC(v7_cpu_resume)
|
||||
|
@ -327,7 +327,7 @@
|
||||
#size-cells = <0>;
|
||||
|
||||
bus-width = <4>;
|
||||
max-frequency = <50000000>;
|
||||
max-frequency = <60000000>;
|
||||
|
||||
non-removable;
|
||||
disable-wp;
|
||||
|
@ -363,6 +363,7 @@
|
||||
compatible = "brcm,bcm43438-bt";
|
||||
interrupt-parent = <&gpio_intc>;
|
||||
interrupts = <95 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "host-wakeup";
|
||||
shutdown-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>;
|
||||
max-speed = <2000000>;
|
||||
clocks = <&wifi32k>;
|
||||
|
@ -52,11 +52,6 @@
|
||||
compatible = "ethernet-phy-ieee802.3-c22";
|
||||
reg = <0>;
|
||||
};
|
||||
|
||||
ethphy1: ethernet-phy@1 {
|
||||
compatible = "ethernet-phy-ieee802.3-c22";
|
||||
reg = <1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -82,7 +82,7 @@
|
||||
ranges = <0 0 0 0xffffffff>;
|
||||
|
||||
gmac0: ethernet@ff800000 {
|
||||
compatible = "altr,socfpga-stmmac", "snps,dwmac-3.74a", "snps,dwmac";
|
||||
compatible = "altr,socfpga-stmmac-a10-s10", "snps,dwmac-3.74a", "snps,dwmac";
|
||||
reg = <0xff800000 0x2000>;
|
||||
interrupts = <0 90 4>;
|
||||
interrupt-names = "macirq";
|
||||
@ -97,7 +97,7 @@
|
||||
};
|
||||
|
||||
gmac1: ethernet@ff802000 {
|
||||
compatible = "altr,socfpga-stmmac", "snps,dwmac-3.74a", "snps,dwmac";
|
||||
compatible = "altr,socfpga-stmmac-a10-s10", "snps,dwmac-3.74a", "snps,dwmac";
|
||||
reg = <0xff802000 0x2000>;
|
||||
interrupts = <0 91 4>;
|
||||
interrupt-names = "macirq";
|
||||
@ -112,7 +112,7 @@
|
||||
};
|
||||
|
||||
gmac2: ethernet@ff804000 {
|
||||
compatible = "altr,socfpga-stmmac", "snps,dwmac-3.74a", "snps,dwmac";
|
||||
compatible = "altr,socfpga-stmmac-a10-s10", "snps,dwmac-3.74a", "snps,dwmac";
|
||||
reg = <0xff804000 0x2000>;
|
||||
interrupts = <0 92 4>;
|
||||
interrupt-names = "macirq";
|
||||
|
@ -34,7 +34,6 @@ CONFIG_BPF_SYSCALL=y
|
||||
CONFIG_BPF_JIT_ALWAYS_ON=y
|
||||
# CONFIG_RSEQ is not set
|
||||
CONFIG_EMBEDDED=y
|
||||
# CONFIG_VM_EVENT_COUNTERS is not set
|
||||
# CONFIG_COMPAT_BRK is not set
|
||||
# CONFIG_SLAB_MERGE_DEFAULT is not set
|
||||
CONFIG_SLAB_FREELIST_RANDOM=y
|
||||
@ -75,6 +74,7 @@ CONFIG_ARM_SCPI_PROTOCOL=y
|
||||
CONFIG_ARM64_CRYPTO=y
|
||||
CONFIG_CRYPTO_SHA2_ARM64_CE=y
|
||||
CONFIG_CRYPTO_AES_ARM64_CE_BLK=y
|
||||
CONFIG_JUMP_LABEL=y
|
||||
CONFIG_SHADOW_CALL_STACK=y
|
||||
CONFIG_LTO_CLANG=y
|
||||
CONFIG_CFI_CLANG=y
|
||||
@ -87,6 +87,7 @@ CONFIG_GKI_HACKS_TO_FIX=y
|
||||
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
|
||||
CONFIG_BINFMT_MISC=y
|
||||
CONFIG_MEMORY_HOTPLUG=y
|
||||
CONFIG_CLEANCACHE=y
|
||||
CONFIG_CMA=y
|
||||
CONFIG_CMA_AREAS=16
|
||||
CONFIG_ZSMALLOC=y
|
||||
@ -212,7 +213,6 @@ CONFIG_FW_LOADER_USER_HELPER=y
|
||||
CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y
|
||||
# CONFIG_FW_CACHE is not set
|
||||
# CONFIG_ALLOW_DEV_COREDUMP is not set
|
||||
CONFIG_DEBUG_DEVRES=y
|
||||
CONFIG_GNSS=y
|
||||
CONFIG_ZRAM=y
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
@ -310,6 +310,7 @@ CONFIG_THERMAL_GOV_USER_SPACE=y
|
||||
CONFIG_CPU_THERMAL=y
|
||||
CONFIG_DEVFREQ_THERMAL=y
|
||||
CONFIG_WATCHDOG=y
|
||||
CONFIG_WATCHDOG_CORE=y
|
||||
CONFIG_MFD_ACT8945A=y
|
||||
CONFIG_MFD_SYSCON=y
|
||||
CONFIG_REGULATOR=y
|
||||
@ -345,10 +346,14 @@ CONFIG_USB_OTG=y
|
||||
CONFIG_USB_GADGET=y
|
||||
CONFIG_USB_CONFIGFS=y
|
||||
CONFIG_USB_CONFIGFS_UEVENT=y
|
||||
CONFIG_USB_CONFIGFS_SERIAL=y
|
||||
CONFIG_USB_CONFIGFS_RNDIS=y
|
||||
CONFIG_USB_CONFIGFS_MASS_STORAGE=y
|
||||
CONFIG_USB_CONFIGFS_F_FS=y
|
||||
CONFIG_USB_CONFIGFS_F_ACC=y
|
||||
CONFIG_USB_CONFIGFS_F_AUDIO_SRC=y
|
||||
CONFIG_USB_CONFIGFS_F_MIDI=y
|
||||
CONFIG_TYPEC=y
|
||||
CONFIG_MMC=y
|
||||
# CONFIG_PWRSEQ_EMMC is not set
|
||||
# CONFIG_PWRSEQ_SIMPLE is not set
|
||||
@ -466,6 +471,7 @@ CONFIG_NLS_MAC_TURKISH=y
|
||||
CONFIG_NLS_UTF8=y
|
||||
CONFIG_UNICODE=y
|
||||
CONFIG_SECURITY=y
|
||||
CONFIG_SECURITYFS=y
|
||||
CONFIG_SECURITY_NETWORK=y
|
||||
CONFIG_HARDENED_USERCOPY=y
|
||||
CONFIG_FORTIFY_SOURCE=y
|
||||
@ -491,5 +497,6 @@ CONFIG_SOFTLOCKUP_DETECTOR=y
|
||||
# CONFIG_DETECT_HUNG_TASK is not set
|
||||
CONFIG_PANIC_TIMEOUT=5
|
||||
CONFIG_SCHEDSTATS=y
|
||||
# CONFIG_DEBUG_PREEMPT is not set
|
||||
CONFIG_CORESIGHT=y
|
||||
CONFIG_CORESIGHT_STM=y
|
||||
|
1
arch/arm64/configs/vendor/holi_GKI.config
vendored
1
arch/arm64/configs/vendor/holi_GKI.config
vendored
@ -28,7 +28,6 @@ CONFIG_USB_DWC3_MSM=m
|
||||
CONFIG_USB_EHSET_TEST_FIXTURE=m
|
||||
CONFIG_USB_LINK_LAYER_TEST=m
|
||||
CONFIG_USB_CONFIGFS_F_DIAG=m
|
||||
CONFIG_TYPEC=m
|
||||
CONFIG_TYPEC_UCSI=m
|
||||
CONFIG_UCSI_QTI_GLINK=m
|
||||
CONFIG_INTERCONNECT_QCOM=m
|
||||
|
1
arch/arm64/configs/vendor/lahaina_GKI.config
vendored
1
arch/arm64/configs/vendor/lahaina_GKI.config
vendored
@ -39,7 +39,6 @@ CONFIG_USB_CONFIGFS_F_CDEV=m
|
||||
CONFIG_USB_CONFIGFS_F_GSI=m
|
||||
CONFIG_USB_CONFIGFS_MASS_STORAGE=m
|
||||
CONFIG_USB_STORAGE=m
|
||||
CONFIG_TYPEC=m
|
||||
CONFIG_SDCARD_FS=m
|
||||
CONFIG_TYPEC_UCSI=m
|
||||
CONFIG_UCSI_QTI_GLINK=m
|
||||
|
@ -55,6 +55,7 @@
|
||||
#define ARM64_WORKAROUND_CAVIUM_TX2_219_TVM 45
|
||||
#define ARM64_WORKAROUND_CAVIUM_TX2_219_PRFM 46
|
||||
|
||||
#define ARM64_NCAPS 47
|
||||
/* kabi: reserve 48 - 62 for future cpu capabilities */
|
||||
#define ARM64_NCAPS 62
|
||||
|
||||
#endif /* __ASM_CPUCAPS_H */
|
||||
|
@ -36,6 +36,7 @@ config CSKY
|
||||
select GX6605S_TIMER if CPU_CK610
|
||||
select HAVE_ARCH_TRACEHOOK
|
||||
select HAVE_ARCH_AUDITSYSCALL
|
||||
select HAVE_COPY_THREAD_TLS
|
||||
select HAVE_DYNAMIC_FTRACE
|
||||
select HAVE_FUNCTION_TRACER
|
||||
select HAVE_FUNCTION_GRAPH_TRACER
|
||||
@ -74,7 +75,7 @@ config CPU_HAS_TLBI
|
||||
config CPU_HAS_LDSTEX
|
||||
bool
|
||||
help
|
||||
For SMP, CPU needs "ldex&stex" instrcutions to atomic operations.
|
||||
For SMP, CPU needs "ldex&stex" instructions for atomic operations.
|
||||
|
||||
config CPU_NEED_TLBSYNC
|
||||
bool
|
||||
|
@ -16,14 +16,16 @@
|
||||
#define LSAVE_A4 40
|
||||
#define LSAVE_A5 44
|
||||
|
||||
#define usp ss1
|
||||
|
||||
.macro USPTOKSP
|
||||
mtcr sp, ss1
|
||||
mtcr sp, usp
|
||||
mfcr sp, ss0
|
||||
.endm
|
||||
|
||||
.macro KSPTOUSP
|
||||
mtcr sp, ss0
|
||||
mfcr sp, ss1
|
||||
mfcr sp, usp
|
||||
.endm
|
||||
|
||||
.macro SAVE_ALL epc_inc
|
||||
@ -45,7 +47,13 @@
|
||||
add lr, r13
|
||||
stw lr, (sp, 8)
|
||||
|
||||
mov lr, sp
|
||||
addi lr, 32
|
||||
addi lr, 32
|
||||
addi lr, 16
|
||||
bt 2f
|
||||
mfcr lr, ss1
|
||||
2:
|
||||
stw lr, (sp, 16)
|
||||
|
||||
stw a0, (sp, 20)
|
||||
@ -79,9 +87,10 @@
|
||||
ldw a0, (sp, 12)
|
||||
mtcr a0, epsr
|
||||
btsti a0, 31
|
||||
bt 1f
|
||||
ldw a0, (sp, 16)
|
||||
mtcr a0, ss1
|
||||
|
||||
1:
|
||||
ldw a0, (sp, 24)
|
||||
ldw a1, (sp, 28)
|
||||
ldw a2, (sp, 32)
|
||||
@ -102,9 +111,9 @@
|
||||
addi sp, 32
|
||||
addi sp, 8
|
||||
|
||||
bt 1f
|
||||
bt 2f
|
||||
KSPTOUSP
|
||||
1:
|
||||
2:
|
||||
rte
|
||||
.endm
|
||||
|
||||
|
@ -31,7 +31,13 @@
|
||||
|
||||
mfcr lr, epsr
|
||||
stw lr, (sp, 12)
|
||||
btsti lr, 31
|
||||
bf 1f
|
||||
addi lr, sp, 152
|
||||
br 2f
|
||||
1:
|
||||
mfcr lr, usp
|
||||
2:
|
||||
stw lr, (sp, 16)
|
||||
|
||||
stw a0, (sp, 20)
|
||||
@ -64,8 +70,10 @@
|
||||
mtcr a0, epc
|
||||
ldw a0, (sp, 12)
|
||||
mtcr a0, epsr
|
||||
btsti a0, 31
|
||||
ldw a0, (sp, 16)
|
||||
mtcr a0, usp
|
||||
mtcr a0, ss0
|
||||
|
||||
#ifdef CONFIG_CPU_HAS_HILO
|
||||
ldw a0, (sp, 140)
|
||||
@ -86,6 +94,9 @@
|
||||
addi sp, 40
|
||||
ldm r16-r30, (sp)
|
||||
addi sp, 72
|
||||
bf 1f
|
||||
mfcr sp, ss0
|
||||
1:
|
||||
rte
|
||||
.endm
|
||||
|
||||
|
@ -1,7 +1,10 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
|
||||
|
||||
#define __ARCH_WANT_STAT64
|
||||
#define __ARCH_WANT_NEW_STAT
|
||||
#define __ARCH_WANT_SYS_CLONE
|
||||
#define __ARCH_WANT_SYS_CLONE3
|
||||
#define __ARCH_WANT_SET_GET_RLIMIT
|
||||
#define __ARCH_WANT_TIME32_SYSCALLS
|
||||
#include <asm-generic/unistd.h>
|
||||
|
@ -17,10 +17,12 @@ ENTRY(csky_cmpxchg)
|
||||
mfcr a3, epc
|
||||
addi a3, TRAP0_SIZE
|
||||
|
||||
subi sp, 8
|
||||
subi sp, 16
|
||||
stw a3, (sp, 0)
|
||||
mfcr a3, epsr
|
||||
stw a3, (sp, 4)
|
||||
mfcr a3, usp
|
||||
stw a3, (sp, 8)
|
||||
|
||||
psrset ee
|
||||
#ifdef CONFIG_CPU_HAS_LDSTEX
|
||||
@ -47,7 +49,9 @@ ENTRY(csky_cmpxchg)
|
||||
mtcr a3, epc
|
||||
ldw a3, (sp, 4)
|
||||
mtcr a3, epsr
|
||||
addi sp, 8
|
||||
ldw a3, (sp, 8)
|
||||
mtcr a3, usp
|
||||
addi sp, 16
|
||||
KSPTOUSP
|
||||
rte
|
||||
END(csky_cmpxchg)
|
||||
|
@ -34,10 +34,11 @@ unsigned long thread_saved_pc(struct task_struct *tsk)
|
||||
return sw->r15;
|
||||
}
|
||||
|
||||
int copy_thread(unsigned long clone_flags,
|
||||
int copy_thread_tls(unsigned long clone_flags,
|
||||
unsigned long usp,
|
||||
unsigned long kthread_arg,
|
||||
struct task_struct *p)
|
||||
struct task_struct *p,
|
||||
unsigned long tls)
|
||||
{
|
||||
struct switch_stack *childstack;
|
||||
struct pt_regs *childregs = task_pt_regs(p);
|
||||
@ -64,7 +65,7 @@ int copy_thread(unsigned long clone_flags,
|
||||
childregs->usp = usp;
|
||||
if (clone_flags & CLONE_SETTLS)
|
||||
task_thread_info(p)->tp_value = childregs->tls
|
||||
= childregs->regs[0];
|
||||
= tls;
|
||||
|
||||
childregs->a0 = 0;
|
||||
childstack->r15 = (unsigned long) ret_from_fork;
|
||||
|
@ -120,7 +120,7 @@ void __init setup_smp_ipi(void)
|
||||
int rc;
|
||||
|
||||
if (ipi_irq == 0)
|
||||
panic("%s IRQ mapping failed\n", __func__);
|
||||
return;
|
||||
|
||||
rc = request_percpu_irq(ipi_irq, handle_ipi, "IPI Interrupt",
|
||||
&ipi_dummy_dev);
|
||||
|
@ -1,8 +1,10 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
ifeq ($(CONFIG_CPU_HAS_CACHEV2),y)
|
||||
obj-y += cachev2.o
|
||||
CFLAGS_REMOVE_cachev2.o = $(CC_FLAGS_FTRACE)
|
||||
else
|
||||
obj-y += cachev1.o
|
||||
CFLAGS_REMOVE_cachev1.o = $(CC_FLAGS_FTRACE)
|
||||
endif
|
||||
|
||||
obj-y += dma-mapping.o
|
||||
|
@ -31,6 +31,7 @@
|
||||
|
||||
pgd_t swapper_pg_dir[PTRS_PER_PGD] __page_aligned_bss;
|
||||
pte_t invalid_pte_table[PTRS_PER_PTE] __page_aligned_bss;
|
||||
EXPORT_SYMBOL(invalid_pte_table);
|
||||
unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)]
|
||||
__page_aligned_bss;
|
||||
EXPORT_SYMBOL(empty_zero_page);
|
||||
|
@ -55,42 +55,48 @@ struct ppc64_caches {
|
||||
|
||||
extern struct ppc64_caches ppc64_caches;
|
||||
|
||||
static inline u32 l1_cache_shift(void)
|
||||
static inline u32 l1_dcache_shift(void)
|
||||
{
|
||||
return ppc64_caches.l1d.log_block_size;
|
||||
}
|
||||
|
||||
static inline u32 l1_cache_bytes(void)
|
||||
static inline u32 l1_dcache_bytes(void)
|
||||
{
|
||||
return ppc64_caches.l1d.block_size;
|
||||
}
|
||||
|
||||
static inline u32 l1_icache_shift(void)
|
||||
{
|
||||
return ppc64_caches.l1i.log_block_size;
|
||||
}
|
||||
|
||||
static inline u32 l1_icache_bytes(void)
|
||||
{
|
||||
return ppc64_caches.l1i.block_size;
|
||||
}
|
||||
#else
|
||||
static inline u32 l1_cache_shift(void)
|
||||
static inline u32 l1_dcache_shift(void)
|
||||
{
|
||||
return L1_CACHE_SHIFT;
|
||||
}
|
||||
|
||||
static inline u32 l1_cache_bytes(void)
|
||||
static inline u32 l1_dcache_bytes(void)
|
||||
{
|
||||
return L1_CACHE_BYTES;
|
||||
}
|
||||
|
||||
static inline u32 l1_icache_shift(void)
|
||||
{
|
||||
return L1_CACHE_SHIFT;
|
||||
}
|
||||
|
||||
static inline u32 l1_icache_bytes(void)
|
||||
{
|
||||
return L1_CACHE_BYTES;
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif /* ! __ASSEMBLY__ */
|
||||
|
||||
#if defined(__ASSEMBLY__)
|
||||
/*
|
||||
* For a snooping icache, we still need a dummy icbi to purge all the
|
||||
* prefetched instructions from the ifetch buffers. We also need a sync
|
||||
* before the icbi to order the the actual stores to memory that might
|
||||
* have modified instructions with the icbi.
|
||||
*/
|
||||
#define PURGE_PREFETCHED_INS \
|
||||
sync; \
|
||||
icbi 0,r3; \
|
||||
sync; \
|
||||
isync
|
||||
|
||||
#else
|
||||
#define __read_mostly __attribute__((__section__(".data..read_mostly")))
|
||||
|
||||
#ifdef CONFIG_PPC_BOOK3S_32
|
||||
@ -124,6 +130,17 @@ static inline void dcbst(void *addr)
|
||||
{
|
||||
__asm__ __volatile__ ("dcbst 0, %0" : : "r"(addr) : "memory");
|
||||
}
|
||||
|
||||
static inline void icbi(void *addr)
|
||||
{
|
||||
asm volatile ("icbi 0, %0" : : "r"(addr) : "memory");
|
||||
}
|
||||
|
||||
static inline void iccci(void *addr)
|
||||
{
|
||||
asm volatile ("iccci 0, %0" : : "r"(addr) : "memory");
|
||||
}
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _ASM_POWERPC_CACHE_H */
|
||||
|
@ -42,29 +42,25 @@ extern void flush_dcache_page(struct page *page);
|
||||
#define flush_dcache_mmap_lock(mapping) do { } while (0)
|
||||
#define flush_dcache_mmap_unlock(mapping) do { } while (0)
|
||||
|
||||
extern void flush_icache_range(unsigned long, unsigned long);
|
||||
void flush_icache_range(unsigned long start, unsigned long stop);
|
||||
extern void flush_icache_user_range(struct vm_area_struct *vma,
|
||||
struct page *page, unsigned long addr,
|
||||
int len);
|
||||
extern void __flush_dcache_icache(void *page_va);
|
||||
extern void flush_dcache_icache_page(struct page *page);
|
||||
#if defined(CONFIG_PPC32) && !defined(CONFIG_BOOKE)
|
||||
extern void __flush_dcache_icache_phys(unsigned long physaddr);
|
||||
#else
|
||||
static inline void __flush_dcache_icache_phys(unsigned long physaddr)
|
||||
{
|
||||
BUG();
|
||||
}
|
||||
#endif
|
||||
void __flush_dcache_icache(void *page);
|
||||
|
||||
/*
|
||||
* Write any modified data cache blocks out to memory and invalidate them.
|
||||
* Does not invalidate the corresponding instruction cache blocks.
|
||||
/**
|
||||
* flush_dcache_range(): Write any modified data cache blocks out to memory and
|
||||
* invalidate them. Does not invalidate the corresponding instruction cache
|
||||
* blocks.
|
||||
*
|
||||
* @start: the start address
|
||||
* @stop: the stop address (exclusive)
|
||||
*/
|
||||
static inline void flush_dcache_range(unsigned long start, unsigned long stop)
|
||||
{
|
||||
unsigned long shift = l1_cache_shift();
|
||||
unsigned long bytes = l1_cache_bytes();
|
||||
unsigned long shift = l1_dcache_shift();
|
||||
unsigned long bytes = l1_dcache_bytes();
|
||||
void *addr = (void *)(start & ~(bytes - 1));
|
||||
unsigned long size = stop - (unsigned long)addr + (bytes - 1);
|
||||
unsigned long i;
|
||||
@ -89,8 +85,8 @@ static inline void flush_dcache_range(unsigned long start, unsigned long stop)
|
||||
*/
|
||||
static inline void clean_dcache_range(unsigned long start, unsigned long stop)
|
||||
{
|
||||
unsigned long shift = l1_cache_shift();
|
||||
unsigned long bytes = l1_cache_bytes();
|
||||
unsigned long shift = l1_dcache_shift();
|
||||
unsigned long bytes = l1_dcache_bytes();
|
||||
void *addr = (void *)(start & ~(bytes - 1));
|
||||
unsigned long size = stop - (unsigned long)addr + (bytes - 1);
|
||||
unsigned long i;
|
||||
@ -108,8 +104,8 @@ static inline void clean_dcache_range(unsigned long start, unsigned long stop)
|
||||
static inline void invalidate_dcache_range(unsigned long start,
|
||||
unsigned long stop)
|
||||
{
|
||||
unsigned long shift = l1_cache_shift();
|
||||
unsigned long bytes = l1_cache_bytes();
|
||||
unsigned long shift = l1_dcache_shift();
|
||||
unsigned long bytes = l1_dcache_bytes();
|
||||
void *addr = (void *)(start & ~(bytes - 1));
|
||||
unsigned long size = stop - (unsigned long)addr + (bytes - 1);
|
||||
unsigned long i;
|
||||
|
@ -2193,11 +2193,13 @@ static struct cpu_spec * __init setup_cpu_spec(unsigned long offset,
|
||||
* oprofile_cpu_type already has a value, then we are
|
||||
* possibly overriding a real PVR with a logical one,
|
||||
* and, in that case, keep the current value for
|
||||
* oprofile_cpu_type.
|
||||
* oprofile_cpu_type. Futhermore, let's ensure that the
|
||||
* fix for the PMAO bug is enabled on compatibility mode.
|
||||
*/
|
||||
if (old.oprofile_cpu_type != NULL) {
|
||||
t->oprofile_cpu_type = old.oprofile_cpu_type;
|
||||
t->oprofile_type = old.oprofile_type;
|
||||
t->cpu_features |= old.cpu_features & CPU_FTR_PMAO_BUG;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -316,126 +316,6 @@ _GLOBAL(flush_instruction_cache)
|
||||
EXPORT_SYMBOL(flush_instruction_cache)
|
||||
#endif /* CONFIG_PPC_8xx */
|
||||
|
||||
/*
|
||||
* Write any modified data cache blocks out to memory
|
||||
* and invalidate the corresponding instruction cache blocks.
|
||||
* This is a no-op on the 601.
|
||||
*
|
||||
* flush_icache_range(unsigned long start, unsigned long stop)
|
||||
*/
|
||||
_GLOBAL(flush_icache_range)
|
||||
#if defined(CONFIG_PPC_BOOK3S_601) || defined(CONFIG_E200)
|
||||
PURGE_PREFETCHED_INS
|
||||
blr /* for 601 and e200, do nothing */
|
||||
#else
|
||||
rlwinm r3,r3,0,0,31 - L1_CACHE_SHIFT
|
||||
subf r4,r3,r4
|
||||
addi r4,r4,L1_CACHE_BYTES - 1
|
||||
srwi. r4,r4,L1_CACHE_SHIFT
|
||||
beqlr
|
||||
mtctr r4
|
||||
mr r6,r3
|
||||
1: dcbst 0,r3
|
||||
addi r3,r3,L1_CACHE_BYTES
|
||||
bdnz 1b
|
||||
sync /* wait for dcbst's to get to ram */
|
||||
#ifndef CONFIG_44x
|
||||
mtctr r4
|
||||
2: icbi 0,r6
|
||||
addi r6,r6,L1_CACHE_BYTES
|
||||
bdnz 2b
|
||||
#else
|
||||
/* Flash invalidate on 44x because we are passed kmapped addresses and
|
||||
this doesn't work for userspace pages due to the virtually tagged
|
||||
icache. Sigh. */
|
||||
iccci 0, r0
|
||||
#endif
|
||||
sync /* additional sync needed on g4 */
|
||||
isync
|
||||
blr
|
||||
#endif
|
||||
_ASM_NOKPROBE_SYMBOL(flush_icache_range)
|
||||
EXPORT_SYMBOL(flush_icache_range)
|
||||
|
||||
/*
|
||||
* Flush a particular page from the data cache to RAM.
|
||||
* Note: this is necessary because the instruction cache does *not*
|
||||
* snoop from the data cache.
|
||||
* This is a no-op on the 601 and e200 which have a unified cache.
|
||||
*
|
||||
* void __flush_dcache_icache(void *page)
|
||||
*/
|
||||
_GLOBAL(__flush_dcache_icache)
|
||||
#if defined(CONFIG_PPC_BOOK3S_601) || defined(CONFIG_E200)
|
||||
PURGE_PREFETCHED_INS
|
||||
blr
|
||||
#else
|
||||
rlwinm r3,r3,0,0,31-PAGE_SHIFT /* Get page base address */
|
||||
li r4,PAGE_SIZE/L1_CACHE_BYTES /* Number of lines in a page */
|
||||
mtctr r4
|
||||
mr r6,r3
|
||||
0: dcbst 0,r3 /* Write line to ram */
|
||||
addi r3,r3,L1_CACHE_BYTES
|
||||
bdnz 0b
|
||||
sync
|
||||
#ifdef CONFIG_44x
|
||||
/* We don't flush the icache on 44x. Those have a virtual icache
|
||||
* and we don't have access to the virtual address here (it's
|
||||
* not the page vaddr but where it's mapped in user space). The
|
||||
* flushing of the icache on these is handled elsewhere, when
|
||||
* a change in the address space occurs, before returning to
|
||||
* user space
|
||||
*/
|
||||
BEGIN_MMU_FTR_SECTION
|
||||
blr
|
||||
END_MMU_FTR_SECTION_IFSET(MMU_FTR_TYPE_44x)
|
||||
#endif /* CONFIG_44x */
|
||||
mtctr r4
|
||||
1: icbi 0,r6
|
||||
addi r6,r6,L1_CACHE_BYTES
|
||||
bdnz 1b
|
||||
sync
|
||||
isync
|
||||
blr
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_BOOKE
|
||||
/*
|
||||
* Flush a particular page from the data cache to RAM, identified
|
||||
* by its physical address. We turn off the MMU so we can just use
|
||||
* the physical address (this may be a highmem page without a kernel
|
||||
* mapping).
|
||||
*
|
||||
* void __flush_dcache_icache_phys(unsigned long physaddr)
|
||||
*/
|
||||
_GLOBAL(__flush_dcache_icache_phys)
|
||||
#if defined(CONFIG_PPC_BOOK3S_601) || defined(CONFIG_E200)
|
||||
PURGE_PREFETCHED_INS
|
||||
blr /* for 601 and e200, do nothing */
|
||||
#else
|
||||
mfmsr r10
|
||||
rlwinm r0,r10,0,28,26 /* clear DR */
|
||||
mtmsr r0
|
||||
isync
|
||||
rlwinm r3,r3,0,0,31-PAGE_SHIFT /* Get page base address */
|
||||
li r4,PAGE_SIZE/L1_CACHE_BYTES /* Number of lines in a page */
|
||||
mtctr r4
|
||||
mr r6,r3
|
||||
0: dcbst 0,r3 /* Write line to ram */
|
||||
addi r3,r3,L1_CACHE_BYTES
|
||||
bdnz 0b
|
||||
sync
|
||||
mtctr r4
|
||||
1: icbi 0,r6
|
||||
addi r6,r6,L1_CACHE_BYTES
|
||||
bdnz 1b
|
||||
sync
|
||||
mtmsr r10 /* restore DR */
|
||||
isync
|
||||
blr
|
||||
#endif
|
||||
#endif /* CONFIG_BOOKE */
|
||||
|
||||
/*
|
||||
* Copy a whole page. We use the dcbz instruction on the destination
|
||||
* to reduce memory traffic (it eliminates the unnecessary reads of
|
||||
|
@ -49,108 +49,6 @@ _GLOBAL(call_do_irq)
|
||||
mtlr r0
|
||||
blr
|
||||
|
||||
.section ".toc","aw"
|
||||
PPC64_CACHES:
|
||||
.tc ppc64_caches[TC],ppc64_caches
|
||||
.section ".text"
|
||||
|
||||
/*
|
||||
* Write any modified data cache blocks out to memory
|
||||
* and invalidate the corresponding instruction cache blocks.
|
||||
*
|
||||
* flush_icache_range(unsigned long start, unsigned long stop)
|
||||
*
|
||||
* flush all bytes from start through stop-1 inclusive
|
||||
*/
|
||||
|
||||
_GLOBAL_TOC(flush_icache_range)
|
||||
BEGIN_FTR_SECTION
|
||||
PURGE_PREFETCHED_INS
|
||||
blr
|
||||
END_FTR_SECTION_IFSET(CPU_FTR_COHERENT_ICACHE)
|
||||
/*
|
||||
* Flush the data cache to memory
|
||||
*
|
||||
* Different systems have different cache line sizes
|
||||
* and in some cases i-cache and d-cache line sizes differ from
|
||||
* each other.
|
||||
*/
|
||||
ld r10,PPC64_CACHES@toc(r2)
|
||||
lwz r7,DCACHEL1BLOCKSIZE(r10)/* Get cache block size */
|
||||
addi r5,r7,-1
|
||||
andc r6,r3,r5 /* round low to line bdy */
|
||||
subf r8,r6,r4 /* compute length */
|
||||
add r8,r8,r5 /* ensure we get enough */
|
||||
lwz r9,DCACHEL1LOGBLOCKSIZE(r10) /* Get log-2 of cache block size */
|
||||
srd. r8,r8,r9 /* compute line count */
|
||||
beqlr /* nothing to do? */
|
||||
mtctr r8
|
||||
1: dcbst 0,r6
|
||||
add r6,r6,r7
|
||||
bdnz 1b
|
||||
sync
|
||||
|
||||
/* Now invalidate the instruction cache */
|
||||
|
||||
lwz r7,ICACHEL1BLOCKSIZE(r10) /* Get Icache block size */
|
||||
addi r5,r7,-1
|
||||
andc r6,r3,r5 /* round low to line bdy */
|
||||
subf r8,r6,r4 /* compute length */
|
||||
add r8,r8,r5
|
||||
lwz r9,ICACHEL1LOGBLOCKSIZE(r10) /* Get log-2 of Icache block size */
|
||||
srd. r8,r8,r9 /* compute line count */
|
||||
beqlr /* nothing to do? */
|
||||
mtctr r8
|
||||
2: icbi 0,r6
|
||||
add r6,r6,r7
|
||||
bdnz 2b
|
||||
isync
|
||||
blr
|
||||
_ASM_NOKPROBE_SYMBOL(flush_icache_range)
|
||||
EXPORT_SYMBOL(flush_icache_range)
|
||||
|
||||
/*
|
||||
* Flush a particular page from the data cache to RAM.
|
||||
* Note: this is necessary because the instruction cache does *not*
|
||||
* snoop from the data cache.
|
||||
*
|
||||
* void __flush_dcache_icache(void *page)
|
||||
*/
|
||||
_GLOBAL(__flush_dcache_icache)
|
||||
/*
|
||||
* Flush the data cache to memory
|
||||
*
|
||||
* Different systems have different cache line sizes
|
||||
*/
|
||||
|
||||
BEGIN_FTR_SECTION
|
||||
PURGE_PREFETCHED_INS
|
||||
blr
|
||||
END_FTR_SECTION_IFSET(CPU_FTR_COHERENT_ICACHE)
|
||||
|
||||
/* Flush the dcache */
|
||||
ld r7,PPC64_CACHES@toc(r2)
|
||||
clrrdi r3,r3,PAGE_SHIFT /* Page align */
|
||||
lwz r4,DCACHEL1BLOCKSPERPAGE(r7) /* Get # dcache blocks per page */
|
||||
lwz r5,DCACHEL1BLOCKSIZE(r7) /* Get dcache block size */
|
||||
mr r6,r3
|
||||
mtctr r4
|
||||
0: dcbst 0,r6
|
||||
add r6,r6,r5
|
||||
bdnz 0b
|
||||
sync
|
||||
|
||||
/* Now invalidate the icache */
|
||||
|
||||
lwz r4,ICACHEL1BLOCKSPERPAGE(r7) /* Get # icache blocks per page */
|
||||
lwz r5,ICACHEL1BLOCKSIZE(r7) /* Get icache block size */
|
||||
mtctr r4
|
||||
1: icbi 0,r3
|
||||
add r3,r3,r5
|
||||
bdnz 1b
|
||||
isync
|
||||
blr
|
||||
|
||||
_GLOBAL(__bswapdi2)
|
||||
EXPORT_SYMBOL(__bswapdi2)
|
||||
srdi r8,r3,32
|
||||
|
@ -348,6 +348,122 @@ void free_initmem(void)
|
||||
free_initmem_default(POISON_FREE_INITMEM);
|
||||
}
|
||||
|
||||
/**
|
||||
* flush_coherent_icache() - if a CPU has a coherent icache, flush it
|
||||
* @addr: The base address to use (can be any valid address, the whole cache will be flushed)
|
||||
* Return true if the cache was flushed, false otherwise
|
||||
*/
|
||||
static inline bool flush_coherent_icache(unsigned long addr)
|
||||
{
|
||||
/*
|
||||
* For a snooping icache, we still need a dummy icbi to purge all the
|
||||
* prefetched instructions from the ifetch buffers. We also need a sync
|
||||
* before the icbi to order the the actual stores to memory that might
|
||||
* have modified instructions with the icbi.
|
||||
*/
|
||||
if (cpu_has_feature(CPU_FTR_COHERENT_ICACHE)) {
|
||||
mb(); /* sync */
|
||||
allow_read_from_user((const void __user *)addr, L1_CACHE_BYTES);
|
||||
icbi((void *)addr);
|
||||
prevent_read_from_user((const void __user *)addr, L1_CACHE_BYTES);
|
||||
mb(); /* sync */
|
||||
isync();
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* invalidate_icache_range() - Flush the icache by issuing icbi across an address range
|
||||
* @start: the start address
|
||||
* @stop: the stop address (exclusive)
|
||||
*/
|
||||
static void invalidate_icache_range(unsigned long start, unsigned long stop)
|
||||
{
|
||||
unsigned long shift = l1_icache_shift();
|
||||
unsigned long bytes = l1_icache_bytes();
|
||||
char *addr = (char *)(start & ~(bytes - 1));
|
||||
unsigned long size = stop - (unsigned long)addr + (bytes - 1);
|
||||
unsigned long i;
|
||||
|
||||
for (i = 0; i < size >> shift; i++, addr += bytes)
|
||||
icbi(addr);
|
||||
|
||||
mb(); /* sync */
|
||||
isync();
|
||||
}
|
||||
|
||||
/**
|
||||
* flush_icache_range: Write any modified data cache blocks out to memory
|
||||
* and invalidate the corresponding blocks in the instruction cache
|
||||
*
|
||||
* Generic code will call this after writing memory, before executing from it.
|
||||
*
|
||||
* @start: the start address
|
||||
* @stop: the stop address (exclusive)
|
||||
*/
|
||||
void flush_icache_range(unsigned long start, unsigned long stop)
|
||||
{
|
||||
if (flush_coherent_icache(start))
|
||||
return;
|
||||
|
||||
clean_dcache_range(start, stop);
|
||||
|
||||
if (IS_ENABLED(CONFIG_44x)) {
|
||||
/*
|
||||
* Flash invalidate on 44x because we are passed kmapped
|
||||
* addresses and this doesn't work for userspace pages due to
|
||||
* the virtually tagged icache.
|
||||
*/
|
||||
iccci((void *)start);
|
||||
mb(); /* sync */
|
||||
isync();
|
||||
} else
|
||||
invalidate_icache_range(start, stop);
|
||||
}
|
||||
EXPORT_SYMBOL(flush_icache_range);
|
||||
|
||||
#if !defined(CONFIG_PPC_8xx) && !defined(CONFIG_PPC64)
|
||||
/**
|
||||
* flush_dcache_icache_phys() - Flush a page by it's physical address
|
||||
* @physaddr: the physical address of the page
|
||||
*/
|
||||
static void flush_dcache_icache_phys(unsigned long physaddr)
|
||||
{
|
||||
unsigned long bytes = l1_dcache_bytes();
|
||||
unsigned long nb = PAGE_SIZE / bytes;
|
||||
unsigned long addr = physaddr & PAGE_MASK;
|
||||
unsigned long msr, msr0;
|
||||
unsigned long loop1 = addr, loop2 = addr;
|
||||
|
||||
msr0 = mfmsr();
|
||||
msr = msr0 & ~MSR_DR;
|
||||
/*
|
||||
* This must remain as ASM to prevent potential memory accesses
|
||||
* while the data MMU is disabled
|
||||
*/
|
||||
asm volatile(
|
||||
" mtctr %2;\n"
|
||||
" mtmsr %3;\n"
|
||||
" isync;\n"
|
||||
"0: dcbst 0, %0;\n"
|
||||
" addi %0, %0, %4;\n"
|
||||
" bdnz 0b;\n"
|
||||
" sync;\n"
|
||||
" mtctr %2;\n"
|
||||
"1: icbi 0, %1;\n"
|
||||
" addi %1, %1, %4;\n"
|
||||
" bdnz 1b;\n"
|
||||
" sync;\n"
|
||||
" mtmsr %5;\n"
|
||||
" isync;\n"
|
||||
: "+&r" (loop1), "+&r" (loop2)
|
||||
: "r" (nb), "r" (msr), "i" (bytes), "r" (msr0)
|
||||
: "ctr", "memory");
|
||||
}
|
||||
#endif // !defined(CONFIG_PPC_8xx) && !defined(CONFIG_PPC64)
|
||||
|
||||
/*
|
||||
* This is called when a page has been modified by the kernel.
|
||||
* It just marks the page as not i-cache clean. We do the i-cache
|
||||
@ -380,12 +496,46 @@ void flush_dcache_icache_page(struct page *page)
|
||||
__flush_dcache_icache(start);
|
||||
kunmap_atomic(start);
|
||||
} else {
|
||||
__flush_dcache_icache_phys(page_to_pfn(page) << PAGE_SHIFT);
|
||||
unsigned long addr = page_to_pfn(page) << PAGE_SHIFT;
|
||||
|
||||
if (flush_coherent_icache(addr))
|
||||
return;
|
||||
flush_dcache_icache_phys(addr);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
EXPORT_SYMBOL(flush_dcache_icache_page);
|
||||
|
||||
/**
|
||||
* __flush_dcache_icache(): Flush a particular page from the data cache to RAM.
|
||||
* Note: this is necessary because the instruction cache does *not*
|
||||
* snoop from the data cache.
|
||||
*
|
||||
* @page: the address of the page to flush
|
||||
*/
|
||||
void __flush_dcache_icache(void *p)
|
||||
{
|
||||
unsigned long addr = (unsigned long)p;
|
||||
|
||||
if (flush_coherent_icache(addr))
|
||||
return;
|
||||
|
||||
clean_dcache_range(addr, addr + PAGE_SIZE);
|
||||
|
||||
/*
|
||||
* We don't flush the icache on 44x. Those have a virtual icache and we
|
||||
* don't have access to the virtual address here (it's not the page
|
||||
* vaddr but where it's mapped in user space). The flushing of the
|
||||
* icache on these is handled elsewhere, when a change in the address
|
||||
* space occurs, before returning to user space.
|
||||
*/
|
||||
|
||||
if (cpu_has_feature(MMU_FTR_TYPE_44x))
|
||||
return;
|
||||
|
||||
invalidate_icache_range(addr, addr + PAGE_SIZE);
|
||||
}
|
||||
|
||||
void clear_user_page(void *page, unsigned long vaddr, struct page *pg)
|
||||
{
|
||||
clear_page(page);
|
||||
|
@ -146,7 +146,7 @@ all: bzImage
|
||||
#KBUILD_IMAGE is necessary for packaging targets like rpm-pkg, deb-pkg...
|
||||
KBUILD_IMAGE := $(boot)/bzImage
|
||||
|
||||
install: vmlinux
|
||||
install:
|
||||
$(Q)$(MAKE) $(build)=$(boot) $@
|
||||
|
||||
bzImage: vmlinux
|
||||
|
@ -70,7 +70,7 @@ $(obj)/compressed/vmlinux: $(obj)/startup.a FORCE
|
||||
$(obj)/startup.a: $(OBJECTS) FORCE
|
||||
$(call if_changed,ar)
|
||||
|
||||
install: $(CONFIGURE) $(obj)/bzImage
|
||||
install:
|
||||
sh -x $(srctree)/$(obj)/install.sh $(KERNELRELEASE) $(obj)/bzImage \
|
||||
System.map "$(INSTALL_PATH)"
|
||||
|
||||
|
@ -756,6 +756,12 @@ static inline int pmd_write(pmd_t pmd)
|
||||
return (pmd_val(pmd) & _SEGMENT_ENTRY_WRITE) != 0;
|
||||
}
|
||||
|
||||
#define pud_write pud_write
|
||||
static inline int pud_write(pud_t pud)
|
||||
{
|
||||
return (pud_val(pud) & _REGION3_ENTRY_WRITE) != 0;
|
||||
}
|
||||
|
||||
static inline int pmd_dirty(pmd_t pmd)
|
||||
{
|
||||
int dirty = 1;
|
||||
|
@ -227,7 +227,7 @@ struct qdio_buffer {
|
||||
* @sbal: absolute SBAL address
|
||||
*/
|
||||
struct sl_element {
|
||||
unsigned long sbal;
|
||||
u64 sbal;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/**
|
||||
|
@ -423,7 +423,7 @@ static void zpci_map_resources(struct pci_dev *pdev)
|
||||
|
||||
if (zpci_use_mio(zdev))
|
||||
pdev->resource[i].start =
|
||||
(resource_size_t __force) zdev->bars[i].mio_wb;
|
||||
(resource_size_t __force) zdev->bars[i].mio_wt;
|
||||
else
|
||||
pdev->resource[i].start = (resource_size_t __force)
|
||||
pci_iomap_range_fh(pdev, i, 0, 0);
|
||||
@ -530,7 +530,7 @@ static int zpci_setup_bus_resources(struct zpci_dev *zdev,
|
||||
flags |= IORESOURCE_MEM_64;
|
||||
|
||||
if (zpci_use_mio(zdev))
|
||||
addr = (unsigned long) zdev->bars[i].mio_wb;
|
||||
addr = (unsigned long) zdev->bars[i].mio_wt;
|
||||
else
|
||||
addr = ZPCI_ADDR(entry);
|
||||
size = 1UL << zdev->bars[i].size;
|
||||
|
@ -29,9 +29,6 @@
|
||||
#define __PAGE_OFFSET __PAGE_OFFSET_BASE
|
||||
#include "../../mm/ident_map.c"
|
||||
|
||||
/* Used by pgtable.h asm code to force instruction serialization. */
|
||||
unsigned long __force_order;
|
||||
|
||||
/* Used to track our page table allocation area. */
|
||||
struct alloc_pgt_data {
|
||||
unsigned char *pgt_buf;
|
||||
|
@ -34,7 +34,6 @@ CONFIG_BPF_SYSCALL=y
|
||||
CONFIG_BPF_JIT_ALWAYS_ON=y
|
||||
# CONFIG_RSEQ is not set
|
||||
CONFIG_EMBEDDED=y
|
||||
# CONFIG_VM_EVENT_COUNTERS is not set
|
||||
# CONFIG_COMPAT_BRK is not set
|
||||
# CONFIG_SLAB_MERGE_DEFAULT is not set
|
||||
CONFIG_SLAB_FREELIST_RANDOM=y
|
||||
@ -53,6 +52,7 @@ CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y
|
||||
CONFIG_CPU_FREQ_GOV_POWERSAVE=y
|
||||
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
|
||||
CONFIG_IA32_EMULATION=y
|
||||
CONFIG_JUMP_LABEL=y
|
||||
CONFIG_LTO_CLANG=y
|
||||
CONFIG_CFI_CLANG=y
|
||||
CONFIG_MODULES=y
|
||||
@ -63,6 +63,7 @@ CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
|
||||
CONFIG_GKI_HACKS_TO_FIX=y
|
||||
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
|
||||
CONFIG_BINFMT_MISC=y
|
||||
CONFIG_CLEANCACHE=y
|
||||
CONFIG_CMA=y
|
||||
CONFIG_CMA_AREAS=16
|
||||
CONFIG_ZSMALLOC=y
|
||||
@ -185,7 +186,6 @@ CONFIG_FW_LOADER_USER_HELPER=y
|
||||
CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y
|
||||
# CONFIG_FW_CACHE is not set
|
||||
# CONFIG_ALLOW_DEV_COREDUMP is not set
|
||||
CONFIG_DEBUG_DEVRES=y
|
||||
CONFIG_GNSS=y
|
||||
CONFIG_OF=y
|
||||
CONFIG_ZRAM=y
|
||||
@ -267,6 +267,7 @@ CONFIG_GPIOLIB=y
|
||||
CONFIG_DEVFREQ_THERMAL=y
|
||||
# CONFIG_X86_PKG_TEMP_THERMAL is not set
|
||||
CONFIG_WATCHDOG=y
|
||||
CONFIG_WATCHDOG_CORE=y
|
||||
CONFIG_MFD_SYSCON=y
|
||||
CONFIG_REGULATOR=y
|
||||
CONFIG_REGULATOR_FIXED_VOLTAGE=y
|
||||
@ -298,6 +299,9 @@ CONFIG_USB_HIDDEV=y
|
||||
CONFIG_USB_GADGET=y
|
||||
CONFIG_USB_CONFIGFS=y
|
||||
CONFIG_USB_CONFIGFS_UEVENT=y
|
||||
CONFIG_USB_CONFIGFS_SERIAL=y
|
||||
CONFIG_USB_CONFIGFS_RNDIS=y
|
||||
CONFIG_USB_CONFIGFS_MASS_STORAGE=y
|
||||
CONFIG_USB_CONFIGFS_F_FS=y
|
||||
CONFIG_USB_CONFIGFS_F_ACC=y
|
||||
CONFIG_USB_CONFIGFS_F_AUDIO_SRC=y
|
||||
@ -401,6 +405,7 @@ CONFIG_NLS_MAC_TURKISH=y
|
||||
CONFIG_NLS_UTF8=y
|
||||
CONFIG_UNICODE=y
|
||||
CONFIG_SECURITY=y
|
||||
CONFIG_SECURITYFS=y
|
||||
CONFIG_SECURITY_NETWORK=y
|
||||
CONFIG_HARDENED_USERCOPY=y
|
||||
CONFIG_FORTIFY_SOURCE=y
|
||||
|
@ -190,15 +190,12 @@ static int amd_uncore_event_init(struct perf_event *event)
|
||||
|
||||
/*
|
||||
* NB and Last level cache counters (MSRs) are shared across all cores
|
||||
* that share the same NB / Last level cache. Interrupts can be directed
|
||||
* to a single target core, however, event counts generated by processes
|
||||
* running on other cores cannot be masked out. So we do not support
|
||||
* sampling and per-thread events.
|
||||
* that share the same NB / Last level cache. On family 16h and below,
|
||||
* Interrupts can be directed to a single target core, however, event
|
||||
* counts generated by processes running on other cores cannot be masked
|
||||
* out. So we do not support sampling and per-thread events via
|
||||
* CAP_NO_INTERRUPT, and we do not enable counter overflow interrupts:
|
||||
*/
|
||||
if (is_sampling_event(event) || event->attach_state & PERF_ATTACH_TASK)
|
||||
return -EINVAL;
|
||||
|
||||
/* and we do not enable counter overflow interrupts */
|
||||
hwc->config = event->attr.config & AMD64_RAW_EVENT_MASK_NB;
|
||||
hwc->idx = -1;
|
||||
|
||||
@ -306,7 +303,7 @@ static struct pmu amd_nb_pmu = {
|
||||
.start = amd_uncore_start,
|
||||
.stop = amd_uncore_stop,
|
||||
.read = amd_uncore_read,
|
||||
.capabilities = PERF_PMU_CAP_NO_EXCLUDE,
|
||||
.capabilities = PERF_PMU_CAP_NO_EXCLUDE | PERF_PMU_CAP_NO_INTERRUPT,
|
||||
};
|
||||
|
||||
static struct pmu amd_llc_pmu = {
|
||||
@ -317,7 +314,7 @@ static struct pmu amd_llc_pmu = {
|
||||
.start = amd_uncore_start,
|
||||
.stop = amd_uncore_stop,
|
||||
.read = amd_uncore_read,
|
||||
.capabilities = PERF_PMU_CAP_NO_EXCLUDE,
|
||||
.capabilities = PERF_PMU_CAP_NO_EXCLUDE | PERF_PMU_CAP_NO_INTERRUPT,
|
||||
};
|
||||
|
||||
static struct amd_uncore *amd_uncore_alloc(unsigned int cpu)
|
||||
|
@ -464,7 +464,7 @@ static __always_inline void setup_pku(struct cpuinfo_x86 *c)
|
||||
* cpuid bit to be set. We need to ensure that we
|
||||
* update that bit in this CPU's "cpu_info".
|
||||
*/
|
||||
get_cpu_cap(c);
|
||||
set_cpu_cap(c, X86_FEATURE_OSPKE);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS
|
||||
|
@ -489,17 +489,18 @@ static void intel_ppin_init(struct cpuinfo_x86 *c)
|
||||
return;
|
||||
|
||||
if ((val & 3UL) == 1UL) {
|
||||
/* PPIN available but disabled: */
|
||||
/* PPIN locked in disabled mode */
|
||||
return;
|
||||
}
|
||||
|
||||
/* If PPIN is disabled, but not locked, try to enable: */
|
||||
if (!(val & 3UL)) {
|
||||
/* If PPIN is disabled, try to enable */
|
||||
if (!(val & 2UL)) {
|
||||
wrmsrl_safe(MSR_PPIN_CTL, val | 2UL);
|
||||
rdmsrl_safe(MSR_PPIN_CTL, &val);
|
||||
}
|
||||
|
||||
if ((val & 3UL) == 2UL)
|
||||
/* Is the enable bit set? */
|
||||
if (val & 2UL)
|
||||
set_cpu_cap(c, X86_FEATURE_INTEL_PPIN);
|
||||
}
|
||||
}
|
||||
|
@ -5197,6 +5197,7 @@ int x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len)
|
||||
ctxt->fetch.ptr = ctxt->fetch.data;
|
||||
ctxt->fetch.end = ctxt->fetch.data + insn_len;
|
||||
ctxt->opcode_len = 1;
|
||||
ctxt->intercept = x86_intercept_none;
|
||||
if (insn_len > 0)
|
||||
memcpy(ctxt->fetch.data, insn, insn_len);
|
||||
else {
|
||||
|
@ -223,7 +223,7 @@ static inline void nested_release_evmcs(struct kvm_vcpu *vcpu)
|
||||
return;
|
||||
|
||||
kvm_vcpu_unmap(vcpu, &vmx->nested.hv_evmcs_map, true);
|
||||
vmx->nested.hv_evmcs_vmptr = -1ull;
|
||||
vmx->nested.hv_evmcs_vmptr = 0;
|
||||
vmx->nested.hv_evmcs = NULL;
|
||||
}
|
||||
|
||||
@ -1828,7 +1828,8 @@ static int nested_vmx_handle_enlightened_vmptrld(struct kvm_vcpu *vcpu,
|
||||
if (!nested_enlightened_vmentry(vcpu, &evmcs_gpa))
|
||||
return 1;
|
||||
|
||||
if (unlikely(evmcs_gpa != vmx->nested.hv_evmcs_vmptr)) {
|
||||
if (unlikely(!vmx->nested.hv_evmcs ||
|
||||
evmcs_gpa != vmx->nested.hv_evmcs_vmptr)) {
|
||||
if (!vmx->nested.hv_evmcs)
|
||||
vmx->nested.current_vmptr = -1ull;
|
||||
|
||||
|
@ -106,6 +106,19 @@ static unsigned int __ioremap_check_encrypted(struct resource *res)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* The EFI runtime services data area is not covered by walk_mem_res(), but must
|
||||
* be mapped encrypted when SEV is active.
|
||||
*/
|
||||
static void __ioremap_check_other(resource_size_t addr, struct ioremap_desc *desc)
|
||||
{
|
||||
if (!sev_active())
|
||||
return;
|
||||
|
||||
if (efi_mem_type(addr) == EFI_RUNTIME_SERVICES_DATA)
|
||||
desc->flags |= IORES_MAP_ENCRYPTED;
|
||||
}
|
||||
|
||||
static int __ioremap_collect_map_flags(struct resource *res, void *arg)
|
||||
{
|
||||
struct ioremap_desc *desc = arg;
|
||||
@ -124,6 +137,9 @@ static int __ioremap_collect_map_flags(struct resource *res, void *arg)
|
||||
* To avoid multiple resource walks, this function walks resources marked as
|
||||
* IORESOURCE_MEM and IORESOURCE_BUSY and looking for system RAM and/or a
|
||||
* resource described not as IORES_DESC_NONE (e.g. IORES_DESC_ACPI_TABLES).
|
||||
*
|
||||
* After that, deal with misc other ranges in __ioremap_check_other() which do
|
||||
* not fall into the above category.
|
||||
*/
|
||||
static void __ioremap_check_mem(resource_size_t addr, unsigned long size,
|
||||
struct ioremap_desc *desc)
|
||||
@ -135,6 +151,8 @@ static void __ioremap_check_mem(resource_size_t addr, unsigned long size,
|
||||
memset(desc, 0, sizeof(struct ioremap_desc));
|
||||
|
||||
walk_mem_res(start, end, desc, __ioremap_collect_map_flags);
|
||||
|
||||
__ioremap_check_other(addr, desc);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -316,7 +316,7 @@ void efi_sync_low_kernel_mappings(void)
|
||||
static inline phys_addr_t
|
||||
virt_to_phys_or_null_size(void *va, unsigned long size)
|
||||
{
|
||||
bool bad_size;
|
||||
phys_addr_t pa;
|
||||
|
||||
if (!va)
|
||||
return 0;
|
||||
@ -324,16 +324,13 @@ virt_to_phys_or_null_size(void *va, unsigned long size)
|
||||
if (virt_addr_valid(va))
|
||||
return virt_to_phys(va);
|
||||
|
||||
/*
|
||||
* A fully aligned variable on the stack is guaranteed not to
|
||||
* cross a page bounary. Try to catch strings on the stack by
|
||||
* checking that 'size' is a power of two.
|
||||
*/
|
||||
bad_size = size > PAGE_SIZE || !is_power_of_2(size);
|
||||
pa = slow_virt_to_phys(va);
|
||||
|
||||
WARN_ON(!IS_ALIGNED((unsigned long)va, size) || bad_size);
|
||||
/* check if the object crosses a page boundary */
|
||||
if (WARN_ON((pa ^ (pa + size - 1)) & PAGE_MASK))
|
||||
return 0;
|
||||
|
||||
return slow_virt_to_phys(va);
|
||||
return pa;
|
||||
}
|
||||
|
||||
#define virt_to_phys_or_null(addr) \
|
||||
@ -791,6 +788,8 @@ static efi_status_t
|
||||
efi_thunk_get_variable(efi_char16_t *name, efi_guid_t *vendor,
|
||||
u32 *attr, unsigned long *data_size, void *data)
|
||||
{
|
||||
u8 buf[24] __aligned(8);
|
||||
efi_guid_t *vnd = PTR_ALIGN((efi_guid_t *)buf, sizeof(*vnd));
|
||||
efi_status_t status;
|
||||
u32 phys_name, phys_vendor, phys_attr;
|
||||
u32 phys_data_size, phys_data;
|
||||
@ -798,14 +797,19 @@ efi_thunk_get_variable(efi_char16_t *name, efi_guid_t *vendor,
|
||||
|
||||
spin_lock_irqsave(&efi_runtime_lock, flags);
|
||||
|
||||
*vnd = *vendor;
|
||||
|
||||
phys_data_size = virt_to_phys_or_null(data_size);
|
||||
phys_vendor = virt_to_phys_or_null(vendor);
|
||||
phys_vendor = virt_to_phys_or_null(vnd);
|
||||
phys_name = virt_to_phys_or_null_size(name, efi_name_size(name));
|
||||
phys_attr = virt_to_phys_or_null(attr);
|
||||
phys_data = virt_to_phys_or_null_size(data, *data_size);
|
||||
|
||||
status = efi_thunk(get_variable, phys_name, phys_vendor,
|
||||
phys_attr, phys_data_size, phys_data);
|
||||
if (!phys_name || (data && !phys_data))
|
||||
status = EFI_INVALID_PARAMETER;
|
||||
else
|
||||
status = efi_thunk(get_variable, phys_name, phys_vendor,
|
||||
phys_attr, phys_data_size, phys_data);
|
||||
|
||||
spin_unlock_irqrestore(&efi_runtime_lock, flags);
|
||||
|
||||
@ -816,19 +820,25 @@ static efi_status_t
|
||||
efi_thunk_set_variable(efi_char16_t *name, efi_guid_t *vendor,
|
||||
u32 attr, unsigned long data_size, void *data)
|
||||
{
|
||||
u8 buf[24] __aligned(8);
|
||||
efi_guid_t *vnd = PTR_ALIGN((efi_guid_t *)buf, sizeof(*vnd));
|
||||
u32 phys_name, phys_vendor, phys_data;
|
||||
efi_status_t status;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&efi_runtime_lock, flags);
|
||||
|
||||
*vnd = *vendor;
|
||||
|
||||
phys_name = virt_to_phys_or_null_size(name, efi_name_size(name));
|
||||
phys_vendor = virt_to_phys_or_null(vendor);
|
||||
phys_vendor = virt_to_phys_or_null(vnd);
|
||||
phys_data = virt_to_phys_or_null_size(data, data_size);
|
||||
|
||||
/* If data_size is > sizeof(u32) we've got problems */
|
||||
status = efi_thunk(set_variable, phys_name, phys_vendor,
|
||||
attr, data_size, phys_data);
|
||||
if (!phys_name || !phys_data)
|
||||
status = EFI_INVALID_PARAMETER;
|
||||
else
|
||||
status = efi_thunk(set_variable, phys_name, phys_vendor,
|
||||
attr, data_size, phys_data);
|
||||
|
||||
spin_unlock_irqrestore(&efi_runtime_lock, flags);
|
||||
|
||||
@ -840,6 +850,8 @@ efi_thunk_set_variable_nonblocking(efi_char16_t *name, efi_guid_t *vendor,
|
||||
u32 attr, unsigned long data_size,
|
||||
void *data)
|
||||
{
|
||||
u8 buf[24] __aligned(8);
|
||||
efi_guid_t *vnd = PTR_ALIGN((efi_guid_t *)buf, sizeof(*vnd));
|
||||
u32 phys_name, phys_vendor, phys_data;
|
||||
efi_status_t status;
|
||||
unsigned long flags;
|
||||
@ -847,13 +859,17 @@ efi_thunk_set_variable_nonblocking(efi_char16_t *name, efi_guid_t *vendor,
|
||||
if (!spin_trylock_irqsave(&efi_runtime_lock, flags))
|
||||
return EFI_NOT_READY;
|
||||
|
||||
*vnd = *vendor;
|
||||
|
||||
phys_name = virt_to_phys_or_null_size(name, efi_name_size(name));
|
||||
phys_vendor = virt_to_phys_or_null(vendor);
|
||||
phys_vendor = virt_to_phys_or_null(vnd);
|
||||
phys_data = virt_to_phys_or_null_size(data, data_size);
|
||||
|
||||
/* If data_size is > sizeof(u32) we've got problems */
|
||||
status = efi_thunk(set_variable, phys_name, phys_vendor,
|
||||
attr, data_size, phys_data);
|
||||
if (!phys_name || !phys_data)
|
||||
status = EFI_INVALID_PARAMETER;
|
||||
else
|
||||
status = efi_thunk(set_variable, phys_name, phys_vendor,
|
||||
attr, data_size, phys_data);
|
||||
|
||||
spin_unlock_irqrestore(&efi_runtime_lock, flags);
|
||||
|
||||
@ -865,21 +881,29 @@ efi_thunk_get_next_variable(unsigned long *name_size,
|
||||
efi_char16_t *name,
|
||||
efi_guid_t *vendor)
|
||||
{
|
||||
u8 buf[24] __aligned(8);
|
||||
efi_guid_t *vnd = PTR_ALIGN((efi_guid_t *)buf, sizeof(*vnd));
|
||||
efi_status_t status;
|
||||
u32 phys_name_size, phys_name, phys_vendor;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&efi_runtime_lock, flags);
|
||||
|
||||
*vnd = *vendor;
|
||||
|
||||
phys_name_size = virt_to_phys_or_null(name_size);
|
||||
phys_vendor = virt_to_phys_or_null(vendor);
|
||||
phys_vendor = virt_to_phys_or_null(vnd);
|
||||
phys_name = virt_to_phys_or_null_size(name, *name_size);
|
||||
|
||||
status = efi_thunk(get_next_variable, phys_name_size,
|
||||
phys_name, phys_vendor);
|
||||
if (!phys_name)
|
||||
status = EFI_INVALID_PARAMETER;
|
||||
else
|
||||
status = efi_thunk(get_next_variable, phys_name_size,
|
||||
phys_name, phys_vendor);
|
||||
|
||||
spin_unlock_irqrestore(&efi_runtime_lock, flags);
|
||||
|
||||
*vendor = *vnd;
|
||||
return status;
|
||||
}
|
||||
|
||||
|
@ -905,14 +905,15 @@ static u64 xen_read_msr_safe(unsigned int msr, int *err)
|
||||
static int xen_write_msr_safe(unsigned int msr, unsigned low, unsigned high)
|
||||
{
|
||||
int ret;
|
||||
#ifdef CONFIG_X86_64
|
||||
unsigned int which;
|
||||
u64 base;
|
||||
#endif
|
||||
|
||||
ret = 0;
|
||||
|
||||
switch (msr) {
|
||||
#ifdef CONFIG_X86_64
|
||||
unsigned which;
|
||||
u64 base;
|
||||
|
||||
case MSR_FS_BASE: which = SEGBASE_FS; goto set;
|
||||
case MSR_KERNEL_GS_BASE: which = SEGBASE_GS_USER; goto set;
|
||||
case MSR_GS_BASE: which = SEGBASE_GS_KERNEL; goto set;
|
||||
|
@ -332,7 +332,7 @@ static void bfqg_put(struct bfq_group *bfqg)
|
||||
kfree(bfqg);
|
||||
}
|
||||
|
||||
static void bfqg_and_blkg_get(struct bfq_group *bfqg)
|
||||
void bfqg_and_blkg_get(struct bfq_group *bfqg)
|
||||
{
|
||||
/* see comments in bfq_bic_update_cgroup for why refcounting bfqg */
|
||||
bfqg_get(bfqg);
|
||||
@ -634,6 +634,12 @@ void bfq_bfqq_move(struct bfq_data *bfqd, struct bfq_queue *bfqq,
|
||||
bfq_bfqq_expire(bfqd, bfqd->in_service_queue,
|
||||
false, BFQQE_PREEMPTED);
|
||||
|
||||
/*
|
||||
* get extra reference to prevent bfqq from being freed in
|
||||
* next possible deactivate
|
||||
*/
|
||||
bfqq->ref++;
|
||||
|
||||
if (bfq_bfqq_busy(bfqq))
|
||||
bfq_deactivate_bfqq(bfqd, bfqq, false, false);
|
||||
else if (entity->on_st)
|
||||
@ -653,6 +659,8 @@ void bfq_bfqq_move(struct bfq_data *bfqd, struct bfq_queue *bfqq,
|
||||
|
||||
if (!bfqd->in_service_queue && !bfqd->rq_in_driver)
|
||||
bfq_schedule_dispatch(bfqd);
|
||||
/* release extra ref taken above */
|
||||
bfq_put_queue(bfqq);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1380,6 +1388,10 @@ struct bfq_group *bfqq_group(struct bfq_queue *bfqq)
|
||||
return bfqq->bfqd->root_group;
|
||||
}
|
||||
|
||||
void bfqg_and_blkg_get(struct bfq_group *bfqg) {}
|
||||
|
||||
void bfqg_and_blkg_put(struct bfq_group *bfqg) {}
|
||||
|
||||
struct bfq_group *bfq_create_group_hierarchy(struct bfq_data *bfqd, int node)
|
||||
{
|
||||
struct bfq_group *bfqg;
|
||||
|
@ -614,6 +614,10 @@ bfq_pos_tree_add_move(struct bfq_data *bfqd, struct bfq_queue *bfqq)
|
||||
bfqq->pos_root = NULL;
|
||||
}
|
||||
|
||||
/* oom_bfqq does not participate in queue merging */
|
||||
if (bfqq == &bfqd->oom_bfqq)
|
||||
return;
|
||||
|
||||
/*
|
||||
* bfqq cannot be merged any longer (see comments in
|
||||
* bfq_setup_cooperator): no point in adding bfqq into the
|
||||
@ -4822,9 +4826,7 @@ void bfq_put_queue(struct bfq_queue *bfqq)
|
||||
{
|
||||
struct bfq_queue *item;
|
||||
struct hlist_node *n;
|
||||
#ifdef CONFIG_BFQ_GROUP_IOSCHED
|
||||
struct bfq_group *bfqg = bfqq_group(bfqq);
|
||||
#endif
|
||||
|
||||
if (bfqq->bfqd)
|
||||
bfq_log_bfqq(bfqq->bfqd, bfqq, "put_queue: %p %d",
|
||||
@ -4897,9 +4899,7 @@ void bfq_put_queue(struct bfq_queue *bfqq)
|
||||
bfqq->bfqd->last_completed_rq_bfqq = NULL;
|
||||
|
||||
kmem_cache_free(bfq_pool, bfqq);
|
||||
#ifdef CONFIG_BFQ_GROUP_IOSCHED
|
||||
bfqg_and_blkg_put(bfqg);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void bfq_put_cooperator(struct bfq_queue *bfqq)
|
||||
@ -6383,10 +6383,10 @@ static void bfq_exit_queue(struct elevator_queue *e)
|
||||
|
||||
hrtimer_cancel(&bfqd->idle_slice_timer);
|
||||
|
||||
#ifdef CONFIG_BFQ_GROUP_IOSCHED
|
||||
/* release oom-queue reference to root group */
|
||||
bfqg_and_blkg_put(bfqd->root_group);
|
||||
|
||||
#ifdef CONFIG_BFQ_GROUP_IOSCHED
|
||||
blkcg_deactivate_policy(bfqd->queue, &blkcg_policy_bfq);
|
||||
#else
|
||||
spin_lock_irq(&bfqd->lock);
|
||||
|
@ -916,6 +916,7 @@ struct bfq_group {
|
||||
|
||||
#else
|
||||
struct bfq_group {
|
||||
struct bfq_entity entity;
|
||||
struct bfq_sched_data sched_data;
|
||||
|
||||
struct bfq_queue *async_bfqq[2][IOPRIO_BE_NR];
|
||||
@ -978,6 +979,7 @@ struct bfq_group *bfq_find_set_group(struct bfq_data *bfqd,
|
||||
struct blkcg_gq *bfqg_to_blkg(struct bfq_group *bfqg);
|
||||
struct bfq_group *bfqq_group(struct bfq_queue *bfqq);
|
||||
struct bfq_group *bfq_create_group_hierarchy(struct bfq_data *bfqd, int node);
|
||||
void bfqg_and_blkg_get(struct bfq_group *bfqg);
|
||||
void bfqg_and_blkg_put(struct bfq_group *bfqg);
|
||||
|
||||
#ifdef CONFIG_BFQ_GROUP_IOSCHED
|
||||
|
@ -536,7 +536,9 @@ static void bfq_get_entity(struct bfq_entity *entity)
|
||||
bfqq->ref++;
|
||||
bfq_log_bfqq(bfqq->bfqd, bfqq, "get_entity: %p %d",
|
||||
bfqq, bfqq->ref);
|
||||
}
|
||||
} else
|
||||
bfqg_and_blkg_get(container_of(entity, struct bfq_group,
|
||||
entity));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -650,8 +652,14 @@ static void bfq_forget_entity(struct bfq_service_tree *st,
|
||||
|
||||
entity->on_st = false;
|
||||
st->wsum -= entity->weight;
|
||||
if (bfqq && !is_in_service)
|
||||
if (is_in_service)
|
||||
return;
|
||||
|
||||
if (bfqq)
|
||||
bfq_put_queue(bfqq);
|
||||
else
|
||||
bfqg_and_blkg_put(container_of(entity, struct bfq_group,
|
||||
entity));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1318,7 +1318,7 @@ static bool iocg_is_idle(struct ioc_gq *iocg)
|
||||
return false;
|
||||
|
||||
/* is something in flight? */
|
||||
if (atomic64_read(&iocg->done_vtime) < atomic64_read(&iocg->vtime))
|
||||
if (atomic64_read(&iocg->done_vtime) != atomic64_read(&iocg->vtime))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
|
4
build.config.allmodconfig.arm
Normal file
4
build.config.allmodconfig.arm
Normal file
@ -0,0 +1,4 @@
|
||||
. ${ROOT_DIR}/common/build.config.common
|
||||
. ${ROOT_DIR}/common/build.config.arm
|
||||
. ${ROOT_DIR}/common/build.config.allmodconfig
|
||||
|
12
build.config.arm
Normal file
12
build.config.arm
Normal file
@ -0,0 +1,12 @@
|
||||
ARCH=arm
|
||||
|
||||
CLANG_TRIPLE=arm-linux-gnueabi-
|
||||
CROSS_COMPILE=arm-linux-androidkernel-
|
||||
LINUX_GCC_CROSS_COMPILE_PREBUILTS_BIN=prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin
|
||||
|
||||
FILES="
|
||||
arch/arm/boot/Image.gz
|
||||
arch/arm/boot/Image
|
||||
vmlinux
|
||||
System.map
|
||||
"
|
2
build.config.gki-debug.aarch64
Normal file
2
build.config.gki-debug.aarch64
Normal file
@ -0,0 +1,2 @@
|
||||
. ${ROOT_DIR}/common/build.config.gki.aarch64
|
||||
TRIM_NONLISTED_KMI=""
|
2
build.config.gki-debug.x86_64
Normal file
2
build.config.gki-debug.x86_64
Normal file
@ -0,0 +1,2 @@
|
||||
. ${ROOT_DIR}/common/build.config.gki.x86_64
|
||||
TRIM_NONLISTED_KMI=""
|
@ -18,3 +18,5 @@ CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y
|
||||
CONFIG_TEST_STACKINIT=m
|
||||
CONFIG_TEST_MEMINIT=m
|
||||
CONFIG_SDCARD_FS=m
|
||||
CONFIG_TCG_TPM=m
|
||||
CONFIG_TCG_VTPM_PROXY=m
|
||||
|
@ -5444,6 +5444,7 @@ static int binder_open(struct inode *nodp, struct file *filp)
|
||||
binder_dev = container_of(filp->private_data,
|
||||
struct binder_device, miscdev);
|
||||
}
|
||||
refcount_inc(&binder_dev->ref);
|
||||
proc->context = &binder_dev->context;
|
||||
binder_alloc_init(&proc->alloc);
|
||||
|
||||
@ -5621,6 +5622,7 @@ static int binder_node_release(struct binder_node *node, int refs)
|
||||
static void binder_deferred_release(struct binder_proc *proc)
|
||||
{
|
||||
struct binder_context *context = proc->context;
|
||||
struct binder_device *device;
|
||||
struct rb_node *n;
|
||||
int threads, nodes, incoming_refs, outgoing_refs, active_transactions;
|
||||
|
||||
@ -5637,6 +5639,12 @@ static void binder_deferred_release(struct binder_proc *proc)
|
||||
context->binder_context_mgr_node = NULL;
|
||||
}
|
||||
mutex_unlock(&context->context_mgr_node_lock);
|
||||
device = container_of(proc->context, struct binder_device, context);
|
||||
if (refcount_dec_and_test(&device->ref)) {
|
||||
kfree(context->name);
|
||||
kfree(device);
|
||||
}
|
||||
proc->context = NULL;
|
||||
binder_inner_proc_lock(proc);
|
||||
/*
|
||||
* Make sure proc stays alive after we
|
||||
@ -6295,6 +6303,7 @@ static int __init init_binder_device(const char *name)
|
||||
binder_device->miscdev.minor = MISC_DYNAMIC_MINOR;
|
||||
binder_device->miscdev.name = name;
|
||||
|
||||
refcount_set(&binder_device->ref, 1);
|
||||
binder_device->context.binder_context_mgr_uid = INVALID_UID;
|
||||
binder_device->context.name = name;
|
||||
mutex_init(&binder_device->context.context_mgr_node_lock);
|
||||
|
@ -8,6 +8,7 @@
|
||||
#include <linux/list.h>
|
||||
#include <linux/miscdevice.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/refcount.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/uidgid.h>
|
||||
@ -33,6 +34,7 @@ struct binder_device {
|
||||
struct miscdevice miscdev;
|
||||
struct binder_context context;
|
||||
struct inode *binderfs_inode;
|
||||
refcount_t ref;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -154,6 +154,7 @@ static int binderfs_binder_device_create(struct inode *ref_inode,
|
||||
if (!name)
|
||||
goto err;
|
||||
|
||||
refcount_set(&device->ref, 1);
|
||||
device->binderfs_inode = inode;
|
||||
device->context.binder_context_mgr_uid = INVALID_UID;
|
||||
device->context.name = name;
|
||||
@ -257,8 +258,10 @@ static void binderfs_evict_inode(struct inode *inode)
|
||||
ida_free(&binderfs_minors, device->miscdev.minor);
|
||||
mutex_unlock(&binderfs_minors_mutex);
|
||||
|
||||
kfree(device->context.name);
|
||||
kfree(device);
|
||||
if (refcount_dec_and_test(&device->ref)) {
|
||||
kfree(device->context.name);
|
||||
kfree(device);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -523,9 +523,13 @@ static void device_link_add_missing_supplier_links(void)
|
||||
|
||||
mutex_lock(&wfs_lock);
|
||||
list_for_each_entry_safe(dev, tmp, &wait_for_suppliers,
|
||||
links.needs_suppliers)
|
||||
if (!fwnode_call_int_op(dev->fwnode, add_links, dev))
|
||||
links.needs_suppliers) {
|
||||
int ret = fwnode_call_int_op(dev->fwnode, add_links, dev);
|
||||
if (!ret)
|
||||
list_del_init(&dev->links.needs_suppliers);
|
||||
else if (ret != -ENODEV)
|
||||
dev->links.need_for_probe = false;
|
||||
}
|
||||
mutex_unlock(&wfs_lock);
|
||||
}
|
||||
|
||||
@ -718,6 +722,8 @@ static void __device_links_queue_sync_state(struct device *dev,
|
||||
{
|
||||
struct device_link *link;
|
||||
|
||||
if (!dev_has_sync_state(dev))
|
||||
return;
|
||||
if (dev->state_synced)
|
||||
return;
|
||||
|
||||
@ -819,7 +825,7 @@ late_initcall(sync_state_resume_initcall);
|
||||
|
||||
static void __device_links_supplier_defer_sync(struct device *sup)
|
||||
{
|
||||
if (list_empty(&sup->links.defer_sync))
|
||||
if (list_empty(&sup->links.defer_sync) && dev_has_sync_state(sup))
|
||||
list_add_tail(&sup->links.defer_sync, &deferred_sync);
|
||||
}
|
||||
|
||||
|
@ -335,10 +335,10 @@ static void setup_pdev_dma_masks(struct platform_device *pdev)
|
||||
{
|
||||
if (!pdev->dev.coherent_dma_mask)
|
||||
pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
|
||||
if (!pdev->dma_mask)
|
||||
pdev->dma_mask = DMA_BIT_MASK(32);
|
||||
if (!pdev->dev.dma_mask)
|
||||
pdev->dev.dma_mask = &pdev->dma_mask;
|
||||
if (!pdev->dev.dma_mask) {
|
||||
pdev->platform_dma_mask = DMA_BIT_MASK(32);
|
||||
pdev->dev.dma_mask = &pdev->platform_dma_mask;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
@ -634,20 +634,8 @@ struct platform_device *platform_device_register_full(
|
||||
pdev->dev.of_node_reused = pdevinfo->of_node_reused;
|
||||
|
||||
if (pdevinfo->dma_mask) {
|
||||
/*
|
||||
* This memory isn't freed when the device is put,
|
||||
* I don't have a nice idea for that though. Conceptually
|
||||
* dma_mask in struct device should not be a pointer.
|
||||
* See http://thread.gmane.org/gmane.linux.kernel.pci/9081
|
||||
*/
|
||||
pdev->dev.dma_mask =
|
||||
kmalloc(sizeof(*pdev->dev.dma_mask), GFP_KERNEL);
|
||||
if (!pdev->dev.dma_mask)
|
||||
goto err;
|
||||
|
||||
kmemleak_ignore(pdev->dev.dma_mask);
|
||||
|
||||
*pdev->dev.dma_mask = pdevinfo->dma_mask;
|
||||
pdev->platform_dma_mask = pdevinfo->dma_mask;
|
||||
pdev->dev.dma_mask = &pdev->platform_dma_mask;
|
||||
pdev->dev.coherent_dma_mask = pdevinfo->dma_mask;
|
||||
}
|
||||
|
||||
@ -672,7 +660,6 @@ struct platform_device *platform_device_register_full(
|
||||
if (ret) {
|
||||
err:
|
||||
ACPI_COMPANION_SET(&pdev->dev, NULL);
|
||||
kfree(pdev->dev.dma_mask);
|
||||
platform_device_put(pdev);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
@ -341,10 +341,12 @@ static blk_status_t virtio_queue_rq(struct blk_mq_hw_ctx *hctx,
|
||||
err = virtblk_add_req(vblk->vqs[qid].vq, vbr, vbr->sg, num);
|
||||
if (err) {
|
||||
virtqueue_kick(vblk->vqs[qid].vq);
|
||||
blk_mq_stop_hw_queue(hctx);
|
||||
/* Don't stop the queue if -ENOMEM: we may have failed to
|
||||
* bounce the buffer due to global resource outage.
|
||||
*/
|
||||
if (err == -ENOSPC)
|
||||
blk_mq_stop_hw_queue(hctx);
|
||||
spin_unlock_irqrestore(&vblk->vqs[qid].lock, flags);
|
||||
/* Out of mem doesn't actually happen, since we fall back
|
||||
* to direct descriptors */
|
||||
if (err == -ENOMEM || err == -ENOSPC)
|
||||
return BLK_STS_DEV_RESOURCE;
|
||||
return BLK_STS_IOERR;
|
||||
|
@ -1406,7 +1406,7 @@ static void sysc_init_revision_quirks(struct sysc *ddata)
|
||||
}
|
||||
|
||||
/* 1-wire needs module's internal clocks enabled for reset */
|
||||
static void sysc_clk_enable_quirk_hdq1w(struct sysc *ddata)
|
||||
static void sysc_pre_reset_quirk_hdq1w(struct sysc *ddata)
|
||||
{
|
||||
int offset = 0x0c; /* HDQ_CTRL_STATUS */
|
||||
u16 val;
|
||||
@ -1494,7 +1494,7 @@ static void sysc_init_module_quirks(struct sysc *ddata)
|
||||
return;
|
||||
|
||||
if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_HDQ1W) {
|
||||
ddata->clk_enable_quirk = sysc_clk_enable_quirk_hdq1w;
|
||||
ddata->clk_disable_quirk = sysc_pre_reset_quirk_hdq1w;
|
||||
|
||||
return;
|
||||
}
|
||||
|
@ -194,7 +194,7 @@ static int platform_ipmi_probe(struct platform_device *pdev)
|
||||
else
|
||||
io.slave_addr = slave_addr;
|
||||
|
||||
io.irq = platform_get_irq(pdev, 0);
|
||||
io.irq = platform_get_irq_optional(pdev, 0);
|
||||
if (io.irq > 0)
|
||||
io.irq_setup = ipmi_std_irq_setup;
|
||||
else
|
||||
@ -378,7 +378,7 @@ static int acpi_ipmi_probe(struct platform_device *pdev)
|
||||
io.irq = tmp;
|
||||
io.irq_setup = acpi_gpe_irq_setup;
|
||||
} else {
|
||||
int irq = platform_get_irq(pdev, 0);
|
||||
int irq = platform_get_irq_optional(pdev, 0);
|
||||
|
||||
if (irq > 0) {
|
||||
io.irq = irq;
|
||||
|
@ -15,36 +15,14 @@
|
||||
|
||||
#include <linux/cpufreq.h>
|
||||
#include <linux/cpufreq_times.h>
|
||||
#include <linux/hashtable.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/threads.h>
|
||||
|
||||
#define UID_HASH_BITS 10
|
||||
|
||||
static DECLARE_HASHTABLE(uid_hash_table, UID_HASH_BITS);
|
||||
|
||||
static DEFINE_SPINLOCK(task_time_in_state_lock); /* task->time_in_state */
|
||||
static DEFINE_SPINLOCK(uid_lock); /* uid_hash_table */
|
||||
|
||||
struct concurrent_times {
|
||||
atomic64_t active[NR_CPUS];
|
||||
atomic64_t policy[NR_CPUS];
|
||||
};
|
||||
|
||||
struct uid_entry {
|
||||
uid_t uid;
|
||||
unsigned int max_state;
|
||||
struct hlist_node hash;
|
||||
struct rcu_head rcu;
|
||||
struct concurrent_times *concurrent_times;
|
||||
u64 time_in_state[0];
|
||||
};
|
||||
|
||||
/**
|
||||
* struct cpu_freqs - per-cpu frequency information
|
||||
@ -64,248 +42,6 @@ static struct cpu_freqs *all_freqs[NR_CPUS];
|
||||
|
||||
static unsigned int next_offset;
|
||||
|
||||
|
||||
/* Caller must hold rcu_read_lock() */
|
||||
static struct uid_entry *find_uid_entry_rcu(uid_t uid)
|
||||
{
|
||||
struct uid_entry *uid_entry;
|
||||
|
||||
hash_for_each_possible_rcu(uid_hash_table, uid_entry, hash, uid) {
|
||||
if (uid_entry->uid == uid)
|
||||
return uid_entry;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Caller must hold uid lock */
|
||||
static struct uid_entry *find_uid_entry_locked(uid_t uid)
|
||||
{
|
||||
struct uid_entry *uid_entry;
|
||||
|
||||
hash_for_each_possible(uid_hash_table, uid_entry, hash, uid) {
|
||||
if (uid_entry->uid == uid)
|
||||
return uid_entry;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Caller must hold uid lock */
|
||||
static struct uid_entry *find_or_register_uid_locked(uid_t uid)
|
||||
{
|
||||
struct uid_entry *uid_entry, *temp;
|
||||
struct concurrent_times *times;
|
||||
unsigned int max_state = READ_ONCE(next_offset);
|
||||
size_t alloc_size = sizeof(*uid_entry) + max_state *
|
||||
sizeof(uid_entry->time_in_state[0]);
|
||||
|
||||
uid_entry = find_uid_entry_locked(uid);
|
||||
if (uid_entry) {
|
||||
if (uid_entry->max_state == max_state)
|
||||
return uid_entry;
|
||||
/* uid_entry->time_in_state is too small to track all freqs, so
|
||||
* expand it.
|
||||
*/
|
||||
temp = __krealloc(uid_entry, alloc_size, GFP_ATOMIC);
|
||||
if (!temp)
|
||||
return uid_entry;
|
||||
temp->max_state = max_state;
|
||||
memset(temp->time_in_state + uid_entry->max_state, 0,
|
||||
(max_state - uid_entry->max_state) *
|
||||
sizeof(uid_entry->time_in_state[0]));
|
||||
if (temp != uid_entry) {
|
||||
hlist_replace_rcu(&uid_entry->hash, &temp->hash);
|
||||
kfree_rcu(uid_entry, rcu);
|
||||
}
|
||||
return temp;
|
||||
}
|
||||
|
||||
uid_entry = kzalloc(alloc_size, GFP_ATOMIC);
|
||||
if (!uid_entry)
|
||||
return NULL;
|
||||
times = kzalloc(sizeof(*times), GFP_ATOMIC);
|
||||
if (!times) {
|
||||
kfree(uid_entry);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
uid_entry->uid = uid;
|
||||
uid_entry->max_state = max_state;
|
||||
uid_entry->concurrent_times = times;
|
||||
|
||||
hash_add_rcu(uid_hash_table, &uid_entry->hash, uid);
|
||||
|
||||
return uid_entry;
|
||||
}
|
||||
|
||||
static int single_uid_time_in_state_show(struct seq_file *m, void *ptr)
|
||||
{
|
||||
struct uid_entry *uid_entry;
|
||||
unsigned int i;
|
||||
uid_t uid = from_kuid_munged(current_user_ns(), *(kuid_t *)m->private);
|
||||
|
||||
if (uid == overflowuid)
|
||||
return -EINVAL;
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
uid_entry = find_uid_entry_rcu(uid);
|
||||
if (!uid_entry) {
|
||||
rcu_read_unlock();
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < uid_entry->max_state; ++i) {
|
||||
u64 time = nsec_to_clock_t(uid_entry->time_in_state[i]);
|
||||
seq_write(m, &time, sizeof(time));
|
||||
}
|
||||
|
||||
rcu_read_unlock();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void *uid_seq_start(struct seq_file *seq, loff_t *pos)
|
||||
{
|
||||
if (*pos >= HASH_SIZE(uid_hash_table))
|
||||
return NULL;
|
||||
|
||||
return &uid_hash_table[*pos];
|
||||
}
|
||||
|
||||
static void *uid_seq_next(struct seq_file *seq, void *v, loff_t *pos)
|
||||
{
|
||||
do {
|
||||
(*pos)++;
|
||||
|
||||
if (*pos >= HASH_SIZE(uid_hash_table))
|
||||
return NULL;
|
||||
} while (hlist_empty(&uid_hash_table[*pos]));
|
||||
|
||||
return &uid_hash_table[*pos];
|
||||
}
|
||||
|
||||
static void uid_seq_stop(struct seq_file *seq, void *v) { }
|
||||
|
||||
static int uid_time_in_state_seq_show(struct seq_file *m, void *v)
|
||||
{
|
||||
struct uid_entry *uid_entry;
|
||||
struct cpu_freqs *freqs, *last_freqs = NULL;
|
||||
int i, cpu;
|
||||
|
||||
if (v == uid_hash_table) {
|
||||
seq_puts(m, "uid:");
|
||||
for_each_possible_cpu(cpu) {
|
||||
freqs = all_freqs[cpu];
|
||||
if (!freqs || freqs == last_freqs)
|
||||
continue;
|
||||
last_freqs = freqs;
|
||||
for (i = 0; i < freqs->max_state; i++) {
|
||||
seq_put_decimal_ull(m, " ",
|
||||
freqs->freq_table[i]);
|
||||
}
|
||||
}
|
||||
seq_putc(m, '\n');
|
||||
}
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
hlist_for_each_entry_rcu(uid_entry, (struct hlist_head *)v, hash) {
|
||||
if (uid_entry->max_state) {
|
||||
seq_put_decimal_ull(m, "", uid_entry->uid);
|
||||
seq_putc(m, ':');
|
||||
}
|
||||
for (i = 0; i < uid_entry->max_state; ++i) {
|
||||
u64 time = nsec_to_clock_t(uid_entry->time_in_state[i]);
|
||||
seq_put_decimal_ull(m, " ", time);
|
||||
}
|
||||
if (uid_entry->max_state)
|
||||
seq_putc(m, '\n');
|
||||
}
|
||||
|
||||
rcu_read_unlock();
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int concurrent_time_seq_show(struct seq_file *m, void *v,
|
||||
atomic64_t *(*get_times)(struct concurrent_times *))
|
||||
{
|
||||
struct uid_entry *uid_entry;
|
||||
int i, num_possible_cpus = num_possible_cpus();
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
hlist_for_each_entry_rcu(uid_entry, (struct hlist_head *)v, hash) {
|
||||
atomic64_t *times = get_times(uid_entry->concurrent_times);
|
||||
|
||||
seq_put_decimal_ull(m, "", (u64)uid_entry->uid);
|
||||
seq_putc(m, ':');
|
||||
|
||||
for (i = 0; i < num_possible_cpus; ++i) {
|
||||
u64 time = nsec_to_clock_t(atomic64_read(×[i]));
|
||||
|
||||
seq_put_decimal_ull(m, " ", time);
|
||||
}
|
||||
seq_putc(m, '\n');
|
||||
}
|
||||
|
||||
rcu_read_unlock();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline atomic64_t *get_active_times(struct concurrent_times *times)
|
||||
{
|
||||
return times->active;
|
||||
}
|
||||
|
||||
static int concurrent_active_time_seq_show(struct seq_file *m, void *v)
|
||||
{
|
||||
if (v == uid_hash_table) {
|
||||
seq_put_decimal_ull(m, "cpus: ", num_possible_cpus());
|
||||
seq_putc(m, '\n');
|
||||
}
|
||||
|
||||
return concurrent_time_seq_show(m, v, get_active_times);
|
||||
}
|
||||
|
||||
static inline atomic64_t *get_policy_times(struct concurrent_times *times)
|
||||
{
|
||||
return times->policy;
|
||||
}
|
||||
|
||||
static int concurrent_policy_time_seq_show(struct seq_file *m, void *v)
|
||||
{
|
||||
int i;
|
||||
struct cpu_freqs *freqs, *last_freqs = NULL;
|
||||
|
||||
if (v == uid_hash_table) {
|
||||
int cnt = 0;
|
||||
|
||||
for_each_possible_cpu(i) {
|
||||
freqs = all_freqs[i];
|
||||
if (!freqs)
|
||||
continue;
|
||||
if (freqs != last_freqs) {
|
||||
if (last_freqs) {
|
||||
seq_put_decimal_ull(m, ": ", cnt);
|
||||
seq_putc(m, ' ');
|
||||
cnt = 0;
|
||||
}
|
||||
seq_put_decimal_ull(m, "policy", i);
|
||||
|
||||
last_freqs = freqs;
|
||||
}
|
||||
cnt++;
|
||||
}
|
||||
if (last_freqs) {
|
||||
seq_put_decimal_ull(m, ": ", cnt);
|
||||
seq_putc(m, '\n');
|
||||
}
|
||||
}
|
||||
|
||||
return concurrent_time_seq_show(m, v, get_policy_times);
|
||||
}
|
||||
|
||||
void cpufreq_task_times_init(struct task_struct *p)
|
||||
{
|
||||
unsigned long flags;
|
||||
@ -398,14 +134,7 @@ void cpufreq_acct_update_power(struct task_struct *p, u64 cputime)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int state;
|
||||
unsigned int active_cpu_cnt = 0;
|
||||
unsigned int policy_cpu_cnt = 0;
|
||||
unsigned int policy_first_cpu;
|
||||
struct uid_entry *uid_entry;
|
||||
struct cpu_freqs *freqs = all_freqs[task_cpu(p)];
|
||||
struct cpufreq_policy *policy;
|
||||
uid_t uid = from_kuid_munged(current_user_ns(), task_uid(p));
|
||||
int cpu = 0;
|
||||
|
||||
if (!freqs || is_idle_task(p) || p->flags & PF_EXITING)
|
||||
return;
|
||||
@ -417,48 +146,6 @@ void cpufreq_acct_update_power(struct task_struct *p, u64 cputime)
|
||||
p->time_in_state)
|
||||
p->time_in_state[state] += cputime;
|
||||
spin_unlock_irqrestore(&task_time_in_state_lock, flags);
|
||||
|
||||
spin_lock_irqsave(&uid_lock, flags);
|
||||
uid_entry = find_or_register_uid_locked(uid);
|
||||
if (uid_entry && state < uid_entry->max_state)
|
||||
uid_entry->time_in_state[state] += cputime;
|
||||
spin_unlock_irqrestore(&uid_lock, flags);
|
||||
|
||||
rcu_read_lock();
|
||||
uid_entry = find_uid_entry_rcu(uid);
|
||||
if (!uid_entry) {
|
||||
rcu_read_unlock();
|
||||
return;
|
||||
}
|
||||
|
||||
for_each_possible_cpu(cpu)
|
||||
if (!idle_cpu(cpu))
|
||||
++active_cpu_cnt;
|
||||
|
||||
atomic64_add(cputime,
|
||||
&uid_entry->concurrent_times->active[active_cpu_cnt - 1]);
|
||||
|
||||
policy = cpufreq_cpu_get(task_cpu(p));
|
||||
if (!policy) {
|
||||
/*
|
||||
* This CPU may have just come up and not have a cpufreq policy
|
||||
* yet.
|
||||
*/
|
||||
rcu_read_unlock();
|
||||
return;
|
||||
}
|
||||
|
||||
for_each_cpu(cpu, policy->related_cpus)
|
||||
if (!idle_cpu(cpu))
|
||||
++policy_cpu_cnt;
|
||||
|
||||
policy_first_cpu = cpumask_first(policy->related_cpus);
|
||||
cpufreq_cpu_put(policy);
|
||||
|
||||
atomic64_add(cputime,
|
||||
&uid_entry->concurrent_times->policy[policy_first_cpu +
|
||||
policy_cpu_cnt - 1]);
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
static int cpufreq_times_get_index(struct cpu_freqs *freqs, unsigned int freq)
|
||||
@ -510,35 +197,6 @@ void cpufreq_times_create_policy(struct cpufreq_policy *policy)
|
||||
all_freqs[cpu] = freqs;
|
||||
}
|
||||
|
||||
static void uid_entry_reclaim(struct rcu_head *rcu)
|
||||
{
|
||||
struct uid_entry *uid_entry = container_of(rcu, struct uid_entry, rcu);
|
||||
|
||||
kfree(uid_entry->concurrent_times);
|
||||
kfree(uid_entry);
|
||||
}
|
||||
|
||||
void cpufreq_task_times_remove_uids(uid_t uid_start, uid_t uid_end)
|
||||
{
|
||||
struct uid_entry *uid_entry;
|
||||
struct hlist_node *tmp;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&uid_lock, flags);
|
||||
|
||||
for (; uid_start <= uid_end; uid_start++) {
|
||||
hash_for_each_possible_safe(uid_hash_table, uid_entry, tmp,
|
||||
hash, uid_start) {
|
||||
if (uid_start == uid_entry->uid) {
|
||||
hash_del_rcu(&uid_entry->hash);
|
||||
call_rcu(&uid_entry->rcu, uid_entry_reclaim);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&uid_lock, flags);
|
||||
}
|
||||
|
||||
void cpufreq_times_record_transition(struct cpufreq_policy *policy,
|
||||
unsigned int new_freq)
|
||||
{
|
||||
@ -551,82 +209,3 @@ void cpufreq_times_record_transition(struct cpufreq_policy *policy,
|
||||
if (index >= 0)
|
||||
WRITE_ONCE(freqs->last_index, index);
|
||||
}
|
||||
|
||||
static const struct seq_operations uid_time_in_state_seq_ops = {
|
||||
.start = uid_seq_start,
|
||||
.next = uid_seq_next,
|
||||
.stop = uid_seq_stop,
|
||||
.show = uid_time_in_state_seq_show,
|
||||
};
|
||||
|
||||
static int uid_time_in_state_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return seq_open(file, &uid_time_in_state_seq_ops);
|
||||
}
|
||||
|
||||
int single_uid_time_in_state_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, single_uid_time_in_state_show,
|
||||
&(inode->i_uid));
|
||||
}
|
||||
|
||||
static const struct file_operations uid_time_in_state_fops = {
|
||||
.open = uid_time_in_state_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = seq_release,
|
||||
};
|
||||
|
||||
static const struct seq_operations concurrent_active_time_seq_ops = {
|
||||
.start = uid_seq_start,
|
||||
.next = uid_seq_next,
|
||||
.stop = uid_seq_stop,
|
||||
.show = concurrent_active_time_seq_show,
|
||||
};
|
||||
|
||||
static int concurrent_active_time_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return seq_open(file, &concurrent_active_time_seq_ops);
|
||||
}
|
||||
|
||||
static const struct file_operations concurrent_active_time_fops = {
|
||||
.open = concurrent_active_time_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = seq_release,
|
||||
};
|
||||
|
||||
static const struct seq_operations concurrent_policy_time_seq_ops = {
|
||||
.start = uid_seq_start,
|
||||
.next = uid_seq_next,
|
||||
.stop = uid_seq_stop,
|
||||
.show = concurrent_policy_time_seq_show,
|
||||
};
|
||||
|
||||
static int concurrent_policy_time_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return seq_open(file, &concurrent_policy_time_seq_ops);
|
||||
}
|
||||
|
||||
static const struct file_operations concurrent_policy_time_fops = {
|
||||
.open = concurrent_policy_time_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = seq_release,
|
||||
};
|
||||
|
||||
static int __init cpufreq_times_init(void)
|
||||
{
|
||||
proc_create_data("uid_time_in_state", 0444, NULL,
|
||||
&uid_time_in_state_fops, NULL);
|
||||
|
||||
proc_create_data("uid_concurrent_active_time", 0444, NULL,
|
||||
&concurrent_active_time_fops, NULL);
|
||||
|
||||
proc_create_data("uid_concurrent_policy_time", 0444, NULL,
|
||||
&concurrent_policy_time_fops, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
early_initcall(cpufreq_times_init);
|
||||
|
@ -111,6 +111,7 @@ static int dma_buf_release(struct inode *inode, struct file *file)
|
||||
dma_resv_fini(dmabuf->resv);
|
||||
|
||||
module_put(dmabuf->owner);
|
||||
kfree(dmabuf->name);
|
||||
kfree(msm_dma_buf);
|
||||
return 0;
|
||||
}
|
||||
|
@ -1947,8 +1947,6 @@ static void dma_tc_handle(struct coh901318_chan *cohc)
|
||||
return;
|
||||
}
|
||||
|
||||
spin_lock(&cohc->lock);
|
||||
|
||||
/*
|
||||
* When we reach this point, at least one queue item
|
||||
* should have been moved over from cohc->queue to
|
||||
@ -1969,8 +1967,6 @@ static void dma_tc_handle(struct coh901318_chan *cohc)
|
||||
if (coh901318_queue_start(cohc) == NULL)
|
||||
cohc->busy = 0;
|
||||
|
||||
spin_unlock(&cohc->lock);
|
||||
|
||||
/*
|
||||
* This tasklet will remove items from cohc->active
|
||||
* and thus terminates them.
|
||||
|
@ -1328,13 +1328,14 @@ static void sdma_free_chan_resources(struct dma_chan *chan)
|
||||
|
||||
sdma_channel_synchronize(chan);
|
||||
|
||||
if (sdmac->event_id0)
|
||||
if (sdmac->event_id0 >= 0)
|
||||
sdma_event_disable(sdmac, sdmac->event_id0);
|
||||
if (sdmac->event_id1)
|
||||
sdma_event_disable(sdmac, sdmac->event_id1);
|
||||
|
||||
sdmac->event_id0 = 0;
|
||||
sdmac->event_id1 = 0;
|
||||
sdmac->context_loaded = false;
|
||||
|
||||
sdma_set_channel_priority(sdmac, 0);
|
||||
|
||||
@ -1628,7 +1629,7 @@ static int sdma_config(struct dma_chan *chan,
|
||||
memcpy(&sdmac->slave_config, dmaengine_cfg, sizeof(*dmaengine_cfg));
|
||||
|
||||
/* Set ENBLn earlier to make sure dma request triggered after that */
|
||||
if (sdmac->event_id0) {
|
||||
if (sdmac->event_id0 >= 0) {
|
||||
if (sdmac->event_id0 >= sdmac->sdma->drvdata->num_events)
|
||||
return -EINVAL;
|
||||
sdma_event_enable(sdmac, sdmac->event_id0);
|
||||
|
@ -281,7 +281,7 @@ static struct tegra_dma_desc *tegra_dma_desc_get(
|
||||
|
||||
/* Do not allocate if desc are waiting for ack */
|
||||
list_for_each_entry(dma_desc, &tdc->free_dma_desc, node) {
|
||||
if (async_tx_test_ack(&dma_desc->txd)) {
|
||||
if (async_tx_test_ack(&dma_desc->txd) && !dma_desc->cb_count) {
|
||||
list_del(&dma_desc->node);
|
||||
spin_unlock_irqrestore(&tdc->lock, flags);
|
||||
dma_desc->txd.flags = 0;
|
||||
@ -756,10 +756,6 @@ static int tegra_dma_terminate_all(struct dma_chan *dc)
|
||||
bool was_busy;
|
||||
|
||||
spin_lock_irqsave(&tdc->lock, flags);
|
||||
if (list_empty(&tdc->pending_sg_req)) {
|
||||
spin_unlock_irqrestore(&tdc->lock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!tdc->busy)
|
||||
goto skip_dma_stop;
|
||||
|
@ -479,20 +479,14 @@ static void handle_error(struct mem_ctl_info *mci, struct synps_ecc_status *p)
|
||||
pinf = &p->ceinfo;
|
||||
if (!priv->p_data->quirks) {
|
||||
snprintf(priv->message, SYNPS_EDAC_MSG_SIZE,
|
||||
"DDR ECC error type:%s Row %d Bank %d Col %d ",
|
||||
"CE", pinf->row, pinf->bank, pinf->col);
|
||||
snprintf(priv->message, SYNPS_EDAC_MSG_SIZE,
|
||||
"Bit Position: %d Data: 0x%08x\n",
|
||||
"DDR ECC error type:%s Row %d Bank %d Col %d Bit Position: %d Data: 0x%08x",
|
||||
"CE", pinf->row, pinf->bank, pinf->col,
|
||||
pinf->bitpos, pinf->data);
|
||||
} else {
|
||||
snprintf(priv->message, SYNPS_EDAC_MSG_SIZE,
|
||||
"DDR ECC error type:%s Row %d Bank %d Col %d ",
|
||||
"CE", pinf->row, pinf->bank, pinf->col);
|
||||
snprintf(priv->message, SYNPS_EDAC_MSG_SIZE,
|
||||
"BankGroup Number %d Block Number %d ",
|
||||
pinf->bankgrpnr, pinf->blknr);
|
||||
snprintf(priv->message, SYNPS_EDAC_MSG_SIZE,
|
||||
"Bit Position: %d Data: 0x%08x\n",
|
||||
"DDR ECC error type:%s Row %d Bank %d Col %d BankGroup Number %d Block Number %d Bit Position: %d Data: 0x%08x",
|
||||
"CE", pinf->row, pinf->bank, pinf->col,
|
||||
pinf->bankgrpnr, pinf->blknr,
|
||||
pinf->bitpos, pinf->data);
|
||||
}
|
||||
|
||||
@ -509,10 +503,8 @@ static void handle_error(struct mem_ctl_info *mci, struct synps_ecc_status *p)
|
||||
"UE", pinf->row, pinf->bank, pinf->col);
|
||||
} else {
|
||||
snprintf(priv->message, SYNPS_EDAC_MSG_SIZE,
|
||||
"DDR ECC error type :%s Row %d Bank %d Col %d ",
|
||||
"UE", pinf->row, pinf->bank, pinf->col);
|
||||
snprintf(priv->message, SYNPS_EDAC_MSG_SIZE,
|
||||
"BankGroup Number %d Block Number %d",
|
||||
"DDR ECC error type :%s Row %d Bank %d Col %d BankGroup Number %d Block Number %d",
|
||||
"UE", pinf->row, pinf->bank, pinf->col,
|
||||
pinf->bankgrpnr, pinf->blknr);
|
||||
}
|
||||
|
||||
|
@ -544,7 +544,7 @@ int __init efi_config_parse_tables(void *config_tables, int count, int sz,
|
||||
|
||||
seed = early_memremap(efi.rng_seed, sizeof(*seed));
|
||||
if (seed != NULL) {
|
||||
size = seed->size;
|
||||
size = READ_ONCE(seed->size);
|
||||
early_memunmap(seed, sizeof(*seed));
|
||||
} else {
|
||||
pr_err("Could not map UEFI random seed!\n");
|
||||
@ -554,7 +554,7 @@ int __init efi_config_parse_tables(void *config_tables, int count, int sz,
|
||||
sizeof(*seed) + size);
|
||||
if (seed != NULL) {
|
||||
pr_notice("seeding entropy pool\n");
|
||||
add_bootloader_randomness(seed->bits, seed->size);
|
||||
add_bootloader_randomness(seed->bits, size);
|
||||
early_memunmap(seed, sizeof(*seed) + size);
|
||||
} else {
|
||||
pr_err("Could not map UEFI random seed!\n");
|
||||
|
@ -83,13 +83,16 @@ static ssize_t
|
||||
efivar_attr_read(struct efivar_entry *entry, char *buf)
|
||||
{
|
||||
struct efi_variable *var = &entry->var;
|
||||
unsigned long size = sizeof(var->Data);
|
||||
char *str = buf;
|
||||
int ret;
|
||||
|
||||
if (!entry || !buf)
|
||||
return -EINVAL;
|
||||
|
||||
var->DataSize = 1024;
|
||||
if (efivar_entry_get(entry, &var->Attributes, &var->DataSize, var->Data))
|
||||
ret = efivar_entry_get(entry, &var->Attributes, &size, var->Data);
|
||||
var->DataSize = size;
|
||||
if (ret)
|
||||
return -EIO;
|
||||
|
||||
if (var->Attributes & EFI_VARIABLE_NON_VOLATILE)
|
||||
@ -116,13 +119,16 @@ static ssize_t
|
||||
efivar_size_read(struct efivar_entry *entry, char *buf)
|
||||
{
|
||||
struct efi_variable *var = &entry->var;
|
||||
unsigned long size = sizeof(var->Data);
|
||||
char *str = buf;
|
||||
int ret;
|
||||
|
||||
if (!entry || !buf)
|
||||
return -EINVAL;
|
||||
|
||||
var->DataSize = 1024;
|
||||
if (efivar_entry_get(entry, &var->Attributes, &var->DataSize, var->Data))
|
||||
ret = efivar_entry_get(entry, &var->Attributes, &size, var->Data);
|
||||
var->DataSize = size;
|
||||
if (ret)
|
||||
return -EIO;
|
||||
|
||||
str += sprintf(str, "0x%lx\n", var->DataSize);
|
||||
@ -133,12 +139,15 @@ static ssize_t
|
||||
efivar_data_read(struct efivar_entry *entry, char *buf)
|
||||
{
|
||||
struct efi_variable *var = &entry->var;
|
||||
unsigned long size = sizeof(var->Data);
|
||||
int ret;
|
||||
|
||||
if (!entry || !buf)
|
||||
return -EINVAL;
|
||||
|
||||
var->DataSize = 1024;
|
||||
if (efivar_entry_get(entry, &var->Attributes, &var->DataSize, var->Data))
|
||||
ret = efivar_entry_get(entry, &var->Attributes, &size, var->Data);
|
||||
var->DataSize = size;
|
||||
if (ret)
|
||||
return -EIO;
|
||||
|
||||
memcpy(buf, var->Data, var->DataSize);
|
||||
@ -199,6 +208,9 @@ efivar_store_raw(struct efivar_entry *entry, const char *buf, size_t count)
|
||||
u8 *data;
|
||||
int err;
|
||||
|
||||
if (!entry || !buf)
|
||||
return -EINVAL;
|
||||
|
||||
if (in_compat_syscall()) {
|
||||
struct compat_efi_variable *compat;
|
||||
|
||||
@ -250,14 +262,16 @@ efivar_show_raw(struct efivar_entry *entry, char *buf)
|
||||
{
|
||||
struct efi_variable *var = &entry->var;
|
||||
struct compat_efi_variable *compat;
|
||||
unsigned long datasize = sizeof(var->Data);
|
||||
size_t size;
|
||||
int ret;
|
||||
|
||||
if (!entry || !buf)
|
||||
return 0;
|
||||
|
||||
var->DataSize = 1024;
|
||||
if (efivar_entry_get(entry, &entry->var.Attributes,
|
||||
&entry->var.DataSize, entry->var.Data))
|
||||
ret = efivar_entry_get(entry, &var->Attributes, &datasize, var->Data);
|
||||
var->DataSize = datasize;
|
||||
if (ret)
|
||||
return -EIO;
|
||||
|
||||
if (in_compat_syscall()) {
|
||||
|
@ -29,6 +29,7 @@ struct imx_sc_chan {
|
||||
struct mbox_client cl;
|
||||
struct mbox_chan *ch;
|
||||
int idx;
|
||||
struct completion tx_done;
|
||||
};
|
||||
|
||||
struct imx_sc_ipc {
|
||||
@ -100,6 +101,14 @@ int imx_scu_get_handle(struct imx_sc_ipc **ipc)
|
||||
}
|
||||
EXPORT_SYMBOL(imx_scu_get_handle);
|
||||
|
||||
/* Callback called when the word of a message is ack-ed, eg read by SCU */
|
||||
static void imx_scu_tx_done(struct mbox_client *cl, void *mssg, int r)
|
||||
{
|
||||
struct imx_sc_chan *sc_chan = container_of(cl, struct imx_sc_chan, cl);
|
||||
|
||||
complete(&sc_chan->tx_done);
|
||||
}
|
||||
|
||||
static void imx_scu_rx_callback(struct mbox_client *c, void *msg)
|
||||
{
|
||||
struct imx_sc_chan *sc_chan = container_of(c, struct imx_sc_chan, cl);
|
||||
@ -143,6 +152,19 @@ static int imx_scu_ipc_write(struct imx_sc_ipc *sc_ipc, void *msg)
|
||||
|
||||
for (i = 0; i < hdr->size; i++) {
|
||||
sc_chan = &sc_ipc->chans[i % 4];
|
||||
|
||||
/*
|
||||
* SCU requires that all messages words are written
|
||||
* sequentially but linux MU driver implements multiple
|
||||
* independent channels for each register so ordering between
|
||||
* different channels must be ensured by SCU API interface.
|
||||
*
|
||||
* Wait for tx_done before every send to ensure that no
|
||||
* queueing happens at the mailbox channel level.
|
||||
*/
|
||||
wait_for_completion(&sc_chan->tx_done);
|
||||
reinit_completion(&sc_chan->tx_done);
|
||||
|
||||
ret = mbox_send_message(sc_chan->ch, &data[i]);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
@ -225,6 +247,11 @@ static int imx_scu_probe(struct platform_device *pdev)
|
||||
cl->knows_txdone = true;
|
||||
cl->rx_callback = imx_scu_rx_callback;
|
||||
|
||||
/* Initial tx_done completion as "done" */
|
||||
cl->tx_done = imx_scu_tx_done;
|
||||
init_completion(&sc_chan->tx_done);
|
||||
complete(&sc_chan->tx_done);
|
||||
|
||||
sc_chan->sc_ipc = sc_ipc;
|
||||
sc_chan->idx = i % 4;
|
||||
sc_chan->ch = mbox_request_channel_byname(cl, chan_name);
|
||||
|
@ -16,7 +16,7 @@ struct imx_sc_msg_req_misc_set_ctrl {
|
||||
u32 ctrl;
|
||||
u32 val;
|
||||
u16 resource;
|
||||
} __packed;
|
||||
} __packed __aligned(4);
|
||||
|
||||
struct imx_sc_msg_req_cpu_start {
|
||||
struct imx_sc_rpc_msg hdr;
|
||||
@ -24,18 +24,18 @@ struct imx_sc_msg_req_cpu_start {
|
||||
u32 address_lo;
|
||||
u16 resource;
|
||||
u8 enable;
|
||||
} __packed;
|
||||
} __packed __aligned(4);
|
||||
|
||||
struct imx_sc_msg_req_misc_get_ctrl {
|
||||
struct imx_sc_rpc_msg hdr;
|
||||
u32 ctrl;
|
||||
u16 resource;
|
||||
} __packed;
|
||||
} __packed __aligned(4);
|
||||
|
||||
struct imx_sc_msg_resp_misc_get_ctrl {
|
||||
struct imx_sc_rpc_msg hdr;
|
||||
u32 val;
|
||||
} __packed;
|
||||
} __packed __aligned(4);
|
||||
|
||||
/*
|
||||
* This function sets a miscellaneous control value.
|
||||
|
@ -61,7 +61,7 @@ struct imx_sc_msg_req_set_resource_power_mode {
|
||||
struct imx_sc_rpc_msg hdr;
|
||||
u16 resource;
|
||||
u8 mode;
|
||||
} __packed;
|
||||
} __packed __aligned(4);
|
||||
|
||||
#define IMX_SCU_PD_NAME_SIZE 20
|
||||
struct imx_sc_pm_domain {
|
||||
|
@ -365,8 +365,7 @@ bool amdgpu_atombios_get_connector_info_from_object_table(struct amdgpu_device *
|
||||
router.ddc_valid = false;
|
||||
router.cd_valid = false;
|
||||
for (j = 0; j < ((le16_to_cpu(path->usSize) - 8) / 2); j++) {
|
||||
uint8_t grph_obj_type=
|
||||
grph_obj_type =
|
||||
uint8_t grph_obj_type =
|
||||
(le16_to_cpu(path->usGraphicObjIds[j]) &
|
||||
OBJECT_TYPE_MASK) >> OBJECT_TYPE_SHIFT;
|
||||
|
||||
|
@ -952,7 +952,8 @@ bool drm_client_rotation(struct drm_mode_set *modeset, unsigned int *rotation)
|
||||
* depending on the hardware this may require the framebuffer
|
||||
* to be in a specific tiling format.
|
||||
*/
|
||||
if ((*rotation & DRM_MODE_ROTATE_MASK) != DRM_MODE_ROTATE_180 ||
|
||||
if (((*rotation & DRM_MODE_ROTATE_MASK) != DRM_MODE_ROTATE_0 &&
|
||||
(*rotation & DRM_MODE_ROTATE_MASK) != DRM_MODE_ROTATE_180) ||
|
||||
!plane->rotation_property)
|
||||
return false;
|
||||
|
||||
|
@ -341,17 +341,27 @@ EXPORT_SYMBOL(drm_dp_dpcd_read_link_status);
|
||||
* @aux: DisplayPort AUX channel
|
||||
* @real_edid_checksum: real edid checksum for the last block
|
||||
*
|
||||
* Returns true on success
|
||||
* Returns:
|
||||
* True on success
|
||||
*/
|
||||
bool drm_dp_send_real_edid_checksum(struct drm_dp_aux *aux,
|
||||
u8 real_edid_checksum)
|
||||
{
|
||||
u8 link_edid_read = 0, auto_test_req = 0, test_resp = 0;
|
||||
|
||||
drm_dp_dpcd_read(aux, DP_DEVICE_SERVICE_IRQ_VECTOR, &auto_test_req, 1);
|
||||
if (drm_dp_dpcd_read(aux, DP_DEVICE_SERVICE_IRQ_VECTOR,
|
||||
&auto_test_req, 1) < 1) {
|
||||
DRM_ERROR("DPCD failed read at register 0x%x\n",
|
||||
DP_DEVICE_SERVICE_IRQ_VECTOR);
|
||||
return false;
|
||||
}
|
||||
auto_test_req &= DP_AUTOMATED_TEST_REQUEST;
|
||||
|
||||
drm_dp_dpcd_read(aux, DP_TEST_REQUEST, &link_edid_read, 1);
|
||||
if (drm_dp_dpcd_read(aux, DP_TEST_REQUEST, &link_edid_read, 1) < 1) {
|
||||
DRM_ERROR("DPCD failed read at register 0x%x\n",
|
||||
DP_TEST_REQUEST);
|
||||
return false;
|
||||
}
|
||||
link_edid_read &= DP_TEST_LINK_EDID_READ;
|
||||
|
||||
if (!auto_test_req || !link_edid_read) {
|
||||
@ -359,13 +369,27 @@ bool drm_dp_send_real_edid_checksum(struct drm_dp_aux *aux,
|
||||
return false;
|
||||
}
|
||||
|
||||
drm_dp_dpcd_write(aux, DP_DEVICE_SERVICE_IRQ_VECTOR, &auto_test_req, 1);
|
||||
if (drm_dp_dpcd_write(aux, DP_DEVICE_SERVICE_IRQ_VECTOR,
|
||||
&auto_test_req, 1) < 1) {
|
||||
DRM_ERROR("DPCD failed write at register 0x%x\n",
|
||||
DP_DEVICE_SERVICE_IRQ_VECTOR);
|
||||
return false;
|
||||
}
|
||||
|
||||
/* send back checksum for the last edid extension block data */
|
||||
drm_dp_dpcd_write(aux, DP_TEST_EDID_CHECKSUM, &real_edid_checksum, 1);
|
||||
if (drm_dp_dpcd_write(aux, DP_TEST_EDID_CHECKSUM,
|
||||
&real_edid_checksum, 1) < 1) {
|
||||
DRM_ERROR("DPCD failed write at register 0x%x\n",
|
||||
DP_TEST_EDID_CHECKSUM);
|
||||
return false;
|
||||
}
|
||||
|
||||
test_resp |= DP_TEST_EDID_CHECKSUM_WRITE;
|
||||
drm_dp_dpcd_write(aux, DP_TEST_RESPONSE, &test_resp, 1);
|
||||
if (drm_dp_dpcd_write(aux, DP_TEST_RESPONSE, &test_resp, 1) < 1) {
|
||||
DRM_ERROR("DPCD failed write at register 0x%x\n",
|
||||
DP_TEST_RESPONSE);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -99,14 +99,6 @@ struct detailed_mode_closure {
|
||||
#define LEVEL_GTF2 2
|
||||
#define LEVEL_CVT 3
|
||||
|
||||
/*Enum storing luminance types for HDR blocks in EDID*/
|
||||
enum luminance_value {
|
||||
NO_LUMINANCE_DATA = 3,
|
||||
MAXIMUM_LUMINANCE = 4,
|
||||
FRAME_AVERAGE_LUMINANCE = 5,
|
||||
MINIMUM_LUMINANCE = 6
|
||||
};
|
||||
|
||||
static const struct edid_quirk {
|
||||
char vendor[4];
|
||||
int product_id;
|
||||
@ -2914,20 +2906,16 @@ add_detailed_modes(struct drm_connector *connector, struct edid *edid,
|
||||
|
||||
return closure.modes;
|
||||
}
|
||||
#define VIDEO_CAPABILITY_EXTENDED_DATA_BLOCK 0x0
|
||||
|
||||
#define AUDIO_BLOCK 0x01
|
||||
#define VIDEO_BLOCK 0x02
|
||||
#define VENDOR_BLOCK 0x03
|
||||
#define SPEAKER_BLOCK 0x04
|
||||
#define COLORIMETRY_EXTENDED_DATA_BLOCK 0x05
|
||||
#define HDR_STATIC_METADATA_BLOCK 0x6
|
||||
#define USE_EXTENDED_TAG 0x07
|
||||
#define EXT_VIDEO_CAPABILITY_BLOCK 0x00
|
||||
#define EXT_VIDEO_DATA_BLOCK_420 0x0E
|
||||
#define EXT_VIDEO_CAP_BLOCK_Y420CMDB 0x0F
|
||||
#define VENDOR_SPECIFIC_VIDEO_DATA_BLOCK 0x01
|
||||
#define VSVDB_HDR10_PLUS_IEEE_CODE 0x90848b
|
||||
#define VSVDB_HDR10_PLUS_APP_VER_MASK 0x3
|
||||
#define EDID_BASIC_AUDIO (1 << 6)
|
||||
#define EDID_CEA_YCRCB444 (1 << 5)
|
||||
#define EDID_CEA_YCRCB422 (1 << 4)
|
||||
@ -3961,48 +3949,6 @@ static void fixup_detailed_cea_mode_clock(struct drm_display_mode *mode)
|
||||
mode->clock = clock;
|
||||
}
|
||||
|
||||
static bool cea_db_is_hdmi_colorimetry_data_block(const u8 *db)
|
||||
{
|
||||
if (cea_db_tag(db) != USE_EXTENDED_TAG)
|
||||
return false;
|
||||
|
||||
if (db[1] != COLORIMETRY_EXTENDED_DATA_BLOCK)
|
||||
return false;
|
||||
|
||||
if (cea_db_payload_len(db) < 2)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void
|
||||
drm_parse_colorimetry_data_block(struct drm_connector *connector, const u8 *db)
|
||||
{
|
||||
struct drm_hdmi_info *info = &connector->display_info.hdmi;
|
||||
|
||||
if (db[2] & DRM_EDID_CLRMETRY_xvYCC_601)
|
||||
info->colorimetry |= DRM_EDID_CLRMETRY_xvYCC_601;
|
||||
if (db[2] & DRM_EDID_CLRMETRY_xvYCC_709)
|
||||
info->colorimetry |= DRM_EDID_CLRMETRY_xvYCC_709;
|
||||
if (db[2] & DRM_EDID_CLRMETRY_sYCC_601)
|
||||
info->colorimetry |= DRM_EDID_CLRMETRY_sYCC_601;
|
||||
if (db[2] & DRM_EDID_CLRMETRY_ADBYCC_601)
|
||||
info->colorimetry |= DRM_EDID_CLRMETRY_ADBYCC_601;
|
||||
if (db[2] & DRM_EDID_CLRMETRY_ADB_RGB)
|
||||
info->colorimetry |= DRM_EDID_CLRMETRY_ADB_RGB;
|
||||
if (db[2] & DRM_EDID_CLRMETRY_BT2020_CYCC)
|
||||
info->colorimetry |= DRM_EDID_CLRMETRY_BT2020_CYCC;
|
||||
if (db[2] & DRM_EDID_CLRMETRY_BT2020_YCC)
|
||||
info->colorimetry |= DRM_EDID_CLRMETRY_BT2020_YCC;
|
||||
if (db[2] & DRM_EDID_CLRMETRY_BT2020_RGB)
|
||||
info->colorimetry |= DRM_EDID_CLRMETRY_BT2020_RGB;
|
||||
/* Byte 4 Bit 7: DCI-P3 */
|
||||
if (db[3] & BIT(7))
|
||||
info->colorimetry |= DRM_EDID_CLRMETRY_DCI_P3;
|
||||
|
||||
DRM_DEBUG_KMS("Supported Colorimetry 0x%x\n", info->colorimetry);
|
||||
}
|
||||
|
||||
static bool cea_db_is_hdmi_hdr_metadata_block(const u8 *db)
|
||||
{
|
||||
if (cea_db_tag(db) != USE_EXTENDED_TAG)
|
||||
@ -4083,232 +4029,6 @@ drm_parse_hdmi_vsdb_audio(struct drm_connector *connector, const u8 *db)
|
||||
connector->audio_latency[1]);
|
||||
}
|
||||
|
||||
/*
|
||||
* drm_extract_vcdb_info - Parse the HDMI Video Capability Data Block
|
||||
* @connector: connector corresponding to the HDMI sink
|
||||
* @db: start of the CEA vendor specific block
|
||||
*
|
||||
* Parses the HDMI VCDB to extract sink info for @connector.
|
||||
*/
|
||||
static void
|
||||
drm_extract_vcdb_info(struct drm_connector *connector, const u8 *db)
|
||||
{
|
||||
/*
|
||||
* Check if the sink specifies underscan
|
||||
* support for:
|
||||
* BIT 5: preferred video format
|
||||
* BIT 3: IT video format
|
||||
* BIT 1: CE video format
|
||||
*/
|
||||
|
||||
connector->pt_scan_info =
|
||||
(db[2] & (BIT(4) | BIT(5))) >> 4;
|
||||
connector->it_scan_info =
|
||||
(db[2] & (BIT(3) | BIT(2))) >> 2;
|
||||
connector->ce_scan_info =
|
||||
db[2] & (BIT(1) | BIT(0));
|
||||
|
||||
DRM_DEBUG_KMS("Scan Info (pt|it|ce): (%d|%d|%d)",
|
||||
(int) connector->pt_scan_info,
|
||||
(int) connector->it_scan_info,
|
||||
(int) connector->ce_scan_info);
|
||||
}
|
||||
|
||||
static void
|
||||
drm_parse_vsvdb_hdr_plus(struct drm_connector *connector, const u8 *db)
|
||||
{
|
||||
connector->hdr_plus_app_ver = db[5] & VSVDB_HDR10_PLUS_APP_VER_MASK;
|
||||
}
|
||||
|
||||
static void
|
||||
drm_extract_vsvdb_info(struct drm_connector *connector, const u8 *db)
|
||||
{
|
||||
u8 db_len = cea_db_payload_len(db);
|
||||
u32 ieee_code = 0;
|
||||
|
||||
if (db_len < 5)
|
||||
return;
|
||||
|
||||
/* Bytes 2-4: IEEE 24-bit code, LSB first */
|
||||
ieee_code = db[2] | (db[3] << 8) | (db[4] << 16);
|
||||
DRM_DEBUG_KMS("found VSVDB with IEEE code 0x%x\n", ieee_code);
|
||||
if (ieee_code == VSVDB_HDR10_PLUS_IEEE_CODE)
|
||||
drm_parse_vsvdb_hdr_plus(connector, db);
|
||||
}
|
||||
|
||||
static bool drm_edid_is_luminance_value_present(
|
||||
u32 block_length, enum luminance_value value)
|
||||
{
|
||||
return block_length > NO_LUMINANCE_DATA && value <= block_length;
|
||||
}
|
||||
|
||||
/*
|
||||
* drm_extract_clrmetry_db - Parse the HDMI colorimetry extended block
|
||||
* @connector: connector corresponding to the HDMI sink
|
||||
* @db: start of the HDMI colorimetry extended block
|
||||
*
|
||||
* Parses the HDMI colorimetry block to extract sink info for @connector.
|
||||
*/
|
||||
static void
|
||||
drm_extract_clrmetry_db(struct drm_connector *connector, const u8 *db)
|
||||
{
|
||||
|
||||
if (!db) {
|
||||
DRM_ERROR("invalid db\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Byte 3 Bit 0: xvYCC_601 */
|
||||
if (db[2] & BIT(0))
|
||||
connector->color_enc_fmt |= DRM_EDID_CLRMETRY_xvYCC_601;
|
||||
/* Byte 3 Bit 1: xvYCC_709 */
|
||||
if (db[2] & BIT(1))
|
||||
connector->color_enc_fmt |= DRM_EDID_CLRMETRY_xvYCC_709;
|
||||
/* Byte 3 Bit 2: sYCC_601 */
|
||||
if (db[2] & BIT(2))
|
||||
connector->color_enc_fmt |= DRM_EDID_CLRMETRY_sYCC_601;
|
||||
/* Byte 3 Bit 3: ADBYCC_601 */
|
||||
if (db[2] & BIT(3))
|
||||
connector->color_enc_fmt |= DRM_EDID_CLRMETRY_ADBYCC_601;
|
||||
/* Byte 3 Bit 4: ADB_RGB */
|
||||
if (db[2] & BIT(4))
|
||||
connector->color_enc_fmt |= DRM_EDID_CLRMETRY_ADB_RGB;
|
||||
/* Byte 3 Bit 5: BT2020_CYCC */
|
||||
if (db[2] & BIT(5))
|
||||
connector->color_enc_fmt |= DRM_EDID_CLRMETRY_BT2020_CYCC;
|
||||
/* Byte 3 Bit 6: BT2020_YCC */
|
||||
if (db[2] & BIT(6))
|
||||
connector->color_enc_fmt |= DRM_EDID_CLRMETRY_BT2020_YCC;
|
||||
/* Byte 3 Bit 7: BT2020_RGB */
|
||||
if (db[2] & BIT(7))
|
||||
connector->color_enc_fmt |= DRM_EDID_CLRMETRY_BT2020_RGB;
|
||||
/* Byte 4 Bit 7: DCI-P3 */
|
||||
if (db[3] & BIT(7))
|
||||
connector->color_enc_fmt |= DRM_EDID_CLRMETRY_DCI_P3;
|
||||
|
||||
DRM_DEBUG_KMS("colorimetry fmts = 0x%x\n", connector->color_enc_fmt);
|
||||
}
|
||||
|
||||
/*
|
||||
* drm_extract_hdr_db - Parse the HDMI HDR extended block
|
||||
* @connector: connector corresponding to the HDMI sink
|
||||
* @db: start of the HDMI HDR extended block
|
||||
*
|
||||
* Parses the HDMI HDR extended block to extract sink info for @connector.
|
||||
*/
|
||||
static void
|
||||
drm_extract_hdr_db(struct drm_connector *connector, const u8 *db)
|
||||
{
|
||||
|
||||
u8 len = 0;
|
||||
|
||||
if (!db)
|
||||
return;
|
||||
|
||||
len = db[0] & 0x1f;
|
||||
/* Byte 3: Electro-Optical Transfer Functions */
|
||||
connector->hdr_eotf = db[2] & 0x3F;
|
||||
|
||||
/* Byte 4: Static Metadata Descriptor Type 1 */
|
||||
connector->hdr_metadata_type_one = (db[3] & BIT(0));
|
||||
|
||||
/* Byte 5: Desired Content Maximum Luminance */
|
||||
if (drm_edid_is_luminance_value_present(len, MAXIMUM_LUMINANCE))
|
||||
connector->hdr_max_luminance =
|
||||
db[MAXIMUM_LUMINANCE];
|
||||
|
||||
/* Byte 6: Desired Content Max Frame-average Luminance */
|
||||
if (drm_edid_is_luminance_value_present(len, FRAME_AVERAGE_LUMINANCE))
|
||||
connector->hdr_avg_luminance =
|
||||
db[FRAME_AVERAGE_LUMINANCE];
|
||||
|
||||
/* Byte 7: Desired Content Min Luminance */
|
||||
if (drm_edid_is_luminance_value_present(len, MINIMUM_LUMINANCE))
|
||||
connector->hdr_min_luminance =
|
||||
db[MINIMUM_LUMINANCE];
|
||||
|
||||
connector->hdr_supported = true;
|
||||
|
||||
DRM_DEBUG_KMS("HDR electro-optical %d\n", connector->hdr_eotf);
|
||||
DRM_DEBUG_KMS("metadata desc 1 %d\n", connector->hdr_metadata_type_one);
|
||||
DRM_DEBUG_KMS("max luminance %d\n", connector->hdr_max_luminance);
|
||||
DRM_DEBUG_KMS("avg luminance %d\n", connector->hdr_avg_luminance);
|
||||
DRM_DEBUG_KMS("min luminance %d\n", connector->hdr_min_luminance);
|
||||
}
|
||||
/*
|
||||
* drm_hdmi_extract_extended_blk_info - Parse the HDMI extended tag blocks
|
||||
* @connector: connector corresponding to the HDMI sink
|
||||
* @edid: handle to the EDID structure
|
||||
* Parses the all extended tag blocks extract sink info for @connector.
|
||||
*/
|
||||
static void
|
||||
drm_hdmi_extract_extended_blk_info(struct drm_connector *connector,
|
||||
const struct edid *edid)
|
||||
{
|
||||
const u8 *cea = drm_find_cea_extension(edid);
|
||||
const u8 *db = NULL;
|
||||
|
||||
if (cea && cea_revision(cea) >= 3) {
|
||||
int i, start, end;
|
||||
|
||||
if (cea_db_offsets(cea, &start, &end))
|
||||
return;
|
||||
|
||||
for_each_cea_db(cea, i, start, end) {
|
||||
db = &cea[i];
|
||||
|
||||
if (cea_db_tag(db) == USE_EXTENDED_TAG) {
|
||||
DRM_DEBUG_KMS("found extended tag block = %d\n",
|
||||
db[1]);
|
||||
switch (db[1]) {
|
||||
case VIDEO_CAPABILITY_EXTENDED_DATA_BLOCK:
|
||||
drm_extract_vcdb_info(connector, db);
|
||||
break;
|
||||
case VENDOR_SPECIFIC_VIDEO_DATA_BLOCK:
|
||||
drm_extract_vsvdb_info(connector, db);
|
||||
break;
|
||||
case HDR_STATIC_METADATA_BLOCK:
|
||||
drm_extract_hdr_db(connector, db);
|
||||
break;
|
||||
case COLORIMETRY_EXTENDED_DATA_BLOCK:
|
||||
drm_extract_clrmetry_db(connector, db);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
parse_hdmi_hf_vsdb(struct drm_connector *connector, const u8 *db)
|
||||
{
|
||||
u8 len = cea_db_payload_len(db);
|
||||
|
||||
if (len < 7)
|
||||
return;
|
||||
|
||||
if (db[4] != 1)
|
||||
return; /* invalid version */
|
||||
|
||||
connector->max_tmds_char = db[5] * 5;
|
||||
connector->scdc_present = db[6] & (1 << 7);
|
||||
connector->rr_capable = db[6] & (1 << 6);
|
||||
connector->flags_3d = db[6] & 0x7;
|
||||
connector->supports_scramble = connector->scdc_present &&
|
||||
(db[6] & (1 << 3));
|
||||
|
||||
DRM_DEBUG_KMS(
|
||||
"HDMI v2: max TMDS char %d, scdc %s, rr %s,3D flags 0x%x, scramble %s\n",
|
||||
connector->max_tmds_char,
|
||||
connector->scdc_present ? "available" : "not available",
|
||||
connector->rr_capable ? "capable" : "not capable",
|
||||
connector->flags_3d,
|
||||
connector->supports_scramble ? "supported" : "not supported");
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
monitor_name(struct detailed_timing *t, void *data)
|
||||
{
|
||||
@ -4441,9 +4161,6 @@ static void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid)
|
||||
/* HDMI Vendor-Specific Data Block */
|
||||
if (cea_db_is_hdmi_vsdb(db))
|
||||
drm_parse_hdmi_vsdb_audio(connector, db);
|
||||
/* HDMI Forum Vendor-Specific Data Block */
|
||||
else if (cea_db_is_hdmi_forum_vsdb(db))
|
||||
parse_hdmi_hf_vsdb(connector, db);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -4910,8 +4627,6 @@ static void drm_parse_cea_ext(struct drm_connector *connector,
|
||||
drm_parse_vcdb(connector, db);
|
||||
if (cea_db_is_hdmi_hdr_metadata_block(db))
|
||||
drm_parse_hdr_metadata_block(connector, db);
|
||||
if (cea_db_is_hdmi_colorimetry_data_block(db))
|
||||
drm_parse_colorimetry_data_block(connector, db);
|
||||
}
|
||||
}
|
||||
|
||||
@ -4938,39 +4653,6 @@ drm_reset_display_info(struct drm_connector *connector)
|
||||
info->non_desktop = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
drm_hdmi_extract_vsdbs_info(struct drm_connector *connector,
|
||||
const struct edid *edid)
|
||||
{
|
||||
const u8 *cea = drm_find_cea_extension(edid);
|
||||
const u8 *db = NULL;
|
||||
|
||||
if (cea && cea_revision(cea) >= 3) {
|
||||
int i, start, end;
|
||||
|
||||
if (cea_db_offsets(cea, &start, &end))
|
||||
return;
|
||||
|
||||
for_each_cea_db(cea, i, start, end) {
|
||||
db = &cea[i];
|
||||
|
||||
if (cea_db_tag(db) == VENDOR_BLOCK) {
|
||||
/* HDMI Vendor-Specific Data Block */
|
||||
if (cea_db_is_hdmi_vsdb(db)) {
|
||||
drm_parse_hdmi_vsdb_video(
|
||||
connector, db);
|
||||
drm_parse_hdmi_vsdb_audio(
|
||||
connector, db);
|
||||
}
|
||||
/* HDMI Forum Vendor-Specific Data Block */
|
||||
else if (cea_db_is_hdmi_forum_vsdb(db))
|
||||
parse_hdmi_hf_vsdb(connector, db);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
u32 drm_add_display_info(struct drm_connector *connector, const struct edid *edid)
|
||||
{
|
||||
struct drm_display_info *info = &connector->display_info;
|
||||
@ -5008,11 +4690,6 @@ u32 drm_add_display_info(struct drm_connector *connector, const struct edid *edi
|
||||
connector->name, info->bpc);
|
||||
}
|
||||
|
||||
/* Extract audio and video latency fields for the sink */
|
||||
drm_hdmi_extract_vsdbs_info(connector, edid);
|
||||
/* Extract info from extended tag blocks */
|
||||
drm_hdmi_extract_extended_blk_info(connector, edid);
|
||||
|
||||
/* Only defined for 1.4 with digital displays */
|
||||
if (edid->revision < 4)
|
||||
return quirks;
|
||||
|
@ -1672,6 +1672,13 @@ static int drm_mode_parse_cmdline_options(char *str, size_t len,
|
||||
}
|
||||
}
|
||||
|
||||
if (!(rotation & DRM_MODE_ROTATE_MASK))
|
||||
rotation |= DRM_MODE_ROTATE_0;
|
||||
|
||||
/* Make sure there is exactly one rotation defined */
|
||||
if (!is_power_of_2(rotation & DRM_MODE_ROTATE_MASK))
|
||||
return -EINVAL;
|
||||
|
||||
mode->rotation_reflection = rotation;
|
||||
|
||||
return 0;
|
||||
|
@ -83,7 +83,6 @@
|
||||
#define VSIZE_OFST 20
|
||||
#define LDI_INT_EN 0x741C
|
||||
#define FRAME_END_INT_EN_OFST 1
|
||||
#define UNDERFLOW_INT_EN_OFST 2
|
||||
#define LDI_CTRL 0x7420
|
||||
#define BPP_OFST 3
|
||||
#define DATA_GATE_EN BIT(2)
|
||||
|
@ -46,7 +46,6 @@ struct ade_hw_ctx {
|
||||
struct clk *media_noc_clk;
|
||||
struct clk *ade_pix_clk;
|
||||
struct reset_control *reset;
|
||||
struct work_struct display_reset_wq;
|
||||
bool power_on;
|
||||
int irq;
|
||||
|
||||
@ -136,7 +135,6 @@ static void ade_init(struct ade_hw_ctx *ctx)
|
||||
*/
|
||||
ade_update_bits(base + ADE_CTRL, FRM_END_START_OFST,
|
||||
FRM_END_START_MASK, REG_EFFECTIVE_IN_ADEEN_FRMEND);
|
||||
ade_update_bits(base + LDI_INT_EN, UNDERFLOW_INT_EN_OFST, MASK(1), 1);
|
||||
}
|
||||
|
||||
static bool ade_crtc_mode_fixup(struct drm_crtc *crtc,
|
||||
@ -304,17 +302,6 @@ static void ade_crtc_disable_vblank(struct drm_crtc *crtc)
|
||||
MASK(1), 0);
|
||||
}
|
||||
|
||||
static void drm_underflow_wq(struct work_struct *work)
|
||||
{
|
||||
struct ade_hw_ctx *ctx = container_of(work, struct ade_hw_ctx,
|
||||
display_reset_wq);
|
||||
struct drm_device *drm_dev = ctx->crtc->dev;
|
||||
struct drm_atomic_state *state;
|
||||
|
||||
state = drm_atomic_helper_suspend(drm_dev);
|
||||
drm_atomic_helper_resume(drm_dev, state);
|
||||
}
|
||||
|
||||
static irqreturn_t ade_irq_handler(int irq, void *data)
|
||||
{
|
||||
struct ade_hw_ctx *ctx = data;
|
||||
@ -331,12 +318,6 @@ static irqreturn_t ade_irq_handler(int irq, void *data)
|
||||
MASK(1), 1);
|
||||
drm_crtc_handle_vblank(crtc);
|
||||
}
|
||||
if (status & BIT(UNDERFLOW_INT_EN_OFST)) {
|
||||
ade_update_bits(base + LDI_INT_CLR, UNDERFLOW_INT_EN_OFST,
|
||||
MASK(1), 1);
|
||||
DRM_ERROR("LDI underflow!");
|
||||
schedule_work(&ctx->display_reset_wq);
|
||||
}
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@ -919,7 +900,6 @@ static void *ade_hw_ctx_alloc(struct platform_device *pdev,
|
||||
if (ret)
|
||||
return ERR_PTR(-EIO);
|
||||
|
||||
INIT_WORK(&ctx->display_reset_wq, drm_underflow_wq);
|
||||
ctx->crtc = crtc;
|
||||
|
||||
return ctx;
|
||||
|
@ -4205,13 +4205,19 @@ static void icl_dbuf_disable(struct drm_i915_private *dev_priv)
|
||||
|
||||
static void icl_mbus_init(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
u32 val;
|
||||
u32 mask, val;
|
||||
|
||||
val = MBUS_ABOX_BT_CREDIT_POOL1(16) |
|
||||
MBUS_ABOX_BT_CREDIT_POOL2(16) |
|
||||
MBUS_ABOX_B_CREDIT(1) |
|
||||
MBUS_ABOX_BW_CREDIT(1);
|
||||
mask = MBUS_ABOX_BT_CREDIT_POOL1_MASK |
|
||||
MBUS_ABOX_BT_CREDIT_POOL2_MASK |
|
||||
MBUS_ABOX_B_CREDIT_MASK |
|
||||
MBUS_ABOX_BW_CREDIT_MASK;
|
||||
|
||||
val = I915_READ(MBUS_ABOX_CTL);
|
||||
val &= ~mask;
|
||||
val |= MBUS_ABOX_BT_CREDIT_POOL1(16) |
|
||||
MBUS_ABOX_BT_CREDIT_POOL2(16) |
|
||||
MBUS_ABOX_B_CREDIT(1) |
|
||||
MBUS_ABOX_BW_CREDIT(1);
|
||||
I915_WRITE(MBUS_ABOX_CTL, val);
|
||||
}
|
||||
|
||||
|
@ -439,7 +439,8 @@ eb_validate_vma(struct i915_execbuffer *eb,
|
||||
if (unlikely(entry->flags & eb->invalid_flags))
|
||||
return -EINVAL;
|
||||
|
||||
if (unlikely(entry->alignment && !is_power_of_2(entry->alignment)))
|
||||
if (unlikely(entry->alignment &&
|
||||
!is_power_of_2_u64(entry->alignment)))
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
|
@ -375,7 +375,7 @@ static bool assert_mmap_offset(struct drm_i915_private *i915,
|
||||
|
||||
obj = i915_gem_object_create_internal(i915, size);
|
||||
if (IS_ERR(obj))
|
||||
return PTR_ERR(obj);
|
||||
return false;
|
||||
|
||||
err = create_mmap_offset(obj);
|
||||
i915_gem_object_put(obj);
|
||||
|
@ -457,7 +457,8 @@ void intel_vgpu_emulate_hotplug(struct intel_vgpu *vgpu, bool connected)
|
||||
struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv;
|
||||
|
||||
/* TODO: add more platforms support */
|
||||
if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) {
|
||||
if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv) ||
|
||||
IS_COFFEELAKE(dev_priv)) {
|
||||
if (connected) {
|
||||
vgpu_vreg_t(vgpu, SFUSE_STRAP) |=
|
||||
SFUSE_STRAP_DDID_DETECTED;
|
||||
|
@ -272,10 +272,17 @@ void intel_gvt_destroy_vgpu(struct intel_vgpu *vgpu)
|
||||
{
|
||||
struct intel_gvt *gvt = vgpu->gvt;
|
||||
|
||||
mutex_lock(&vgpu->vgpu_lock);
|
||||
|
||||
WARN(vgpu->active, "vGPU is still active!\n");
|
||||
|
||||
/*
|
||||
* remove idr first so later clean can judge if need to stop
|
||||
* service if no active vgpu.
|
||||
*/
|
||||
mutex_lock(&gvt->lock);
|
||||
idr_remove(&gvt->vgpu_idr, vgpu->id);
|
||||
mutex_unlock(&gvt->lock);
|
||||
|
||||
mutex_lock(&vgpu->vgpu_lock);
|
||||
intel_gvt_debugfs_remove_vgpu(vgpu);
|
||||
intel_vgpu_clean_sched_policy(vgpu);
|
||||
intel_vgpu_clean_submission(vgpu);
|
||||
@ -290,7 +297,6 @@ void intel_gvt_destroy_vgpu(struct intel_vgpu *vgpu)
|
||||
mutex_unlock(&vgpu->vgpu_lock);
|
||||
|
||||
mutex_lock(&gvt->lock);
|
||||
idr_remove(&gvt->vgpu_idr, vgpu->id);
|
||||
if (idr_is_empty(&gvt->vgpu_idr))
|
||||
intel_gvt_clean_irq(gvt);
|
||||
intel_gvt_update_vgpu_types(gvt);
|
||||
|
@ -560,19 +560,31 @@ submit_notify(struct i915_sw_fence *fence, enum i915_sw_fence_notify state)
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
static void irq_semaphore_cb(struct irq_work *wrk)
|
||||
{
|
||||
struct i915_request *rq =
|
||||
container_of(wrk, typeof(*rq), semaphore_work);
|
||||
|
||||
i915_schedule_bump_priority(rq, I915_PRIORITY_NOSEMAPHORE);
|
||||
i915_request_put(rq);
|
||||
}
|
||||
|
||||
static int __i915_sw_fence_call
|
||||
semaphore_notify(struct i915_sw_fence *fence, enum i915_sw_fence_notify state)
|
||||
{
|
||||
struct i915_request *request =
|
||||
container_of(fence, typeof(*request), semaphore);
|
||||
struct i915_request *rq = container_of(fence, typeof(*rq), semaphore);
|
||||
|
||||
switch (state) {
|
||||
case FENCE_COMPLETE:
|
||||
i915_schedule_bump_priority(request, I915_PRIORITY_NOSEMAPHORE);
|
||||
if (!(READ_ONCE(rq->sched.attr.priority) & I915_PRIORITY_NOSEMAPHORE)) {
|
||||
i915_request_get(rq);
|
||||
init_irq_work(&rq->semaphore_work, irq_semaphore_cb);
|
||||
irq_work_queue(&rq->semaphore_work);
|
||||
}
|
||||
break;
|
||||
|
||||
case FENCE_FREE:
|
||||
i915_request_put(request);
|
||||
i915_request_put(rq);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -1215,9 +1227,9 @@ void __i915_request_queue(struct i915_request *rq,
|
||||
* decide whether to preempt the entire chain so that it is ready to
|
||||
* run at the earliest possible convenience.
|
||||
*/
|
||||
i915_sw_fence_commit(&rq->semaphore);
|
||||
if (attr && rq->engine->schedule)
|
||||
rq->engine->schedule(rq, attr);
|
||||
i915_sw_fence_commit(&rq->semaphore);
|
||||
i915_sw_fence_commit(&rq->submit);
|
||||
}
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user