Merge android-4.19-stable.149 (9ce79d9
) into msm-4.19
* refs/heads/tmp-9ce79d9: Linux 4.19.149 KVM: arm64: Assume write fault on S1PTW permission fault on instruction fetch ata: sata_mv, avoid trigerrable BUG_ON ata: make qc_prep return ata_completion_errors ata: define AC_ERR_OK kprobes: Fix compiler warning for !CONFIG_KPROBES_ON_FTRACE s390/zcrypt: Fix ZCRYPT_PERDEV_REQCNT ioctl mm, THP, swap: fix allocating cluster for swapfile by mistake kprobes: Fix to check probe enabled before disarm_kprobe_ftrace() s390/dasd: Fix zero write for FBA devices tracing: fix double free KVM: SVM: Add a dedicated INVD intercept routine KVM: x86: Reset MMU context if guest toggles CR4.SMAP or CR4.PKE MIPS: Add the missing 'CPU_1074K' into __get_cpu_type() regmap: fix page selection for noinc reads ALSA: asihpi: fix iounmap in error handler bpf: Fix a rcu warning for bpffs map pretty-print batman-adv: mcast: fix duplicate mcast packets from BLA backbone to mesh batman-adv: mcast: fix duplicate mcast packets in BLA backbone from mesh batman-adv: Add missing include for in_interrupt() drm/sun4i: sun8i-csc: Secondary CSC register correction net: qed: RDMA personality shouldn't fail VF load drm/vc4/vc4_hdmi: fill ASoC card owner bpf: Fix clobbering of r2 in bpf_gen_ld_abs mac802154: tx: fix use-after-free batman-adv: mcast/TT: fix wrongly dropped or rerouted packets atm: eni: fix the missed pci_disable_device() for eni_init_one() batman-adv: bla: fix type misuse for backbone_gw hash indexing mwifiex: Increase AES key storage size to 256 bits clocksource/drivers/h8300_timer8: Fix wrong return value in h8300_8timer_init() ieee802154/adf7242: check status of adf7242_read_reg ieee802154: fix one possible memleak in ca8210_dev_com_init objtool: Fix noreturn detection for ignored functions i2c: core: Call i2c_acpi_install_space_handler() before i2c_acpi_register_devices() drm/amdkfd: fix a memory leak issue lockdep: fix order in trace_hardirqs_off_caller() s390/init: add missing __init annotations RISC-V: Take text_mutex in ftrace_init_nop() ASoC: Intel: bytcr_rt5640: Add quirk for MPMAN Converter9 2-in-1 ASoC: wm8994: Ensure the device is resumed in wm89xx_mic_detect functions ASoC: wm8994: Skip setting of the WM8994_MICBIAS register for WM1811 nvme: explicitly update mpath disk capacity on revalidation net: openvswitch: use div_u64() for 64-by-32 divisions perf parse-events: Use strcmp() to compare the PMU name ubi: fastmap: Free unused fastmap anchor peb during detach btrfs: qgroup: fix data leak caused by race between writeback and truncate vfio/pci: fix racy on error and request eventfd ctx selftests/x86/syscall_nt: Clear weird flags after each test scsi: libfc: Skip additional kref updating work event scsi: libfc: Handling of extra kref nvme: fix possible deadlock when I/O is blocked cifs: Fix double add page to memcg when cifs_readpages vfio/pci: Clear error and request eventfd ctx after releasing x86/speculation/mds: Mark mds_user_clear_cpu_buffers() __always_inline mtd: parser: cmdline: Support MTD names containing one or more colons rapidio: avoid data race between file operation callbacks and mport_cdev_add(). mm/swap_state: fix a data race in swapin_nr_pages ceph: fix potential race in ceph_check_caps PCI: tegra: Fix runtime PM imbalance on error mtd: rawnand: omap_elm: Fix runtime PM imbalance on error wlcore: fix runtime pm imbalance in wlcore_regdomain_config wlcore: fix runtime pm imbalance in wl1271_tx_work ASoC: img-i2s-out: Fix runtime PM imbalance on error perf kcore_copy: Fix module map when there are no modules loaded perf metricgroup: Free metric_events on error perf util: Fix memory leak of prefix_if_not_in perf stat: Fix duration_time value for higher intervals perf trace: Fix the selection for architectures to generate the errno name tables perf evsel: Fix 2 memory leaks vfio/pci: fix memory leaks of eventfd ctx btrfs: don't force read-only after error in drop snapshot usb: dwc3: Increase timeout for CmdAct cleared by device controller printk: handle blank console arguments passed in. drm/nouveau/dispnv50: fix runtime pm imbalance on error drm/nouveau: fix runtime pm imbalance on error drm/nouveau/debugfs: fix runtime pm imbalance on error e1000: Do not perform reset in reset_task if we are already down arm64/cpufeature: Drop TraceFilt feature exposure from ID_DFR0 register scsi: cxlflash: Fix error return code in cxlflash_probe() USB: EHCI: ehci-mv: fix less than zero comparison of an unsigned int fuse: don't check refcount after stealing page powerpc/traps: Make unrecoverable NMIs die instead of panic ALSA: hda: Fix potential race in unsol event handler tty: serial: samsung: Correct clock selection logic tipc: fix memory leak in service subscripting USB: EHCI: ehci-mv: fix error handling in mv_ehci_probe() Bluetooth: Handle Inquiry Cancel error after Inquiry Complete phy: samsung: s5pv210-usb2: Add delay after reset power: supply: max17040: Correct voltage reading perf mem2node: Avoid double free related to realloc atm: fix a memory leak of vcc->user_back dt-bindings: sound: wm8994: Correct required supplies based on actual implementaion arm64: cpufeature: Relax checks for AArch32 support at EL[0-2] sparc64: vcc: Fix error return code in vcc_probe() staging:r8188eu: avoid skb_clone for amsdu to msdu conversion scsi: aacraid: Fix error handling paths in aac_probe_one() net: openvswitch: use u64 for meter bucket KVM: arm64: vgic-its: Fix memory leak on the error path of vgic_add_lpi() drivers: char: tlclk.c: Avoid data race between init and interrupt handler bdev: Reduce time holding bd_mutex in sync in blkdev_close() KVM: Remove CREATE_IRQCHIP/SET_PIT2 race serial: uartps: Wait for tx_empty in console setup scsi: qedi: Fix termination timeouts in session logout mm/mmap.c: initialize align_offset explicitly for vm_unmapped_area nvmet-rdma: fix double free of rdma queue mm/vmscan.c: fix data races using kswapd_classzone_idx mm/filemap.c: clear page error before actual read mm/kmemleak.c: use address-of operator on section symbols NFS: Fix races nfs_page_group_destroy() vs nfs_destroy_unlinked_subrequests() PCI: pciehp: Fix MSI interrupt race ALSA: usb-audio: Fix case when USB MIDI interface has more than one extra endpoint descriptor ubifs: Fix out-of-bounds memory access caused by abnormal value of node_len PCI: Use ioremap(), not phys_to_virt() for platform ROM svcrdma: Fix leak of transport addresses SUNRPC: Fix a potential buffer overflow in 'svc_print_xprts()' scsi: hpsa: correct race condition in offload enabled RDMA/rxe: Set sys_image_guid to be aligned with HW IB devices nvme: Fix controller creation races with teardown flow nvme-multipath: do not reset on unknown status tools: gpio-hammer: Avoid potential overflow in main cpufreq: powernv: Fix frame-size-overflow in powernv_cpufreq_work_fn perf cpumap: Fix snprintf overflow check serial: 8250: 8250_omap: Terminate DMA before pushing data on RX timeout serial: 8250_omap: Fix sleeping function called from invalid context during probe serial: 8250_port: Don't service RX FIFO if throttled perf parse-events: Fix 3 use after frees found with clang ASAN thermal: rcar_thermal: Handle probe error gracefully tracing: Use address-of operator on section symbols drm/msm/a5xx: Always set an OPP supported hardware value drm/msm: fix leaks if initialization fails KVM: PPC: Book3S HV: Treat TM-related invalid form instructions on P9 like the valid ones RDMA/cm: Remove a race freeing timewait_info nfsd: Don't add locks to closed or closing open stateids rtc: ds1374: fix possible race condition rtc: sa1100: fix possible race condition tpm: ibmvtpm: Wait for buffer to be set before proceeding ext4: mark block bitmap corrupted when found instead of BUGON xfs: mark dir corrupt when lookup-by-hash fails xfs: don't ever return a stale pointer from __xfs_dir3_free_read media: tda10071: fix unsigned sign extension overflow Bluetooth: L2CAP: handle l2cap config request during open state scsi: aacraid: Disabling TM path and only processing IOP reset ath10k: use kzalloc to read for ath10k_sdio_hif_diag_read drm/amd/display: Stop if retimer is not available drm/amdgpu: increase atombios cmd timeout mm: avoid data corruption on CoW fault into PFN-mapped VMA perf jevents: Fix leak of mapfile memory ext4: fix a data race at inode->i_disksize timekeeping: Prevent 32bit truncation in scale64_check_overflow() Bluetooth: guard against controllers sending zero'd events media: go7007: Fix URB type for interrupt handling bus: hisi_lpc: Fixup IO ports addresses to avoid use-after-free in host removal random: fix data races at timer_rand_state firmware: arm_sdei: Use cpus_read_lock() to avoid races with cpuhp drm/amd/display: dal_ddc_i2c_payloads_create can fail causing panic dmaengine: tegra-apb: Prevent race conditions on channel's freeing dmaengine: stm32-dma: use vchan_terminate_vdesc() in .terminate_all bpf: Remove recursion prevention from rcu free callback x86/pkeys: Add check for pkey "overflow" media: staging/imx: Missing assignment in imx_media_capture_device_register() dmaengine: stm32-mdma: use vchan_terminate_vdesc() in .terminate_all KVM: x86: fix incorrect comparison in trace event RDMA/rxe: Fix configuration of atomic queue pair attributes perf test: Fix test trace+probe_vfs_getname.sh on s390 ALSA: usb-audio: Don't create a mixer element with bogus volume range mt76: clear skb pointers from rx aggregation reorder buffer during cleanup crypto: chelsio - This fixes the kernel panic which occurs during a libkcapi test clk: stratix10: use do_div() for 64-bit calculation drm/omap: fix possible object reference leak scsi: lpfc: Fix coverity errors in fmdi attribute handling scsi: lpfc: Fix RQ buffer leakage when no IOCBs available selinux: sel_avc_get_stat_idx should increase position index audit: CONFIG_CHANGE don't log internal bookkeeping as an event skbuff: fix a data race in skb_queue_len() ALSA: hda: Clear RIRB status before reading WP KVM: fix overflow of zero page refcount with ksm running Bluetooth: prefetch channel before killing sock mm: pagewalk: fix termination condition in walk_pte_range() mm/swapfile.c: swap_next should increase position index Bluetooth: Fix refcount use-after-free issue tools/power/x86/intel_pstate_tracer: changes for python 3 compatibility selftests/ftrace: fix glob selftest ceph: ensure we have a new cap before continuing in fill_inode ar5523: Add USB ID of SMCWUSBT-G2 wireless adapter ARM: 8948/1: Prevent OOB access in stacktrace tracing: Set kernel_stack's caller size properly Bluetooth: btrtl: Use kvmalloc for FW allocations powerpc/eeh: Only dump stack once if an MMIO loop is detected s390/cpum_sf: Use kzalloc and minor changes dmaengine: zynqmp_dma: fix burst length configuration scsi: ufs: Fix a race condition in the tracing code scsi: ufs: Make ufshcd_add_command_trace() easier to read ACPI: EC: Reference count query handlers under lock sctp: move trace_sctp_probe_path into sctp_outq_sack media: ti-vpe: cal: Restrict DMA to avoid memory corruption seqlock: Require WRITE_ONCE surrounding raw_seqcount_barrier ipv6_route_seq_next should increase position index rt_cpu_seq_next should increase position index neigh_stat_seq_next() should increase position index xfs: fix log reservation overflows when allocating large rt extents KVM: arm/arm64: vgic: Fix potential double free dist->spis in __kvm_vgic_destroy() kernel/sys.c: avoid copying possible padding bytes in copy_to_user ASoC: max98090: remove msleep in PLL unlocked workaround CIFS: Properly process SMB3 lease breaks debugfs: Fix !DEBUG_FS debugfs_create_automount scsi: pm80xx: Cleanup command when a reset times out gfs2: clean up iopen glock mess in gfs2_create_inode mmc: core: Fix size overflow for mmc partitions ubi: Fix producing anchor PEBs RDMA/iw_cgxb4: Fix an error handling path in 'c4iw_connect()' xfs: fix attr leaf header freemap.size underflow fix dget_parent() fastpath race RDMA/i40iw: Fix potential use after free RDMA/qedr: Fix potential use after free dmaengine: mediatek: hsdma_probe: fixed a memory leak when devm_request_irq fails bcache: fix a lost wake-up problem caused by mca_cannibalize_lock tracing: Adding NULL checks for trace_array descriptor pointer tpm_crb: fix fTPM on AMD Zen+ CPUs drm/amdgpu/powerplay/smu7: fix AVFS handling with custom powerplay table mfd: mfd-core: Protect against NULL call-back function pointer mtd: cfi_cmdset_0002: don't free cfi->cfiq in error path of cfi_amdstd_setup() drm/amdgpu/powerplay: fix AVFS handling with custom powerplay table clk/ti/adpll: allocate room for terminating null net: silence data-races on sk_backlog.tail scsi: lpfc: Fix kernel crash at lpfc_nvme_info_show during remote port bounce scsi: fnic: fix use after free PM / devfreq: tegra30: Fix integer overflow on CPU's freq max out leds: mlxreg: Fix possible buffer overflow lib/string.c: implement stpcpy ALSA: hda/realtek: Enable front panel headset LED on Lenovo ThinkStation P520 ALSA: hda/realtek - Couldn't detect Mic if booting with headset plugged ALSA: usb-audio: Add delay quirk for H570e USB headsets x86/ioapic: Unbreak check_timer() arch/x86/lib/usercopy_64.c: fix __copy_user_flushcache() cache writeback media: smiapp: Fix error handling at NVM reading ASoC: kirkwood: fix IRQ error handling gma/gma500: fix a memory disclosure bug due to uninitialized bytes m68k: q40: Fix info-leak in rtc_ioctl scsi: aacraid: fix illegal IO beyond last LBA mm: fix double page fault on arm64 if PTE_AF is cleared ath10k: fix memory leak for tpc_stats_final ath10k: fix array out-of-bounds access dma-fence: Serialise signal enabling (dma_fence_enable_sw_signaling) media: mc-device.c: fix memleak in media_device_register_entity selinux: allow labeling before policy is loaded ANDROID: GKI: prevent removal of monitored symbols ANDROID: Refresh ABI.xmls with libabigail 1.8.0-98bbf30d Linux 4.19.148 serial: 8250: Avoid error message on reprobe tcp_bbr: adapt cwnd based on ack aggregation estimation tcp_bbr: refactor bbr_target_cwnd() for general inflight provisioning mm: memcg: fix memcg reclaim soft lockup kbuild: support LLVM=1 to switch the default tools to Clang/LLVM kbuild: replace AS=clang with LLVM_IAS=1 kbuild: remove AS variable x86/boot: kbuild: allow readelf executable to be specified net: wan: wanxl: use $(M68KCC) instead of $(M68KAS) for rebuilding firmware net: wan: wanxl: use allow to pass CROSS_COMPILE_M68k for rebuilding firmware Documentation/llvm: fix the name of llvm-size Documentation/llvm: add documentation on building w/ Clang/LLVM kbuild: add OBJSIZE variable for the size tool MAINTAINERS: add CLANG/LLVM BUILD SUPPORT info ipv4: Update exception handling for multipath routes via same device net: add __must_check to skb_put_padto() net: qrtr: check skb_put_padto() return value net: phy: Avoid NPD upon phy_detach() when driver is unbound bnxt_en: Protect bnxt_set_eee() and bnxt_set_pauseparam() with mutex. bnxt_en: return proper error codes in bnxt_show_temp tipc: use skb_unshare() instead in tipc_buf_append() tipc: fix shutdown() of connection oriented socket tipc: Fix memory leak in tipc_group_create_member() nfp: use correct define to return NONE fec net: sch_generic: aviod concurrent reset and enqueue op for lockless qdisc net: ipv6: fix kconfig dependency warning for IPV6_SEG6_HMAC net: dsa: rtl8366: Properly clear member config net: DCB: Validate DCB_ATTR_DCB_BUFFER argument ipv6: avoid lockdep issue in fib6_del() ip: fix tos reflection in ack and reset packets hdlc_ppp: add range checks in ppp_cp_parse_cr() geneve: add transport ports in route lookup for geneve cxgb4: Fix offset when clearing filter byte counters mm/thp: fix __split_huge_pmd_locked() for migration PMD kprobes: fix kill kprobe which has been marked as gone KVM: fix memory leak in kvm_io_bus_unregister_dev() af_key: pfkey_dump needs parameter validation ANDROID: drop KERNEL_DIR setting in build.config.common Linux 4.19.147 x86/defconfig: Enable CONFIG_USB_XHCI_HCD=y powerpc/dma: Fix dma_map_ops::get_required_mask ehci-hcd: Move include to keep CRC stable x86/boot/compressed: Disable relocation relaxation serial: 8250_pci: Add Realtek 816a and 816b Input: i8042 - add Entroware Proteus EL07R4 to nomux and reset lists Input: trackpoint - add new trackpoint variant IDs percpu: fix first chunk size calculation for populated bitmap Revert "ALSA: hda - Fix silent audio output and corrupted input on MSI X570-A PRO" i2c: i801: Fix resume bug usblp: fix race between disconnect() and read() USB: UAS: fix disconnect by unplugging a hub USB: quirks: Add USB_QUIRK_IGNORE_REMOTE_WAKEUP quirk for BYD zhaoxin notebook drm/mediatek: Add missing put_device() call in mtk_hdmi_dt_parse_pdata() drm/mediatek: Add exception handing in mtk_drm_probe() if component init fail MIPS: SNI: Fix spurious interrupts fbcon: Fix user font detection test at fbcon_resize(). perf test: Free formats for perf pmu parse test MIPS: SNI: Fix MIPS_L1_CACHE_SHIFT perf test: Fix the "signal" test inline assembly Drivers: hv: vmbus: Add timeout to vmbus_wait_for_unload ASoC: qcom: Set card->owner to avoid warnings clk: rockchip: Fix initialization of mux_pll_src_4plls_p clk: davinci: Use the correct size when allocating memory KVM: MIPS: Change the definition of kvm type spi: Fix memory leak on splited transfers i2c: algo: pca: Reapply i2c bus settings after reset f2fs: Return EOF on unaligned end of file DIO read f2fs: fix indefinite loop scanning for free nid nvme-rdma: cancel async events before freeing event struct nvme-fc: cancel async events before freeing event struct openrisc: Fix cache API compile issue when not inlining rapidio: Replace 'select' DMAENGINES 'with depends on' SUNRPC: stop printk reading past end of string NFS: Zero-stateid SETATTR should first return delegation spi: spi-loopback-test: Fix out-of-bounds read regulator: pwm: Fix machine constraints application scsi: lpfc: Fix FLOGI/PLOGI receive race condition in pt2pt discovery scsi: libfc: Fix for double free() scsi: pm8001: Fix memleak in pm8001_exec_internal_task_abort NFSv4.1 handle ERR_DELAY error reclaiming locking state on delegation recall hv_netvsc: Remove "unlikely" from netvsc_select_queue net: handle the return value of pskb_carve_frag_list() correctly RDMA/bnxt_re: Restrict the max_gids to 256 gfs2: initialize transaction tr_ailX_lists earlier scsi: qla2xxx: Reduce holding sess_lock to prevent CPU lock-up scsi: qla2xxx: Move rport registration out of internal work_list scsi: qla2xxx: Update rscn_rcvd field to more meaningful scan_needed dsa: Allow forwarding of redirected IGMP traffic ANDROID: Refresh ABI.xmls with libabigail 1.8.0-1dca710a ANDROID: KMI symbol lists: migrate section name Conflicts: Documentation/devicetree/bindings Documentation/devicetree/bindings/sound/wm8994.txt Makefile drivers/scsi/ufs/ufshcd.c drivers/usb/dwc3/gadget.c mm/memory.c net/qrtr/qrtr.c Change-Id: I51d2167f5b2aca5ff0e50a5399d6c13b7a9a7e64 Signed-off-by: Srinivasarao P <spathi@codeaurora.org>
This commit is contained in:
commit
5ca1f513f7
378 changed files with 7540 additions and 2428 deletions
|
@ -250,7 +250,7 @@ High-level taskfile hooks
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
void (*qc_prep) (struct ata_queued_cmd *qc);
|
enum ata_completion_errors (*qc_prep) (struct ata_queued_cmd *qc);
|
||||||
int (*qc_issue) (struct ata_queued_cmd *qc);
|
int (*qc_issue) (struct ata_queued_cmd *qc);
|
||||||
|
|
||||||
|
|
||||||
|
|
87
Documentation/kbuild/llvm.rst
Normal file
87
Documentation/kbuild/llvm.rst
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
==============================
|
||||||
|
Building Linux with Clang/LLVM
|
||||||
|
==============================
|
||||||
|
|
||||||
|
This document covers how to build the Linux kernel with Clang and LLVM
|
||||||
|
utilities.
|
||||||
|
|
||||||
|
About
|
||||||
|
-----
|
||||||
|
|
||||||
|
The Linux kernel has always traditionally been compiled with GNU toolchains
|
||||||
|
such as GCC and binutils. Ongoing work has allowed for `Clang
|
||||||
|
<https://clang.llvm.org/>`_ and `LLVM <https://llvm.org/>`_ utilities to be
|
||||||
|
used as viable substitutes. Distributions such as `Android
|
||||||
|
<https://www.android.com/>`_, `ChromeOS
|
||||||
|
<https://www.chromium.org/chromium-os>`_, and `OpenMandriva
|
||||||
|
<https://www.openmandriva.org/>`_ use Clang built kernels. `LLVM is a
|
||||||
|
collection of toolchain components implemented in terms of C++ objects
|
||||||
|
<https://www.aosabook.org/en/llvm.html>`_. Clang is a front-end to LLVM that
|
||||||
|
supports C and the GNU C extensions required by the kernel, and is pronounced
|
||||||
|
"klang," not "see-lang."
|
||||||
|
|
||||||
|
Clang
|
||||||
|
-----
|
||||||
|
|
||||||
|
The compiler used can be swapped out via `CC=` command line argument to `make`.
|
||||||
|
`CC=` should be set when selecting a config and during a build.
|
||||||
|
|
||||||
|
make CC=clang defconfig
|
||||||
|
|
||||||
|
make CC=clang
|
||||||
|
|
||||||
|
Cross Compiling
|
||||||
|
---------------
|
||||||
|
|
||||||
|
A single Clang compiler binary will typically contain all supported backends,
|
||||||
|
which can help simplify cross compiling.
|
||||||
|
|
||||||
|
ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make CC=clang
|
||||||
|
|
||||||
|
`CROSS_COMPILE` is not used to prefix the Clang compiler binary, instead
|
||||||
|
`CROSS_COMPILE` is used to set a command line flag: `--target <triple>`. For
|
||||||
|
example:
|
||||||
|
|
||||||
|
clang --target aarch64-linux-gnu foo.c
|
||||||
|
|
||||||
|
LLVM Utilities
|
||||||
|
--------------
|
||||||
|
|
||||||
|
LLVM has substitutes for GNU binutils utilities. Kbuild supports `LLVM=1`
|
||||||
|
to enable them.
|
||||||
|
|
||||||
|
make LLVM=1
|
||||||
|
|
||||||
|
They can be enabled individually. The full list of the parameters:
|
||||||
|
|
||||||
|
make CC=clang LD=ld.lld AR=llvm-ar NM=llvm-nm STRIP=llvm-strip \\
|
||||||
|
OBJCOPY=llvm-objcopy OBJDUMP=llvm-objdump OBJSIZE=llvm-size \\
|
||||||
|
READELF=llvm-readelf HOSTCC=clang HOSTCXX=clang++ HOSTAR=llvm-ar \\
|
||||||
|
HOSTLD=ld.lld
|
||||||
|
|
||||||
|
Currently, the integrated assembler is disabled by default. You can pass
|
||||||
|
`LLVM_IAS=1` to enable it.
|
||||||
|
|
||||||
|
Getting Help
|
||||||
|
------------
|
||||||
|
|
||||||
|
- `Website <https://clangbuiltlinux.github.io/>`_
|
||||||
|
- `Mailing List <https://groups.google.com/forum/#!forum/clang-built-linux>`_: <clang-built-linux@googlegroups.com>
|
||||||
|
- `Issue Tracker <https://github.com/ClangBuiltLinux/linux/issues>`_
|
||||||
|
- IRC: #clangbuiltlinux on chat.freenode.net
|
||||||
|
- `Telegram <https://t.me/ClangBuiltLinux>`_: @ClangBuiltLinux
|
||||||
|
- `Wiki <https://github.com/ClangBuiltLinux/linux/wiki>`_
|
||||||
|
- `Beginner Bugs <https://github.com/ClangBuiltLinux/linux/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22>`_
|
||||||
|
|
||||||
|
Getting LLVM
|
||||||
|
-------------
|
||||||
|
|
||||||
|
- http://releases.llvm.org/download.html
|
||||||
|
- https://github.com/llvm/llvm-project
|
||||||
|
- https://llvm.org/docs/GettingStarted.html
|
||||||
|
- https://llvm.org/docs/CMake.html
|
||||||
|
- https://apt.llvm.org/
|
||||||
|
- https://www.archlinux.org/packages/extra/x86_64/llvm/
|
||||||
|
- https://github.com/ClangBuiltLinux/tc-build
|
||||||
|
- https://github.com/ClangBuiltLinux/linux/wiki/Building-Clang-from-source
|
||||||
|
- https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86/
|
|
@ -3619,6 +3619,15 @@ M: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: .clang-format
|
F: .clang-format
|
||||||
|
|
||||||
|
CLANG/LLVM BUILD SUPPORT
|
||||||
|
L: clang-built-linux@googlegroups.com
|
||||||
|
W: https://clangbuiltlinux.github.io/
|
||||||
|
B: https://github.com/ClangBuiltLinux/linux/issues
|
||||||
|
C: irc://chat.freenode.net/clangbuiltlinux
|
||||||
|
S: Supported
|
||||||
|
K: \b(?i:clang|llvm)\b
|
||||||
|
F: Documentation/kbuild/llvm.rst
|
||||||
|
|
||||||
CLEANCACHE API
|
CLEANCACHE API
|
||||||
M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
|
|
34
Makefile
34
Makefile
|
@ -1,7 +1,7 @@
|
||||||
# SPDX-License-Identifier: GPL-2.0
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
VERSION = 4
|
VERSION = 4
|
||||||
PATCHLEVEL = 19
|
PATCHLEVEL = 19
|
||||||
SUBLEVEL = 146
|
SUBLEVEL = 149
|
||||||
EXTRAVERSION =
|
EXTRAVERSION =
|
||||||
NAME = "People's Front"
|
NAME = "People's Front"
|
||||||
|
|
||||||
|
@ -358,8 +358,13 @@ HOST_LFS_CFLAGS := $(shell getconf LFS_CFLAGS 2>/dev/null)
|
||||||
HOST_LFS_LDFLAGS := $(shell getconf LFS_LDFLAGS 2>/dev/null)
|
HOST_LFS_LDFLAGS := $(shell getconf LFS_LDFLAGS 2>/dev/null)
|
||||||
HOST_LFS_LIBS := $(shell getconf LFS_LIBS 2>/dev/null)
|
HOST_LFS_LIBS := $(shell getconf LFS_LIBS 2>/dev/null)
|
||||||
|
|
||||||
|
ifneq ($(LLVM),)
|
||||||
|
HOSTCC = clang
|
||||||
|
HOSTCXX = clang++
|
||||||
|
else
|
||||||
HOSTCC = gcc
|
HOSTCC = gcc
|
||||||
HOSTCXX = g++
|
HOSTCXX = g++
|
||||||
|
endif
|
||||||
KBUILD_HOSTCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 \
|
KBUILD_HOSTCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 \
|
||||||
-fomit-frame-pointer -std=gnu89 $(HOST_LFS_CFLAGS) \
|
-fomit-frame-pointer -std=gnu89 $(HOST_LFS_CFLAGS) \
|
||||||
$(HOSTCFLAGS)
|
$(HOSTCFLAGS)
|
||||||
|
@ -368,15 +373,28 @@ KBUILD_HOSTLDFLAGS := $(HOST_LFS_LDFLAGS) $(HOSTLDFLAGS)
|
||||||
KBUILD_HOSTLDLIBS := $(HOST_LFS_LIBS) $(HOSTLDLIBS)
|
KBUILD_HOSTLDLIBS := $(HOST_LFS_LIBS) $(HOSTLDLIBS)
|
||||||
|
|
||||||
# Make variables (CC, etc...)
|
# Make variables (CC, etc...)
|
||||||
AS = $(CROSS_COMPILE)as
|
|
||||||
LD = $(CROSS_COMPILE)ld
|
|
||||||
REAL_CC = $(CROSS_COMPILE)gcc
|
|
||||||
CPP = $(CC) -E
|
CPP = $(CC) -E
|
||||||
|
ifneq ($(LLVM),)
|
||||||
|
CC = clang
|
||||||
|
LD = ld.lld
|
||||||
|
AR = llvm-ar
|
||||||
|
NM = llvm-nm
|
||||||
|
OBJCOPY = llvm-objcopy
|
||||||
|
OBJDUMP = llvm-objdump
|
||||||
|
READELF = llvm-readelf
|
||||||
|
OBJSIZE = llvm-size
|
||||||
|
STRIP = llvm-strip
|
||||||
|
else
|
||||||
|
REAL_CC = $(CROSS_COMPILE)gcc
|
||||||
|
LD = $(CROSS_COMPILE)ld
|
||||||
AR = $(CROSS_COMPILE)ar
|
AR = $(CROSS_COMPILE)ar
|
||||||
NM = $(CROSS_COMPILE)nm
|
NM = $(CROSS_COMPILE)nm
|
||||||
STRIP = $(CROSS_COMPILE)strip
|
|
||||||
OBJCOPY = $(CROSS_COMPILE)objcopy
|
OBJCOPY = $(CROSS_COMPILE)objcopy
|
||||||
OBJDUMP = $(CROSS_COMPILE)objdump
|
OBJDUMP = $(CROSS_COMPILE)objdump
|
||||||
|
READELF = $(CROSS_COMPILE)readelf
|
||||||
|
OBJSIZE = $(CROSS_COMPILE)size
|
||||||
|
STRIP = $(CROSS_COMPILE)strip
|
||||||
|
endif
|
||||||
LEX = flex
|
LEX = flex
|
||||||
YACC = bison
|
YACC = bison
|
||||||
AWK = awk
|
AWK = awk
|
||||||
|
@ -436,8 +454,8 @@ KBUILD_LDFLAGS :=
|
||||||
GCC_PLUGINS_CFLAGS :=
|
GCC_PLUGINS_CFLAGS :=
|
||||||
CLANG_FLAGS :=
|
CLANG_FLAGS :=
|
||||||
|
|
||||||
export ARCH SRCARCH CONFIG_SHELL HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE AS LD CC
|
export ARCH SRCARCH CONFIG_SHELL HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE LD CC
|
||||||
export CPP AR NM STRIP OBJCOPY OBJDUMP KBUILD_HOSTLDFLAGS KBUILD_HOSTLDLIBS
|
export CPP AR NM STRIP OBJCOPY OBJDUMP OBJSIZE READELF KBUILD_HOSTLDFLAGS KBUILD_HOSTLDLIBS
|
||||||
export MAKE LEX YACC AWK GENKSYMS INSTALLKERNEL PERL PYTHON PYTHON2 PYTHON3 UTS_MACHINE
|
export MAKE LEX YACC AWK GENKSYMS INSTALLKERNEL PERL PYTHON PYTHON2 PYTHON3 UTS_MACHINE
|
||||||
export HOSTCXX KBUILD_HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS
|
export HOSTCXX KBUILD_HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS
|
||||||
|
|
||||||
|
@ -499,7 +517,9 @@ endif
|
||||||
ifneq ($(GCC_TOOLCHAIN),)
|
ifneq ($(GCC_TOOLCHAIN),)
|
||||||
CLANG_FLAGS += --gcc-toolchain=$(GCC_TOOLCHAIN)
|
CLANG_FLAGS += --gcc-toolchain=$(GCC_TOOLCHAIN)
|
||||||
endif
|
endif
|
||||||
|
ifneq ($(LLVM_IAS),1)
|
||||||
CLANG_FLAGS += -no-integrated-as
|
CLANG_FLAGS += -no-integrated-as
|
||||||
|
endif
|
||||||
CLANG_FLAGS += $(call cc-option, -Wno-misleading-indentation)
|
CLANG_FLAGS += $(call cc-option, -Wno-misleading-indentation)
|
||||||
CLANG_FLAGS += $(call cc-option, -Wno-bool-operation)
|
CLANG_FLAGS += $(call cc-option, -Wno-bool-operation)
|
||||||
CLANG_FLAGS += -Werror=unknown-warning-option
|
CLANG_FLAGS += -Werror=unknown-warning-option
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
[abi_whitelist]
|
[abi_symbol_list]
|
||||||
# commonly used symbols
|
# commonly used symbols
|
||||||
__cfi_slowpath
|
__cfi_slowpath
|
||||||
__const_udelay
|
__const_udelay
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,4 +1,4 @@
|
||||||
[abi_whitelist]
|
[abi_symbol_list]
|
||||||
# commonly used symbols
|
# commonly used symbols
|
||||||
add_wait_queue
|
add_wait_queue
|
||||||
alloc_etherdev_mqs
|
alloc_etherdev_mqs
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
[abi_whitelist]
|
[abi_symbol_list]
|
||||||
# commonly used symbols
|
# commonly used symbols
|
||||||
add_timer
|
add_timer
|
||||||
add_uevent_var
|
add_uevent_var
|
||||||
|
|
|
@ -216,7 +216,7 @@ static inline int kvm_vcpu_dabt_get_rd(struct kvm_vcpu *vcpu)
|
||||||
return (kvm_vcpu_get_hsr(vcpu) & HSR_SRT_MASK) >> HSR_SRT_SHIFT;
|
return (kvm_vcpu_get_hsr(vcpu) & HSR_SRT_MASK) >> HSR_SRT_SHIFT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool kvm_vcpu_dabt_iss1tw(struct kvm_vcpu *vcpu)
|
static inline bool kvm_vcpu_abt_iss1tw(const struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
return kvm_vcpu_get_hsr(vcpu) & HSR_DABT_S1PTW;
|
return kvm_vcpu_get_hsr(vcpu) & HSR_DABT_S1PTW;
|
||||||
}
|
}
|
||||||
|
@ -248,16 +248,21 @@ static inline bool kvm_vcpu_trap_il_is32bit(struct kvm_vcpu *vcpu)
|
||||||
return kvm_vcpu_get_hsr(vcpu) & HSR_IL;
|
return kvm_vcpu_get_hsr(vcpu) & HSR_IL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline u8 kvm_vcpu_trap_get_class(struct kvm_vcpu *vcpu)
|
static inline u8 kvm_vcpu_trap_get_class(const struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
return kvm_vcpu_get_hsr(vcpu) >> HSR_EC_SHIFT;
|
return kvm_vcpu_get_hsr(vcpu) >> HSR_EC_SHIFT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool kvm_vcpu_trap_is_iabt(struct kvm_vcpu *vcpu)
|
static inline bool kvm_vcpu_trap_is_iabt(const struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
return kvm_vcpu_trap_get_class(vcpu) == HSR_EC_IABT;
|
return kvm_vcpu_trap_get_class(vcpu) == HSR_EC_IABT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool kvm_vcpu_trap_is_exec_fault(const struct kvm_vcpu *vcpu)
|
||||||
|
{
|
||||||
|
return kvm_vcpu_trap_is_iabt(vcpu) && !kvm_vcpu_abt_iss1tw(vcpu);
|
||||||
|
}
|
||||||
|
|
||||||
static inline u8 kvm_vcpu_trap_get_fault(struct kvm_vcpu *vcpu)
|
static inline u8 kvm_vcpu_trap_get_fault(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
return kvm_vcpu_get_hsr(vcpu) & HSR_FSC;
|
return kvm_vcpu_get_hsr(vcpu) & HSR_FSC;
|
||||||
|
|
|
@ -115,6 +115,8 @@ static int save_trace(struct stackframe *frame, void *d)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
regs = (struct pt_regs *)frame->sp;
|
regs = (struct pt_regs *)frame->sp;
|
||||||
|
if ((unsigned long)®s[1] > ALIGN(frame->sp, THREAD_SIZE))
|
||||||
|
return 0;
|
||||||
|
|
||||||
trace->entries[trace->nr_entries++] = regs->ARM_pc;
|
trace->entries[trace->nr_entries++] = regs->ARM_pc;
|
||||||
|
|
||||||
|
|
|
@ -68,14 +68,16 @@ static void dump_mem(const char *, const char *, unsigned long, unsigned long);
|
||||||
|
|
||||||
void dump_backtrace_entry(unsigned long where, unsigned long from, unsigned long frame)
|
void dump_backtrace_entry(unsigned long where, unsigned long from, unsigned long frame)
|
||||||
{
|
{
|
||||||
|
unsigned long end = frame + 4 + sizeof(struct pt_regs);
|
||||||
|
|
||||||
#ifdef CONFIG_KALLSYMS
|
#ifdef CONFIG_KALLSYMS
|
||||||
printk("[<%08lx>] (%ps) from [<%08lx>] (%pS)\n", where, (void *)where, from, (void *)from);
|
printk("[<%08lx>] (%ps) from [<%08lx>] (%pS)\n", where, (void *)where, from, (void *)from);
|
||||||
#else
|
#else
|
||||||
printk("Function entered at [<%08lx>] from [<%08lx>]\n", where, from);
|
printk("Function entered at [<%08lx>] from [<%08lx>]\n", where, from);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (in_entry_text(from))
|
if (in_entry_text(from) && end <= ALIGN(frame, THREAD_SIZE))
|
||||||
dump_mem("", "Exception stack", frame + 4, frame + 4 + sizeof(struct pt_regs));
|
dump_mem("", "Exception stack", frame + 4, end);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dump_backtrace_stm(u32 *stack, u32 instruction)
|
void dump_backtrace_stm(u32 *stack, u32 instruction)
|
||||||
|
|
|
@ -303,7 +303,7 @@ static inline int kvm_vcpu_dabt_get_rd(const struct kvm_vcpu *vcpu)
|
||||||
return (kvm_vcpu_get_hsr(vcpu) & ESR_ELx_SRT_MASK) >> ESR_ELx_SRT_SHIFT;
|
return (kvm_vcpu_get_hsr(vcpu) & ESR_ELx_SRT_MASK) >> ESR_ELx_SRT_SHIFT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool kvm_vcpu_dabt_iss1tw(const struct kvm_vcpu *vcpu)
|
static inline bool kvm_vcpu_abt_iss1tw(const struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
return !!(kvm_vcpu_get_hsr(vcpu) & ESR_ELx_S1PTW);
|
return !!(kvm_vcpu_get_hsr(vcpu) & ESR_ELx_S1PTW);
|
||||||
}
|
}
|
||||||
|
@ -311,7 +311,7 @@ static inline bool kvm_vcpu_dabt_iss1tw(const struct kvm_vcpu *vcpu)
|
||||||
static inline bool kvm_vcpu_dabt_iswrite(const struct kvm_vcpu *vcpu)
|
static inline bool kvm_vcpu_dabt_iswrite(const struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
return !!(kvm_vcpu_get_hsr(vcpu) & ESR_ELx_WNR) ||
|
return !!(kvm_vcpu_get_hsr(vcpu) & ESR_ELx_WNR) ||
|
||||||
kvm_vcpu_dabt_iss1tw(vcpu); /* AF/DBM update */
|
kvm_vcpu_abt_iss1tw(vcpu); /* AF/DBM update */
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool kvm_vcpu_dabt_is_cm(const struct kvm_vcpu *vcpu)
|
static inline bool kvm_vcpu_dabt_is_cm(const struct kvm_vcpu *vcpu)
|
||||||
|
@ -340,6 +340,11 @@ static inline bool kvm_vcpu_trap_is_iabt(const struct kvm_vcpu *vcpu)
|
||||||
return kvm_vcpu_trap_get_class(vcpu) == ESR_ELx_EC_IABT_LOW;
|
return kvm_vcpu_trap_get_class(vcpu) == ESR_ELx_EC_IABT_LOW;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool kvm_vcpu_trap_is_exec_fault(const struct kvm_vcpu *vcpu)
|
||||||
|
{
|
||||||
|
return kvm_vcpu_trap_is_iabt(vcpu) && !kvm_vcpu_abt_iss1tw(vcpu);
|
||||||
|
}
|
||||||
|
|
||||||
static inline u8 kvm_vcpu_trap_get_fault(const struct kvm_vcpu *vcpu)
|
static inline u8 kvm_vcpu_trap_get_fault(const struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
return kvm_vcpu_get_hsr(vcpu) & ESR_ELx_FSC;
|
return kvm_vcpu_get_hsr(vcpu) & ESR_ELx_FSC;
|
||||||
|
|
|
@ -155,11 +155,10 @@ static const struct arm64_ftr_bits ftr_id_aa64pfr0[] = {
|
||||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64PFR0_GIC_SHIFT, 4, 0),
|
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64PFR0_GIC_SHIFT, 4, 0),
|
||||||
S_ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64PFR0_ASIMD_SHIFT, 4, ID_AA64PFR0_ASIMD_NI),
|
S_ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64PFR0_ASIMD_SHIFT, 4, ID_AA64PFR0_ASIMD_NI),
|
||||||
S_ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64PFR0_FP_SHIFT, 4, ID_AA64PFR0_FP_NI),
|
S_ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64PFR0_FP_SHIFT, 4, ID_AA64PFR0_FP_NI),
|
||||||
/* Linux doesn't care about the EL3 */
|
|
||||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_NONSTRICT, FTR_LOWER_SAFE, ID_AA64PFR0_EL3_SHIFT, 4, 0),
|
ARM64_FTR_BITS(FTR_HIDDEN, FTR_NONSTRICT, FTR_LOWER_SAFE, ID_AA64PFR0_EL3_SHIFT, 4, 0),
|
||||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64PFR0_EL2_SHIFT, 4, 0),
|
ARM64_FTR_BITS(FTR_HIDDEN, FTR_NONSTRICT, FTR_LOWER_SAFE, ID_AA64PFR0_EL2_SHIFT, 4, 0),
|
||||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64PFR0_EL1_SHIFT, 4, ID_AA64PFR0_EL1_64BIT_ONLY),
|
ARM64_FTR_BITS(FTR_HIDDEN, FTR_NONSTRICT, FTR_LOWER_SAFE, ID_AA64PFR0_EL1_SHIFT, 4, ID_AA64PFR0_EL1_64BIT_ONLY),
|
||||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64PFR0_EL0_SHIFT, 4, ID_AA64PFR0_EL0_64BIT_ONLY),
|
ARM64_FTR_BITS(FTR_HIDDEN, FTR_NONSTRICT, FTR_LOWER_SAFE, ID_AA64PFR0_EL0_SHIFT, 4, ID_AA64PFR0_EL0_64BIT_ONLY),
|
||||||
ARM64_FTR_END,
|
ARM64_FTR_END,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -301,7 +300,7 @@ static const struct arm64_ftr_bits ftr_id_pfr0[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct arm64_ftr_bits ftr_id_dfr0[] = {
|
static const struct arm64_ftr_bits ftr_id_dfr0[] = {
|
||||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, 28, 4, 0),
|
/* [31:28] TraceFilt */
|
||||||
S_ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, 24, 4, 0xf), /* PerfMon */
|
S_ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, 24, 4, 0xf), /* PerfMon */
|
||||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, 20, 4, 0),
|
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, 20, 4, 0),
|
||||||
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, 16, 4, 0),
|
ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, 16, 4, 0),
|
||||||
|
@ -671,9 +670,6 @@ void update_cpu_features(int cpu,
|
||||||
taint |= check_update_ftr_reg(SYS_ID_AA64MMFR2_EL1, cpu,
|
taint |= check_update_ftr_reg(SYS_ID_AA64MMFR2_EL1, cpu,
|
||||||
info->reg_id_aa64mmfr2, boot->reg_id_aa64mmfr2);
|
info->reg_id_aa64mmfr2, boot->reg_id_aa64mmfr2);
|
||||||
|
|
||||||
/*
|
|
||||||
* EL3 is not our concern.
|
|
||||||
*/
|
|
||||||
taint |= check_update_ftr_reg(SYS_ID_AA64PFR0_EL1, cpu,
|
taint |= check_update_ftr_reg(SYS_ID_AA64PFR0_EL1, cpu,
|
||||||
info->reg_id_aa64pfr0, boot->reg_id_aa64pfr0);
|
info->reg_id_aa64pfr0, boot->reg_id_aa64pfr0);
|
||||||
taint |= check_update_ftr_reg(SYS_ID_AA64PFR1_EL1, cpu,
|
taint |= check_update_ftr_reg(SYS_ID_AA64PFR1_EL1, cpu,
|
||||||
|
|
|
@ -430,7 +430,7 @@ static bool __hyp_text fixup_guest_exit(struct kvm_vcpu *vcpu, u64 *exit_code)
|
||||||
kvm_vcpu_trap_get_fault_type(vcpu) == FSC_FAULT &&
|
kvm_vcpu_trap_get_fault_type(vcpu) == FSC_FAULT &&
|
||||||
kvm_vcpu_dabt_isvalid(vcpu) &&
|
kvm_vcpu_dabt_isvalid(vcpu) &&
|
||||||
!kvm_vcpu_dabt_isextabt(vcpu) &&
|
!kvm_vcpu_dabt_isextabt(vcpu) &&
|
||||||
!kvm_vcpu_dabt_iss1tw(vcpu);
|
!kvm_vcpu_abt_iss1tw(vcpu);
|
||||||
|
|
||||||
if (valid) {
|
if (valid) {
|
||||||
int ret = __vgic_v2_perform_cpuif_access(vcpu);
|
int ret = __vgic_v2_perform_cpuif_access(vcpu);
|
||||||
|
|
|
@ -273,6 +273,7 @@ static int q40_get_rtc_pll(struct rtc_pll_info *pll)
|
||||||
{
|
{
|
||||||
int tmp = Q40_RTC_CTRL;
|
int tmp = Q40_RTC_CTRL;
|
||||||
|
|
||||||
|
pll->pll_ctrl = 0;
|
||||||
pll->pll_value = tmp & Q40_RTC_PLL_MASK;
|
pll->pll_value = tmp & Q40_RTC_PLL_MASK;
|
||||||
if (tmp & Q40_RTC_PLL_SIGN)
|
if (tmp & Q40_RTC_PLL_SIGN)
|
||||||
pll->pll_value = -pll->pll_value;
|
pll->pll_value = -pll->pll_value;
|
||||||
|
|
|
@ -854,6 +854,7 @@ config SNI_RM
|
||||||
select I8253
|
select I8253
|
||||||
select I8259
|
select I8259
|
||||||
select ISA
|
select ISA
|
||||||
|
select MIPS_L1_CACHE_SHIFT_6
|
||||||
select SWAP_IO_SPACE if CPU_BIG_ENDIAN
|
select SWAP_IO_SPACE if CPU_BIG_ENDIAN
|
||||||
select SYS_HAS_CPU_R4X00
|
select SYS_HAS_CPU_R4X00
|
||||||
select SYS_HAS_CPU_R5000
|
select SYS_HAS_CPU_R5000
|
||||||
|
|
|
@ -47,6 +47,7 @@ static inline int __pure __get_cpu_type(const int cpu_type)
|
||||||
case CPU_34K:
|
case CPU_34K:
|
||||||
case CPU_1004K:
|
case CPU_1004K:
|
||||||
case CPU_74K:
|
case CPU_74K:
|
||||||
|
case CPU_1074K:
|
||||||
case CPU_M14KC:
|
case CPU_M14KC:
|
||||||
case CPU_M14KEC:
|
case CPU_M14KEC:
|
||||||
case CPU_INTERAPTIV:
|
case CPU_INTERAPTIV:
|
||||||
|
|
|
@ -131,6 +131,8 @@ void kvm_arch_check_processor_compat(void *rtn)
|
||||||
int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
|
int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
|
||||||
{
|
{
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
case KVM_VM_MIPS_AUTO:
|
||||||
|
break;
|
||||||
#ifdef CONFIG_KVM_MIPS_VZ
|
#ifdef CONFIG_KVM_MIPS_VZ
|
||||||
case KVM_VM_MIPS_VZ:
|
case KVM_VM_MIPS_VZ:
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -143,7 +143,10 @@ static struct platform_device sc26xx_pdev = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static u32 a20r_ack_hwint(void)
|
/*
|
||||||
|
* Trigger chipset to update CPU's CAUSE IP field
|
||||||
|
*/
|
||||||
|
static u32 a20r_update_cause_ip(void)
|
||||||
{
|
{
|
||||||
u32 status = read_c0_status();
|
u32 status = read_c0_status();
|
||||||
|
|
||||||
|
@ -205,12 +208,14 @@ static void a20r_hwint(void)
|
||||||
int irq;
|
int irq;
|
||||||
|
|
||||||
clear_c0_status(IE_IRQ0);
|
clear_c0_status(IE_IRQ0);
|
||||||
status = a20r_ack_hwint();
|
status = a20r_update_cause_ip();
|
||||||
cause = read_c0_cause();
|
cause = read_c0_cause();
|
||||||
|
|
||||||
irq = ffs(((cause & status) >> 8) & 0xf8);
|
irq = ffs(((cause & status) >> 8) & 0xf8);
|
||||||
if (likely(irq > 0))
|
if (likely(irq > 0))
|
||||||
do_IRQ(SNI_A20R_IRQ_BASE + irq - 1);
|
do_IRQ(SNI_A20R_IRQ_BASE + irq - 1);
|
||||||
|
|
||||||
|
a20r_update_cause_ip();
|
||||||
set_c0_status(IE_IRQ0);
|
set_c0_status(IE_IRQ0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
#include <asm/tlbflush.h>
|
#include <asm/tlbflush.h>
|
||||||
|
|
||||||
static void cache_loop(struct page *page, const unsigned int reg)
|
static __always_inline void cache_loop(struct page *page, const unsigned int reg)
|
||||||
{
|
{
|
||||||
unsigned long paddr = page_to_pfn(page) << PAGE_SHIFT;
|
unsigned long paddr = page_to_pfn(page) << PAGE_SHIFT;
|
||||||
unsigned long line = paddr & ~(L1_CACHE_BYTES - 1);
|
unsigned long line = paddr & ~(L1_CACHE_BYTES - 1);
|
||||||
|
|
|
@ -163,4 +163,7 @@
|
||||||
|
|
||||||
#define KVM_INST_FETCH_FAILED -1
|
#define KVM_INST_FETCH_FAILED -1
|
||||||
|
|
||||||
|
/* Extract PO and XOP opcode fields */
|
||||||
|
#define PO_XOP_OPCODE_MASK 0xfc0007fe
|
||||||
|
|
||||||
#endif /* __POWERPC_KVM_ASM_H__ */
|
#endif /* __POWERPC_KVM_ASM_H__ */
|
||||||
|
|
|
@ -100,7 +100,8 @@ static u64 dma_iommu_get_required_mask(struct device *dev)
|
||||||
if (!tbl)
|
if (!tbl)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
mask = 1ULL < (fls_long(tbl->it_offset + tbl->it_size) - 1);
|
mask = 1ULL << (fls_long(tbl->it_offset + tbl->it_size) +
|
||||||
|
tbl->it_page_shift - 1);
|
||||||
mask += mask - 1;
|
mask += mask - 1;
|
||||||
|
|
||||||
return mask;
|
return mask;
|
||||||
|
|
|
@ -502,7 +502,7 @@ int eeh_dev_check_failure(struct eeh_dev *edev)
|
||||||
rc = 1;
|
rc = 1;
|
||||||
if (pe->state & EEH_PE_ISOLATED) {
|
if (pe->state & EEH_PE_ISOLATED) {
|
||||||
pe->check_count++;
|
pe->check_count++;
|
||||||
if (pe->check_count % EEH_MAX_FAILS == 0) {
|
if (pe->check_count == EEH_MAX_FAILS) {
|
||||||
dn = pci_device_to_OF_node(dev);
|
dn = pci_device_to_OF_node(dev);
|
||||||
if (dn)
|
if (dn)
|
||||||
location = of_get_property(dn, "ibm,loc-code",
|
location = of_get_property(dn, "ibm,loc-code",
|
||||||
|
|
|
@ -430,11 +430,11 @@ void system_reset_exception(struct pt_regs *regs)
|
||||||
#ifdef CONFIG_PPC_BOOK3S_64
|
#ifdef CONFIG_PPC_BOOK3S_64
|
||||||
BUG_ON(get_paca()->in_nmi == 0);
|
BUG_ON(get_paca()->in_nmi == 0);
|
||||||
if (get_paca()->in_nmi > 1)
|
if (get_paca()->in_nmi > 1)
|
||||||
nmi_panic(regs, "Unrecoverable nested System Reset");
|
die("Unrecoverable nested System Reset", regs, SIGABRT);
|
||||||
#endif
|
#endif
|
||||||
/* Must die if the interrupt is not recoverable */
|
/* Must die if the interrupt is not recoverable */
|
||||||
if (!(regs->msr & MSR_RI))
|
if (!(regs->msr & MSR_RI))
|
||||||
nmi_panic(regs, "Unrecoverable System Reset");
|
die("Unrecoverable System Reset", regs, SIGABRT);
|
||||||
|
|
||||||
if (!nested)
|
if (!nested)
|
||||||
nmi_exit();
|
nmi_exit();
|
||||||
|
@ -775,7 +775,7 @@ void machine_check_exception(struct pt_regs *regs)
|
||||||
|
|
||||||
/* Must die if the interrupt is not recoverable */
|
/* Must die if the interrupt is not recoverable */
|
||||||
if (!(regs->msr & MSR_RI))
|
if (!(regs->msr & MSR_RI))
|
||||||
nmi_panic(regs, "Unrecoverable Machine check");
|
die("Unrecoverable Machine check", regs, SIGBUS);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,8 @@
|
||||||
* published by the Free Software Foundation.
|
* published by the Free Software Foundation.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||||
|
|
||||||
#include <linux/kvm_host.h>
|
#include <linux/kvm_host.h>
|
||||||
|
|
||||||
#include <asm/kvm_ppc.h>
|
#include <asm/kvm_ppc.h>
|
||||||
|
@ -47,7 +49,18 @@ int kvmhv_p9_tm_emulation(struct kvm_vcpu *vcpu)
|
||||||
u64 newmsr, bescr;
|
u64 newmsr, bescr;
|
||||||
int ra, rs;
|
int ra, rs;
|
||||||
|
|
||||||
switch (instr & 0xfc0007ff) {
|
/*
|
||||||
|
* rfid, rfebb, and mtmsrd encode bit 31 = 0 since it's a reserved bit
|
||||||
|
* in these instructions, so masking bit 31 out doesn't change these
|
||||||
|
* instructions. For treclaim., tsr., and trechkpt. instructions if bit
|
||||||
|
* 31 = 0 then they are per ISA invalid forms, however P9 UM, in section
|
||||||
|
* 4.6.10 Book II Invalid Forms, informs specifically that ignoring bit
|
||||||
|
* 31 is an acceptable way to handle these invalid forms that have
|
||||||
|
* bit 31 = 0. Moreover, for emulation purposes both forms (w/ and wo/
|
||||||
|
* bit 31 set) can generate a softpatch interrupt. Hence both forms
|
||||||
|
* are handled below for these instructions so they behave the same way.
|
||||||
|
*/
|
||||||
|
switch (instr & PO_XOP_OPCODE_MASK) {
|
||||||
case PPC_INST_RFID:
|
case PPC_INST_RFID:
|
||||||
/* XXX do we need to check for PR=0 here? */
|
/* XXX do we need to check for PR=0 here? */
|
||||||
newmsr = vcpu->arch.shregs.srr1;
|
newmsr = vcpu->arch.shregs.srr1;
|
||||||
|
@ -108,7 +121,8 @@ int kvmhv_p9_tm_emulation(struct kvm_vcpu *vcpu)
|
||||||
vcpu->arch.shregs.msr = newmsr;
|
vcpu->arch.shregs.msr = newmsr;
|
||||||
return RESUME_GUEST;
|
return RESUME_GUEST;
|
||||||
|
|
||||||
case PPC_INST_TSR:
|
/* ignore bit 31, see comment above */
|
||||||
|
case (PPC_INST_TSR & PO_XOP_OPCODE_MASK):
|
||||||
/* check for PR=1 and arch 2.06 bit set in PCR */
|
/* check for PR=1 and arch 2.06 bit set in PCR */
|
||||||
if ((msr & MSR_PR) && (vcpu->arch.vcore->pcr & PCR_ARCH_206)) {
|
if ((msr & MSR_PR) && (vcpu->arch.vcore->pcr & PCR_ARCH_206)) {
|
||||||
/* generate an illegal instruction interrupt */
|
/* generate an illegal instruction interrupt */
|
||||||
|
@ -143,7 +157,8 @@ int kvmhv_p9_tm_emulation(struct kvm_vcpu *vcpu)
|
||||||
vcpu->arch.shregs.msr = msr;
|
vcpu->arch.shregs.msr = msr;
|
||||||
return RESUME_GUEST;
|
return RESUME_GUEST;
|
||||||
|
|
||||||
case PPC_INST_TRECLAIM:
|
/* ignore bit 31, see comment above */
|
||||||
|
case (PPC_INST_TRECLAIM & PO_XOP_OPCODE_MASK):
|
||||||
/* check for TM disabled in the HFSCR or MSR */
|
/* check for TM disabled in the HFSCR or MSR */
|
||||||
if (!(vcpu->arch.hfscr & HFSCR_TM)) {
|
if (!(vcpu->arch.hfscr & HFSCR_TM)) {
|
||||||
/* generate an illegal instruction interrupt */
|
/* generate an illegal instruction interrupt */
|
||||||
|
@ -179,7 +194,8 @@ int kvmhv_p9_tm_emulation(struct kvm_vcpu *vcpu)
|
||||||
vcpu->arch.shregs.msr &= ~MSR_TS_MASK;
|
vcpu->arch.shregs.msr &= ~MSR_TS_MASK;
|
||||||
return RESUME_GUEST;
|
return RESUME_GUEST;
|
||||||
|
|
||||||
case PPC_INST_TRECHKPT:
|
/* ignore bit 31, see comment above */
|
||||||
|
case (PPC_INST_TRECHKPT & PO_XOP_OPCODE_MASK):
|
||||||
/* XXX do we need to check for PR=0 here? */
|
/* XXX do we need to check for PR=0 here? */
|
||||||
/* check for TM disabled in the HFSCR or MSR */
|
/* check for TM disabled in the HFSCR or MSR */
|
||||||
if (!(vcpu->arch.hfscr & HFSCR_TM)) {
|
if (!(vcpu->arch.hfscr & HFSCR_TM)) {
|
||||||
|
@ -211,6 +227,8 @@ int kvmhv_p9_tm_emulation(struct kvm_vcpu *vcpu)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* What should we do here? We didn't recognize the instruction */
|
/* What should we do here? We didn't recognize the instruction */
|
||||||
WARN_ON_ONCE(1);
|
kvmppc_core_queue_program(vcpu, SRR1_PROGILL);
|
||||||
|
pr_warn_ratelimited("Unrecognized TM-related instruction %#x for emulation", instr);
|
||||||
|
|
||||||
return RESUME_GUEST;
|
return RESUME_GUEST;
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,18 @@ int kvmhv_p9_tm_emulation_early(struct kvm_vcpu *vcpu)
|
||||||
u64 newmsr, msr, bescr;
|
u64 newmsr, msr, bescr;
|
||||||
int rs;
|
int rs;
|
||||||
|
|
||||||
switch (instr & 0xfc0007ff) {
|
/*
|
||||||
|
* rfid, rfebb, and mtmsrd encode bit 31 = 0 since it's a reserved bit
|
||||||
|
* in these instructions, so masking bit 31 out doesn't change these
|
||||||
|
* instructions. For the tsr. instruction if bit 31 = 0 then it is per
|
||||||
|
* ISA an invalid form, however P9 UM, in section 4.6.10 Book II Invalid
|
||||||
|
* Forms, informs specifically that ignoring bit 31 is an acceptable way
|
||||||
|
* to handle TM-related invalid forms that have bit 31 = 0. Moreover,
|
||||||
|
* for emulation purposes both forms (w/ and wo/ bit 31 set) can
|
||||||
|
* generate a softpatch interrupt. Hence both forms are handled below
|
||||||
|
* for tsr. to make them behave the same way.
|
||||||
|
*/
|
||||||
|
switch (instr & PO_XOP_OPCODE_MASK) {
|
||||||
case PPC_INST_RFID:
|
case PPC_INST_RFID:
|
||||||
/* XXX do we need to check for PR=0 here? */
|
/* XXX do we need to check for PR=0 here? */
|
||||||
newmsr = vcpu->arch.shregs.srr1;
|
newmsr = vcpu->arch.shregs.srr1;
|
||||||
|
@ -76,7 +87,8 @@ int kvmhv_p9_tm_emulation_early(struct kvm_vcpu *vcpu)
|
||||||
vcpu->arch.shregs.msr = newmsr;
|
vcpu->arch.shregs.msr = newmsr;
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
case PPC_INST_TSR:
|
/* ignore bit 31, see comment above */
|
||||||
|
case (PPC_INST_TSR & PO_XOP_OPCODE_MASK):
|
||||||
/* we know the MSR has the TS field = S (0b01) here */
|
/* we know the MSR has the TS field = S (0b01) here */
|
||||||
msr = vcpu->arch.shregs.msr;
|
msr = vcpu->arch.shregs.msr;
|
||||||
/* check for PR=1 and arch 2.06 bit set in PCR */
|
/* check for PR=1 and arch 2.06 bit set in PCR */
|
||||||
|
|
|
@ -63,4 +63,11 @@ do { \
|
||||||
* Let auipc+jalr be the basic *mcount unit*, so we make it 8 bytes here.
|
* Let auipc+jalr be the basic *mcount unit*, so we make it 8 bytes here.
|
||||||
*/
|
*/
|
||||||
#define MCOUNT_INSN_SIZE 8
|
#define MCOUNT_INSN_SIZE 8
|
||||||
|
|
||||||
|
#ifndef __ASSEMBLY__
|
||||||
|
struct dyn_ftrace;
|
||||||
|
int ftrace_init_nop(struct module *mod, struct dyn_ftrace *rec);
|
||||||
|
#define ftrace_init_nop ftrace_init_nop
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -88,6 +88,25 @@ int ftrace_make_nop(struct module *mod, struct dyn_ftrace *rec,
|
||||||
return __ftrace_modify_call(rec->ip, addr, false);
|
return __ftrace_modify_call(rec->ip, addr, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is called early on, and isn't wrapped by
|
||||||
|
* ftrace_arch_code_modify_{prepare,post_process}() and therefor doesn't hold
|
||||||
|
* text_mutex, which triggers a lockdep failure. SMP isn't running so we could
|
||||||
|
* just directly poke the text, but it's simpler to just take the lock
|
||||||
|
* ourselves.
|
||||||
|
*/
|
||||||
|
int ftrace_init_nop(struct module *mod, struct dyn_ftrace *rec)
|
||||||
|
{
|
||||||
|
int out;
|
||||||
|
|
||||||
|
ftrace_arch_code_modify_prepare();
|
||||||
|
out = ftrace_make_nop(mod, rec, MCOUNT_ADDR);
|
||||||
|
ftrace_arch_code_modify_post_process();
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
int ftrace_update_ftrace_func(ftrace_func_t func)
|
int ftrace_update_ftrace_func(ftrace_func_t func)
|
||||||
{
|
{
|
||||||
int ret = __ftrace_modify_call((unsigned long)&ftrace_call,
|
int ret = __ftrace_modify_call((unsigned long)&ftrace_call,
|
||||||
|
|
|
@ -1377,8 +1377,8 @@ static int aux_output_begin(struct perf_output_handle *handle,
|
||||||
idx = aux->empty_mark + 1;
|
idx = aux->empty_mark + 1;
|
||||||
for (i = 0; i < range_scan; i++, idx++) {
|
for (i = 0; i < range_scan; i++, idx++) {
|
||||||
te = aux_sdb_trailer(aux, idx);
|
te = aux_sdb_trailer(aux, idx);
|
||||||
te->flags = te->flags & ~SDB_TE_BUFFER_FULL_MASK;
|
te->flags &= ~(SDB_TE_BUFFER_FULL_MASK |
|
||||||
te->flags = te->flags & ~SDB_TE_ALERT_REQ_MASK;
|
SDB_TE_ALERT_REQ_MASK);
|
||||||
te->overflow = 0;
|
te->overflow = 0;
|
||||||
}
|
}
|
||||||
/* Save the position of empty SDBs */
|
/* Save the position of empty SDBs */
|
||||||
|
@ -1425,8 +1425,7 @@ static bool aux_set_alert(struct aux_buffer *aux, unsigned long alert_index,
|
||||||
te = aux_sdb_trailer(aux, alert_index);
|
te = aux_sdb_trailer(aux, alert_index);
|
||||||
do {
|
do {
|
||||||
orig_flags = te->flags;
|
orig_flags = te->flags;
|
||||||
orig_overflow = te->overflow;
|
*overflow = orig_overflow = te->overflow;
|
||||||
*overflow = orig_overflow;
|
|
||||||
if (orig_flags & SDB_TE_BUFFER_FULL_MASK) {
|
if (orig_flags & SDB_TE_BUFFER_FULL_MASK) {
|
||||||
/*
|
/*
|
||||||
* SDB is already set by hardware.
|
* SDB is already set by hardware.
|
||||||
|
@ -1660,7 +1659,7 @@ static void *aux_buffer_setup(struct perf_event *event, void **pages,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allocate aux_buffer struct for the event */
|
/* Allocate aux_buffer struct for the event */
|
||||||
aux = kmalloc(sizeof(struct aux_buffer), GFP_KERNEL);
|
aux = kzalloc(sizeof(struct aux_buffer), GFP_KERNEL);
|
||||||
if (!aux)
|
if (!aux)
|
||||||
goto no_aux;
|
goto no_aux;
|
||||||
sfb = &aux->sfb;
|
sfb = &aux->sfb;
|
||||||
|
|
|
@ -537,7 +537,7 @@ static struct notifier_block kdump_mem_nb = {
|
||||||
/*
|
/*
|
||||||
* Make sure that the area behind memory_end is protected
|
* Make sure that the area behind memory_end is protected
|
||||||
*/
|
*/
|
||||||
static void reserve_memory_end(void)
|
static void __init reserve_memory_end(void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_CRASH_DUMP
|
#ifdef CONFIG_CRASH_DUMP
|
||||||
if (ipl_info.type == IPL_TYPE_FCP_DUMP &&
|
if (ipl_info.type == IPL_TYPE_FCP_DUMP &&
|
||||||
|
@ -555,7 +555,7 @@ static void reserve_memory_end(void)
|
||||||
/*
|
/*
|
||||||
* Make sure that oldmem, where the dump is stored, is protected
|
* Make sure that oldmem, where the dump is stored, is protected
|
||||||
*/
|
*/
|
||||||
static void reserve_oldmem(void)
|
static void __init reserve_oldmem(void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_CRASH_DUMP
|
#ifdef CONFIG_CRASH_DUMP
|
||||||
if (OLDMEM_BASE)
|
if (OLDMEM_BASE)
|
||||||
|
@ -567,7 +567,7 @@ static void reserve_oldmem(void)
|
||||||
/*
|
/*
|
||||||
* Make sure that oldmem, where the dump is stored, is protected
|
* Make sure that oldmem, where the dump is stored, is protected
|
||||||
*/
|
*/
|
||||||
static void remove_oldmem(void)
|
static void __init remove_oldmem(void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_CRASH_DUMP
|
#ifdef CONFIG_CRASH_DUMP
|
||||||
if (OLDMEM_BASE)
|
if (OLDMEM_BASE)
|
||||||
|
|
|
@ -38,6 +38,8 @@ KBUILD_CFLAGS += $(call cc-option,-fno-stack-protector)
|
||||||
KBUILD_CFLAGS += $(call cc-disable-warning, address-of-packed-member)
|
KBUILD_CFLAGS += $(call cc-disable-warning, address-of-packed-member)
|
||||||
KBUILD_CFLAGS += $(call cc-disable-warning, gnu)
|
KBUILD_CFLAGS += $(call cc-disable-warning, gnu)
|
||||||
KBUILD_CFLAGS += -Wno-pointer-sign
|
KBUILD_CFLAGS += -Wno-pointer-sign
|
||||||
|
# Disable relocation relaxation in case the link is not PIE.
|
||||||
|
KBUILD_CFLAGS += $(call as-option,-Wa$(comma)-mrelax-relocations=no)
|
||||||
|
|
||||||
KBUILD_AFLAGS := $(KBUILD_CFLAGS) -D__ASSEMBLY__
|
KBUILD_AFLAGS := $(KBUILD_CFLAGS) -D__ASSEMBLY__
|
||||||
GCOV_PROFILE := n
|
GCOV_PROFILE := n
|
||||||
|
@ -100,7 +102,7 @@ vmlinux-objs-$(CONFIG_EFI_MIXED) += $(obj)/efi_thunk_$(BITS).o
|
||||||
quiet_cmd_check_data_rel = DATAREL $@
|
quiet_cmd_check_data_rel = DATAREL $@
|
||||||
define cmd_check_data_rel
|
define cmd_check_data_rel
|
||||||
for obj in $(filter %.o,$^); do \
|
for obj in $(filter %.o,$^); do \
|
||||||
${CROSS_COMPILE}readelf -S $$obj | grep -qF .rel.local && { \
|
$(READELF) -S $$obj | grep -qF .rel.local && { \
|
||||||
echo "error: $$obj has data relocations!" >&2; \
|
echo "error: $$obj has data relocations!" >&2; \
|
||||||
exit 1; \
|
exit 1; \
|
||||||
} || true; \
|
} || true; \
|
||||||
|
|
|
@ -245,6 +245,7 @@ CONFIG_USB_HIDDEV=y
|
||||||
CONFIG_USB=y
|
CONFIG_USB=y
|
||||||
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
|
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
|
||||||
CONFIG_USB_MON=y
|
CONFIG_USB_MON=y
|
||||||
|
CONFIG_USB_XHCI_HCD=y
|
||||||
CONFIG_USB_EHCI_HCD=y
|
CONFIG_USB_EHCI_HCD=y
|
||||||
CONFIG_USB_EHCI_TT_NEWSCHED=y
|
CONFIG_USB_EHCI_TT_NEWSCHED=y
|
||||||
CONFIG_USB_OHCI_HCD=y
|
CONFIG_USB_OHCI_HCD=y
|
||||||
|
|
|
@ -241,6 +241,7 @@ CONFIG_USB_HIDDEV=y
|
||||||
CONFIG_USB=y
|
CONFIG_USB=y
|
||||||
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
|
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
|
||||||
CONFIG_USB_MON=y
|
CONFIG_USB_MON=y
|
||||||
|
CONFIG_USB_XHCI_HCD=y
|
||||||
CONFIG_USB_EHCI_HCD=y
|
CONFIG_USB_EHCI_HCD=y
|
||||||
CONFIG_USB_EHCI_TT_NEWSCHED=y
|
CONFIG_USB_EHCI_TT_NEWSCHED=y
|
||||||
CONFIG_USB_OHCI_HCD=y
|
CONFIG_USB_OHCI_HCD=y
|
||||||
|
|
|
@ -330,7 +330,7 @@ DECLARE_STATIC_KEY_FALSE(mds_idle_clear);
|
||||||
* combination with microcode which triggers a CPU buffer flush when the
|
* combination with microcode which triggers a CPU buffer flush when the
|
||||||
* instruction is executed.
|
* instruction is executed.
|
||||||
*/
|
*/
|
||||||
static inline void mds_clear_cpu_buffers(void)
|
static __always_inline void mds_clear_cpu_buffers(void)
|
||||||
{
|
{
|
||||||
static const u16 ds = __KERNEL_DS;
|
static const u16 ds = __KERNEL_DS;
|
||||||
|
|
||||||
|
@ -351,7 +351,7 @@ static inline void mds_clear_cpu_buffers(void)
|
||||||
*
|
*
|
||||||
* Clear CPU buffers if the corresponding static key is enabled
|
* Clear CPU buffers if the corresponding static key is enabled
|
||||||
*/
|
*/
|
||||||
static inline void mds_user_clear_cpu_buffers(void)
|
static __always_inline void mds_user_clear_cpu_buffers(void)
|
||||||
{
|
{
|
||||||
if (static_branch_likely(&mds_user_clear))
|
if (static_branch_likely(&mds_user_clear))
|
||||||
mds_clear_cpu_buffers();
|
mds_clear_cpu_buffers();
|
||||||
|
|
|
@ -4,6 +4,11 @@
|
||||||
|
|
||||||
#define ARCH_DEFAULT_PKEY 0
|
#define ARCH_DEFAULT_PKEY 0
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If more than 16 keys are ever supported, a thorough audit
|
||||||
|
* will be necessary to ensure that the types that store key
|
||||||
|
* numbers and masks have sufficient capacity.
|
||||||
|
*/
|
||||||
#define arch_max_pkey() (boot_cpu_has(X86_FEATURE_OSPKE) ? 16 : 1)
|
#define arch_max_pkey() (boot_cpu_has(X86_FEATURE_OSPKE) ? 16 : 1)
|
||||||
|
|
||||||
extern int arch_set_user_pkey_access(struct task_struct *tsk, int pkey,
|
extern int arch_set_user_pkey_access(struct task_struct *tsk, int pkey,
|
||||||
|
|
|
@ -2250,6 +2250,7 @@ static inline void __init check_timer(void)
|
||||||
legacy_pic->init(0);
|
legacy_pic->init(0);
|
||||||
legacy_pic->make_irq(0);
|
legacy_pic->make_irq(0);
|
||||||
apic_write(APIC_LVT0, APIC_DM_EXTINT);
|
apic_write(APIC_LVT0, APIC_DM_EXTINT);
|
||||||
|
legacy_pic->unmask(0);
|
||||||
|
|
||||||
unlock_ExtINT_logic();
|
unlock_ExtINT_logic();
|
||||||
|
|
||||||
|
|
|
@ -907,8 +907,6 @@ const void *get_xsave_field_ptr(int xsave_state)
|
||||||
|
|
||||||
#ifdef CONFIG_ARCH_HAS_PKEYS
|
#ifdef CONFIG_ARCH_HAS_PKEYS
|
||||||
|
|
||||||
#define NR_VALID_PKRU_BITS (CONFIG_NR_PROTECTION_KEYS * 2)
|
|
||||||
#define PKRU_VALID_MASK (NR_VALID_PKRU_BITS - 1)
|
|
||||||
/*
|
/*
|
||||||
* This will go out and modify PKRU register to set the access
|
* This will go out and modify PKRU register to set the access
|
||||||
* rights for @pkey to @init_val.
|
* rights for @pkey to @init_val.
|
||||||
|
@ -927,6 +925,13 @@ int arch_set_user_pkey_access(struct task_struct *tsk, int pkey,
|
||||||
if (!boot_cpu_has(X86_FEATURE_OSPKE))
|
if (!boot_cpu_has(X86_FEATURE_OSPKE))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This code should only be called with valid 'pkey'
|
||||||
|
* values originating from in-kernel users. Complain
|
||||||
|
* if a bad value is observed.
|
||||||
|
*/
|
||||||
|
WARN_ON_ONCE(pkey >= arch_max_pkey());
|
||||||
|
|
||||||
/* Set the bits we need in PKRU: */
|
/* Set the bits we need in PKRU: */
|
||||||
if (init_val & PKEY_DISABLE_ACCESS)
|
if (init_val & PKEY_DISABLE_ACCESS)
|
||||||
new_pkru_bits |= PKRU_AD_BIT;
|
new_pkru_bits |= PKRU_AD_BIT;
|
||||||
|
|
|
@ -339,7 +339,7 @@ TRACE_EVENT(
|
||||||
/* These depend on page entry type, so compute them now. */
|
/* These depend on page entry type, so compute them now. */
|
||||||
__field(bool, r)
|
__field(bool, r)
|
||||||
__field(bool, x)
|
__field(bool, x)
|
||||||
__field(u8, u)
|
__field(signed char, u)
|
||||||
),
|
),
|
||||||
|
|
||||||
TP_fast_assign(
|
TP_fast_assign(
|
||||||
|
|
|
@ -3942,6 +3942,12 @@ static int iret_interception(struct vcpu_svm *svm)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int invd_interception(struct vcpu_svm *svm)
|
||||||
|
{
|
||||||
|
/* Treat an INVD instruction as a NOP and just skip it. */
|
||||||
|
return kvm_skip_emulated_instruction(&svm->vcpu);
|
||||||
|
}
|
||||||
|
|
||||||
static int invlpg_interception(struct vcpu_svm *svm)
|
static int invlpg_interception(struct vcpu_svm *svm)
|
||||||
{
|
{
|
||||||
if (!static_cpu_has(X86_FEATURE_DECODEASSISTS))
|
if (!static_cpu_has(X86_FEATURE_DECODEASSISTS))
|
||||||
|
@ -4831,7 +4837,7 @@ static int (*const svm_exit_handlers[])(struct vcpu_svm *svm) = {
|
||||||
[SVM_EXIT_RDPMC] = rdpmc_interception,
|
[SVM_EXIT_RDPMC] = rdpmc_interception,
|
||||||
[SVM_EXIT_CPUID] = cpuid_interception,
|
[SVM_EXIT_CPUID] = cpuid_interception,
|
||||||
[SVM_EXIT_IRET] = iret_interception,
|
[SVM_EXIT_IRET] = iret_interception,
|
||||||
[SVM_EXIT_INVD] = emulate_on_interception,
|
[SVM_EXIT_INVD] = invd_interception,
|
||||||
[SVM_EXIT_PAUSE] = pause_interception,
|
[SVM_EXIT_PAUSE] = pause_interception,
|
||||||
[SVM_EXIT_HLT] = halt_interception,
|
[SVM_EXIT_HLT] = halt_interception,
|
||||||
[SVM_EXIT_INVLPG] = invlpg_interception,
|
[SVM_EXIT_INVLPG] = invlpg_interception,
|
||||||
|
|
|
@ -858,6 +858,7 @@ int kvm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
|
||||||
unsigned long old_cr4 = kvm_read_cr4(vcpu);
|
unsigned long old_cr4 = kvm_read_cr4(vcpu);
|
||||||
unsigned long pdptr_bits = X86_CR4_PGE | X86_CR4_PSE | X86_CR4_PAE |
|
unsigned long pdptr_bits = X86_CR4_PGE | X86_CR4_PSE | X86_CR4_PAE |
|
||||||
X86_CR4_SMEP;
|
X86_CR4_SMEP;
|
||||||
|
unsigned long mmu_role_bits = pdptr_bits | X86_CR4_SMAP | X86_CR4_PKE;
|
||||||
|
|
||||||
if (kvm_valid_cr4(vcpu, cr4))
|
if (kvm_valid_cr4(vcpu, cr4))
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -885,7 +886,7 @@ int kvm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
|
||||||
if (kvm_x86_ops->set_cr4(vcpu, cr4))
|
if (kvm_x86_ops->set_cr4(vcpu, cr4))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
if (((cr4 ^ old_cr4) & pdptr_bits) ||
|
if (((cr4 ^ old_cr4) & mmu_role_bits) ||
|
||||||
(!(cr4 & X86_CR4_PCIDE) && (old_cr4 & X86_CR4_PCIDE)))
|
(!(cr4 & X86_CR4_PCIDE) && (old_cr4 & X86_CR4_PCIDE)))
|
||||||
kvm_mmu_reset_context(vcpu);
|
kvm_mmu_reset_context(vcpu);
|
||||||
|
|
||||||
|
@ -4668,10 +4669,13 @@ long kvm_arch_vm_ioctl(struct file *filp,
|
||||||
r = -EFAULT;
|
r = -EFAULT;
|
||||||
if (copy_from_user(&u.ps, argp, sizeof u.ps))
|
if (copy_from_user(&u.ps, argp, sizeof u.ps))
|
||||||
goto out;
|
goto out;
|
||||||
|
mutex_lock(&kvm->lock);
|
||||||
r = -ENXIO;
|
r = -ENXIO;
|
||||||
if (!kvm->arch.vpit)
|
if (!kvm->arch.vpit)
|
||||||
goto out;
|
goto set_pit_out;
|
||||||
r = kvm_vm_ioctl_set_pit(kvm, &u.ps);
|
r = kvm_vm_ioctl_set_pit(kvm, &u.ps);
|
||||||
|
set_pit_out:
|
||||||
|
mutex_unlock(&kvm->lock);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case KVM_GET_PIT2: {
|
case KVM_GET_PIT2: {
|
||||||
|
@ -4691,10 +4695,13 @@ long kvm_arch_vm_ioctl(struct file *filp,
|
||||||
r = -EFAULT;
|
r = -EFAULT;
|
||||||
if (copy_from_user(&u.ps2, argp, sizeof(u.ps2)))
|
if (copy_from_user(&u.ps2, argp, sizeof(u.ps2)))
|
||||||
goto out;
|
goto out;
|
||||||
|
mutex_lock(&kvm->lock);
|
||||||
r = -ENXIO;
|
r = -ENXIO;
|
||||||
if (!kvm->arch.vpit)
|
if (!kvm->arch.vpit)
|
||||||
goto out;
|
goto set_pit2_out;
|
||||||
r = kvm_vm_ioctl_set_pit2(kvm, &u.ps2);
|
r = kvm_vm_ioctl_set_pit2(kvm, &u.ps2);
|
||||||
|
set_pit2_out:
|
||||||
|
mutex_unlock(&kvm->lock);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case KVM_REINJECT_CONTROL: {
|
case KVM_REINJECT_CONTROL: {
|
||||||
|
|
|
@ -139,7 +139,7 @@ long __copy_user_flushcache(void *dst, const void __user *src, unsigned size)
|
||||||
*/
|
*/
|
||||||
if (size < 8) {
|
if (size < 8) {
|
||||||
if (!IS_ALIGNED(dest, 4) || size != 4)
|
if (!IS_ALIGNED(dest, 4) || size != 4)
|
||||||
clean_cache_range(dst, 1);
|
clean_cache_range(dst, size);
|
||||||
} else {
|
} else {
|
||||||
if (!IS_ALIGNED(dest, 8)) {
|
if (!IS_ALIGNED(dest, 8)) {
|
||||||
dest = ALIGN(dest, boot_cpu_data.x86_clflush_size);
|
dest = ALIGN(dest, boot_cpu_data.x86_clflush_size);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
. ${ROOT_DIR}/common/build.config.common
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.common
|
||||||
. ${ROOT_DIR}/common/build.config.aarch64
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.aarch64
|
||||||
. ${ROOT_DIR}/common/build.config.allmodconfig
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.allmodconfig
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
. ${ROOT_DIR}/common/build.config.common
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.common
|
||||||
. ${ROOT_DIR}/common/build.config.arm
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.arm
|
||||||
. ${ROOT_DIR}/common/build.config.allmodconfig
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.allmodconfig
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
. ${ROOT_DIR}/common/build.config.common
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.common
|
||||||
. ${ROOT_DIR}/common/build.config.x86_64
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.x86_64
|
||||||
. ${ROOT_DIR}/common/build.config.allmodconfig
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.allmodconfig
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
BRANCH=android-4.19-stable
|
BRANCH=android-4.19-stable
|
||||||
KMI_GENERATION=0
|
KMI_GENERATION=0
|
||||||
KERNEL_DIR=common
|
|
||||||
|
|
||||||
CC=clang
|
CC=clang
|
||||||
LD=ld.lld
|
LD=ld.lld
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
. ${ROOT_DIR}/common/build.config.gki.aarch64
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.gki.aarch64
|
||||||
TRIM_NONLISTED_KMI=""
|
TRIM_NONLISTED_KMI=""
|
||||||
KMI_SYMBOL_LIST_STRICT_MODE=""
|
KMI_SYMBOL_LIST_STRICT_MODE=""
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
. ${ROOT_DIR}/common/build.config.gki.x86_64
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.gki.x86_64
|
||||||
TRIM_NONLISTED_KMI=""
|
TRIM_NONLISTED_KMI=""
|
||||||
KMI_SYMBOL_LIST_STRICT_MODE=""
|
KMI_SYMBOL_LIST_STRICT_MODE=""
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
. ${ROOT_DIR}/common/build.config.common
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.common
|
||||||
. ${ROOT_DIR}/common/build.config.aarch64
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.aarch64
|
||||||
. ${ROOT_DIR}/common/build.config.gki
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.gki
|
||||||
|
|
||||||
ABI_DEFINITION=android/abi_gki_aarch64.xml
|
ABI_DEFINITION=android/abi_gki_aarch64.xml
|
||||||
KMI_SYMBOL_LIST=android/abi_gki_aarch64
|
KMI_SYMBOL_LIST=android/abi_gki_aarch64
|
||||||
|
@ -9,5 +9,6 @@ android/abi_gki_aarch64_cuttlefish
|
||||||
android/abi_gki_aarch64_qcom
|
android/abi_gki_aarch64_qcom
|
||||||
"
|
"
|
||||||
TRIM_NONLISTED_KMI=1
|
TRIM_NONLISTED_KMI=1
|
||||||
|
KMI_SYMBOL_LIST_ADD_ONLY=1
|
||||||
KMI_SYMBOL_LIST_STRICT_MODE=1
|
KMI_SYMBOL_LIST_STRICT_MODE=1
|
||||||
KMI_ENFORCED=1
|
KMI_ENFORCED=1
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
. ${ROOT_DIR}/common/build.config.common
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.common
|
||||||
. ${ROOT_DIR}/common/build.config.x86_64
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.x86_64
|
||||||
. ${ROOT_DIR}/common/build.config.gki
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.gki
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
DEFCONFIG=gki_defconfig
|
DEFCONFIG=gki_defconfig
|
||||||
POST_DEFCONFIG_CMDS="check_defconfig && update_kasan_config"
|
POST_DEFCONFIG_CMDS="check_defconfig && update_kasan_config"
|
||||||
KERNEL_DIR=common
|
|
||||||
function update_kasan_config() {
|
function update_kasan_config() {
|
||||||
${KERNEL_DIR}/scripts/config --file ${OUT_DIR}/.config \
|
${KERNEL_DIR}/scripts/config --file ${OUT_DIR}/.config \
|
||||||
-e CONFIG_KASAN \
|
-e CONFIG_KASAN \
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
. ${ROOT_DIR}/common/build.config.common
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.common
|
||||||
. ${ROOT_DIR}/common/build.config.aarch64
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.aarch64
|
||||||
. ${ROOT_DIR}/common/build.config.gki_kasan
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.gki_kasan
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
. ${ROOT_DIR}/common/build.config.common
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.common
|
||||||
. ${ROOT_DIR}/common/build.config.x86_64
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.x86_64
|
||||||
. ${ROOT_DIR}/common/build.config.gki_kasan
|
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.gki_kasan
|
||||||
|
|
||||||
|
|
|
@ -1080,29 +1080,21 @@ void acpi_ec_dispatch_gpe(void)
|
||||||
/* --------------------------------------------------------------------------
|
/* --------------------------------------------------------------------------
|
||||||
Event Management
|
Event Management
|
||||||
-------------------------------------------------------------------------- */
|
-------------------------------------------------------------------------- */
|
||||||
static struct acpi_ec_query_handler *
|
|
||||||
acpi_ec_get_query_handler(struct acpi_ec_query_handler *handler)
|
|
||||||
{
|
|
||||||
if (handler)
|
|
||||||
kref_get(&handler->kref);
|
|
||||||
return handler;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct acpi_ec_query_handler *
|
static struct acpi_ec_query_handler *
|
||||||
acpi_ec_get_query_handler_by_value(struct acpi_ec *ec, u8 value)
|
acpi_ec_get_query_handler_by_value(struct acpi_ec *ec, u8 value)
|
||||||
{
|
{
|
||||||
struct acpi_ec_query_handler *handler;
|
struct acpi_ec_query_handler *handler;
|
||||||
bool found = false;
|
|
||||||
|
|
||||||
mutex_lock(&ec->mutex);
|
mutex_lock(&ec->mutex);
|
||||||
list_for_each_entry(handler, &ec->list, node) {
|
list_for_each_entry(handler, &ec->list, node) {
|
||||||
if (value == handler->query_bit) {
|
if (value == handler->query_bit) {
|
||||||
found = true;
|
kref_get(&handler->kref);
|
||||||
break;
|
mutex_unlock(&ec->mutex);
|
||||||
|
return handler;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mutex_unlock(&ec->mutex);
|
mutex_unlock(&ec->mutex);
|
||||||
return found ? acpi_ec_get_query_handler(handler) : NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void acpi_ec_query_handler_release(struct kref *kref)
|
static void acpi_ec_query_handler_release(struct kref *kref)
|
||||||
|
|
|
@ -72,7 +72,7 @@ struct acard_sg {
|
||||||
__le32 size; /* bit 31 (EOT) max==0x10000 (64k) */
|
__le32 size; /* bit 31 (EOT) max==0x10000 (64k) */
|
||||||
};
|
};
|
||||||
|
|
||||||
static void acard_ahci_qc_prep(struct ata_queued_cmd *qc);
|
static enum ata_completion_errors acard_ahci_qc_prep(struct ata_queued_cmd *qc);
|
||||||
static bool acard_ahci_qc_fill_rtf(struct ata_queued_cmd *qc);
|
static bool acard_ahci_qc_fill_rtf(struct ata_queued_cmd *qc);
|
||||||
static int acard_ahci_port_start(struct ata_port *ap);
|
static int acard_ahci_port_start(struct ata_port *ap);
|
||||||
static int acard_ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
|
static int acard_ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
|
||||||
|
@ -257,7 +257,7 @@ static unsigned int acard_ahci_fill_sg(struct ata_queued_cmd *qc, void *cmd_tbl)
|
||||||
return si;
|
return si;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void acard_ahci_qc_prep(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors acard_ahci_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
struct ata_port *ap = qc->ap;
|
struct ata_port *ap = qc->ap;
|
||||||
struct ahci_port_priv *pp = ap->private_data;
|
struct ahci_port_priv *pp = ap->private_data;
|
||||||
|
@ -295,6 +295,8 @@ static void acard_ahci_qc_prep(struct ata_queued_cmd *qc)
|
||||||
opts |= AHCI_CMD_ATAPI | AHCI_CMD_PREFETCH;
|
opts |= AHCI_CMD_ATAPI | AHCI_CMD_PREFETCH;
|
||||||
|
|
||||||
ahci_fill_cmd_slot(pp, qc->hw_tag, opts);
|
ahci_fill_cmd_slot(pp, qc->hw_tag, opts);
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool acard_ahci_qc_fill_rtf(struct ata_queued_cmd *qc)
|
static bool acard_ahci_qc_fill_rtf(struct ata_queued_cmd *qc)
|
||||||
|
|
|
@ -73,7 +73,7 @@ static int ahci_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val);
|
||||||
static bool ahci_qc_fill_rtf(struct ata_queued_cmd *qc);
|
static bool ahci_qc_fill_rtf(struct ata_queued_cmd *qc);
|
||||||
static int ahci_port_start(struct ata_port *ap);
|
static int ahci_port_start(struct ata_port *ap);
|
||||||
static void ahci_port_stop(struct ata_port *ap);
|
static void ahci_port_stop(struct ata_port *ap);
|
||||||
static void ahci_qc_prep(struct ata_queued_cmd *qc);
|
static enum ata_completion_errors ahci_qc_prep(struct ata_queued_cmd *qc);
|
||||||
static int ahci_pmp_qc_defer(struct ata_queued_cmd *qc);
|
static int ahci_pmp_qc_defer(struct ata_queued_cmd *qc);
|
||||||
static void ahci_freeze(struct ata_port *ap);
|
static void ahci_freeze(struct ata_port *ap);
|
||||||
static void ahci_thaw(struct ata_port *ap);
|
static void ahci_thaw(struct ata_port *ap);
|
||||||
|
@ -1640,7 +1640,7 @@ static int ahci_pmp_qc_defer(struct ata_queued_cmd *qc)
|
||||||
return sata_pmp_qc_defer_cmd_switch(qc);
|
return sata_pmp_qc_defer_cmd_switch(qc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ahci_qc_prep(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors ahci_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
struct ata_port *ap = qc->ap;
|
struct ata_port *ap = qc->ap;
|
||||||
struct ahci_port_priv *pp = ap->private_data;
|
struct ahci_port_priv *pp = ap->private_data;
|
||||||
|
@ -1676,6 +1676,8 @@ static void ahci_qc_prep(struct ata_queued_cmd *qc)
|
||||||
opts |= AHCI_CMD_ATAPI | AHCI_CMD_PREFETCH;
|
opts |= AHCI_CMD_ATAPI | AHCI_CMD_PREFETCH;
|
||||||
|
|
||||||
ahci_fill_cmd_slot(pp, qc->hw_tag, opts);
|
ahci_fill_cmd_slot(pp, qc->hw_tag, opts);
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ahci_fbs_dec_intr(struct ata_port *ap)
|
static void ahci_fbs_dec_intr(struct ata_port *ap)
|
||||||
|
|
|
@ -4996,7 +4996,10 @@ int ata_std_qc_defer(struct ata_queued_cmd *qc)
|
||||||
return ATA_DEFER_LINK;
|
return ATA_DEFER_LINK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ata_noop_qc_prep(struct ata_queued_cmd *qc) { }
|
enum ata_completion_errors ata_noop_qc_prep(struct ata_queued_cmd *qc)
|
||||||
|
{
|
||||||
|
return AC_ERR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ata_sg_init - Associate command with scatter-gather table.
|
* ata_sg_init - Associate command with scatter-gather table.
|
||||||
|
@ -5483,7 +5486,9 @@ void ata_qc_issue(struct ata_queued_cmd *qc)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ap->ops->qc_prep(qc);
|
qc->err_mask |= ap->ops->qc_prep(qc);
|
||||||
|
if (unlikely(qc->err_mask))
|
||||||
|
goto err;
|
||||||
trace_ata_qc_issue(qc);
|
trace_ata_qc_issue(qc);
|
||||||
qc->err_mask |= ap->ops->qc_issue(qc);
|
qc->err_mask |= ap->ops->qc_issue(qc);
|
||||||
if (unlikely(qc->err_mask))
|
if (unlikely(qc->err_mask))
|
||||||
|
|
|
@ -2695,12 +2695,14 @@ static void ata_bmdma_fill_sg_dumb(struct ata_queued_cmd *qc)
|
||||||
* LOCKING:
|
* LOCKING:
|
||||||
* spin_lock_irqsave(host lock)
|
* spin_lock_irqsave(host lock)
|
||||||
*/
|
*/
|
||||||
void ata_bmdma_qc_prep(struct ata_queued_cmd *qc)
|
enum ata_completion_errors ata_bmdma_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
|
|
||||||
ata_bmdma_fill_sg(qc);
|
ata_bmdma_fill_sg(qc);
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(ata_bmdma_qc_prep);
|
EXPORT_SYMBOL_GPL(ata_bmdma_qc_prep);
|
||||||
|
|
||||||
|
@ -2713,12 +2715,14 @@ EXPORT_SYMBOL_GPL(ata_bmdma_qc_prep);
|
||||||
* LOCKING:
|
* LOCKING:
|
||||||
* spin_lock_irqsave(host lock)
|
* spin_lock_irqsave(host lock)
|
||||||
*/
|
*/
|
||||||
void ata_bmdma_dumb_qc_prep(struct ata_queued_cmd *qc)
|
enum ata_completion_errors ata_bmdma_dumb_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
|
|
||||||
ata_bmdma_fill_sg_dumb(qc);
|
ata_bmdma_fill_sg_dumb(qc);
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(ata_bmdma_dumb_qc_prep);
|
EXPORT_SYMBOL_GPL(ata_bmdma_dumb_qc_prep);
|
||||||
|
|
||||||
|
|
|
@ -507,7 +507,7 @@ static int pata_macio_cable_detect(struct ata_port *ap)
|
||||||
return ATA_CBL_PATA40;
|
return ATA_CBL_PATA40;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pata_macio_qc_prep(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors pata_macio_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
unsigned int write = (qc->tf.flags & ATA_TFLAG_WRITE);
|
unsigned int write = (qc->tf.flags & ATA_TFLAG_WRITE);
|
||||||
struct ata_port *ap = qc->ap;
|
struct ata_port *ap = qc->ap;
|
||||||
|
@ -520,7 +520,7 @@ static void pata_macio_qc_prep(struct ata_queued_cmd *qc)
|
||||||
__func__, qc, qc->flags, write, qc->dev->devno);
|
__func__, qc, qc->flags, write, qc->dev->devno);
|
||||||
|
|
||||||
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
|
|
||||||
table = (struct dbdma_cmd *) priv->dma_table_cpu;
|
table = (struct dbdma_cmd *) priv->dma_table_cpu;
|
||||||
|
|
||||||
|
@ -565,6 +565,8 @@ static void pata_macio_qc_prep(struct ata_queued_cmd *qc)
|
||||||
table->command = cpu_to_le16(DBDMA_STOP);
|
table->command = cpu_to_le16(DBDMA_STOP);
|
||||||
|
|
||||||
dev_dbgdma(priv->dev, "%s: %d DMA list entries\n", __func__, pi);
|
dev_dbgdma(priv->dev, "%s: %d DMA list entries\n", __func__, pi);
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -58,25 +58,27 @@ static void pxa_ata_dma_irq(void *d)
|
||||||
/*
|
/*
|
||||||
* Prepare taskfile for submission.
|
* Prepare taskfile for submission.
|
||||||
*/
|
*/
|
||||||
static void pxa_qc_prep(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors pxa_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
struct pata_pxa_data *pd = qc->ap->private_data;
|
struct pata_pxa_data *pd = qc->ap->private_data;
|
||||||
struct dma_async_tx_descriptor *tx;
|
struct dma_async_tx_descriptor *tx;
|
||||||
enum dma_transfer_direction dir;
|
enum dma_transfer_direction dir;
|
||||||
|
|
||||||
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
|
|
||||||
dir = (qc->dma_dir == DMA_TO_DEVICE ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM);
|
dir = (qc->dma_dir == DMA_TO_DEVICE ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM);
|
||||||
tx = dmaengine_prep_slave_sg(pd->dma_chan, qc->sg, qc->n_elem, dir,
|
tx = dmaengine_prep_slave_sg(pd->dma_chan, qc->sg, qc->n_elem, dir,
|
||||||
DMA_PREP_INTERRUPT);
|
DMA_PREP_INTERRUPT);
|
||||||
if (!tx) {
|
if (!tx) {
|
||||||
ata_dev_err(qc->dev, "prep_slave_sg() failed\n");
|
ata_dev_err(qc->dev, "prep_slave_sg() failed\n");
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
tx->callback = pxa_ata_dma_irq;
|
tx->callback = pxa_ata_dma_irq;
|
||||||
tx->callback_param = pd;
|
tx->callback_param = pd;
|
||||||
pd->dma_cookie = dmaengine_submit(tx);
|
pd->dma_cookie = dmaengine_submit(tx);
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -132,7 +132,7 @@ static int adma_ata_init_one(struct pci_dev *pdev,
|
||||||
const struct pci_device_id *ent);
|
const struct pci_device_id *ent);
|
||||||
static int adma_port_start(struct ata_port *ap);
|
static int adma_port_start(struct ata_port *ap);
|
||||||
static void adma_port_stop(struct ata_port *ap);
|
static void adma_port_stop(struct ata_port *ap);
|
||||||
static void adma_qc_prep(struct ata_queued_cmd *qc);
|
static enum ata_completion_errors adma_qc_prep(struct ata_queued_cmd *qc);
|
||||||
static unsigned int adma_qc_issue(struct ata_queued_cmd *qc);
|
static unsigned int adma_qc_issue(struct ata_queued_cmd *qc);
|
||||||
static int adma_check_atapi_dma(struct ata_queued_cmd *qc);
|
static int adma_check_atapi_dma(struct ata_queued_cmd *qc);
|
||||||
static void adma_freeze(struct ata_port *ap);
|
static void adma_freeze(struct ata_port *ap);
|
||||||
|
@ -311,7 +311,7 @@ static int adma_fill_sg(struct ata_queued_cmd *qc)
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void adma_qc_prep(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors adma_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
struct adma_port_priv *pp = qc->ap->private_data;
|
struct adma_port_priv *pp = qc->ap->private_data;
|
||||||
u8 *buf = pp->pkt;
|
u8 *buf = pp->pkt;
|
||||||
|
@ -322,7 +322,7 @@ static void adma_qc_prep(struct ata_queued_cmd *qc)
|
||||||
|
|
||||||
adma_enter_reg_mode(qc->ap);
|
adma_enter_reg_mode(qc->ap);
|
||||||
if (qc->tf.protocol != ATA_PROT_DMA)
|
if (qc->tf.protocol != ATA_PROT_DMA)
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
|
|
||||||
buf[i++] = 0; /* Response flags */
|
buf[i++] = 0; /* Response flags */
|
||||||
buf[i++] = 0; /* reserved */
|
buf[i++] = 0; /* reserved */
|
||||||
|
@ -387,6 +387,7 @@ static void adma_qc_prep(struct ata_queued_cmd *qc)
|
||||||
printk("%s\n", obuf);
|
printk("%s\n", obuf);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void adma_packet_start(struct ata_queued_cmd *qc)
|
static inline void adma_packet_start(struct ata_queued_cmd *qc)
|
||||||
|
|
|
@ -507,7 +507,7 @@ static unsigned int sata_fsl_fill_sg(struct ata_queued_cmd *qc, void *cmd_desc,
|
||||||
return num_prde;
|
return num_prde;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sata_fsl_qc_prep(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors sata_fsl_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
struct ata_port *ap = qc->ap;
|
struct ata_port *ap = qc->ap;
|
||||||
struct sata_fsl_port_priv *pp = ap->private_data;
|
struct sata_fsl_port_priv *pp = ap->private_data;
|
||||||
|
@ -553,6 +553,8 @@ static void sata_fsl_qc_prep(struct ata_queued_cmd *qc)
|
||||||
|
|
||||||
VPRINTK("SATA FSL : xx_qc_prep, di = 0x%x, ttl = %d, num_prde = %d\n",
|
VPRINTK("SATA FSL : xx_qc_prep, di = 0x%x, ttl = %d, num_prde = %d\n",
|
||||||
desc_info, ttl_dwords, num_prde);
|
desc_info, ttl_dwords, num_prde);
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int sata_fsl_qc_issue(struct ata_queued_cmd *qc)
|
static unsigned int sata_fsl_qc_issue(struct ata_queued_cmd *qc)
|
||||||
|
|
|
@ -472,7 +472,7 @@ static void inic_fill_sg(struct inic_prd *prd, struct ata_queued_cmd *qc)
|
||||||
prd[-1].flags |= PRD_END;
|
prd[-1].flags |= PRD_END;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void inic_qc_prep(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors inic_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
struct inic_port_priv *pp = qc->ap->private_data;
|
struct inic_port_priv *pp = qc->ap->private_data;
|
||||||
struct inic_pkt *pkt = pp->pkt;
|
struct inic_pkt *pkt = pp->pkt;
|
||||||
|
@ -532,6 +532,8 @@ static void inic_qc_prep(struct ata_queued_cmd *qc)
|
||||||
inic_fill_sg(prd, qc);
|
inic_fill_sg(prd, qc);
|
||||||
|
|
||||||
pp->cpb_tbl[0] = pp->pkt_dma;
|
pp->cpb_tbl[0] = pp->pkt_dma;
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int inic_qc_issue(struct ata_queued_cmd *qc)
|
static unsigned int inic_qc_issue(struct ata_queued_cmd *qc)
|
||||||
|
|
|
@ -605,8 +605,8 @@ static int mv5_scr_write(struct ata_link *link, unsigned int sc_reg_in, u32 val)
|
||||||
static int mv_port_start(struct ata_port *ap);
|
static int mv_port_start(struct ata_port *ap);
|
||||||
static void mv_port_stop(struct ata_port *ap);
|
static void mv_port_stop(struct ata_port *ap);
|
||||||
static int mv_qc_defer(struct ata_queued_cmd *qc);
|
static int mv_qc_defer(struct ata_queued_cmd *qc);
|
||||||
static void mv_qc_prep(struct ata_queued_cmd *qc);
|
static enum ata_completion_errors mv_qc_prep(struct ata_queued_cmd *qc);
|
||||||
static void mv_qc_prep_iie(struct ata_queued_cmd *qc);
|
static enum ata_completion_errors mv_qc_prep_iie(struct ata_queued_cmd *qc);
|
||||||
static unsigned int mv_qc_issue(struct ata_queued_cmd *qc);
|
static unsigned int mv_qc_issue(struct ata_queued_cmd *qc);
|
||||||
static int mv_hardreset(struct ata_link *link, unsigned int *class,
|
static int mv_hardreset(struct ata_link *link, unsigned int *class,
|
||||||
unsigned long deadline);
|
unsigned long deadline);
|
||||||
|
@ -2044,7 +2044,7 @@ static void mv_rw_multi_errata_sata24(struct ata_queued_cmd *qc)
|
||||||
* LOCKING:
|
* LOCKING:
|
||||||
* Inherited from caller.
|
* Inherited from caller.
|
||||||
*/
|
*/
|
||||||
static void mv_qc_prep(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors mv_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
struct ata_port *ap = qc->ap;
|
struct ata_port *ap = qc->ap;
|
||||||
struct mv_port_priv *pp = ap->private_data;
|
struct mv_port_priv *pp = ap->private_data;
|
||||||
|
@ -2056,15 +2056,15 @@ static void mv_qc_prep(struct ata_queued_cmd *qc)
|
||||||
switch (tf->protocol) {
|
switch (tf->protocol) {
|
||||||
case ATA_PROT_DMA:
|
case ATA_PROT_DMA:
|
||||||
if (tf->command == ATA_CMD_DSM)
|
if (tf->command == ATA_CMD_DSM)
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
/* fall-thru */
|
/* fall-thru */
|
||||||
case ATA_PROT_NCQ:
|
case ATA_PROT_NCQ:
|
||||||
break; /* continue below */
|
break; /* continue below */
|
||||||
case ATA_PROT_PIO:
|
case ATA_PROT_PIO:
|
||||||
mv_rw_multi_errata_sata24(qc);
|
mv_rw_multi_errata_sata24(qc);
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
default:
|
default:
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Fill in command request block
|
/* Fill in command request block
|
||||||
|
@ -2111,12 +2111,10 @@ static void mv_qc_prep(struct ata_queued_cmd *qc)
|
||||||
* non-NCQ mode are: [RW] STREAM DMA and W DMA FUA EXT, none
|
* non-NCQ mode are: [RW] STREAM DMA and W DMA FUA EXT, none
|
||||||
* of which are defined/used by Linux. If we get here, this
|
* of which are defined/used by Linux. If we get here, this
|
||||||
* driver needs work.
|
* driver needs work.
|
||||||
*
|
|
||||||
* FIXME: modify libata to give qc_prep a return value and
|
|
||||||
* return error here.
|
|
||||||
*/
|
*/
|
||||||
BUG_ON(tf->command);
|
ata_port_err(ap, "%s: unsupported command: %.2x\n", __func__,
|
||||||
break;
|
tf->command);
|
||||||
|
return AC_ERR_INVALID;
|
||||||
}
|
}
|
||||||
mv_crqb_pack_cmd(cw++, tf->nsect, ATA_REG_NSECT, 0);
|
mv_crqb_pack_cmd(cw++, tf->nsect, ATA_REG_NSECT, 0);
|
||||||
mv_crqb_pack_cmd(cw++, tf->hob_lbal, ATA_REG_LBAL, 0);
|
mv_crqb_pack_cmd(cw++, tf->hob_lbal, ATA_REG_LBAL, 0);
|
||||||
|
@ -2129,8 +2127,10 @@ static void mv_qc_prep(struct ata_queued_cmd *qc)
|
||||||
mv_crqb_pack_cmd(cw++, tf->command, ATA_REG_CMD, 1); /* last */
|
mv_crqb_pack_cmd(cw++, tf->command, ATA_REG_CMD, 1); /* last */
|
||||||
|
|
||||||
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
mv_fill_sg(qc);
|
mv_fill_sg(qc);
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2145,7 +2145,7 @@ static void mv_qc_prep(struct ata_queued_cmd *qc)
|
||||||
* LOCKING:
|
* LOCKING:
|
||||||
* Inherited from caller.
|
* Inherited from caller.
|
||||||
*/
|
*/
|
||||||
static void mv_qc_prep_iie(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors mv_qc_prep_iie(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
struct ata_port *ap = qc->ap;
|
struct ata_port *ap = qc->ap;
|
||||||
struct mv_port_priv *pp = ap->private_data;
|
struct mv_port_priv *pp = ap->private_data;
|
||||||
|
@ -2156,9 +2156,9 @@ static void mv_qc_prep_iie(struct ata_queued_cmd *qc)
|
||||||
|
|
||||||
if ((tf->protocol != ATA_PROT_DMA) &&
|
if ((tf->protocol != ATA_PROT_DMA) &&
|
||||||
(tf->protocol != ATA_PROT_NCQ))
|
(tf->protocol != ATA_PROT_NCQ))
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
if (tf->command == ATA_CMD_DSM)
|
if (tf->command == ATA_CMD_DSM)
|
||||||
return; /* use bmdma for this */
|
return AC_ERR_OK; /* use bmdma for this */
|
||||||
|
|
||||||
/* Fill in Gen IIE command request block */
|
/* Fill in Gen IIE command request block */
|
||||||
if (!(tf->flags & ATA_TFLAG_WRITE))
|
if (!(tf->flags & ATA_TFLAG_WRITE))
|
||||||
|
@ -2199,8 +2199,10 @@ static void mv_qc_prep_iie(struct ata_queued_cmd *qc)
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
mv_fill_sg(qc);
|
mv_fill_sg(qc);
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -313,7 +313,7 @@ static void nv_ck804_freeze(struct ata_port *ap);
|
||||||
static void nv_ck804_thaw(struct ata_port *ap);
|
static void nv_ck804_thaw(struct ata_port *ap);
|
||||||
static int nv_adma_slave_config(struct scsi_device *sdev);
|
static int nv_adma_slave_config(struct scsi_device *sdev);
|
||||||
static int nv_adma_check_atapi_dma(struct ata_queued_cmd *qc);
|
static int nv_adma_check_atapi_dma(struct ata_queued_cmd *qc);
|
||||||
static void nv_adma_qc_prep(struct ata_queued_cmd *qc);
|
static enum ata_completion_errors nv_adma_qc_prep(struct ata_queued_cmd *qc);
|
||||||
static unsigned int nv_adma_qc_issue(struct ata_queued_cmd *qc);
|
static unsigned int nv_adma_qc_issue(struct ata_queued_cmd *qc);
|
||||||
static irqreturn_t nv_adma_interrupt(int irq, void *dev_instance);
|
static irqreturn_t nv_adma_interrupt(int irq, void *dev_instance);
|
||||||
static void nv_adma_irq_clear(struct ata_port *ap);
|
static void nv_adma_irq_clear(struct ata_port *ap);
|
||||||
|
@ -335,7 +335,7 @@ static void nv_mcp55_freeze(struct ata_port *ap);
|
||||||
static void nv_swncq_error_handler(struct ata_port *ap);
|
static void nv_swncq_error_handler(struct ata_port *ap);
|
||||||
static int nv_swncq_slave_config(struct scsi_device *sdev);
|
static int nv_swncq_slave_config(struct scsi_device *sdev);
|
||||||
static int nv_swncq_port_start(struct ata_port *ap);
|
static int nv_swncq_port_start(struct ata_port *ap);
|
||||||
static void nv_swncq_qc_prep(struct ata_queued_cmd *qc);
|
static enum ata_completion_errors nv_swncq_qc_prep(struct ata_queued_cmd *qc);
|
||||||
static void nv_swncq_fill_sg(struct ata_queued_cmd *qc);
|
static void nv_swncq_fill_sg(struct ata_queued_cmd *qc);
|
||||||
static unsigned int nv_swncq_qc_issue(struct ata_queued_cmd *qc);
|
static unsigned int nv_swncq_qc_issue(struct ata_queued_cmd *qc);
|
||||||
static void nv_swncq_irq_clear(struct ata_port *ap, u16 fis);
|
static void nv_swncq_irq_clear(struct ata_port *ap, u16 fis);
|
||||||
|
@ -1365,7 +1365,7 @@ static int nv_adma_use_reg_mode(struct ata_queued_cmd *qc)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nv_adma_qc_prep(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors nv_adma_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
struct nv_adma_port_priv *pp = qc->ap->private_data;
|
struct nv_adma_port_priv *pp = qc->ap->private_data;
|
||||||
struct nv_adma_cpb *cpb = &pp->cpb[qc->hw_tag];
|
struct nv_adma_cpb *cpb = &pp->cpb[qc->hw_tag];
|
||||||
|
@ -1377,7 +1377,7 @@ static void nv_adma_qc_prep(struct ata_queued_cmd *qc)
|
||||||
(qc->flags & ATA_QCFLAG_DMAMAP));
|
(qc->flags & ATA_QCFLAG_DMAMAP));
|
||||||
nv_adma_register_mode(qc->ap);
|
nv_adma_register_mode(qc->ap);
|
||||||
ata_bmdma_qc_prep(qc);
|
ata_bmdma_qc_prep(qc);
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
cpb->resp_flags = NV_CPB_RESP_DONE;
|
cpb->resp_flags = NV_CPB_RESP_DONE;
|
||||||
|
@ -1409,6 +1409,8 @@ static void nv_adma_qc_prep(struct ata_queued_cmd *qc)
|
||||||
cpb->ctl_flags = ctl_flags;
|
cpb->ctl_flags = ctl_flags;
|
||||||
wmb();
|
wmb();
|
||||||
cpb->resp_flags = 0;
|
cpb->resp_flags = 0;
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int nv_adma_qc_issue(struct ata_queued_cmd *qc)
|
static unsigned int nv_adma_qc_issue(struct ata_queued_cmd *qc)
|
||||||
|
@ -1972,17 +1974,19 @@ static int nv_swncq_port_start(struct ata_port *ap)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nv_swncq_qc_prep(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors nv_swncq_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
if (qc->tf.protocol != ATA_PROT_NCQ) {
|
if (qc->tf.protocol != ATA_PROT_NCQ) {
|
||||||
ata_bmdma_qc_prep(qc);
|
ata_bmdma_qc_prep(qc);
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
|
|
||||||
nv_swncq_fill_sg(qc);
|
nv_swncq_fill_sg(qc);
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nv_swncq_fill_sg(struct ata_queued_cmd *qc)
|
static void nv_swncq_fill_sg(struct ata_queued_cmd *qc)
|
||||||
|
|
|
@ -155,7 +155,7 @@ static int pdc_sata_scr_write(struct ata_link *link, unsigned int sc_reg, u32 va
|
||||||
static int pdc_ata_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
|
static int pdc_ata_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
|
||||||
static int pdc_common_port_start(struct ata_port *ap);
|
static int pdc_common_port_start(struct ata_port *ap);
|
||||||
static int pdc_sata_port_start(struct ata_port *ap);
|
static int pdc_sata_port_start(struct ata_port *ap);
|
||||||
static void pdc_qc_prep(struct ata_queued_cmd *qc);
|
static enum ata_completion_errors pdc_qc_prep(struct ata_queued_cmd *qc);
|
||||||
static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
|
static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
|
||||||
static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
|
static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
|
||||||
static int pdc_check_atapi_dma(struct ata_queued_cmd *qc);
|
static int pdc_check_atapi_dma(struct ata_queued_cmd *qc);
|
||||||
|
@ -649,7 +649,7 @@ static void pdc_fill_sg(struct ata_queued_cmd *qc)
|
||||||
prd[idx - 1].flags_len |= cpu_to_le32(ATA_PRD_EOT);
|
prd[idx - 1].flags_len |= cpu_to_le32(ATA_PRD_EOT);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pdc_qc_prep(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors pdc_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
struct pdc_port_priv *pp = qc->ap->private_data;
|
struct pdc_port_priv *pp = qc->ap->private_data;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
@ -681,6 +681,8 @@ static void pdc_qc_prep(struct ata_queued_cmd *qc)
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pdc_is_sataii_tx4(unsigned long flags)
|
static int pdc_is_sataii_tx4(unsigned long flags)
|
||||||
|
|
|
@ -116,7 +116,7 @@ static int qs_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val);
|
||||||
static int qs_ata_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
|
static int qs_ata_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
|
||||||
static int qs_port_start(struct ata_port *ap);
|
static int qs_port_start(struct ata_port *ap);
|
||||||
static void qs_host_stop(struct ata_host *host);
|
static void qs_host_stop(struct ata_host *host);
|
||||||
static void qs_qc_prep(struct ata_queued_cmd *qc);
|
static enum ata_completion_errors qs_qc_prep(struct ata_queued_cmd *qc);
|
||||||
static unsigned int qs_qc_issue(struct ata_queued_cmd *qc);
|
static unsigned int qs_qc_issue(struct ata_queued_cmd *qc);
|
||||||
static int qs_check_atapi_dma(struct ata_queued_cmd *qc);
|
static int qs_check_atapi_dma(struct ata_queued_cmd *qc);
|
||||||
static void qs_freeze(struct ata_port *ap);
|
static void qs_freeze(struct ata_port *ap);
|
||||||
|
@ -276,7 +276,7 @@ static unsigned int qs_fill_sg(struct ata_queued_cmd *qc)
|
||||||
return si;
|
return si;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void qs_qc_prep(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors qs_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
struct qs_port_priv *pp = qc->ap->private_data;
|
struct qs_port_priv *pp = qc->ap->private_data;
|
||||||
u8 dflags = QS_DF_PORD, *buf = pp->pkt;
|
u8 dflags = QS_DF_PORD, *buf = pp->pkt;
|
||||||
|
@ -288,7 +288,7 @@ static void qs_qc_prep(struct ata_queued_cmd *qc)
|
||||||
|
|
||||||
qs_enter_reg_mode(qc->ap);
|
qs_enter_reg_mode(qc->ap);
|
||||||
if (qc->tf.protocol != ATA_PROT_DMA)
|
if (qc->tf.protocol != ATA_PROT_DMA)
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
|
|
||||||
nelem = qs_fill_sg(qc);
|
nelem = qs_fill_sg(qc);
|
||||||
|
|
||||||
|
@ -311,6 +311,8 @@ static void qs_qc_prep(struct ata_queued_cmd *qc)
|
||||||
|
|
||||||
/* frame information structure (FIS) */
|
/* frame information structure (FIS) */
|
||||||
ata_tf_to_fis(&qc->tf, 0, 1, &buf[32]);
|
ata_tf_to_fis(&qc->tf, 0, 1, &buf[32]);
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void qs_packet_start(struct ata_queued_cmd *qc)
|
static inline void qs_packet_start(struct ata_queued_cmd *qc)
|
||||||
|
|
|
@ -554,12 +554,14 @@ static void sata_rcar_bmdma_fill_sg(struct ata_queued_cmd *qc)
|
||||||
prd[si - 1].addr |= cpu_to_le32(SATA_RCAR_DTEND);
|
prd[si - 1].addr |= cpu_to_le32(SATA_RCAR_DTEND);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sata_rcar_qc_prep(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors sata_rcar_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
|
|
||||||
sata_rcar_bmdma_fill_sg(qc);
|
sata_rcar_bmdma_fill_sg(qc);
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sata_rcar_bmdma_setup(struct ata_queued_cmd *qc)
|
static void sata_rcar_bmdma_setup(struct ata_queued_cmd *qc)
|
||||||
|
|
|
@ -119,7 +119,7 @@ static void sil_dev_config(struct ata_device *dev);
|
||||||
static int sil_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val);
|
static int sil_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val);
|
||||||
static int sil_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val);
|
static int sil_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val);
|
||||||
static int sil_set_mode(struct ata_link *link, struct ata_device **r_failed);
|
static int sil_set_mode(struct ata_link *link, struct ata_device **r_failed);
|
||||||
static void sil_qc_prep(struct ata_queued_cmd *qc);
|
static enum ata_completion_errors sil_qc_prep(struct ata_queued_cmd *qc);
|
||||||
static void sil_bmdma_setup(struct ata_queued_cmd *qc);
|
static void sil_bmdma_setup(struct ata_queued_cmd *qc);
|
||||||
static void sil_bmdma_start(struct ata_queued_cmd *qc);
|
static void sil_bmdma_start(struct ata_queued_cmd *qc);
|
||||||
static void sil_bmdma_stop(struct ata_queued_cmd *qc);
|
static void sil_bmdma_stop(struct ata_queued_cmd *qc);
|
||||||
|
@ -333,12 +333,14 @@ static void sil_fill_sg(struct ata_queued_cmd *qc)
|
||||||
last_prd->flags_len |= cpu_to_le32(ATA_PRD_EOT);
|
last_prd->flags_len |= cpu_to_le32(ATA_PRD_EOT);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sil_qc_prep(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors sil_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
||||||
return;
|
return AC_ERR_OK;
|
||||||
|
|
||||||
sil_fill_sg(qc);
|
sil_fill_sg(qc);
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned char sil_get_device_cache_line(struct pci_dev *pdev)
|
static unsigned char sil_get_device_cache_line(struct pci_dev *pdev)
|
||||||
|
|
|
@ -336,7 +336,7 @@ static void sil24_dev_config(struct ata_device *dev);
|
||||||
static int sil24_scr_read(struct ata_link *link, unsigned sc_reg, u32 *val);
|
static int sil24_scr_read(struct ata_link *link, unsigned sc_reg, u32 *val);
|
||||||
static int sil24_scr_write(struct ata_link *link, unsigned sc_reg, u32 val);
|
static int sil24_scr_write(struct ata_link *link, unsigned sc_reg, u32 val);
|
||||||
static int sil24_qc_defer(struct ata_queued_cmd *qc);
|
static int sil24_qc_defer(struct ata_queued_cmd *qc);
|
||||||
static void sil24_qc_prep(struct ata_queued_cmd *qc);
|
static enum ata_completion_errors sil24_qc_prep(struct ata_queued_cmd *qc);
|
||||||
static unsigned int sil24_qc_issue(struct ata_queued_cmd *qc);
|
static unsigned int sil24_qc_issue(struct ata_queued_cmd *qc);
|
||||||
static bool sil24_qc_fill_rtf(struct ata_queued_cmd *qc);
|
static bool sil24_qc_fill_rtf(struct ata_queued_cmd *qc);
|
||||||
static void sil24_pmp_attach(struct ata_port *ap);
|
static void sil24_pmp_attach(struct ata_port *ap);
|
||||||
|
@ -840,7 +840,7 @@ static int sil24_qc_defer(struct ata_queued_cmd *qc)
|
||||||
return ata_std_qc_defer(qc);
|
return ata_std_qc_defer(qc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sil24_qc_prep(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors sil24_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
struct ata_port *ap = qc->ap;
|
struct ata_port *ap = qc->ap;
|
||||||
struct sil24_port_priv *pp = ap->private_data;
|
struct sil24_port_priv *pp = ap->private_data;
|
||||||
|
@ -884,6 +884,8 @@ static void sil24_qc_prep(struct ata_queued_cmd *qc)
|
||||||
|
|
||||||
if (qc->flags & ATA_QCFLAG_DMAMAP)
|
if (qc->flags & ATA_QCFLAG_DMAMAP)
|
||||||
sil24_fill_sg(qc, sge);
|
sil24_fill_sg(qc, sge);
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int sil24_qc_issue(struct ata_queued_cmd *qc)
|
static unsigned int sil24_qc_issue(struct ata_queued_cmd *qc)
|
||||||
|
|
|
@ -218,7 +218,7 @@ static void pdc_error_handler(struct ata_port *ap);
|
||||||
static void pdc_freeze(struct ata_port *ap);
|
static void pdc_freeze(struct ata_port *ap);
|
||||||
static void pdc_thaw(struct ata_port *ap);
|
static void pdc_thaw(struct ata_port *ap);
|
||||||
static int pdc_port_start(struct ata_port *ap);
|
static int pdc_port_start(struct ata_port *ap);
|
||||||
static void pdc20621_qc_prep(struct ata_queued_cmd *qc);
|
static enum ata_completion_errors pdc20621_qc_prep(struct ata_queued_cmd *qc);
|
||||||
static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
|
static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
|
||||||
static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
|
static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
|
||||||
static unsigned int pdc20621_dimm_init(struct ata_host *host);
|
static unsigned int pdc20621_dimm_init(struct ata_host *host);
|
||||||
|
@ -546,7 +546,7 @@ static void pdc20621_nodata_prep(struct ata_queued_cmd *qc)
|
||||||
VPRINTK("ata pkt buf ofs %u, mmio copied\n", i);
|
VPRINTK("ata pkt buf ofs %u, mmio copied\n", i);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pdc20621_qc_prep(struct ata_queued_cmd *qc)
|
static enum ata_completion_errors pdc20621_qc_prep(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
switch (qc->tf.protocol) {
|
switch (qc->tf.protocol) {
|
||||||
case ATA_PROT_DMA:
|
case ATA_PROT_DMA:
|
||||||
|
@ -558,6 +558,8 @@ static void pdc20621_qc_prep(struct ata_queued_cmd *qc)
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return AC_ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __pdc20621_push_hdma(struct ata_queued_cmd *qc,
|
static void __pdc20621_push_hdma(struct ata_queued_cmd *qc,
|
||||||
|
|
|
@ -2243,7 +2243,7 @@ static int eni_init_one(struct pci_dev *pci_dev,
|
||||||
|
|
||||||
rc = dma_set_mask_and_coherent(&pci_dev->dev, DMA_BIT_MASK(32));
|
rc = dma_set_mask_and_coherent(&pci_dev->dev, DMA_BIT_MASK(32));
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
goto out;
|
goto err_disable;
|
||||||
|
|
||||||
rc = -ENOMEM;
|
rc = -ENOMEM;
|
||||||
eni_dev = kmalloc(sizeof(struct eni_dev), GFP_KERNEL);
|
eni_dev = kmalloc(sizeof(struct eni_dev), GFP_KERNEL);
|
||||||
|
|
|
@ -2367,7 +2367,7 @@ int regmap_raw_write_async(struct regmap *map, unsigned int reg,
|
||||||
EXPORT_SYMBOL_GPL(regmap_raw_write_async);
|
EXPORT_SYMBOL_GPL(regmap_raw_write_async);
|
||||||
|
|
||||||
static int _regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
|
static int _regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
|
||||||
unsigned int val_len)
|
unsigned int val_len, bool noinc)
|
||||||
{
|
{
|
||||||
struct regmap_range_node *range;
|
struct regmap_range_node *range;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -2380,7 +2380,7 @@ static int _regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
|
||||||
range = _regmap_range_lookup(map, reg);
|
range = _regmap_range_lookup(map, reg);
|
||||||
if (range) {
|
if (range) {
|
||||||
ret = _regmap_select_page(map, ®, range,
|
ret = _regmap_select_page(map, ®, range,
|
||||||
val_len / map->format.val_bytes);
|
noinc ? 1 : val_len / map->format.val_bytes);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -2418,7 +2418,7 @@ static int _regmap_bus_read(void *context, unsigned int reg,
|
||||||
if (!map->format.parse_val)
|
if (!map->format.parse_val)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
ret = _regmap_raw_read(map, reg, work_val, map->format.val_bytes);
|
ret = _regmap_raw_read(map, reg, work_val, map->format.val_bytes, false);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
*val = map->format.parse_val(work_val);
|
*val = map->format.parse_val(work_val);
|
||||||
|
|
||||||
|
@ -2536,7 +2536,7 @@ int regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
|
||||||
|
|
||||||
/* Read bytes that fit into whole chunks */
|
/* Read bytes that fit into whole chunks */
|
||||||
for (i = 0; i < chunk_count; i++) {
|
for (i = 0; i < chunk_count; i++) {
|
||||||
ret = _regmap_raw_read(map, reg, val, chunk_bytes);
|
ret = _regmap_raw_read(map, reg, val, chunk_bytes, false);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
@ -2547,7 +2547,7 @@ int regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
|
||||||
|
|
||||||
/* Read remaining bytes */
|
/* Read remaining bytes */
|
||||||
if (val_len) {
|
if (val_len) {
|
||||||
ret = _regmap_raw_read(map, reg, val, val_len);
|
ret = _regmap_raw_read(map, reg, val, val_len, false);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
@ -2622,7 +2622,7 @@ int regmap_noinc_read(struct regmap *map, unsigned int reg,
|
||||||
read_len = map->max_raw_read;
|
read_len = map->max_raw_read;
|
||||||
else
|
else
|
||||||
read_len = val_len;
|
read_len = val_len;
|
||||||
ret = _regmap_raw_read(map, reg, val, read_len);
|
ret = _regmap_raw_read(map, reg, val, read_len, true);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
val = ((u8 *)val) + read_len;
|
val = ((u8 *)val) + read_len;
|
||||||
|
|
|
@ -343,11 +343,11 @@ static int rtlbt_parse_firmware(struct hci_dev *hdev,
|
||||||
* the end.
|
* the end.
|
||||||
*/
|
*/
|
||||||
len = patch_length;
|
len = patch_length;
|
||||||
buf = kmemdup(btrtl_dev->fw_data + patch_offset, patch_length,
|
buf = kvmalloc(patch_length, GFP_KERNEL);
|
||||||
GFP_KERNEL);
|
|
||||||
if (!buf)
|
if (!buf)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
memcpy(buf, btrtl_dev->fw_data + patch_offset, patch_length - 4);
|
||||||
memcpy(buf + patch_length - 4, &epatch_info->fw_version, 4);
|
memcpy(buf + patch_length - 4, &epatch_info->fw_version, 4);
|
||||||
|
|
||||||
*_buf = buf;
|
*_buf = buf;
|
||||||
|
@ -415,8 +415,10 @@ static int rtl_load_file(struct hci_dev *hdev, const char *name, u8 **buff)
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
ret = fw->size;
|
ret = fw->size;
|
||||||
*buff = kmemdup(fw->data, ret, GFP_KERNEL);
|
*buff = kvmalloc(fw->size, GFP_KERNEL);
|
||||||
if (!*buff)
|
if (*buff)
|
||||||
|
memcpy(*buff, fw->data, ret);
|
||||||
|
else
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
|
||||||
release_firmware(fw);
|
release_firmware(fw);
|
||||||
|
@ -454,14 +456,14 @@ static int btrtl_setup_rtl8723b(struct hci_dev *hdev,
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (btrtl_dev->cfg_len > 0) {
|
if (btrtl_dev->cfg_len > 0) {
|
||||||
tbuff = kzalloc(ret + btrtl_dev->cfg_len, GFP_KERNEL);
|
tbuff = kvzalloc(ret + btrtl_dev->cfg_len, GFP_KERNEL);
|
||||||
if (!tbuff) {
|
if (!tbuff) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(tbuff, fw_data, ret);
|
memcpy(tbuff, fw_data, ret);
|
||||||
kfree(fw_data);
|
kvfree(fw_data);
|
||||||
|
|
||||||
memcpy(tbuff + ret, btrtl_dev->cfg_data, btrtl_dev->cfg_len);
|
memcpy(tbuff + ret, btrtl_dev->cfg_data, btrtl_dev->cfg_len);
|
||||||
ret += btrtl_dev->cfg_len;
|
ret += btrtl_dev->cfg_len;
|
||||||
|
@ -474,7 +476,7 @@ static int btrtl_setup_rtl8723b(struct hci_dev *hdev,
|
||||||
ret = rtl_download_firmware(hdev, fw_data, ret);
|
ret = rtl_download_firmware(hdev, fw_data, ret);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
kfree(fw_data);
|
kvfree(fw_data);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -501,8 +503,8 @@ static struct sk_buff *btrtl_read_local_version(struct hci_dev *hdev)
|
||||||
|
|
||||||
void btrtl_free(struct btrtl_device_info *btrtl_dev)
|
void btrtl_free(struct btrtl_device_info *btrtl_dev)
|
||||||
{
|
{
|
||||||
kfree(btrtl_dev->fw_data);
|
kvfree(btrtl_dev->fw_data);
|
||||||
kfree(btrtl_dev->cfg_data);
|
kvfree(btrtl_dev->cfg_data);
|
||||||
kfree(btrtl_dev);
|
kfree(btrtl_dev);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(btrtl_free);
|
EXPORT_SYMBOL_GPL(btrtl_free);
|
||||||
|
|
|
@ -358,6 +358,26 @@ static int hisi_lpc_acpi_xlat_io_res(struct acpi_device *adev,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Released firmware describes the IO port max address as 0x3fff, which is
|
||||||
|
* the max host bus address. Fixup to a proper range. This will probably
|
||||||
|
* never be fixed in firmware.
|
||||||
|
*/
|
||||||
|
static void hisi_lpc_acpi_fixup_child_resource(struct device *hostdev,
|
||||||
|
struct resource *r)
|
||||||
|
{
|
||||||
|
if (r->end != 0x3fff)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (r->start == 0xe4)
|
||||||
|
r->end = 0xe4 + 0x04 - 1;
|
||||||
|
else if (r->start == 0x2f8)
|
||||||
|
r->end = 0x2f8 + 0x08 - 1;
|
||||||
|
else
|
||||||
|
dev_warn(hostdev, "unrecognised resource %pR to fixup, ignoring\n",
|
||||||
|
r);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* hisi_lpc_acpi_set_io_res - set the resources for a child
|
* hisi_lpc_acpi_set_io_res - set the resources for a child
|
||||||
* @child: the device node to be updated the I/O resource
|
* @child: the device node to be updated the I/O resource
|
||||||
|
@ -419,8 +439,11 @@ static int hisi_lpc_acpi_set_io_res(struct device *child,
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
count = 0;
|
count = 0;
|
||||||
list_for_each_entry(rentry, &resource_list, node)
|
list_for_each_entry(rentry, &resource_list, node) {
|
||||||
resources[count++] = *rentry->res;
|
resources[count] = *rentry->res;
|
||||||
|
hisi_lpc_acpi_fixup_child_resource(hostdev, &resources[count]);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
|
||||||
acpi_dev_free_resource_list(&resource_list);
|
acpi_dev_free_resource_list(&resource_list);
|
||||||
|
|
||||||
|
|
|
@ -1142,14 +1142,14 @@ static void add_timer_randomness(struct timer_rand_state *state, unsigned num)
|
||||||
* We take into account the first, second and third-order deltas
|
* We take into account the first, second and third-order deltas
|
||||||
* in order to make our estimate.
|
* in order to make our estimate.
|
||||||
*/
|
*/
|
||||||
delta = sample.jiffies - state->last_time;
|
delta = sample.jiffies - READ_ONCE(state->last_time);
|
||||||
state->last_time = sample.jiffies;
|
WRITE_ONCE(state->last_time, sample.jiffies);
|
||||||
|
|
||||||
delta2 = delta - state->last_delta;
|
delta2 = delta - READ_ONCE(state->last_delta);
|
||||||
state->last_delta = delta;
|
WRITE_ONCE(state->last_delta, delta);
|
||||||
|
|
||||||
delta3 = delta2 - state->last_delta2;
|
delta3 = delta2 - READ_ONCE(state->last_delta2);
|
||||||
state->last_delta2 = delta2;
|
WRITE_ONCE(state->last_delta2, delta2);
|
||||||
|
|
||||||
if (delta < 0)
|
if (delta < 0)
|
||||||
delta = -delta;
|
delta = -delta;
|
||||||
|
|
|
@ -776,18 +776,22 @@ static int __init tlclk_init(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = register_chrdev(tlclk_major, "telco_clock", &tlclk_fops);
|
telclk_interrupt = (inb(TLCLK_REG7) & 0x0f);
|
||||||
if (ret < 0) {
|
|
||||||
printk(KERN_ERR "tlclk: can't get major %d.\n", tlclk_major);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
tlclk_major = ret;
|
|
||||||
alarm_events = kzalloc( sizeof(struct tlclk_alarms), GFP_KERNEL);
|
alarm_events = kzalloc( sizeof(struct tlclk_alarms), GFP_KERNEL);
|
||||||
if (!alarm_events) {
|
if (!alarm_events) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto out1;
|
goto out1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = register_chrdev(tlclk_major, "telco_clock", &tlclk_fops);
|
||||||
|
if (ret < 0) {
|
||||||
|
printk(KERN_ERR "tlclk: can't get major %d.\n", tlclk_major);
|
||||||
|
kfree(alarm_events);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
tlclk_major = ret;
|
||||||
|
|
||||||
/* Read telecom clock IRQ number (Set by BIOS) */
|
/* Read telecom clock IRQ number (Set by BIOS) */
|
||||||
if (!request_region(TLCLK_BASE, 8, "telco_clock")) {
|
if (!request_region(TLCLK_BASE, 8, "telco_clock")) {
|
||||||
printk(KERN_ERR "tlclk: request_region 0x%X failed.\n",
|
printk(KERN_ERR "tlclk: request_region 0x%X failed.\n",
|
||||||
|
@ -795,7 +799,6 @@ static int __init tlclk_init(void)
|
||||||
ret = -EBUSY;
|
ret = -EBUSY;
|
||||||
goto out2;
|
goto out2;
|
||||||
}
|
}
|
||||||
telclk_interrupt = (inb(TLCLK_REG7) & 0x0f);
|
|
||||||
|
|
||||||
if (0x0F == telclk_interrupt ) { /* not MCPBL0010 ? */
|
if (0x0F == telclk_interrupt ) { /* not MCPBL0010 ? */
|
||||||
printk(KERN_ERR "telclk_interrupt = 0x%x non-mcpbl0010 hw.\n",
|
printk(KERN_ERR "telclk_interrupt = 0x%x non-mcpbl0010 hw.\n",
|
||||||
|
@ -836,8 +839,8 @@ static int __init tlclk_init(void)
|
||||||
release_region(TLCLK_BASE, 8);
|
release_region(TLCLK_BASE, 8);
|
||||||
out2:
|
out2:
|
||||||
kfree(alarm_events);
|
kfree(alarm_events);
|
||||||
out1:
|
|
||||||
unregister_chrdev(tlclk_major, "telco_clock");
|
unregister_chrdev(tlclk_major, "telco_clock");
|
||||||
|
out1:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#include "tpm.h"
|
#include "tpm.h"
|
||||||
|
|
||||||
#define ACPI_SIG_TPM2 "TPM2"
|
#define ACPI_SIG_TPM2 "TPM2"
|
||||||
|
#define TPM_CRB_MAX_RESOURCES 3
|
||||||
|
|
||||||
static const guid_t crb_acpi_start_guid =
|
static const guid_t crb_acpi_start_guid =
|
||||||
GUID_INIT(0x6BBF6CAB, 0x5463, 0x4714,
|
GUID_INIT(0x6BBF6CAB, 0x5463, 0x4714,
|
||||||
|
@ -95,7 +96,6 @@ enum crb_status {
|
||||||
struct crb_priv {
|
struct crb_priv {
|
||||||
u32 sm;
|
u32 sm;
|
||||||
const char *hid;
|
const char *hid;
|
||||||
void __iomem *iobase;
|
|
||||||
struct crb_regs_head __iomem *regs_h;
|
struct crb_regs_head __iomem *regs_h;
|
||||||
struct crb_regs_tail __iomem *regs_t;
|
struct crb_regs_tail __iomem *regs_t;
|
||||||
u8 __iomem *cmd;
|
u8 __iomem *cmd;
|
||||||
|
@ -438,21 +438,27 @@ static const struct tpm_class_ops tpm_crb = {
|
||||||
|
|
||||||
static int crb_check_resource(struct acpi_resource *ares, void *data)
|
static int crb_check_resource(struct acpi_resource *ares, void *data)
|
||||||
{
|
{
|
||||||
struct resource *io_res = data;
|
struct resource *iores_array = data;
|
||||||
struct resource_win win;
|
struct resource_win win;
|
||||||
struct resource *res = &(win.res);
|
struct resource *res = &(win.res);
|
||||||
|
int i;
|
||||||
|
|
||||||
if (acpi_dev_resource_memory(ares, res) ||
|
if (acpi_dev_resource_memory(ares, res) ||
|
||||||
acpi_dev_resource_address_space(ares, &win)) {
|
acpi_dev_resource_address_space(ares, &win)) {
|
||||||
*io_res = *res;
|
for (i = 0; i < TPM_CRB_MAX_RESOURCES + 1; ++i) {
|
||||||
io_res->name = NULL;
|
if (resource_type(iores_array + i) != IORESOURCE_MEM) {
|
||||||
|
iores_array[i] = *res;
|
||||||
|
iores_array[i].name = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __iomem *crb_map_res(struct device *dev, struct crb_priv *priv,
|
static void __iomem *crb_map_res(struct device *dev, struct resource *iores,
|
||||||
struct resource *io_res, u64 start, u32 size)
|
void __iomem **iobase_ptr, u64 start, u32 size)
|
||||||
{
|
{
|
||||||
struct resource new_res = {
|
struct resource new_res = {
|
||||||
.start = start,
|
.start = start,
|
||||||
|
@ -464,10 +470,16 @@ static void __iomem *crb_map_res(struct device *dev, struct crb_priv *priv,
|
||||||
if (start != new_res.start)
|
if (start != new_res.start)
|
||||||
return (void __iomem *) ERR_PTR(-EINVAL);
|
return (void __iomem *) ERR_PTR(-EINVAL);
|
||||||
|
|
||||||
if (!resource_contains(io_res, &new_res))
|
if (!iores)
|
||||||
return devm_ioremap_resource(dev, &new_res);
|
return devm_ioremap_resource(dev, &new_res);
|
||||||
|
|
||||||
return priv->iobase + (new_res.start - io_res->start);
|
if (!*iobase_ptr) {
|
||||||
|
*iobase_ptr = devm_ioremap_resource(dev, iores);
|
||||||
|
if (IS_ERR(*iobase_ptr))
|
||||||
|
return *iobase_ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *iobase_ptr + (new_res.start - iores->start);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -494,9 +506,13 @@ static u64 crb_fixup_cmd_size(struct device *dev, struct resource *io_res,
|
||||||
static int crb_map_io(struct acpi_device *device, struct crb_priv *priv,
|
static int crb_map_io(struct acpi_device *device, struct crb_priv *priv,
|
||||||
struct acpi_table_tpm2 *buf)
|
struct acpi_table_tpm2 *buf)
|
||||||
{
|
{
|
||||||
struct list_head resources;
|
struct list_head acpi_resource_list;
|
||||||
struct resource io_res;
|
struct resource iores_array[TPM_CRB_MAX_RESOURCES + 1] = { {0} };
|
||||||
|
void __iomem *iobase_array[TPM_CRB_MAX_RESOURCES] = {NULL};
|
||||||
struct device *dev = &device->dev;
|
struct device *dev = &device->dev;
|
||||||
|
struct resource *iores;
|
||||||
|
void __iomem **iobase_ptr;
|
||||||
|
int i;
|
||||||
u32 pa_high, pa_low;
|
u32 pa_high, pa_low;
|
||||||
u64 cmd_pa;
|
u64 cmd_pa;
|
||||||
u32 cmd_size;
|
u32 cmd_size;
|
||||||
|
@ -505,21 +521,41 @@ static int crb_map_io(struct acpi_device *device, struct crb_priv *priv,
|
||||||
u32 rsp_size;
|
u32 rsp_size;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
INIT_LIST_HEAD(&resources);
|
INIT_LIST_HEAD(&acpi_resource_list);
|
||||||
ret = acpi_dev_get_resources(device, &resources, crb_check_resource,
|
ret = acpi_dev_get_resources(device, &acpi_resource_list,
|
||||||
&io_res);
|
crb_check_resource, iores_array);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
acpi_dev_free_resource_list(&resources);
|
acpi_dev_free_resource_list(&acpi_resource_list);
|
||||||
|
|
||||||
if (resource_type(&io_res) != IORESOURCE_MEM) {
|
if (resource_type(iores_array) != IORESOURCE_MEM) {
|
||||||
dev_err(dev, FW_BUG "TPM2 ACPI table does not define a memory resource\n");
|
dev_err(dev, FW_BUG "TPM2 ACPI table does not define a memory resource\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
} else if (resource_type(iores_array + TPM_CRB_MAX_RESOURCES) ==
|
||||||
|
IORESOURCE_MEM) {
|
||||||
|
dev_warn(dev, "TPM2 ACPI table defines too many memory resources\n");
|
||||||
|
memset(iores_array + TPM_CRB_MAX_RESOURCES,
|
||||||
|
0, sizeof(*iores_array));
|
||||||
|
iores_array[TPM_CRB_MAX_RESOURCES].flags = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
priv->iobase = devm_ioremap_resource(dev, &io_res);
|
iores = NULL;
|
||||||
if (IS_ERR(priv->iobase))
|
iobase_ptr = NULL;
|
||||||
return PTR_ERR(priv->iobase);
|
for (i = 0; resource_type(iores_array + i) == IORESOURCE_MEM; ++i) {
|
||||||
|
if (buf->control_address >= iores_array[i].start &&
|
||||||
|
buf->control_address + sizeof(struct crb_regs_tail) - 1 <=
|
||||||
|
iores_array[i].end) {
|
||||||
|
iores = iores_array + i;
|
||||||
|
iobase_ptr = iobase_array + i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
priv->regs_t = crb_map_res(dev, iores, iobase_ptr, buf->control_address,
|
||||||
|
sizeof(struct crb_regs_tail));
|
||||||
|
|
||||||
|
if (IS_ERR(priv->regs_t))
|
||||||
|
return PTR_ERR(priv->regs_t);
|
||||||
|
|
||||||
/* The ACPI IO region starts at the head area and continues to include
|
/* The ACPI IO region starts at the head area and continues to include
|
||||||
* the control area, as one nice sane region except for some older
|
* the control area, as one nice sane region except for some older
|
||||||
|
@ -527,9 +563,10 @@ static int crb_map_io(struct acpi_device *device, struct crb_priv *priv,
|
||||||
*/
|
*/
|
||||||
if ((priv->sm == ACPI_TPM2_COMMAND_BUFFER) ||
|
if ((priv->sm == ACPI_TPM2_COMMAND_BUFFER) ||
|
||||||
(priv->sm == ACPI_TPM2_MEMORY_MAPPED)) {
|
(priv->sm == ACPI_TPM2_MEMORY_MAPPED)) {
|
||||||
if (buf->control_address == io_res.start +
|
if (iores &&
|
||||||
|
buf->control_address == iores->start +
|
||||||
sizeof(*priv->regs_h))
|
sizeof(*priv->regs_h))
|
||||||
priv->regs_h = priv->iobase;
|
priv->regs_h = *iobase_ptr;
|
||||||
else
|
else
|
||||||
dev_warn(dev, FW_BUG "Bad ACPI memory layout");
|
dev_warn(dev, FW_BUG "Bad ACPI memory layout");
|
||||||
}
|
}
|
||||||
|
@ -538,13 +575,6 @@ static int crb_map_io(struct acpi_device *device, struct crb_priv *priv,
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
priv->regs_t = crb_map_res(dev, priv, &io_res, buf->control_address,
|
|
||||||
sizeof(struct crb_regs_tail));
|
|
||||||
if (IS_ERR(priv->regs_t)) {
|
|
||||||
ret = PTR_ERR(priv->regs_t);
|
|
||||||
goto out_relinquish_locality;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* PTT HW bug w/a: wake up the device to access
|
* PTT HW bug w/a: wake up the device to access
|
||||||
* possibly not retained registers.
|
* possibly not retained registers.
|
||||||
|
@ -556,13 +586,26 @@ static int crb_map_io(struct acpi_device *device, struct crb_priv *priv,
|
||||||
pa_high = ioread32(&priv->regs_t->ctrl_cmd_pa_high);
|
pa_high = ioread32(&priv->regs_t->ctrl_cmd_pa_high);
|
||||||
pa_low = ioread32(&priv->regs_t->ctrl_cmd_pa_low);
|
pa_low = ioread32(&priv->regs_t->ctrl_cmd_pa_low);
|
||||||
cmd_pa = ((u64)pa_high << 32) | pa_low;
|
cmd_pa = ((u64)pa_high << 32) | pa_low;
|
||||||
cmd_size = crb_fixup_cmd_size(dev, &io_res, cmd_pa,
|
cmd_size = ioread32(&priv->regs_t->ctrl_cmd_size);
|
||||||
ioread32(&priv->regs_t->ctrl_cmd_size));
|
|
||||||
|
iores = NULL;
|
||||||
|
iobase_ptr = NULL;
|
||||||
|
for (i = 0; iores_array[i].end; ++i) {
|
||||||
|
if (cmd_pa >= iores_array[i].start &&
|
||||||
|
cmd_pa <= iores_array[i].end) {
|
||||||
|
iores = iores_array + i;
|
||||||
|
iobase_ptr = iobase_array + i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (iores)
|
||||||
|
cmd_size = crb_fixup_cmd_size(dev, iores, cmd_pa, cmd_size);
|
||||||
|
|
||||||
dev_dbg(dev, "cmd_hi = %X cmd_low = %X cmd_size %X\n",
|
dev_dbg(dev, "cmd_hi = %X cmd_low = %X cmd_size %X\n",
|
||||||
pa_high, pa_low, cmd_size);
|
pa_high, pa_low, cmd_size);
|
||||||
|
|
||||||
priv->cmd = crb_map_res(dev, priv, &io_res, cmd_pa, cmd_size);
|
priv->cmd = crb_map_res(dev, iores, iobase_ptr, cmd_pa, cmd_size);
|
||||||
if (IS_ERR(priv->cmd)) {
|
if (IS_ERR(priv->cmd)) {
|
||||||
ret = PTR_ERR(priv->cmd);
|
ret = PTR_ERR(priv->cmd);
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -570,11 +613,25 @@ static int crb_map_io(struct acpi_device *device, struct crb_priv *priv,
|
||||||
|
|
||||||
memcpy_fromio(&__rsp_pa, &priv->regs_t->ctrl_rsp_pa, 8);
|
memcpy_fromio(&__rsp_pa, &priv->regs_t->ctrl_rsp_pa, 8);
|
||||||
rsp_pa = le64_to_cpu(__rsp_pa);
|
rsp_pa = le64_to_cpu(__rsp_pa);
|
||||||
rsp_size = crb_fixup_cmd_size(dev, &io_res, rsp_pa,
|
rsp_size = ioread32(&priv->regs_t->ctrl_rsp_size);
|
||||||
ioread32(&priv->regs_t->ctrl_rsp_size));
|
|
||||||
|
iores = NULL;
|
||||||
|
iobase_ptr = NULL;
|
||||||
|
for (i = 0; resource_type(iores_array + i) == IORESOURCE_MEM; ++i) {
|
||||||
|
if (rsp_pa >= iores_array[i].start &&
|
||||||
|
rsp_pa <= iores_array[i].end) {
|
||||||
|
iores = iores_array + i;
|
||||||
|
iobase_ptr = iobase_array + i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (iores)
|
||||||
|
rsp_size = crb_fixup_cmd_size(dev, iores, rsp_pa, rsp_size);
|
||||||
|
|
||||||
if (cmd_pa != rsp_pa) {
|
if (cmd_pa != rsp_pa) {
|
||||||
priv->rsp = crb_map_res(dev, priv, &io_res, rsp_pa, rsp_size);
|
priv->rsp = crb_map_res(dev, iores, iobase_ptr,
|
||||||
|
rsp_pa, rsp_size);
|
||||||
ret = PTR_ERR_OR_ZERO(priv->rsp);
|
ret = PTR_ERR_OR_ZERO(priv->rsp);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
|
@ -588,6 +588,7 @@ static irqreturn_t ibmvtpm_interrupt(int irq, void *vtpm_instance)
|
||||||
*/
|
*/
|
||||||
while ((crq = ibmvtpm_crq_get_next(ibmvtpm)) != NULL) {
|
while ((crq = ibmvtpm_crq_get_next(ibmvtpm)) != NULL) {
|
||||||
ibmvtpm_crq_process(crq, ibmvtpm);
|
ibmvtpm_crq_process(crq, ibmvtpm);
|
||||||
|
wake_up_interruptible(&ibmvtpm->crq_queue.wq);
|
||||||
crq->valid = 0;
|
crq->valid = 0;
|
||||||
smp_wmb();
|
smp_wmb();
|
||||||
}
|
}
|
||||||
|
@ -635,6 +636,7 @@ static int tpm_ibmvtpm_probe(struct vio_dev *vio_dev,
|
||||||
}
|
}
|
||||||
|
|
||||||
crq_q->num_entry = CRQ_RES_BUF_SIZE / sizeof(*crq_q->crq_addr);
|
crq_q->num_entry = CRQ_RES_BUF_SIZE / sizeof(*crq_q->crq_addr);
|
||||||
|
init_waitqueue_head(&crq_q->wq);
|
||||||
ibmvtpm->crq_dma_handle = dma_map_single(dev, crq_q->crq_addr,
|
ibmvtpm->crq_dma_handle = dma_map_single(dev, crq_q->crq_addr,
|
||||||
CRQ_RES_BUF_SIZE,
|
CRQ_RES_BUF_SIZE,
|
||||||
DMA_BIDIRECTIONAL);
|
DMA_BIDIRECTIONAL);
|
||||||
|
@ -687,6 +689,13 @@ static int tpm_ibmvtpm_probe(struct vio_dev *vio_dev,
|
||||||
if (rc)
|
if (rc)
|
||||||
goto init_irq_cleanup;
|
goto init_irq_cleanup;
|
||||||
|
|
||||||
|
if (!wait_event_timeout(ibmvtpm->crq_queue.wq,
|
||||||
|
ibmvtpm->rtce_buf != NULL,
|
||||||
|
HZ)) {
|
||||||
|
dev_err(dev, "CRQ response timed out\n");
|
||||||
|
goto init_irq_cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
return tpm_chip_register(chip);
|
return tpm_chip_register(chip);
|
||||||
init_irq_cleanup:
|
init_irq_cleanup:
|
||||||
do {
|
do {
|
||||||
|
|
|
@ -31,6 +31,7 @@ struct ibmvtpm_crq_queue {
|
||||||
struct ibmvtpm_crq *crq_addr;
|
struct ibmvtpm_crq *crq_addr;
|
||||||
u32 index;
|
u32 index;
|
||||||
u32 num_entry;
|
u32 num_entry;
|
||||||
|
wait_queue_head_t wq;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ibmvtpm_dev {
|
struct ibmvtpm_dev {
|
||||||
|
|
|
@ -491,7 +491,7 @@ struct clk *davinci_pll_clk_register(struct device *dev,
|
||||||
parent_name = postdiv_name;
|
parent_name = postdiv_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
pllen = kzalloc(sizeof(*pllout), GFP_KERNEL);
|
pllen = kzalloc(sizeof(*pllen), GFP_KERNEL);
|
||||||
if (!pllen) {
|
if (!pllen) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto err_unregister_postdiv;
|
goto err_unregister_postdiv;
|
||||||
|
|
|
@ -144,7 +144,7 @@ PNAME(mux_usb480m_p) = { "usb480m_phy", "xin24m" };
|
||||||
PNAME(mux_hdmiphy_p) = { "hdmiphy_phy", "xin24m" };
|
PNAME(mux_hdmiphy_p) = { "hdmiphy_phy", "xin24m" };
|
||||||
PNAME(mux_aclk_cpu_src_p) = { "cpll_aclk_cpu", "gpll_aclk_cpu", "hdmiphy_aclk_cpu" };
|
PNAME(mux_aclk_cpu_src_p) = { "cpll_aclk_cpu", "gpll_aclk_cpu", "hdmiphy_aclk_cpu" };
|
||||||
|
|
||||||
PNAME(mux_pll_src_4plls_p) = { "cpll", "gpll", "hdmiphy" "usb480m" };
|
PNAME(mux_pll_src_4plls_p) = { "cpll", "gpll", "hdmiphy", "usb480m" };
|
||||||
PNAME(mux_pll_src_3plls_p) = { "cpll", "gpll", "hdmiphy" };
|
PNAME(mux_pll_src_3plls_p) = { "cpll", "gpll", "hdmiphy" };
|
||||||
PNAME(mux_pll_src_2plls_p) = { "cpll", "gpll" };
|
PNAME(mux_pll_src_2plls_p) = { "cpll", "gpll" };
|
||||||
PNAME(mux_sclk_hdmi_cec_p) = { "cpll", "gpll", "xin24m" };
|
PNAME(mux_sclk_hdmi_cec_p) = { "cpll", "gpll", "xin24m" };
|
||||||
|
|
|
@ -38,7 +38,9 @@ static unsigned long clk_pll_recalc_rate(struct clk_hw *hwclk,
|
||||||
/* read VCO1 reg for numerator and denominator */
|
/* read VCO1 reg for numerator and denominator */
|
||||||
reg = readl(socfpgaclk->hw.reg);
|
reg = readl(socfpgaclk->hw.reg);
|
||||||
refdiv = (reg & SOCFPGA_PLL_REFDIV_MASK) >> SOCFPGA_PLL_REFDIV_SHIFT;
|
refdiv = (reg & SOCFPGA_PLL_REFDIV_MASK) >> SOCFPGA_PLL_REFDIV_SHIFT;
|
||||||
vco_freq = (unsigned long long)parent_rate / refdiv;
|
|
||||||
|
vco_freq = parent_rate;
|
||||||
|
do_div(vco_freq, refdiv);
|
||||||
|
|
||||||
/* Read mdiv and fdiv from the fdbck register */
|
/* Read mdiv and fdiv from the fdbck register */
|
||||||
reg = readl(socfpgaclk->hw.reg + 0x4);
|
reg = readl(socfpgaclk->hw.reg + 0x4);
|
||||||
|
|
|
@ -193,15 +193,8 @@ static const char *ti_adpll_clk_get_name(struct ti_adpll_data *d,
|
||||||
if (err)
|
if (err)
|
||||||
return NULL;
|
return NULL;
|
||||||
} else {
|
} else {
|
||||||
const char *base_name = "adpll";
|
name = devm_kasprintf(d->dev, GFP_KERNEL, "%08lx.adpll.%s",
|
||||||
char *buf;
|
d->pa, postfix);
|
||||||
|
|
||||||
buf = devm_kzalloc(d->dev, 8 + 1 + strlen(base_name) + 1 +
|
|
||||||
strlen(postfix), GFP_KERNEL);
|
|
||||||
if (!buf)
|
|
||||||
return NULL;
|
|
||||||
sprintf(buf, "%08lx.%s.%s", d->pa, base_name, postfix);
|
|
||||||
name = buf;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return name;
|
return name;
|
||||||
|
|
|
@ -169,7 +169,7 @@ static int __init h8300_8timer_init(struct device_node *node)
|
||||||
return PTR_ERR(clk);
|
return PTR_ERR(clk);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = ENXIO;
|
ret = -ENXIO;
|
||||||
base = of_iomap(node, 0);
|
base = of_iomap(node, 0);
|
||||||
if (!base) {
|
if (!base) {
|
||||||
pr_err("failed to map registers for clockevent\n");
|
pr_err("failed to map registers for clockevent\n");
|
||||||
|
|
|
@ -903,6 +903,7 @@ static struct notifier_block powernv_cpufreq_reboot_nb = {
|
||||||
void powernv_cpufreq_work_fn(struct work_struct *work)
|
void powernv_cpufreq_work_fn(struct work_struct *work)
|
||||||
{
|
{
|
||||||
struct chip *chip = container_of(work, struct chip, throttle);
|
struct chip *chip = container_of(work, struct chip, throttle);
|
||||||
|
struct cpufreq_policy *policy;
|
||||||
unsigned int cpu;
|
unsigned int cpu;
|
||||||
cpumask_t mask;
|
cpumask_t mask;
|
||||||
|
|
||||||
|
@ -917,12 +918,14 @@ void powernv_cpufreq_work_fn(struct work_struct *work)
|
||||||
chip->restore = false;
|
chip->restore = false;
|
||||||
for_each_cpu(cpu, &mask) {
|
for_each_cpu(cpu, &mask) {
|
||||||
int index;
|
int index;
|
||||||
struct cpufreq_policy policy;
|
|
||||||
|
|
||||||
cpufreq_get_policy(&policy, cpu);
|
policy = cpufreq_cpu_get(cpu);
|
||||||
index = cpufreq_table_find_index_c(&policy, policy.cur);
|
if (!policy)
|
||||||
powernv_cpufreq_target_index(&policy, index);
|
continue;
|
||||||
cpumask_andnot(&mask, &mask, policy.cpus);
|
index = cpufreq_table_find_index_c(policy, policy->cur);
|
||||||
|
powernv_cpufreq_target_index(policy, index);
|
||||||
|
cpumask_andnot(&mask, &mask, policy->cpus);
|
||||||
|
cpufreq_cpu_put(policy);
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
put_online_cpus();
|
put_online_cpus();
|
||||||
|
|
|
@ -2419,7 +2419,8 @@ int chcr_aead_dma_map(struct device *dev,
|
||||||
else
|
else
|
||||||
reqctx->b0_dma = 0;
|
reqctx->b0_dma = 0;
|
||||||
if (req->src == req->dst) {
|
if (req->src == req->dst) {
|
||||||
error = dma_map_sg(dev, req->src, sg_nents(req->src),
|
error = dma_map_sg(dev, req->src,
|
||||||
|
sg_nents_for_len(req->src, dst_size),
|
||||||
DMA_BIDIRECTIONAL);
|
DMA_BIDIRECTIONAL);
|
||||||
if (!error)
|
if (!error)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
|
@ -1449,7 +1449,7 @@ static int chtls_pt_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||||
csk->wr_max_credits))
|
csk->wr_max_credits))
|
||||||
sk->sk_write_space(sk);
|
sk->sk_write_space(sk);
|
||||||
|
|
||||||
if (copied >= target && !sk->sk_backlog.tail)
|
if (copied >= target && !READ_ONCE(sk->sk_backlog.tail))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (copied) {
|
if (copied) {
|
||||||
|
@ -1482,7 +1482,7 @@ static int chtls_pt_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (sk->sk_backlog.tail) {
|
if (READ_ONCE(sk->sk_backlog.tail)) {
|
||||||
release_sock(sk);
|
release_sock(sk);
|
||||||
lock_sock(sk);
|
lock_sock(sk);
|
||||||
chtls_cleanup_rbuf(sk, copied);
|
chtls_cleanup_rbuf(sk, copied);
|
||||||
|
@ -1627,7 +1627,7 @@ static int peekmsg(struct sock *sk, struct msghdr *msg,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sk->sk_backlog.tail) {
|
if (READ_ONCE(sk->sk_backlog.tail)) {
|
||||||
/* Do not sleep, just process backlog. */
|
/* Do not sleep, just process backlog. */
|
||||||
release_sock(sk);
|
release_sock(sk);
|
||||||
lock_sock(sk);
|
lock_sock(sk);
|
||||||
|
@ -1759,7 +1759,7 @@ int chtls_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||||
csk->wr_max_credits))
|
csk->wr_max_credits))
|
||||||
sk->sk_write_space(sk);
|
sk->sk_write_space(sk);
|
||||||
|
|
||||||
if (copied >= target && !sk->sk_backlog.tail)
|
if (copied >= target && !READ_ONCE(sk->sk_backlog.tail))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (copied) {
|
if (copied) {
|
||||||
|
@ -1790,7 +1790,7 @@ int chtls_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sk->sk_backlog.tail) {
|
if (READ_ONCE(sk->sk_backlog.tail)) {
|
||||||
release_sock(sk);
|
release_sock(sk);
|
||||||
lock_sock(sk);
|
lock_sock(sk);
|
||||||
chtls_cleanup_rbuf(sk, copied);
|
chtls_cleanup_rbuf(sk, copied);
|
||||||
|
|
|
@ -80,6 +80,8 @@
|
||||||
|
|
||||||
#define KHZ 1000
|
#define KHZ 1000
|
||||||
|
|
||||||
|
#define KHZ_MAX (ULONG_MAX / KHZ)
|
||||||
|
|
||||||
/* Assume that the bus is saturated if the utilization is 25% */
|
/* Assume that the bus is saturated if the utilization is 25% */
|
||||||
#define BUS_SATURATION_RATIO 25
|
#define BUS_SATURATION_RATIO 25
|
||||||
|
|
||||||
|
@ -180,7 +182,7 @@ struct tegra_actmon_emc_ratio {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct tegra_actmon_emc_ratio actmon_emc_ratios[] = {
|
static struct tegra_actmon_emc_ratio actmon_emc_ratios[] = {
|
||||||
{ 1400000, ULONG_MAX },
|
{ 1400000, KHZ_MAX },
|
||||||
{ 1200000, 750000 },
|
{ 1200000, 750000 },
|
||||||
{ 1100000, 600000 },
|
{ 1100000, 600000 },
|
||||||
{ 1000000, 500000 },
|
{ 1000000, 500000 },
|
||||||
|
|
|
@ -244,6 +244,30 @@ void dma_fence_free(struct dma_fence *fence)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(dma_fence_free);
|
EXPORT_SYMBOL(dma_fence_free);
|
||||||
|
|
||||||
|
static bool __dma_fence_enable_signaling(struct dma_fence *fence)
|
||||||
|
{
|
||||||
|
bool was_set;
|
||||||
|
|
||||||
|
lockdep_assert_held(fence->lock);
|
||||||
|
|
||||||
|
was_set = test_and_set_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT,
|
||||||
|
&fence->flags);
|
||||||
|
|
||||||
|
if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!was_set && fence->ops->enable_signaling) {
|
||||||
|
trace_dma_fence_enable_signal(fence);
|
||||||
|
|
||||||
|
if (!fence->ops->enable_signaling(fence)) {
|
||||||
|
dma_fence_signal_locked(fence);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* dma_fence_enable_sw_signaling - enable signaling on fence
|
* dma_fence_enable_sw_signaling - enable signaling on fence
|
||||||
* @fence: the fence to enable
|
* @fence: the fence to enable
|
||||||
|
@ -256,19 +280,12 @@ void dma_fence_enable_sw_signaling(struct dma_fence *fence)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
if (!test_and_set_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT,
|
if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
|
||||||
&fence->flags) &&
|
return;
|
||||||
!test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags) &&
|
|
||||||
fence->ops->enable_signaling) {
|
|
||||||
trace_dma_fence_enable_signal(fence);
|
|
||||||
|
|
||||||
spin_lock_irqsave(fence->lock, flags);
|
spin_lock_irqsave(fence->lock, flags);
|
||||||
|
__dma_fence_enable_signaling(fence);
|
||||||
if (!fence->ops->enable_signaling(fence))
|
|
||||||
dma_fence_signal_locked(fence);
|
|
||||||
|
|
||||||
spin_unlock_irqrestore(fence->lock, flags);
|
spin_unlock_irqrestore(fence->lock, flags);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(dma_fence_enable_sw_signaling);
|
EXPORT_SYMBOL(dma_fence_enable_sw_signaling);
|
||||||
|
|
||||||
|
@ -302,7 +319,6 @@ int dma_fence_add_callback(struct dma_fence *fence, struct dma_fence_cb *cb,
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
bool was_set;
|
|
||||||
|
|
||||||
if (WARN_ON(!fence || !func))
|
if (WARN_ON(!fence || !func))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -314,25 +330,14 @@ int dma_fence_add_callback(struct dma_fence *fence, struct dma_fence_cb *cb,
|
||||||
|
|
||||||
spin_lock_irqsave(fence->lock, flags);
|
spin_lock_irqsave(fence->lock, flags);
|
||||||
|
|
||||||
was_set = test_and_set_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT,
|
if (__dma_fence_enable_signaling(fence)) {
|
||||||
&fence->flags);
|
|
||||||
|
|
||||||
if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
|
|
||||||
ret = -ENOENT;
|
|
||||||
else if (!was_set && fence->ops->enable_signaling) {
|
|
||||||
trace_dma_fence_enable_signal(fence);
|
|
||||||
|
|
||||||
if (!fence->ops->enable_signaling(fence)) {
|
|
||||||
dma_fence_signal_locked(fence);
|
|
||||||
ret = -ENOENT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ret) {
|
|
||||||
cb->func = func;
|
cb->func = func;
|
||||||
list_add_tail(&cb->node, &fence->cb_list);
|
list_add_tail(&cb->node, &fence->cb_list);
|
||||||
} else
|
} else {
|
||||||
INIT_LIST_HEAD(&cb->node);
|
INIT_LIST_HEAD(&cb->node);
|
||||||
|
ret = -ENOENT;
|
||||||
|
}
|
||||||
|
|
||||||
spin_unlock_irqrestore(fence->lock, flags);
|
spin_unlock_irqrestore(fence->lock, flags);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -432,7 +437,6 @@ dma_fence_default_wait(struct dma_fence *fence, bool intr, signed long timeout)
|
||||||
struct default_wait_cb cb;
|
struct default_wait_cb cb;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
signed long ret = timeout ? timeout : 1;
|
signed long ret = timeout ? timeout : 1;
|
||||||
bool was_set;
|
|
||||||
|
|
||||||
if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
|
if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -444,21 +448,9 @@ dma_fence_default_wait(struct dma_fence *fence, bool intr, signed long timeout)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
was_set = test_and_set_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT,
|
if (!__dma_fence_enable_signaling(fence))
|
||||||
&fence->flags);
|
|
||||||
|
|
||||||
if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
|
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (!was_set && fence->ops->enable_signaling) {
|
|
||||||
trace_dma_fence_enable_signal(fence);
|
|
||||||
|
|
||||||
if (!fence->ops->enable_signaling(fence)) {
|
|
||||||
dma_fence_signal_locked(fence);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!timeout) {
|
if (!timeout) {
|
||||||
ret = 0;
|
ret = 0;
|
||||||
goto out;
|
goto out;
|
||||||
|
|
|
@ -997,7 +997,7 @@ static int mtk_hsdma_probe(struct platform_device *pdev)
|
||||||
if (err) {
|
if (err) {
|
||||||
dev_err(&pdev->dev,
|
dev_err(&pdev->dev,
|
||||||
"request_irq failed with err %d\n", err);
|
"request_irq failed with err %d\n", err);
|
||||||
goto err_unregister;
|
goto err_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
platform_set_drvdata(pdev, hsdma);
|
platform_set_drvdata(pdev, hsdma);
|
||||||
|
@ -1006,6 +1006,8 @@ static int mtk_hsdma_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
err_free:
|
||||||
|
of_dma_controller_free(pdev->dev.of_node);
|
||||||
err_unregister:
|
err_unregister:
|
||||||
dma_async_device_unregister(dd);
|
dma_async_device_unregister(dd);
|
||||||
|
|
||||||
|
|
|
@ -494,7 +494,9 @@ static int stm32_dma_terminate_all(struct dma_chan *c)
|
||||||
|
|
||||||
spin_lock_irqsave(&chan->vchan.lock, flags);
|
spin_lock_irqsave(&chan->vchan.lock, flags);
|
||||||
|
|
||||||
if (chan->busy) {
|
if (chan->desc) {
|
||||||
|
vchan_terminate_vdesc(&chan->desc->vdesc);
|
||||||
|
if (chan->busy)
|
||||||
stm32_dma_stop(chan);
|
stm32_dma_stop(chan);
|
||||||
chan->desc = NULL;
|
chan->desc = NULL;
|
||||||
}
|
}
|
||||||
|
@ -551,6 +553,8 @@ static void stm32_dma_start_transfer(struct stm32_dma_chan *chan)
|
||||||
if (!vdesc)
|
if (!vdesc)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
list_del(&vdesc->node);
|
||||||
|
|
||||||
chan->desc = to_stm32_dma_desc(vdesc);
|
chan->desc = to_stm32_dma_desc(vdesc);
|
||||||
chan->next_sg = 0;
|
chan->next_sg = 0;
|
||||||
}
|
}
|
||||||
|
@ -628,7 +632,6 @@ static void stm32_dma_handle_chan_done(struct stm32_dma_chan *chan)
|
||||||
} else {
|
} else {
|
||||||
chan->busy = false;
|
chan->busy = false;
|
||||||
if (chan->next_sg == chan->desc->num_sgs) {
|
if (chan->next_sg == chan->desc->num_sgs) {
|
||||||
list_del(&chan->desc->vdesc.node);
|
|
||||||
vchan_cookie_complete(&chan->desc->vdesc);
|
vchan_cookie_complete(&chan->desc->vdesc);
|
||||||
chan->desc = NULL;
|
chan->desc = NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1137,6 +1137,8 @@ static void stm32_mdma_start_transfer(struct stm32_mdma_chan *chan)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
list_del(&vdesc->node);
|
||||||
|
|
||||||
chan->desc = to_stm32_mdma_desc(vdesc);
|
chan->desc = to_stm32_mdma_desc(vdesc);
|
||||||
hwdesc = chan->desc->node[0].hwdesc;
|
hwdesc = chan->desc->node[0].hwdesc;
|
||||||
chan->curr_hwdesc = 0;
|
chan->curr_hwdesc = 0;
|
||||||
|
@ -1252,7 +1254,9 @@ static int stm32_mdma_terminate_all(struct dma_chan *c)
|
||||||
LIST_HEAD(head);
|
LIST_HEAD(head);
|
||||||
|
|
||||||
spin_lock_irqsave(&chan->vchan.lock, flags);
|
spin_lock_irqsave(&chan->vchan.lock, flags);
|
||||||
if (chan->busy) {
|
if (chan->desc) {
|
||||||
|
vchan_terminate_vdesc(&chan->desc->vdesc);
|
||||||
|
if (chan->busy)
|
||||||
stm32_mdma_stop(chan);
|
stm32_mdma_stop(chan);
|
||||||
chan->desc = NULL;
|
chan->desc = NULL;
|
||||||
}
|
}
|
||||||
|
@ -1341,7 +1345,6 @@ static enum dma_status stm32_mdma_tx_status(struct dma_chan *c,
|
||||||
|
|
||||||
static void stm32_mdma_xfer_end(struct stm32_mdma_chan *chan)
|
static void stm32_mdma_xfer_end(struct stm32_mdma_chan *chan)
|
||||||
{
|
{
|
||||||
list_del(&chan->desc->vdesc.node);
|
|
||||||
vchan_cookie_complete(&chan->desc->vdesc);
|
vchan_cookie_complete(&chan->desc->vdesc);
|
||||||
chan->desc = NULL;
|
chan->desc = NULL;
|
||||||
chan->busy = false;
|
chan->busy = false;
|
||||||
|
|
|
@ -1225,7 +1225,6 @@ static void tegra_dma_free_chan_resources(struct dma_chan *dc)
|
||||||
|
|
||||||
dev_dbg(tdc2dev(tdc), "Freeing channel %d\n", tdc->id);
|
dev_dbg(tdc2dev(tdc), "Freeing channel %d\n", tdc->id);
|
||||||
|
|
||||||
if (tdc->busy)
|
|
||||||
tegra_dma_terminate_all(dc);
|
tegra_dma_terminate_all(dc);
|
||||||
|
|
||||||
spin_lock_irqsave(&tdc->lock, flags);
|
spin_lock_irqsave(&tdc->lock, flags);
|
||||||
|
|
|
@ -127,10 +127,12 @@
|
||||||
/* Max transfer size per descriptor */
|
/* Max transfer size per descriptor */
|
||||||
#define ZYNQMP_DMA_MAX_TRANS_LEN 0x40000000
|
#define ZYNQMP_DMA_MAX_TRANS_LEN 0x40000000
|
||||||
|
|
||||||
|
/* Max burst lengths */
|
||||||
|
#define ZYNQMP_DMA_MAX_DST_BURST_LEN 32768U
|
||||||
|
#define ZYNQMP_DMA_MAX_SRC_BURST_LEN 32768U
|
||||||
|
|
||||||
/* Reset values for data attributes */
|
/* Reset values for data attributes */
|
||||||
#define ZYNQMP_DMA_AXCACHE_VAL 0xF
|
#define ZYNQMP_DMA_AXCACHE_VAL 0xF
|
||||||
#define ZYNQMP_DMA_ARLEN_RST_VAL 0xF
|
|
||||||
#define ZYNQMP_DMA_AWLEN_RST_VAL 0xF
|
|
||||||
|
|
||||||
#define ZYNQMP_DMA_SRC_ISSUE_RST_VAL 0x1F
|
#define ZYNQMP_DMA_SRC_ISSUE_RST_VAL 0x1F
|
||||||
|
|
||||||
|
@ -536,17 +538,19 @@ static void zynqmp_dma_handle_ovfl_int(struct zynqmp_dma_chan *chan, u32 status)
|
||||||
|
|
||||||
static void zynqmp_dma_config(struct zynqmp_dma_chan *chan)
|
static void zynqmp_dma_config(struct zynqmp_dma_chan *chan)
|
||||||
{
|
{
|
||||||
u32 val;
|
u32 val, burst_val;
|
||||||
|
|
||||||
val = readl(chan->regs + ZYNQMP_DMA_CTRL0);
|
val = readl(chan->regs + ZYNQMP_DMA_CTRL0);
|
||||||
val |= ZYNQMP_DMA_POINT_TYPE_SG;
|
val |= ZYNQMP_DMA_POINT_TYPE_SG;
|
||||||
writel(val, chan->regs + ZYNQMP_DMA_CTRL0);
|
writel(val, chan->regs + ZYNQMP_DMA_CTRL0);
|
||||||
|
|
||||||
val = readl(chan->regs + ZYNQMP_DMA_DATA_ATTR);
|
val = readl(chan->regs + ZYNQMP_DMA_DATA_ATTR);
|
||||||
|
burst_val = __ilog2_u32(chan->src_burst_len);
|
||||||
val = (val & ~ZYNQMP_DMA_ARLEN) |
|
val = (val & ~ZYNQMP_DMA_ARLEN) |
|
||||||
(chan->src_burst_len << ZYNQMP_DMA_ARLEN_OFST);
|
((burst_val << ZYNQMP_DMA_ARLEN_OFST) & ZYNQMP_DMA_ARLEN);
|
||||||
|
burst_val = __ilog2_u32(chan->dst_burst_len);
|
||||||
val = (val & ~ZYNQMP_DMA_AWLEN) |
|
val = (val & ~ZYNQMP_DMA_AWLEN) |
|
||||||
(chan->dst_burst_len << ZYNQMP_DMA_AWLEN_OFST);
|
((burst_val << ZYNQMP_DMA_AWLEN_OFST) & ZYNQMP_DMA_AWLEN);
|
||||||
writel(val, chan->regs + ZYNQMP_DMA_DATA_ATTR);
|
writel(val, chan->regs + ZYNQMP_DMA_DATA_ATTR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -562,8 +566,10 @@ static int zynqmp_dma_device_config(struct dma_chan *dchan,
|
||||||
{
|
{
|
||||||
struct zynqmp_dma_chan *chan = to_chan(dchan);
|
struct zynqmp_dma_chan *chan = to_chan(dchan);
|
||||||
|
|
||||||
chan->src_burst_len = config->src_maxburst;
|
chan->src_burst_len = clamp(config->src_maxburst, 1U,
|
||||||
chan->dst_burst_len = config->dst_maxburst;
|
ZYNQMP_DMA_MAX_SRC_BURST_LEN);
|
||||||
|
chan->dst_burst_len = clamp(config->dst_maxburst, 1U,
|
||||||
|
ZYNQMP_DMA_MAX_DST_BURST_LEN);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -884,8 +890,8 @@ static int zynqmp_dma_chan_probe(struct zynqmp_dma_device *zdev,
|
||||||
return PTR_ERR(chan->regs);
|
return PTR_ERR(chan->regs);
|
||||||
|
|
||||||
chan->bus_width = ZYNQMP_DMA_BUS_WIDTH_64;
|
chan->bus_width = ZYNQMP_DMA_BUS_WIDTH_64;
|
||||||
chan->dst_burst_len = ZYNQMP_DMA_AWLEN_RST_VAL;
|
chan->dst_burst_len = ZYNQMP_DMA_MAX_DST_BURST_LEN;
|
||||||
chan->src_burst_len = ZYNQMP_DMA_ARLEN_RST_VAL;
|
chan->src_burst_len = ZYNQMP_DMA_MAX_SRC_BURST_LEN;
|
||||||
err = of_property_read_u32(node, "xlnx,bus-width", &chan->bus_width);
|
err = of_property_read_u32(node, "xlnx,bus-width", &chan->bus_width);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
dev_err(&pdev->dev, "missing xlnx,bus-width property\n");
|
dev_err(&pdev->dev, "missing xlnx,bus-width property\n");
|
||||||
|
|
|
@ -410,14 +410,19 @@ int sdei_event_enable(u32 event_num)
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_lock(&sdei_list_lock);
|
|
||||||
event->reenable = true;
|
|
||||||
spin_unlock(&sdei_list_lock);
|
|
||||||
|
|
||||||
|
cpus_read_lock();
|
||||||
if (event->type == SDEI_EVENT_TYPE_SHARED)
|
if (event->type == SDEI_EVENT_TYPE_SHARED)
|
||||||
err = sdei_api_event_enable(event->event_num);
|
err = sdei_api_event_enable(event->event_num);
|
||||||
else
|
else
|
||||||
err = sdei_do_cross_call(_local_event_enable, event);
|
err = sdei_do_cross_call(_local_event_enable, event);
|
||||||
|
|
||||||
|
if (!err) {
|
||||||
|
spin_lock(&sdei_list_lock);
|
||||||
|
event->reenable = true;
|
||||||
|
spin_unlock(&sdei_list_lock);
|
||||||
|
}
|
||||||
|
cpus_read_unlock();
|
||||||
mutex_unlock(&sdei_events_lock);
|
mutex_unlock(&sdei_events_lock);
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
|
@ -619,21 +624,18 @@ int sdei_event_register(u32 event_num, sdei_event_callback *cb, void *arg)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_lock(&sdei_list_lock);
|
cpus_read_lock();
|
||||||
event->reregister = true;
|
|
||||||
spin_unlock(&sdei_list_lock);
|
|
||||||
|
|
||||||
err = _sdei_event_register(event);
|
err = _sdei_event_register(event);
|
||||||
if (err) {
|
if (err) {
|
||||||
spin_lock(&sdei_list_lock);
|
|
||||||
event->reregister = false;
|
|
||||||
event->reenable = false;
|
|
||||||
spin_unlock(&sdei_list_lock);
|
|
||||||
|
|
||||||
sdei_event_destroy(event);
|
sdei_event_destroy(event);
|
||||||
pr_warn("Failed to register event %u: %d\n", event_num,
|
pr_warn("Failed to register event %u: %d\n", event_num,
|
||||||
err);
|
err);
|
||||||
|
} else {
|
||||||
|
spin_lock(&sdei_list_lock);
|
||||||
|
event->reregister = true;
|
||||||
|
spin_unlock(&sdei_list_lock);
|
||||||
}
|
}
|
||||||
|
cpus_read_unlock();
|
||||||
} while (0);
|
} while (0);
|
||||||
mutex_unlock(&sdei_events_lock);
|
mutex_unlock(&sdei_events_lock);
|
||||||
|
|
||||||
|
|
|
@ -191,30 +191,35 @@ static bool amdgpu_read_bios_from_rom(struct amdgpu_device *adev)
|
||||||
|
|
||||||
static bool amdgpu_read_platform_bios(struct amdgpu_device *adev)
|
static bool amdgpu_read_platform_bios(struct amdgpu_device *adev)
|
||||||
{
|
{
|
||||||
uint8_t __iomem *bios;
|
phys_addr_t rom = adev->pdev->rom;
|
||||||
size_t size;
|
size_t romlen = adev->pdev->romlen;
|
||||||
|
void __iomem *bios;
|
||||||
|
|
||||||
adev->bios = NULL;
|
adev->bios = NULL;
|
||||||
|
|
||||||
bios = pci_platform_rom(adev->pdev, &size);
|
if (!rom || romlen == 0)
|
||||||
if (!bios) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
adev->bios = kzalloc(size, GFP_KERNEL);
|
|
||||||
if (adev->bios == NULL)
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
memcpy_fromio(adev->bios, bios, size);
|
adev->bios = kzalloc(romlen, GFP_KERNEL);
|
||||||
|
if (!adev->bios)
|
||||||
if (!check_atom_bios(adev->bios, size)) {
|
|
||||||
kfree(adev->bios);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
adev->bios_size = size;
|
bios = ioremap(rom, romlen);
|
||||||
|
if (!bios)
|
||||||
|
goto free_bios;
|
||||||
|
|
||||||
|
memcpy_fromio(adev->bios, bios, romlen);
|
||||||
|
iounmap(bios);
|
||||||
|
|
||||||
|
if (!check_atom_bios(adev->bios, romlen))
|
||||||
|
goto free_bios;
|
||||||
|
|
||||||
|
adev->bios_size = romlen;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
free_bios:
|
||||||
|
kfree(adev->bios);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_ACPI
|
#ifdef CONFIG_ACPI
|
||||||
|
|
|
@ -742,8 +742,8 @@ static void atom_op_jump(atom_exec_context *ctx, int *ptr, int arg)
|
||||||
cjiffies = jiffies;
|
cjiffies = jiffies;
|
||||||
if (time_after(cjiffies, ctx->last_jump_jiffies)) {
|
if (time_after(cjiffies, ctx->last_jump_jiffies)) {
|
||||||
cjiffies -= ctx->last_jump_jiffies;
|
cjiffies -= ctx->last_jump_jiffies;
|
||||||
if ((jiffies_to_msecs(cjiffies) > 5000)) {
|
if ((jiffies_to_msecs(cjiffies) > 10000)) {
|
||||||
DRM_ERROR("atombios stuck in loop for more than 5secs aborting\n");
|
DRM_ERROR("atombios stuck in loop for more than 10secs aborting\n");
|
||||||
ctx->abort = true;
|
ctx->abort = true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -1101,6 +1101,8 @@ static int stop_cpsch(struct device_queue_manager *dqm)
|
||||||
unmap_queues_cpsch(dqm, KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES, 0);
|
unmap_queues_cpsch(dqm, KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES, 0);
|
||||||
dqm_unlock(dqm);
|
dqm_unlock(dqm);
|
||||||
|
|
||||||
|
pm_release_ib(&dqm->packets);
|
||||||
|
|
||||||
kfd_gtt_sa_free(dqm->dev, dqm->fence_mem);
|
kfd_gtt_sa_free(dqm->dev, dqm->fence_mem);
|
||||||
pm_uninit(&dqm->packets);
|
pm_uninit(&dqm->packets);
|
||||||
|
|
||||||
|
|
|
@ -1576,8 +1576,7 @@ static void write_i2c_retimer_setting(
|
||||||
buffer, sizeof(buffer));
|
buffer, sizeof(buffer));
|
||||||
|
|
||||||
if (!i2c_success)
|
if (!i2c_success)
|
||||||
/* Write failure */
|
goto i2c_write_fail;
|
||||||
ASSERT(i2c_success);
|
|
||||||
|
|
||||||
/* Based on DP159 specs, APPLY_RX_TX_CHANGE bit in 0x0A
|
/* Based on DP159 specs, APPLY_RX_TX_CHANGE bit in 0x0A
|
||||||
* needs to be set to 1 on every 0xA-0xC write.
|
* needs to be set to 1 on every 0xA-0xC write.
|
||||||
|
@ -1595,8 +1594,7 @@ static void write_i2c_retimer_setting(
|
||||||
pipe_ctx->stream->sink->link->ddc,
|
pipe_ctx->stream->sink->link->ddc,
|
||||||
slave_address, &offset, 1, &value, 1);
|
slave_address, &offset, 1, &value, 1);
|
||||||
if (!i2c_success)
|
if (!i2c_success)
|
||||||
/* Write failure */
|
goto i2c_write_fail;
|
||||||
ASSERT(i2c_success);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer[0] = offset;
|
buffer[0] = offset;
|
||||||
|
@ -1605,8 +1603,7 @@ static void write_i2c_retimer_setting(
|
||||||
i2c_success = i2c_write(pipe_ctx, slave_address,
|
i2c_success = i2c_write(pipe_ctx, slave_address,
|
||||||
buffer, sizeof(buffer));
|
buffer, sizeof(buffer));
|
||||||
if (!i2c_success)
|
if (!i2c_success)
|
||||||
/* Write failure */
|
goto i2c_write_fail;
|
||||||
ASSERT(i2c_success);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1623,8 +1620,7 @@ static void write_i2c_retimer_setting(
|
||||||
buffer, sizeof(buffer));
|
buffer, sizeof(buffer));
|
||||||
|
|
||||||
if (!i2c_success)
|
if (!i2c_success)
|
||||||
/* Write failure */
|
goto i2c_write_fail;
|
||||||
ASSERT(i2c_success);
|
|
||||||
|
|
||||||
/* Based on DP159 specs, APPLY_RX_TX_CHANGE bit in 0x0A
|
/* Based on DP159 specs, APPLY_RX_TX_CHANGE bit in 0x0A
|
||||||
* needs to be set to 1 on every 0xA-0xC write.
|
* needs to be set to 1 on every 0xA-0xC write.
|
||||||
|
@ -1642,8 +1638,7 @@ static void write_i2c_retimer_setting(
|
||||||
pipe_ctx->stream->sink->link->ddc,
|
pipe_ctx->stream->sink->link->ddc,
|
||||||
slave_address, &offset, 1, &value, 1);
|
slave_address, &offset, 1, &value, 1);
|
||||||
if (!i2c_success)
|
if (!i2c_success)
|
||||||
/* Write failure */
|
goto i2c_write_fail;
|
||||||
ASSERT(i2c_success);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer[0] = offset;
|
buffer[0] = offset;
|
||||||
|
@ -1652,8 +1647,7 @@ static void write_i2c_retimer_setting(
|
||||||
i2c_success = i2c_write(pipe_ctx, slave_address,
|
i2c_success = i2c_write(pipe_ctx, slave_address,
|
||||||
buffer, sizeof(buffer));
|
buffer, sizeof(buffer));
|
||||||
if (!i2c_success)
|
if (!i2c_success)
|
||||||
/* Write failure */
|
goto i2c_write_fail;
|
||||||
ASSERT(i2c_success);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1668,8 +1662,7 @@ static void write_i2c_retimer_setting(
|
||||||
i2c_success = i2c_write(pipe_ctx, slave_address,
|
i2c_success = i2c_write(pipe_ctx, slave_address,
|
||||||
buffer, sizeof(buffer));
|
buffer, sizeof(buffer));
|
||||||
if (!i2c_success)
|
if (!i2c_success)
|
||||||
/* Write failure */
|
goto i2c_write_fail;
|
||||||
ASSERT(i2c_success);
|
|
||||||
|
|
||||||
/* Write offset 0x00 to 0x23 */
|
/* Write offset 0x00 to 0x23 */
|
||||||
buffer[0] = 0x00;
|
buffer[0] = 0x00;
|
||||||
|
@ -1677,8 +1670,7 @@ static void write_i2c_retimer_setting(
|
||||||
i2c_success = i2c_write(pipe_ctx, slave_address,
|
i2c_success = i2c_write(pipe_ctx, slave_address,
|
||||||
buffer, sizeof(buffer));
|
buffer, sizeof(buffer));
|
||||||
if (!i2c_success)
|
if (!i2c_success)
|
||||||
/* Write failure */
|
goto i2c_write_fail;
|
||||||
ASSERT(i2c_success);
|
|
||||||
|
|
||||||
/* Write offset 0xff to 0x00 */
|
/* Write offset 0xff to 0x00 */
|
||||||
buffer[0] = 0xff;
|
buffer[0] = 0xff;
|
||||||
|
@ -1686,10 +1678,14 @@ static void write_i2c_retimer_setting(
|
||||||
i2c_success = i2c_write(pipe_ctx, slave_address,
|
i2c_success = i2c_write(pipe_ctx, slave_address,
|
||||||
buffer, sizeof(buffer));
|
buffer, sizeof(buffer));
|
||||||
if (!i2c_success)
|
if (!i2c_success)
|
||||||
/* Write failure */
|
goto i2c_write_fail;
|
||||||
ASSERT(i2c_success);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
|
i2c_write_fail:
|
||||||
|
DC_LOG_DEBUG("Set retimer failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void write_i2c_default_retimer_setting(
|
static void write_i2c_default_retimer_setting(
|
||||||
|
@ -1710,8 +1706,7 @@ static void write_i2c_default_retimer_setting(
|
||||||
i2c_success = i2c_write(pipe_ctx, slave_address,
|
i2c_success = i2c_write(pipe_ctx, slave_address,
|
||||||
buffer, sizeof(buffer));
|
buffer, sizeof(buffer));
|
||||||
if (!i2c_success)
|
if (!i2c_success)
|
||||||
/* Write failure */
|
goto i2c_write_fail;
|
||||||
ASSERT(i2c_success);
|
|
||||||
|
|
||||||
/* Write offset 0x0A to 0x17 */
|
/* Write offset 0x0A to 0x17 */
|
||||||
buffer[0] = 0x0A;
|
buffer[0] = 0x0A;
|
||||||
|
@ -1719,8 +1714,7 @@ static void write_i2c_default_retimer_setting(
|
||||||
i2c_success = i2c_write(pipe_ctx, slave_address,
|
i2c_success = i2c_write(pipe_ctx, slave_address,
|
||||||
buffer, sizeof(buffer));
|
buffer, sizeof(buffer));
|
||||||
if (!i2c_success)
|
if (!i2c_success)
|
||||||
/* Write failure */
|
goto i2c_write_fail;
|
||||||
ASSERT(i2c_success);
|
|
||||||
|
|
||||||
/* Write offset 0x0B to 0xDA or 0xD8 */
|
/* Write offset 0x0B to 0xDA or 0xD8 */
|
||||||
buffer[0] = 0x0B;
|
buffer[0] = 0x0B;
|
||||||
|
@ -1728,8 +1722,7 @@ static void write_i2c_default_retimer_setting(
|
||||||
i2c_success = i2c_write(pipe_ctx, slave_address,
|
i2c_success = i2c_write(pipe_ctx, slave_address,
|
||||||
buffer, sizeof(buffer));
|
buffer, sizeof(buffer));
|
||||||
if (!i2c_success)
|
if (!i2c_success)
|
||||||
/* Write failure */
|
goto i2c_write_fail;
|
||||||
ASSERT(i2c_success);
|
|
||||||
|
|
||||||
/* Write offset 0x0A to 0x17 */
|
/* Write offset 0x0A to 0x17 */
|
||||||
buffer[0] = 0x0A;
|
buffer[0] = 0x0A;
|
||||||
|
@ -1737,8 +1730,7 @@ static void write_i2c_default_retimer_setting(
|
||||||
i2c_success = i2c_write(pipe_ctx, slave_address,
|
i2c_success = i2c_write(pipe_ctx, slave_address,
|
||||||
buffer, sizeof(buffer));
|
buffer, sizeof(buffer));
|
||||||
if (!i2c_success)
|
if (!i2c_success)
|
||||||
/* Write failure */
|
goto i2c_write_fail;
|
||||||
ASSERT(i2c_success);
|
|
||||||
|
|
||||||
/* Write offset 0x0C to 0x1D or 0x91 */
|
/* Write offset 0x0C to 0x1D or 0x91 */
|
||||||
buffer[0] = 0x0C;
|
buffer[0] = 0x0C;
|
||||||
|
@ -1746,8 +1738,7 @@ static void write_i2c_default_retimer_setting(
|
||||||
i2c_success = i2c_write(pipe_ctx, slave_address,
|
i2c_success = i2c_write(pipe_ctx, slave_address,
|
||||||
buffer, sizeof(buffer));
|
buffer, sizeof(buffer));
|
||||||
if (!i2c_success)
|
if (!i2c_success)
|
||||||
/* Write failure */
|
goto i2c_write_fail;
|
||||||
ASSERT(i2c_success);
|
|
||||||
|
|
||||||
/* Write offset 0x0A to 0x17 */
|
/* Write offset 0x0A to 0x17 */
|
||||||
buffer[0] = 0x0A;
|
buffer[0] = 0x0A;
|
||||||
|
@ -1755,8 +1746,7 @@ static void write_i2c_default_retimer_setting(
|
||||||
i2c_success = i2c_write(pipe_ctx, slave_address,
|
i2c_success = i2c_write(pipe_ctx, slave_address,
|
||||||
buffer, sizeof(buffer));
|
buffer, sizeof(buffer));
|
||||||
if (!i2c_success)
|
if (!i2c_success)
|
||||||
/* Write failure */
|
goto i2c_write_fail;
|
||||||
ASSERT(i2c_success);
|
|
||||||
|
|
||||||
|
|
||||||
if (is_vga_mode) {
|
if (is_vga_mode) {
|
||||||
|
@ -1768,8 +1758,7 @@ static void write_i2c_default_retimer_setting(
|
||||||
i2c_success = i2c_write(pipe_ctx, slave_address,
|
i2c_success = i2c_write(pipe_ctx, slave_address,
|
||||||
buffer, sizeof(buffer));
|
buffer, sizeof(buffer));
|
||||||
if (!i2c_success)
|
if (!i2c_success)
|
||||||
/* Write failure */
|
goto i2c_write_fail;
|
||||||
ASSERT(i2c_success);
|
|
||||||
|
|
||||||
/* Write offset 0x00 to 0x23 */
|
/* Write offset 0x00 to 0x23 */
|
||||||
buffer[0] = 0x00;
|
buffer[0] = 0x00;
|
||||||
|
@ -1777,8 +1766,7 @@ static void write_i2c_default_retimer_setting(
|
||||||
i2c_success = i2c_write(pipe_ctx, slave_address,
|
i2c_success = i2c_write(pipe_ctx, slave_address,
|
||||||
buffer, sizeof(buffer));
|
buffer, sizeof(buffer));
|
||||||
if (!i2c_success)
|
if (!i2c_success)
|
||||||
/* Write failure */
|
goto i2c_write_fail;
|
||||||
ASSERT(i2c_success);
|
|
||||||
|
|
||||||
/* Write offset 0xff to 0x00 */
|
/* Write offset 0xff to 0x00 */
|
||||||
buffer[0] = 0xff;
|
buffer[0] = 0xff;
|
||||||
|
@ -1786,9 +1774,13 @@ static void write_i2c_default_retimer_setting(
|
||||||
i2c_success = i2c_write(pipe_ctx, slave_address,
|
i2c_success = i2c_write(pipe_ctx, slave_address,
|
||||||
buffer, sizeof(buffer));
|
buffer, sizeof(buffer));
|
||||||
if (!i2c_success)
|
if (!i2c_success)
|
||||||
/* Write failure */
|
goto i2c_write_fail;
|
||||||
ASSERT(i2c_success);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
|
i2c_write_fail:
|
||||||
|
DC_LOG_DEBUG("Set default retimer failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void write_i2c_redriver_setting(
|
static void write_i2c_redriver_setting(
|
||||||
|
@ -1811,8 +1803,7 @@ static void write_i2c_redriver_setting(
|
||||||
buffer, sizeof(buffer));
|
buffer, sizeof(buffer));
|
||||||
|
|
||||||
if (!i2c_success)
|
if (!i2c_success)
|
||||||
/* Write failure */
|
DC_LOG_DEBUG("Set redriver failed");
|
||||||
ASSERT(i2c_success);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void enable_link_hdmi(struct pipe_ctx *pipe_ctx)
|
static void enable_link_hdmi(struct pipe_ctx *pipe_ctx)
|
||||||
|
|
|
@ -127,22 +127,16 @@ struct aux_payloads {
|
||||||
struct vector payloads;
|
struct vector payloads;
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct i2c_payloads *dal_ddc_i2c_payloads_create(struct dc_context *ctx, uint32_t count)
|
static bool dal_ddc_i2c_payloads_create(
|
||||||
|
struct dc_context *ctx,
|
||||||
|
struct i2c_payloads *payloads,
|
||||||
|
uint32_t count)
|
||||||
{
|
{
|
||||||
struct i2c_payloads *payloads;
|
|
||||||
|
|
||||||
payloads = kzalloc(sizeof(struct i2c_payloads), GFP_KERNEL);
|
|
||||||
|
|
||||||
if (!payloads)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (dal_vector_construct(
|
if (dal_vector_construct(
|
||||||
&payloads->payloads, ctx, count, sizeof(struct i2c_payload)))
|
&payloads->payloads, ctx, count, sizeof(struct i2c_payload)))
|
||||||
return payloads;
|
return true;
|
||||||
|
|
||||||
kfree(payloads);
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct i2c_payload *dal_ddc_i2c_payloads_get(struct i2c_payloads *p)
|
static struct i2c_payload *dal_ddc_i2c_payloads_get(struct i2c_payloads *p)
|
||||||
|
@ -155,14 +149,12 @@ static uint32_t dal_ddc_i2c_payloads_get_count(struct i2c_payloads *p)
|
||||||
return p->payloads.count;
|
return p->payloads.count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dal_ddc_i2c_payloads_destroy(struct i2c_payloads **p)
|
static void dal_ddc_i2c_payloads_destroy(struct i2c_payloads *p)
|
||||||
{
|
{
|
||||||
if (!p || !*p)
|
if (!p)
|
||||||
return;
|
return;
|
||||||
dal_vector_destruct(&(*p)->payloads);
|
|
||||||
kfree(*p);
|
|
||||||
*p = NULL;
|
|
||||||
|
|
||||||
|
dal_vector_destruct(&p->payloads);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct aux_payloads *dal_ddc_aux_payloads_create(struct dc_context *ctx, uint32_t count)
|
static struct aux_payloads *dal_ddc_aux_payloads_create(struct dc_context *ctx, uint32_t count)
|
||||||
|
@ -580,9 +572,13 @@ bool dal_ddc_service_query_ddc_data(
|
||||||
|
|
||||||
uint32_t payloads_num = write_payloads + read_payloads;
|
uint32_t payloads_num = write_payloads + read_payloads;
|
||||||
|
|
||||||
|
|
||||||
if (write_size > EDID_SEGMENT_SIZE || read_size > EDID_SEGMENT_SIZE)
|
if (write_size > EDID_SEGMENT_SIZE || read_size > EDID_SEGMENT_SIZE)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (!payloads_num)
|
||||||
|
return false;
|
||||||
|
|
||||||
/*TODO: len of payload data for i2c and aux is uint8!!!!,
|
/*TODO: len of payload data for i2c and aux is uint8!!!!,
|
||||||
* but we want to read 256 over i2c!!!!*/
|
* but we want to read 256 over i2c!!!!*/
|
||||||
if (dal_ddc_service_is_in_aux_transaction_mode(ddc)) {
|
if (dal_ddc_service_is_in_aux_transaction_mode(ddc)) {
|
||||||
|
@ -613,23 +609,25 @@ bool dal_ddc_service_query_ddc_data(
|
||||||
dal_ddc_aux_payloads_destroy(&payloads);
|
dal_ddc_aux_payloads_destroy(&payloads);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
struct i2c_payloads *payloads =
|
struct i2c_command command = {0};
|
||||||
dal_ddc_i2c_payloads_create(ddc->ctx, payloads_num);
|
struct i2c_payloads payloads;
|
||||||
|
|
||||||
struct i2c_command command = {
|
if (!dal_ddc_i2c_payloads_create(ddc->ctx, &payloads, payloads_num))
|
||||||
.payloads = dal_ddc_i2c_payloads_get(payloads),
|
return false;
|
||||||
.number_of_payloads = 0,
|
|
||||||
.engine = DDC_I2C_COMMAND_ENGINE,
|
command.payloads = dal_ddc_i2c_payloads_get(&payloads);
|
||||||
.speed = ddc->ctx->dc->caps.i2c_speed_in_khz };
|
command.number_of_payloads = 0;
|
||||||
|
command.engine = DDC_I2C_COMMAND_ENGINE;
|
||||||
|
command.speed = ddc->ctx->dc->caps.i2c_speed_in_khz;
|
||||||
|
|
||||||
dal_ddc_i2c_payloads_add(
|
dal_ddc_i2c_payloads_add(
|
||||||
payloads, address, write_size, write_buf, true);
|
&payloads, address, write_size, write_buf, true);
|
||||||
|
|
||||||
dal_ddc_i2c_payloads_add(
|
dal_ddc_i2c_payloads_add(
|
||||||
payloads, address, read_size, read_buf, false);
|
&payloads, address, read_size, read_buf, false);
|
||||||
|
|
||||||
command.number_of_payloads =
|
command.number_of_payloads =
|
||||||
dal_ddc_i2c_payloads_get_count(payloads);
|
dal_ddc_i2c_payloads_get_count(&payloads);
|
||||||
|
|
||||||
ret = dm_helpers_submit_i2c(
|
ret = dm_helpers_submit_i2c(
|
||||||
ddc->ctx,
|
ddc->ctx,
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue