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:
Blagovest Kolenichev 2020-05-19 12:26:51 -07:00
commit 4e2b270d2c
367 changed files with 143619 additions and 139431 deletions

View File

@ -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.

View File

@ -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.

View File

@ -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)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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;
};
};

View File

@ -86,3 +86,8 @@
&usb4_tm {
status = "disabled";
};
&mmc3 {
/* dra76x is not affected by i887 */
max-frequency = <96000000>;
};

View File

@ -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 {

View File

@ -183,7 +183,6 @@
pinctrl-0 = <&pinctrl_usdhc4>;
bus-width = <8>;
non-removable;
vmmc-supply = <&vdd_emmc_1p8>;
status = "disabled";
};

View File

@ -337,7 +337,6 @@
assigned-clock-rates = <400000000>;
bus-width = <8>;
fsl,tuning-step = <2>;
max-frequency = <100000000>;
vmmc-supply = <&reg_module_3v3>;
vqmmc-supply = <&reg_DCDC3>;
non-removable;

View File

@ -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>;

View File

@ -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

View File

@ -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);

View 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)

View File

@ -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)

View File

@ -327,7 +327,7 @@
#size-cells = <0>;
bus-width = <4>;
max-frequency = <50000000>;
max-frequency = <60000000>;
non-removable;
disable-wp;

View File

@ -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>;

View File

@ -52,11 +52,6 @@
compatible = "ethernet-phy-ieee802.3-c22";
reg = <0>;
};
ethphy1: ethernet-phy@1 {
compatible = "ethernet-phy-ieee802.3-c22";
reg = <1>;
};
};
};

View File

@ -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";

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 */

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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>

View File

@ -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)

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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);

View File

@ -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 */

View File

@ -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;

View File

@ -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;
}
}

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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

View File

@ -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)"

View File

@ -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;

View File

@ -227,7 +227,7 @@ struct qdio_buffer {
* @sbal: absolute SBAL address
*/
struct sl_element {
unsigned long sbal;
u64 sbal;
} __attribute__ ((packed));
/**

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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);
}
}

View File

@ -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 {

View File

@ -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;

View File

@ -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);
}
/*

View File

@ -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;
}

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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));
}
/**

View File

@ -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;

View 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
View 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
"

View File

@ -0,0 +1,2 @@
. ${ROOT_DIR}/common/build.config.gki.aarch64
TRIM_NONLISTED_KMI=""

View File

@ -0,0 +1,2 @@
. ${ROOT_DIR}/common/build.config.gki.x86_64
TRIM_NONLISTED_KMI=""

View File

@ -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

View File

@ -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);

View File

@ -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;
};
/**

View File

@ -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);
}
}
/**

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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;

View File

@ -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;
}

View File

@ -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;

View File

@ -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(&times[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);

View File

@ -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;
}

View File

@ -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.

View File

@ -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);

View File

@ -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;

View File

@ -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);
}

View File

@ -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");

View File

@ -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()) {

View File

@ -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);

View File

@ -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.

View File

@ -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 {

View File

@ -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;

View File

@ -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;

View File

@ -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;
}

View File

@ -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;

View File

@ -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;

View File

@ -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)

View File

@ -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;

View File

@ -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);
}

View File

@ -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;
/*

View File

@ -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);

View File

@ -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;

View File

@ -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);

View File

@ -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