Merge 4.14.199 into android-4.14-q
Linux 4.14.199
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
drivers/usb/host/ehci-hcd.c
drivers/usb/host/ehci-hub.c
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
mm/percpu.c
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
drivers/usb/core/quirks.c
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
Drivers: hv: vmbus: Add timeout to vmbus_wait_for_unload
clk: rockchip: Fix initialization of mux_pll_src_4plls_p
* KVM: MIPS: Change the definition of kvm type
include/uapi/linux/kvm.h
* spi: Fix memory leak on splited transfers
drivers/spi/spi.c
* i2c: algo: pca: Reapply i2c bus settings after reset
include/linux/i2c-algo-pca.h
* f2fs: fix indefinite loop scanning for free nid
fs/f2fs/node.c
nvme-fc: cancel async events before freeing event struct
rapidio: Replace 'select' DMAENGINES 'with depends on'
SUNRPC: stop printk reading past end of string
spi: spi-loopback-test: Fix out-of-bounds read
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
net/core/skbuff.c
gfs2: initialize transaction tr_ailX_lists earlier
* gcov: add support for GCC 10.1
kernel/gcov/Kconfig
usb: typec: ucsi: acpi: Check the _DEP dependencies
* usb: Fix out of sync data toggle if a configured device is reconfigured
drivers/usb/core/message.c
USB: serial: option: add support for SIM7070/SIM7080/SIM7090 modules
USB: serial: option: support dynamic Quectel USB compositions
USB: serial: ftdi_sio: add IDs for Xsens Mti USB converter
* usb: core: fix slab-out-of-bounds Read in read_descriptors
drivers/usb/core/sysfs.c
staging: greybus: audio: fix uninitialized value issue
video: fbdev: fix OOB read in vga_8planes_imageblit()
ARM: dts: vfxxx: Add syscon compatible with OCOTP
KVM: VMX: Don't freeze guest when event delivery causes an APIC-access exit
* vgacon: remove software scrollback support
drivers/video/console/Kconfig
fbcon: remove now unusued 'softback_lines' cursor() argument
fbcon: remove soft scrollback code
RDMA/rxe: Fix the parent sysfs read when the interface has 15 chars
rbd: require global CAP_SYS_ADMIN for mapping and unmapping
scsi: target: iscsi: Fix hang in iscsit_access_np() when getting tpg->np_login_sem
scsi: target: iscsi: Fix data digest calculation
* regulator: push allocation in set_consumer_device_supply() out of lock
drivers/regulator/core.c
btrfs: fix wrong address when faulting in pages in the search ioctl
btrfs: fix lockdep splat in add_missing_dev
btrfs: require only sector size alignment for parent eb bytenr
staging: wlan-ng: fix out of bounds read in prism2sta_probe_usb()
iio:accel:mma8452: Fix timestamp alignment and prevent data leak.
iio:accel:mma7455: Fix timestamp alignment and prevent data leak.
iio: accel: kxsd9: Fix alignment of local buffer.
iio:chemical:ccs811: Fix timestamp alignment and prevent data leak.
iio:light:max44000 Fix timestamp alignment and prevent data leak.
iio:magnetometer:ak8975 Fix alignment and data leak issues.
iio:adc:ti-adc081c Fix alignment and data leak issues
iio:adc:max1118 Fix alignment of timestamp and data leak issues
iio:adc:ina2xx Fix timestamp alignment issue.
iio:adc:ti-adc084s021 Fix alignment and data leak issues.
iio:accel:bmc150-accel: Fix timestamp alignment and prevent data leak.
iio:light:ltr501 Fix timestamp alignment issue.
iio: adc: ti-ads1015: fix conversion when CONFIG_PM is not set
iio: adc: mcp3422: fix locking on error path
iio: adc: mcp3422: fix locking scope
* gcov: Disable gcov build with GCC 10
kernel/gcov/Kconfig
ALSA: hda: fix a runtime pm issue in SOF when integrated GPU is disabled
cpufreq: intel_pstate: Refuse to turn off with HWP enabled
ARC: [plat-hsdk]: Switch ethernet phy-mode to rgmii-id
drivers/net/wan/hdlc_cisco: Add hard_header_len
* irqchip/eznps: Fix build error for !ARC700 builds
arch/arc/plat-eznps/include/plat/ctop.h
include/soc/nps/common.h
xfs: initialize the shortform attr header padding entry
drivers/net/wan/lapbether: Set network_header before transmitting
ALSA: hda: Fix 2 channel swapping for Tegra
firestream: Fix memleak in fs_open
NFC: st95hf: Fix memleak in st95hf_in_send_cmd
drivers/net/wan/lapbether: Added needed_tailroom
dmaengine: acpi: Put the CSRT table after using it
ARC: HSDK: wireup perf irq
arm64: dts: ns2: Fixed QSPI compatible string
ARM: dts: BCM5301X: Fixed QSPI compatible string
mmc: sdhci-msm: Add retries when all tuning phases are found valid
RDMA/core: Fix reported speed and width
scsi: libsas: Set data_dir as DMA_NONE if libata marks qc as NODATA
RDMA/rxe: Drop pointless checks in rxe_init_ports
RDMA/rxe: Fix memleak in rxe_mem_init_user
ARM: dts: socfpga: fix register entry for timer3 on Arria10
* ANDROID: Fix mismerge of f2fs into android-4.14-q
fs/f2fs/super.c
Merge 4.14.198 into android-4.14-q
Linux 4.14.198
* net: disable netpoll on fresh napis
net/core/dev.c
tipc: fix shutdown() of connectionless socket
* sctp: not disable bh in the whole sctp_get_port_local()
net/sctp/socket.c
net: usb: dm9601: Add USB ID of Keenetic Plus DSL
* netlabel: fix problems with mapping removal
net/netlabel/netlabel_domainhash.c
bnxt: don't enable NAPI until rings are ready
vfio/pci: Fix SR-IOV VF handling with MMIO blocking
vfio-pci: Invalidate mmaps and block MMIO access on disabled memory
vfio-pci: Fault mmaps to enable vma tracking
vfio/type1: Support faulting PFNMAP vmas
* block: ensure bdi->io_pages is always initialized
block/blk-core.c
ALSA; firewire-tascam: exclude Tascam FE-8 from detection
Merge 4.14.197 into android-4.14-q
Linux 4.14.197
* net: usb: Fix uninit-was-stored issue in asix_read_phy_addr()
drivers/net/usb/asix_common.c
* cfg80211: regulatory: reject invalid hints
net/wireless/reg.c
mm/hugetlb: fix a race between hugetlb sysctl handlers
checkpatch: fix the usage of capture group ( ... )
* KVM: arm64: Set HCR_EL2.PTW to prevent AT taking synchronous exception
arch/arm64/include/asm/kvm_arm.h
* KVM: arm64: Survive synchronous exceptions caused by AT instructions
arch/arm64/include/asm/kvm_asm.h
KVM: arm64: Defer guest entry when an asynchronous exception is pending
* KVM: arm64: Add kvm_extable for vaxorcism code
arch/arm64/include/asm/kvm_asm.h
arch/arm64/kernel/vmlinux.lds.S
* mm: slub: fix conversion of freelist_corrupted()
mm/slub.c
dm thin metadata: Avoid returning cmd->bm wild pointer on error
dm cache metadata: Avoid returning cmd->bm wild pointer on error
* libata: implement ATA_HORKAGE_MAX_TRIM_128M and apply to Sandisks
include/linux/libata.h
* block: Move SECTOR_SIZE and SECTOR_SHIFT definitions into <linux/blkdev.h>
drivers/block/brd.c
drivers/block/zram/zram_drv.h
include/linux/blkdev.h
include/linux/device-mapper.h
include/linux/ide.h
include/uapi/linux/msdos_fs.h
* block: allow for_each_bvec to support zero len bvec
include/linux/bvec.h
affs: fix basic permission bits to actually work
ALSA: firewire-digi00x: exclude Avid Adrenaline from detection
ALSA: hda/hdmi: always check pin power status in i915 pin fixup
ALSA: pcm: oss: Remove superfluous WARN_ON() for mulaw sanity check
ALSA: ca0106: fix error code handling
usb: qmi_wwan: add D-Link DWM-222 A2 device ID
net: usb: qmi_wwan: add Telit 0x1050 composition
btrfs: fix potential deadlock in the search ioctl
* uaccess: Add non-pagefault user-space write function
include/linux/uaccess.h
mm/maccess.c
* uaccess: Add non-pagefault user-space read functions
include/linux/uaccess.h
mm/maccess.c
btrfs: set the lockdep class for log tree extent buffers
btrfs: Remove extraneous extent_buffer_get from tree_mod_log_rewind
btrfs: Remove redundant extent_buffer_get in get_old_root
btrfs: drop path before adding new uuid tree entry
* include/linux/log2.h: add missing () around n in roundup_pow_of_two()
include/linux/log2.h
thermal: ti-soc-thermal: Fix bogus thermal shutdowns for omap4430
iommu/vt-d: Serialize IOMMU GCMD register modifications
tg3: Fix soft lockup when tg3_reset_task() fails.
* fix regression in "epoll: Keep a reference on files added to the check list"
fs/eventpoll.c
net: ethernet: mlx4: Fix memory allocation in mlx4_buddy_init()
perf tools: Correct SNOOPX field offset
nvmet-fc: Fix a missed _irqsave version of spin_lock in 'nvmet_fc_fod_op_done()'
bnxt_en: Fix PCI AER error recovery flow
bnxt_en: Check for zero dir entries in NVRAM.
gtp: add GTPA_LINK info to msg sent to userspace
dmaengine: pl330: Fix burst length if burst size is smaller than bus width
net: arc_emac: Fix memleak in arc_mdio_probe
ravb: Fixed to be able to unload modules
net: systemport: Fix memleak in bcm_sysport_probe
net: hns: Fix memleak in hns_nic_dev_probe
* netfilter: nf_tables: fix destination register zeroing
include/net/netfilter/nf_tables.h
* netfilter: nf_tables: incorrect enum nft_list_attributes definition
include/uapi/linux/netfilter/nf_tables.h
netfilter: nf_tables: add NFTA_SET_USERDATA if not null
MIPS: BMIPS: Also call bmips_cpu_setup() for secondary cores
MIPS: mm: BMIPS5000 has inclusive physical caches
dmaengine: at_hdmac: check return value of of_find_device_by_node() in at_dma_xlate()
batman-adv: bla: use netif_rx_ni when not in interrupt context
batman-adv: Fix own OGM check in aggregated OGMs
batman-adv: Avoid uninitialized chaddr when handling DHCP
* dmaengine: of-dma: Fix of_dma_router_xlate's of_dma_xlate handling
drivers/dma/of-dma.c
xen/xenbus: Fix granting of vmalloc'd memory
* s390: don't trace preemption in percpu macros
arch/s390/include/asm/percpu.h
* cpuidle: Fixup IRQ state
drivers/cpuidle/cpuidle.c
ceph: don't allow setlease on cephfs
nvmet: Disable keep-alive timer when kato is cleared to 0h
hwmon: (applesmc) check status earlier.
* drm/msm: add shutdown support for display platform_driver
drivers/gpu/drm/msm/msm_drv.c
perf record/stat: Explicitly call out event modifiers in the documentation
* HID: core: Sanitize event code and type when mapping input
drivers/hid/hid-input.c
drivers/hid/hid-multitouch.c
include/linux/hid.h
* HID: core: Correctly handle ReportSize being zero
drivers/hid/hid-core.c
* ANDROID: overflow.h: fix merge issue with 4.14.196
include/linux/overflow.h
Merge 4.14.196 into android-4.14-q
Linux 4.14.196
* ALSA: usb-audio: Update documentation comment for MS2109 quirk
sound/usb/quirks-table.h
* HID: hiddev: Fix slab-out-of-bounds write in hiddev_ioctl_usage()
drivers/hid/usbhid/hiddev.c
tpm: Unify the mismatching TPM space buffer sizes
btrfs: check the right error variable in btrfs_del_dir_entries_in_log
usb: storage: Add unusual_uas entry for Sony PSZ drives
USB: cdc-acm: rework notification_buffer resizing
* USB: gadget: u_f: Unbreak offset calculation in VLAs
drivers/usb/gadget/u_f.h
* USB: gadget: f_ncm: add bounds checks to ncm_unwrap_ntb()
drivers/usb/gadget/function/f_ncm.c
* USB: gadget: u_f: add overflow checks to VLA macros
drivers/usb/gadget/u_f.h
* overflow.h: Add allocation size calculation helpers
drivers/md/dm-table.c
include/linux/overflow.h
usb: host: ohci-exynos: Fix error handling in exynos_ohci_probe()
* USB: Ignore UAS for JMicron JMS567 ATA/ATAPI Bridge
drivers/usb/storage/unusual_devs.h
* USB: quirks: Add no-lpm quirk for another Raydium touchscreen
drivers/usb/core/quirks.c
usb: uas: Add quirk for PNY Pro Elite
USB: yurex: Fix bad gfp argument
drm/amdgpu: Fix buffer overflow in INFO ioctl
* device property: Fix the secondary firmware node handling in set_primary_fwnode()
drivers/base/core.c
* PM: sleep: core: Fix the handling of pending runtime resume requests
drivers/base/power/main.c
* xhci: Do warm-reset when both CAS and XDEV_RESUME are set
drivers/usb/host/xhci-hub.c
XEN uses irqdesc::irq_data_common::handler_data to store a per interrupt XEN data pointer which contains XEN specific information.
* writeback: Fix sync livelock due to b_dirty_time processing
fs/fs-writeback.c
include/trace/events/writeback.h
* writeback: Avoid skipping inode writeback
fs/fs-writeback.c
include/linux/fs.h
* writeback: Protect inode->i_io_list with inode->i_lock
fs/fs-writeback.c
serial: 8250: change lock order in serial8250_do_startup()
serial: 8250_exar: Fix number of ports for Commtech PCIe cards
serial: pl011: Don't leak amba_ports entry on driver register error
serial: pl011: Fix oops on -EPROBE_DEFER
serial: samsung: Removes the IRQ not found warning
vt_ioctl: change VT_RESIZEX ioctl to check for error return from vc_resize()
vt: defer kfree() of vc_screenbuf in vc_do_resize()
* USB: lvtest: return proper error code in probe
drivers/usb/misc/lvstest.c
fbcon: prevent user font height or width change from causing potential out-of-bounds access
btrfs: fix space cache memory leak after transaction abort
HID: i2c-hid: Always sleep 60ms after I2C_HID_PWR_ON commands
powerpc/perf: Fix soft lockups due to missed interrupt accounting
net: gianfar: Add of_node_put() before goto statement
* scsi: ufs: Clean up completed request without interrupt notification
drivers/scsi/ufs/ufshcd.c
* scsi: ufs: Improve interrupt handling for shared interrupts
drivers/scsi/ufs/ufshcd.c
* scsi: ufs: Fix possible infinite loop in ufshcd_hold
drivers/scsi/ufs/ufshcd.c
s390/cio: add cond_resched() in the slow_eval_known_fn() loop
spi: stm32: fix stm32_spi_prepare_mbr in case of odd clk_rate
* fs: prevent BUG_ON in submit_bh_wbc()
fs/buffer.c
fs/ext4/super.c
* jbd2: abort journal if free a async write error metadata buffer
fs/jbd2/transaction.c
* ext4: don't BUG on inconsistent journal feature
fs/ext4/super.c
* jbd2: make sure jh have b_transaction set in refile/unfile_buffer
fs/jbd2/transaction.c
usb: gadget: f_tcm: Fix some resource leaks in some error paths
i2c: rcar: in slave mode, clear NACK earlier
null_blk: fix passing of REQ_FUA flag in null_handle_rq
nvme-fc: Fix wrong return value in __nvme_fc_init_request()
media: gpio-ir-tx: improve precision of transmitted signal due to scheduling
Revert "ath10k: fix DMA related firmware crashes on multiple devices"
* efi: provide empty efi_enter_virtual_mode implementation
include/linux/efi.h
USB: sisusbvga: Fix a potential UB casued by left shifting a negative value
powerpc/spufs: add CONFIG_COREDUMP dependency
KVM: arm64: Fix symbol dependency in __hyp_call_panic_nvhe
media: davinci: vpif_capture: fix potential double free
EDAC/ie31200: Fallback if host bridge device is already initialized
scsi: fcoe: Memory leak fix in fcoe_sysfs_fcf_del()
ceph: fix potential mdsc use-after-free crash
scsi: iscsi: Do not put host in iscsi_set_flashnode_param()
locking/lockdep: Fix overflow in presentation of average lock-time
drm/nouveau: Fix reference count leak in nouveau_connector_detect
drm/nouveau/drm/noveau: fix reference count leak in nouveau_fbcon_open
* f2fs: fix use-after-free issue
fs/f2fs/super.c
cec-api: prevent leaking memory through hole in structure
mips/vdso: Fix resource leaks in genvdso.c
rtlwifi: rtl8192cu: Prevent leaking urb
* PCI: Fix pci_create_slot() reference count leak
drivers/pci/slot.c
omapfb: fix multiple reference count leaks due to pm_runtime_get_sync
selftests/powerpc: Purge extra count_pmc() calls of ebb selftests
scsi: lpfc: Fix shost refcount mismatch when deleting vport
drm/amdgpu/display: fix ref count leak when pm_runtime_get_sync fails
drm/amdgpu: fix ref count leak in amdgpu_display_crtc_set_config
drm/amd/display: fix ref count leak in amdgpu_drm_ioctl
drm/amdgpu: fix ref count leak in amdgpu_driver_open_kms
drm/radeon: fix multiple reference count leak
drm/amdkfd: Fix reference count leaks.
* iommu/iova: Don't BUG on invalid PFNs
drivers/iommu/iova.c
scsi: target: tcmu: Fix crash on ARM during cmd completion
* blktrace: ensure our debugfs dir exists
kernel/trace/blktrace.c
media: pci: ttpci: av7110: fix possible buffer overflow caused by bad DMA value in debiirq()
powerpc/xive: Ignore kmemleak false positives
arm64: dts: qcom: msm8916: Pull down PDM GPIOs during sleep
mfd: intel-lpss: Add Intel Emmitsburg PCH PCI IDs
ASoC: tegra: Fix reference count leaks.
ALSA: pci: delete repeated words in comments
* gre6: Fix reception with IP6_TNL_F_RCV_DSCP_COPY
net/ipv6/ip6_tunnel.c
ipvlan: fix device features
tipc: fix uninit skb->data in tipc_nl_compat_dumpit()
* net: Fix potential wrong skb->protocol in skb_vlan_untag()
net/core/skbuff.c
powerpc/64s: Don't init FSCR_DSCR in __init_FSCR()
Change-Id: I859e5233b7b9e6b1cd64de707f4ee4a00c0860a6
Signed-off-by: lucaswei <lucaswei@google.com>
224 lines
5.5 KiB
C
224 lines
5.5 KiB
C
/* Integer base 2 logarithm calculation
|
|
*
|
|
* Copyright (C) 2006 Red Hat, Inc. All Rights Reserved.
|
|
* Written by David Howells (dhowells@redhat.com)
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version
|
|
* 2 of the License, or (at your option) any later version.
|
|
*/
|
|
|
|
#ifndef _LINUX_LOG2_H
|
|
#define _LINUX_LOG2_H
|
|
|
|
#include <linux/types.h>
|
|
#include <linux/bitops.h>
|
|
|
|
/*
|
|
* non-constant log of base 2 calculators
|
|
* - the arch may override these in asm/bitops.h if they can be implemented
|
|
* more efficiently than using fls() and fls64()
|
|
* - the arch is not required to handle n==0 if implementing the fallback
|
|
*/
|
|
#ifndef CONFIG_ARCH_HAS_ILOG2_U32
|
|
static inline __attribute__((const))
|
|
int __ilog2_u32(u32 n)
|
|
{
|
|
return fls(n) - 1;
|
|
}
|
|
#endif
|
|
|
|
#ifndef CONFIG_ARCH_HAS_ILOG2_U64
|
|
static inline __attribute__((const))
|
|
int __ilog2_u64(u64 n)
|
|
{
|
|
return fls64(n) - 1;
|
|
}
|
|
#endif
|
|
|
|
/*
|
|
* Determine whether some value is a power of two, where zero is
|
|
* *not* considered a power of two.
|
|
*/
|
|
|
|
static inline __attribute__((const))
|
|
bool is_power_of_2(unsigned long n)
|
|
{
|
|
return (n != 0 && ((n & (n - 1)) == 0));
|
|
}
|
|
|
|
/*
|
|
* round up to nearest power of two
|
|
*/
|
|
static inline __attribute__((const))
|
|
unsigned long __roundup_pow_of_two(unsigned long n)
|
|
{
|
|
return 1UL << fls_long(n - 1);
|
|
}
|
|
|
|
/*
|
|
* round down to nearest power of two
|
|
*/
|
|
static inline __attribute__((const))
|
|
unsigned long __rounddown_pow_of_two(unsigned long n)
|
|
{
|
|
return 1UL << (fls_long(n) - 1);
|
|
}
|
|
|
|
/**
|
|
* const_ilog2 - log base 2 of 32-bit or a 64-bit constant unsigned value
|
|
* @n: parameter
|
|
*
|
|
* Use this where sparse expects a true constant expression, e.g. for array
|
|
* indices.
|
|
*/
|
|
#define const_ilog2(n) \
|
|
( \
|
|
__builtin_constant_p(n) ? ( \
|
|
(n) < 2 ? 0 : \
|
|
(n) & (1ULL << 63) ? 63 : \
|
|
(n) & (1ULL << 62) ? 62 : \
|
|
(n) & (1ULL << 61) ? 61 : \
|
|
(n) & (1ULL << 60) ? 60 : \
|
|
(n) & (1ULL << 59) ? 59 : \
|
|
(n) & (1ULL << 58) ? 58 : \
|
|
(n) & (1ULL << 57) ? 57 : \
|
|
(n) & (1ULL << 56) ? 56 : \
|
|
(n) & (1ULL << 55) ? 55 : \
|
|
(n) & (1ULL << 54) ? 54 : \
|
|
(n) & (1ULL << 53) ? 53 : \
|
|
(n) & (1ULL << 52) ? 52 : \
|
|
(n) & (1ULL << 51) ? 51 : \
|
|
(n) & (1ULL << 50) ? 50 : \
|
|
(n) & (1ULL << 49) ? 49 : \
|
|
(n) & (1ULL << 48) ? 48 : \
|
|
(n) & (1ULL << 47) ? 47 : \
|
|
(n) & (1ULL << 46) ? 46 : \
|
|
(n) & (1ULL << 45) ? 45 : \
|
|
(n) & (1ULL << 44) ? 44 : \
|
|
(n) & (1ULL << 43) ? 43 : \
|
|
(n) & (1ULL << 42) ? 42 : \
|
|
(n) & (1ULL << 41) ? 41 : \
|
|
(n) & (1ULL << 40) ? 40 : \
|
|
(n) & (1ULL << 39) ? 39 : \
|
|
(n) & (1ULL << 38) ? 38 : \
|
|
(n) & (1ULL << 37) ? 37 : \
|
|
(n) & (1ULL << 36) ? 36 : \
|
|
(n) & (1ULL << 35) ? 35 : \
|
|
(n) & (1ULL << 34) ? 34 : \
|
|
(n) & (1ULL << 33) ? 33 : \
|
|
(n) & (1ULL << 32) ? 32 : \
|
|
(n) & (1ULL << 31) ? 31 : \
|
|
(n) & (1ULL << 30) ? 30 : \
|
|
(n) & (1ULL << 29) ? 29 : \
|
|
(n) & (1ULL << 28) ? 28 : \
|
|
(n) & (1ULL << 27) ? 27 : \
|
|
(n) & (1ULL << 26) ? 26 : \
|
|
(n) & (1ULL << 25) ? 25 : \
|
|
(n) & (1ULL << 24) ? 24 : \
|
|
(n) & (1ULL << 23) ? 23 : \
|
|
(n) & (1ULL << 22) ? 22 : \
|
|
(n) & (1ULL << 21) ? 21 : \
|
|
(n) & (1ULL << 20) ? 20 : \
|
|
(n) & (1ULL << 19) ? 19 : \
|
|
(n) & (1ULL << 18) ? 18 : \
|
|
(n) & (1ULL << 17) ? 17 : \
|
|
(n) & (1ULL << 16) ? 16 : \
|
|
(n) & (1ULL << 15) ? 15 : \
|
|
(n) & (1ULL << 14) ? 14 : \
|
|
(n) & (1ULL << 13) ? 13 : \
|
|
(n) & (1ULL << 12) ? 12 : \
|
|
(n) & (1ULL << 11) ? 11 : \
|
|
(n) & (1ULL << 10) ? 10 : \
|
|
(n) & (1ULL << 9) ? 9 : \
|
|
(n) & (1ULL << 8) ? 8 : \
|
|
(n) & (1ULL << 7) ? 7 : \
|
|
(n) & (1ULL << 6) ? 6 : \
|
|
(n) & (1ULL << 5) ? 5 : \
|
|
(n) & (1ULL << 4) ? 4 : \
|
|
(n) & (1ULL << 3) ? 3 : \
|
|
(n) & (1ULL << 2) ? 2 : \
|
|
1) : \
|
|
-1)
|
|
|
|
/**
|
|
* ilog2 - log base 2 of 32-bit or a 64-bit unsigned value
|
|
* @n: parameter
|
|
*
|
|
* constant-capable log of base 2 calculation
|
|
* - this can be used to initialise global variables from constant data, hence
|
|
* the massive ternary operator construction
|
|
*
|
|
* selects the appropriately-sized optimised version depending on sizeof(n)
|
|
*/
|
|
#define ilog2(n) \
|
|
( \
|
|
__builtin_constant_p(n) ? \
|
|
const_ilog2(n) : \
|
|
(sizeof(n) <= 4) ? \
|
|
__ilog2_u32(n) : \
|
|
__ilog2_u64(n) \
|
|
)
|
|
|
|
/**
|
|
* roundup_pow_of_two - round the given value up to nearest power of two
|
|
* @n - parameter
|
|
*
|
|
* round the given value up to the nearest power of two
|
|
* - the result is undefined when n == 0
|
|
* - this can be used to initialise global variables from constant data
|
|
*/
|
|
#define roundup_pow_of_two(n) \
|
|
( \
|
|
__builtin_constant_p(n) ? ( \
|
|
((n) == 1) ? 1 : \
|
|
(1UL << (ilog2((n) - 1) + 1)) \
|
|
) : \
|
|
__roundup_pow_of_two(n) \
|
|
)
|
|
|
|
/**
|
|
* rounddown_pow_of_two - round the given value down to nearest power of two
|
|
* @n - parameter
|
|
*
|
|
* round the given value down to the nearest power of two
|
|
* - the result is undefined when n == 0
|
|
* - this can be used to initialise global variables from constant data
|
|
*/
|
|
#define rounddown_pow_of_two(n) \
|
|
( \
|
|
__builtin_constant_p(n) ? ( \
|
|
(1UL << ilog2(n))) : \
|
|
__rounddown_pow_of_two(n) \
|
|
)
|
|
|
|
/**
|
|
* order_base_2 - calculate the (rounded up) base 2 order of the argument
|
|
* @n: parameter
|
|
*
|
|
* The first few values calculated by this routine:
|
|
* ob2(0) = 0
|
|
* ob2(1) = 0
|
|
* ob2(2) = 1
|
|
* ob2(3) = 2
|
|
* ob2(4) = 2
|
|
* ob2(5) = 3
|
|
* ... and so on.
|
|
*/
|
|
|
|
static inline __attribute_const__
|
|
int __order_base_2(unsigned long n)
|
|
{
|
|
return n > 1 ? ilog2(n - 1) + 1 : 0;
|
|
}
|
|
|
|
#define order_base_2(n) \
|
|
( \
|
|
__builtin_constant_p(n) ? ( \
|
|
((n) == 0 || (n) == 1) ? 0 : \
|
|
ilog2((n) - 1) + 1) : \
|
|
__order_base_2(n) \
|
|
)
|
|
#endif /* _LINUX_LOG2_H */
|