Merge drm/drm-next into drm-misc-next
Backmerging required to pull topic/phy-compliance. Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
This commit is contained in:
commit
08d99b2c23
10045 changed files with 453864 additions and 215658 deletions
|
|
@ -416,9 +416,30 @@ extern void acpi_osi_setup(char *str);
|
|||
extern bool acpi_osi_is_win8(void);
|
||||
|
||||
#ifdef CONFIG_ACPI_NUMA
|
||||
int acpi_map_pxm_to_online_node(int pxm);
|
||||
int acpi_map_pxm_to_node(int pxm);
|
||||
int acpi_get_node(acpi_handle handle);
|
||||
|
||||
/**
|
||||
* acpi_map_pxm_to_online_node - Map proximity ID to online node
|
||||
* @pxm: ACPI proximity ID
|
||||
*
|
||||
* This is similar to acpi_map_pxm_to_node(), but always returns an online
|
||||
* node. When the mapped node from a given proximity ID is offline, it
|
||||
* looks up the node distance table and returns the nearest online node.
|
||||
*
|
||||
* ACPI device drivers, which are called after the NUMA initialization has
|
||||
* completed in the kernel, can call this interface to obtain their device
|
||||
* NUMA topology from ACPI tables. Such drivers do not have to deal with
|
||||
* offline nodes. A node may be offline when a device proximity ID is
|
||||
* unique, SRAT memory entry does not exist, or NUMA is disabled, ex.
|
||||
* "numa=off" on x86.
|
||||
*/
|
||||
static inline int acpi_map_pxm_to_online_node(int pxm)
|
||||
{
|
||||
int node = acpi_map_pxm_to_node(pxm);
|
||||
|
||||
return numa_map_to_online_node(node);
|
||||
}
|
||||
#else
|
||||
static inline int acpi_map_pxm_to_online_node(int pxm)
|
||||
{
|
||||
|
|
@ -488,6 +509,11 @@ void __init acpi_nvs_nosave_s3(void);
|
|||
void __init acpi_sleep_no_blacklist(void);
|
||||
#endif /* CONFIG_PM_SLEEP */
|
||||
|
||||
int acpi_register_wakeup_handler(
|
||||
int wake_irq, bool (*wakeup)(void *context), void *context);
|
||||
void acpi_unregister_wakeup_handler(
|
||||
bool (*wakeup)(void *context), void *context);
|
||||
|
||||
struct acpi_osc_context {
|
||||
char *uuid_str; /* UUID string */
|
||||
int rev;
|
||||
|
|
@ -530,8 +556,9 @@ extern bool osc_pc_lpi_support_confirmed;
|
|||
#define OSC_PCI_CLOCK_PM_SUPPORT 0x00000004
|
||||
#define OSC_PCI_SEGMENT_GROUPS_SUPPORT 0x00000008
|
||||
#define OSC_PCI_MSI_SUPPORT 0x00000010
|
||||
#define OSC_PCI_EDR_SUPPORT 0x00000080
|
||||
#define OSC_PCI_HPX_TYPE_3_SUPPORT 0x00000100
|
||||
#define OSC_PCI_SUPPORT_MASKS 0x0000011f
|
||||
#define OSC_PCI_SUPPORT_MASKS 0x0000019f
|
||||
|
||||
/* PCI Host Bridge _OSC: Capabilities DWORD 3: Control Field */
|
||||
#define OSC_PCI_EXPRESS_NATIVE_HP_CONTROL 0x00000001
|
||||
|
|
@ -540,7 +567,8 @@ extern bool osc_pc_lpi_support_confirmed;
|
|||
#define OSC_PCI_EXPRESS_AER_CONTROL 0x00000008
|
||||
#define OSC_PCI_EXPRESS_CAPABILITY_CONTROL 0x00000010
|
||||
#define OSC_PCI_EXPRESS_LTR_CONTROL 0x00000020
|
||||
#define OSC_PCI_CONTROL_MASKS 0x0000003f
|
||||
#define OSC_PCI_EXPRESS_DPC_CONTROL 0x00000080
|
||||
#define OSC_PCI_CONTROL_MASKS 0x000000bf
|
||||
|
||||
#define ACPI_GSB_ACCESS_ATTRIB_QUICK 0x00000002
|
||||
#define ACPI_GSB_ACCESS_ATTRIB_SEND_RCV 0x00000004
|
||||
|
|
|
|||
|
|
@ -44,8 +44,7 @@ struct aer_capability_regs {
|
|||
/* PCIe port driver needs this function to enable AER */
|
||||
int pci_enable_pcie_error_reporting(struct pci_dev *dev);
|
||||
int pci_disable_pcie_error_reporting(struct pci_dev *dev);
|
||||
int pci_cleanup_aer_uncorrect_error_status(struct pci_dev *dev);
|
||||
int pci_cleanup_aer_error_status_regs(struct pci_dev *dev);
|
||||
int pci_aer_clear_nonfatal_status(struct pci_dev *dev);
|
||||
void pci_save_aer_state(struct pci_dev *dev);
|
||||
void pci_restore_aer_state(struct pci_dev *dev);
|
||||
#else
|
||||
|
|
@ -57,11 +56,7 @@ static inline int pci_disable_pcie_error_reporting(struct pci_dev *dev)
|
|||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
static inline int pci_cleanup_aer_uncorrect_error_status(struct pci_dev *dev)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
static inline int pci_cleanup_aer_error_status_regs(struct pci_dev *dev)
|
||||
static inline int pci_aer_clear_nonfatal_status(struct pci_dev *dev)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,9 +16,7 @@ bool topology_parse_cpu_capacity(struct device_node *cpu_node, int cpu);
|
|||
|
||||
DECLARE_PER_CPU(unsigned long, cpu_scale);
|
||||
|
||||
struct sched_domain;
|
||||
static inline
|
||||
unsigned long topology_get_cpu_scale(int cpu)
|
||||
static inline unsigned long topology_get_cpu_scale(int cpu)
|
||||
{
|
||||
return per_cpu(cpu_scale, cpu);
|
||||
}
|
||||
|
|
@ -27,12 +25,23 @@ void topology_set_cpu_scale(unsigned int cpu, unsigned long capacity);
|
|||
|
||||
DECLARE_PER_CPU(unsigned long, freq_scale);
|
||||
|
||||
static inline
|
||||
unsigned long topology_get_freq_scale(int cpu)
|
||||
static inline unsigned long topology_get_freq_scale(int cpu)
|
||||
{
|
||||
return per_cpu(freq_scale, cpu);
|
||||
}
|
||||
|
||||
bool arch_freq_counters_available(struct cpumask *cpus);
|
||||
|
||||
DECLARE_PER_CPU(unsigned long, thermal_pressure);
|
||||
|
||||
static inline unsigned long topology_get_thermal_pressure(int cpu)
|
||||
{
|
||||
return per_cpu(thermal_pressure, cpu);
|
||||
}
|
||||
|
||||
void arch_set_thermal_pressure(struct cpumask *cpus,
|
||||
unsigned long th_pressure);
|
||||
|
||||
struct cpu_topology {
|
||||
int thread_id;
|
||||
int core_id;
|
||||
|
|
|
|||
58
include/linux/atmel-isc-media.h
Normal file
58
include/linux/atmel-isc-media.h
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (c) 2019 Microchip Technology Inc. and its subsidiaries
|
||||
*
|
||||
* Author: Eugen Hristev <eugen.hristev@microchip.com>
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_ATMEL_ISC_MEDIA_H__
|
||||
#define __LINUX_ATMEL_ISC_MEDIA_H__
|
||||
|
||||
/*
|
||||
* There are 8 controls available:
|
||||
* 4 gain controls, sliders, for each of the BAYER components: R, B, GR, GB.
|
||||
* These gains are multipliers for each component, in format unsigned 0:4:9 with
|
||||
* a default value of 512 (1.0 multiplier).
|
||||
* 4 offset controls, sliders, for each of the BAYER components: R, B, GR, GB.
|
||||
* These offsets are added/substracted from each component, in format signed
|
||||
* 1:12:0 with a default value of 0 (+/- 0)
|
||||
*
|
||||
* To expose this to userspace, added 8 custom controls, in an auto cluster.
|
||||
*
|
||||
* To summarize the functionality:
|
||||
* The auto cluster switch is the auto white balance control, and it works
|
||||
* like this:
|
||||
* AWB == 1: autowhitebalance is on, the do_white_balance button is inactive,
|
||||
* the gains/offsets are inactive, but volatile and readable.
|
||||
* Thus, the results of the whitebalance algorithm are available to userspace to
|
||||
* read at any time.
|
||||
* AWB == 0: autowhitebalance is off, cluster is in manual mode, user can
|
||||
* configure the gain/offsets directly.
|
||||
* More than that, if the do_white_balance button is
|
||||
* pressed, the driver will perform one-time-adjustment, (preferably with color
|
||||
* checker card) and the userspace can read again the new values.
|
||||
*
|
||||
* With this feature, the userspace can save the coefficients and reinstall them
|
||||
* for example after reboot or reprobing the driver.
|
||||
*/
|
||||
|
||||
enum atmel_isc_ctrl_id {
|
||||
/* Red component gain control */
|
||||
ISC_CID_R_GAIN = (V4L2_CID_USER_ATMEL_ISC_BASE + 0),
|
||||
/* Blue component gain control */
|
||||
ISC_CID_B_GAIN,
|
||||
/* Green Red component gain control */
|
||||
ISC_CID_GR_GAIN,
|
||||
/* Green Blue gain control */
|
||||
ISC_CID_GB_GAIN,
|
||||
/* Red component offset control */
|
||||
ISC_CID_R_OFFSET,
|
||||
/* Blue component offset control */
|
||||
ISC_CID_B_OFFSET,
|
||||
/* Green Red component offset control */
|
||||
ISC_CID_GR_OFFSET,
|
||||
/* Green Blue component offset control */
|
||||
ISC_CID_GB_OFFSET,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
@ -44,7 +44,13 @@ struct linux_binprm {
|
|||
* exec has happened. Used to sanitize execution environment
|
||||
* and to set AT_SECURE auxv for glibc.
|
||||
*/
|
||||
secureexec:1;
|
||||
secureexec:1,
|
||||
/*
|
||||
* Set by flush_old_exec, when exec_mmap has been called.
|
||||
* This is past the point of no return, when the
|
||||
* exec_update_mutex has been taken.
|
||||
*/
|
||||
called_exec_mmap:1;
|
||||
#ifdef __alpha__
|
||||
unsigned int taso:1;
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -441,14 +441,6 @@ void __bio_add_page(struct bio *bio, struct page *page,
|
|||
unsigned int len, unsigned int off);
|
||||
int bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter);
|
||||
void bio_release_pages(struct bio *bio, bool mark_dirty);
|
||||
struct rq_map_data;
|
||||
extern struct bio *bio_map_user_iov(struct request_queue *,
|
||||
struct iov_iter *, gfp_t);
|
||||
extern void bio_unmap_user(struct bio *);
|
||||
extern struct bio *bio_map_kern(struct request_queue *, void *, unsigned int,
|
||||
gfp_t);
|
||||
extern struct bio *bio_copy_kern(struct request_queue *, void *, unsigned int,
|
||||
gfp_t, int);
|
||||
extern void bio_set_pages_dirty(struct bio *bio);
|
||||
extern void bio_check_pages_dirty(struct bio *bio);
|
||||
|
||||
|
|
@ -463,14 +455,9 @@ extern void bio_copy_data_iter(struct bio *dst, struct bvec_iter *dst_iter,
|
|||
extern void bio_copy_data(struct bio *dst, struct bio *src);
|
||||
extern void bio_list_copy_data(struct bio *dst, struct bio *src);
|
||||
extern void bio_free_pages(struct bio *bio);
|
||||
|
||||
extern struct bio *bio_copy_user_iov(struct request_queue *,
|
||||
struct rq_map_data *,
|
||||
struct iov_iter *,
|
||||
gfp_t);
|
||||
extern int bio_uncopy_user(struct bio *);
|
||||
void zero_fill_bio_iter(struct bio *bio, struct bvec_iter iter);
|
||||
void bio_truncate(struct bio *bio, unsigned new_size);
|
||||
void guard_bio_eod(struct bio *bio);
|
||||
|
||||
static inline void zero_fill_bio(struct bio *bio)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -55,6 +55,19 @@
|
|||
(1ULL << __bf_shf(_mask))); \
|
||||
})
|
||||
|
||||
/**
|
||||
* FIELD_MAX() - produce the maximum value representable by a field
|
||||
* @_mask: shifted mask defining the field's length and position
|
||||
*
|
||||
* FIELD_MAX() returns the maximum value that can be held in the field
|
||||
* specified by @_mask.
|
||||
*/
|
||||
#define FIELD_MAX(_mask) \
|
||||
({ \
|
||||
__BF_FIELD_CHECK(_mask, 0ULL, 0ULL, "FIELD_MAX: "); \
|
||||
(typeof(_mask))((_mask) >> __bf_shf(_mask)); \
|
||||
})
|
||||
|
||||
/**
|
||||
* FIELD_FIT() - check if value fits in the field
|
||||
* @_mask: shifted mask defining the field's length and position
|
||||
|
|
@ -110,6 +123,7 @@ static __always_inline u64 field_mask(u64 field)
|
|||
{
|
||||
return field / field_multiplier(field);
|
||||
}
|
||||
#define field_max(field) ((typeof(field))field_mask(field))
|
||||
#define ____MAKE_OP(type,base,to,from) \
|
||||
static __always_inline __##type type##_encode_bits(base v, base field) \
|
||||
{ \
|
||||
|
|
|
|||
|
|
@ -50,7 +50,13 @@
|
|||
* bitmap_set(dst, pos, nbits) Set specified bit area
|
||||
* bitmap_clear(dst, pos, nbits) Clear specified bit area
|
||||
* bitmap_find_next_zero_area(buf, len, pos, n, mask) Find bit free area
|
||||
* bitmap_find_next_zero_area_off(buf, len, pos, n, mask) as above
|
||||
* bitmap_find_next_zero_area_off(buf, len, pos, n, mask, mask_off) as above
|
||||
* bitmap_next_clear_region(map, &start, &end, nbits) Find next clear region
|
||||
* bitmap_next_set_region(map, &start, &end, nbits) Find next set region
|
||||
* bitmap_for_each_clear_region(map, rs, re, start, end)
|
||||
* Iterate over all clear regions
|
||||
* bitmap_for_each_set_region(map, rs, re, start, end)
|
||||
* Iterate over all set regions
|
||||
* bitmap_shift_right(dst, src, n, nbits) *dst = *src >> n
|
||||
* bitmap_shift_left(dst, src, n, nbits) *dst = *src << n
|
||||
* bitmap_cut(dst, src, first, n, nbits) Cut n bits from first, copy rest
|
||||
|
|
|
|||
|
|
@ -162,7 +162,7 @@ static inline __u8 ror8(__u8 word, unsigned int shift)
|
|||
*
|
||||
* This is safe to use for 16- and 8-bit types as well.
|
||||
*/
|
||||
static inline __s32 sign_extend32(__u32 value, int index)
|
||||
static __always_inline __s32 sign_extend32(__u32 value, int index)
|
||||
{
|
||||
__u8 shift = 31 - index;
|
||||
return (__s32)(value << shift) >> shift;
|
||||
|
|
@ -173,7 +173,7 @@ static inline __s32 sign_extend32(__u32 value, int index)
|
|||
* @value: value to sign extend
|
||||
* @index: 0 based bit index (0<=index<64) to sign bit
|
||||
*/
|
||||
static inline __s64 sign_extend64(__u64 value, int index)
|
||||
static __always_inline __s64 sign_extend64(__u64 value, int index)
|
||||
{
|
||||
__u8 shift = 63 - index;
|
||||
return (__s64)(value << shift) >> shift;
|
||||
|
|
|
|||
|
|
@ -3,9 +3,9 @@
|
|||
#define __LINUX_BITS_H
|
||||
|
||||
#include <linux/const.h>
|
||||
#include <vdso/bits.h>
|
||||
#include <asm/bitsperlong.h>
|
||||
|
||||
#define BIT(nr) (UL(1) << (nr))
|
||||
#define BIT_ULL(nr) (ULL(1) << (nr))
|
||||
#define BIT_MASK(nr) (UL(1) << ((nr) % BITS_PER_LONG))
|
||||
#define BIT_WORD(nr) ((nr) / BITS_PER_LONG)
|
||||
|
|
@ -18,12 +18,30 @@
|
|||
* position @h. For example
|
||||
* GENMASK_ULL(39, 21) gives us the 64bit vector 0x000000ffffe00000.
|
||||
*/
|
||||
#define GENMASK(h, l) \
|
||||
#if !defined(__ASSEMBLY__) && \
|
||||
(!defined(CONFIG_CC_IS_GCC) || CONFIG_GCC_VERSION >= 49000)
|
||||
#include <linux/build_bug.h>
|
||||
#define GENMASK_INPUT_CHECK(h, l) \
|
||||
(BUILD_BUG_ON_ZERO(__builtin_choose_expr( \
|
||||
__builtin_constant_p((l) > (h)), (l) > (h), 0)))
|
||||
#else
|
||||
/*
|
||||
* BUILD_BUG_ON_ZERO is not available in h files included from asm files,
|
||||
* disable the input check if that is the case.
|
||||
*/
|
||||
#define GENMASK_INPUT_CHECK(h, l) 0
|
||||
#endif
|
||||
|
||||
#define __GENMASK(h, l) \
|
||||
(((~UL(0)) - (UL(1) << (l)) + 1) & \
|
||||
(~UL(0) >> (BITS_PER_LONG - 1 - (h))))
|
||||
#define GENMASK(h, l) \
|
||||
(GENMASK_INPUT_CHECK(h, l) + __GENMASK(h, l))
|
||||
|
||||
#define GENMASK_ULL(h, l) \
|
||||
#define __GENMASK_ULL(h, l) \
|
||||
(((~ULL(0)) - (ULL(1) << (l)) + 1) & \
|
||||
(~ULL(0) >> (BITS_PER_LONG_LONG - 1 - (h))))
|
||||
#define GENMASK_ULL(h, l) \
|
||||
(GENMASK_INPUT_CHECK(h, l) + __GENMASK_ULL(h, l))
|
||||
|
||||
#endif /* __LINUX_BITS_H */
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@ struct blkcg_gq;
|
|||
struct blkcg {
|
||||
struct cgroup_subsys_state css;
|
||||
spinlock_t lock;
|
||||
refcount_t online_pin;
|
||||
|
||||
struct radix_tree_root blkg_tree;
|
||||
struct blkcg_gq __rcu *blkg_hint;
|
||||
|
|
@ -56,7 +57,6 @@ struct blkcg {
|
|||
struct list_head all_blkcgs_node;
|
||||
#ifdef CONFIG_CGROUP_WRITEBACK
|
||||
struct list_head cgwb_list;
|
||||
refcount_t cgwb_refcnt;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
|
@ -412,47 +412,38 @@ static inline struct blkcg *cpd_to_blkcg(struct blkcg_policy_data *cpd)
|
|||
|
||||
extern void blkcg_destroy_blkgs(struct blkcg *blkcg);
|
||||
|
||||
#ifdef CONFIG_CGROUP_WRITEBACK
|
||||
|
||||
/**
|
||||
* blkcg_cgwb_get - get a reference for blkcg->cgwb_list
|
||||
* blkcg_pin_online - pin online state
|
||||
* @blkcg: blkcg of interest
|
||||
*
|
||||
* This is used to track the number of active wb's related to a blkcg.
|
||||
* While pinned, a blkcg is kept online. This is primarily used to
|
||||
* impedance-match blkg and cgwb lifetimes so that blkg doesn't go offline
|
||||
* while an associated cgwb is still active.
|
||||
*/
|
||||
static inline void blkcg_cgwb_get(struct blkcg *blkcg)
|
||||
static inline void blkcg_pin_online(struct blkcg *blkcg)
|
||||
{
|
||||
refcount_inc(&blkcg->cgwb_refcnt);
|
||||
refcount_inc(&blkcg->online_pin);
|
||||
}
|
||||
|
||||
/**
|
||||
* blkcg_cgwb_put - put a reference for @blkcg->cgwb_list
|
||||
* blkcg_unpin_online - unpin online state
|
||||
* @blkcg: blkcg of interest
|
||||
*
|
||||
* This is used to track the number of active wb's related to a blkcg.
|
||||
* When this count goes to zero, all active wb has finished so the
|
||||
* This is primarily used to impedance-match blkg and cgwb lifetimes so
|
||||
* that blkg doesn't go offline while an associated cgwb is still active.
|
||||
* When this count goes to zero, all active cgwbs have finished so the
|
||||
* blkcg can continue destruction by calling blkcg_destroy_blkgs().
|
||||
* This work may occur in cgwb_release_workfn() on the cgwb_release
|
||||
* workqueue.
|
||||
*/
|
||||
static inline void blkcg_cgwb_put(struct blkcg *blkcg)
|
||||
static inline void blkcg_unpin_online(struct blkcg *blkcg)
|
||||
{
|
||||
if (refcount_dec_and_test(&blkcg->cgwb_refcnt))
|
||||
do {
|
||||
if (!refcount_dec_and_test(&blkcg->online_pin))
|
||||
break;
|
||||
blkcg_destroy_blkgs(blkcg);
|
||||
blkcg = blkcg_parent(blkcg);
|
||||
} while (blkcg);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static inline void blkcg_cgwb_get(struct blkcg *blkcg) { }
|
||||
|
||||
static inline void blkcg_cgwb_put(struct blkcg *blkcg)
|
||||
{
|
||||
/* wb isn't being accounted, so trigger destruction right away */
|
||||
blkcg_destroy_blkgs(blkcg);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* blkg_path - format cgroup path of blkg
|
||||
* @blkg: blkg of interest
|
||||
|
|
|
|||
|
|
@ -162,7 +162,10 @@ struct blk_mq_hw_ctx {
|
|||
struct dentry *sched_debugfs_dir;
|
||||
#endif
|
||||
|
||||
/** @hctx_list: List of all hardware queues. */
|
||||
/**
|
||||
* @hctx_list: if this hctx is not in use, this is an entry in
|
||||
* q->unused_hctx_list.
|
||||
*/
|
||||
struct list_head hctx_list;
|
||||
|
||||
/**
|
||||
|
|
@ -409,6 +412,8 @@ enum {
|
|||
<< BLK_MQ_F_ALLOC_POLICY_START_BIT)
|
||||
|
||||
struct request_queue *blk_mq_init_queue(struct blk_mq_tag_set *);
|
||||
struct request_queue *blk_mq_init_queue_data(struct blk_mq_tag_set *set,
|
||||
void *queuedata);
|
||||
struct request_queue *blk_mq_init_allocated_queue(struct blk_mq_tag_set *set,
|
||||
struct request_queue *q,
|
||||
bool elevator_init);
|
||||
|
|
|
|||
|
|
@ -952,6 +952,10 @@ static inline unsigned int blk_rq_stats_sectors(const struct request *rq)
|
|||
}
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_ZONED
|
||||
|
||||
/* Helper to convert BLK_ZONE_ZONE_XXX to its string format XXX */
|
||||
const char *blk_zone_cond_str(enum blk_zone_cond zone_cond);
|
||||
|
||||
static inline unsigned int blk_rq_zone_no(struct request *rq)
|
||||
{
|
||||
return blk_queue_zone_no(rq->q, blk_rq_pos(rq));
|
||||
|
|
@ -1063,7 +1067,6 @@ extern void blk_abort_request(struct request *);
|
|||
* Access functions for manipulating queue properties
|
||||
*/
|
||||
extern void blk_cleanup_queue(struct request_queue *);
|
||||
extern void blk_queue_make_request(struct request_queue *, make_request_fn *);
|
||||
extern void blk_queue_bounce_limit(struct request_queue *, u64);
|
||||
extern void blk_queue_max_hw_sectors(struct request_queue *, unsigned int);
|
||||
extern void blk_queue_chunk_sectors(struct request_queue *, unsigned int);
|
||||
|
|
@ -1140,8 +1143,7 @@ extern void blk_dump_rq_flags(struct request *, char *);
|
|||
extern long nr_blockdev_pages(void);
|
||||
|
||||
bool __must_check blk_get_queue(struct request_queue *);
|
||||
struct request_queue *blk_alloc_queue(gfp_t);
|
||||
struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id);
|
||||
struct request_queue *blk_alloc_queue(make_request_fn make_request, int node_id);
|
||||
extern void blk_put_queue(struct request_queue *);
|
||||
extern void blk_set_queue_dying(struct request_queue *);
|
||||
|
||||
|
|
@ -1484,15 +1486,6 @@ static inline unsigned int block_size(struct block_device *bdev)
|
|||
return bdev->bd_block_size;
|
||||
}
|
||||
|
||||
typedef struct {struct page *v;} Sector;
|
||||
|
||||
unsigned char *read_dev_sector(struct block_device *, sector_t, Sector *);
|
||||
|
||||
static inline void put_dev_sector(Sector p)
|
||||
{
|
||||
put_page(p.v);
|
||||
}
|
||||
|
||||
int kblockd_schedule_work(struct work_struct *work);
|
||||
int kblockd_mod_delayed_work_on(int cpu, struct delayed_work *dwork, unsigned long delay);
|
||||
|
||||
|
|
@ -1706,6 +1699,7 @@ struct block_device_operations {
|
|||
void (*swap_slot_free_notify) (struct block_device *, unsigned long);
|
||||
int (*report_zones)(struct gendisk *, sector_t sector,
|
||||
unsigned int nr_zones, report_zones_cb cb, void *data);
|
||||
char *(*devnode)(struct gendisk *disk, umode_t *mode);
|
||||
struct module *owner;
|
||||
const struct pr_ops *pr_ops;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -216,7 +216,8 @@ static inline int __init xbc_node_compose_key(struct xbc_node *node,
|
|||
}
|
||||
|
||||
/* XBC node initializer */
|
||||
int __init xbc_init(char *buf);
|
||||
int __init xbc_init(char *buf, const char **emsg, int *epos);
|
||||
|
||||
|
||||
/* XBC cleanup data structures */
|
||||
void __init xbc_destroy_all(void);
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ struct bpf_cgroup_storage_map;
|
|||
|
||||
struct bpf_storage_buffer {
|
||||
struct rcu_head rcu;
|
||||
char data[0];
|
||||
char data[];
|
||||
};
|
||||
|
||||
struct bpf_cgroup_storage {
|
||||
|
|
@ -51,9 +51,18 @@ struct bpf_cgroup_storage {
|
|||
struct rcu_head rcu;
|
||||
};
|
||||
|
||||
struct bpf_cgroup_link {
|
||||
struct bpf_link link;
|
||||
struct cgroup *cgroup;
|
||||
enum bpf_attach_type type;
|
||||
};
|
||||
|
||||
extern const struct bpf_link_ops bpf_cgroup_link_lops;
|
||||
|
||||
struct bpf_prog_list {
|
||||
struct list_head node;
|
||||
struct bpf_prog *prog;
|
||||
struct bpf_cgroup_link *link;
|
||||
struct bpf_cgroup_storage *storage[MAX_BPF_CGROUP_STORAGE_TYPE];
|
||||
};
|
||||
|
||||
|
|
@ -84,20 +93,27 @@ struct cgroup_bpf {
|
|||
int cgroup_bpf_inherit(struct cgroup *cgrp);
|
||||
void cgroup_bpf_offline(struct cgroup *cgrp);
|
||||
|
||||
int __cgroup_bpf_attach(struct cgroup *cgrp, struct bpf_prog *prog,
|
||||
struct bpf_prog *replace_prog,
|
||||
int __cgroup_bpf_attach(struct cgroup *cgrp,
|
||||
struct bpf_prog *prog, struct bpf_prog *replace_prog,
|
||||
struct bpf_cgroup_link *link,
|
||||
enum bpf_attach_type type, u32 flags);
|
||||
int __cgroup_bpf_detach(struct cgroup *cgrp, struct bpf_prog *prog,
|
||||
struct bpf_cgroup_link *link,
|
||||
enum bpf_attach_type type);
|
||||
int __cgroup_bpf_replace(struct cgroup *cgrp, struct bpf_cgroup_link *link,
|
||||
struct bpf_prog *new_prog);
|
||||
int __cgroup_bpf_query(struct cgroup *cgrp, const union bpf_attr *attr,
|
||||
union bpf_attr __user *uattr);
|
||||
|
||||
/* Wrapper for __cgroup_bpf_*() protected by cgroup_mutex */
|
||||
int cgroup_bpf_attach(struct cgroup *cgrp, struct bpf_prog *prog,
|
||||
struct bpf_prog *replace_prog, enum bpf_attach_type type,
|
||||
int cgroup_bpf_attach(struct cgroup *cgrp,
|
||||
struct bpf_prog *prog, struct bpf_prog *replace_prog,
|
||||
struct bpf_cgroup_link *link, enum bpf_attach_type type,
|
||||
u32 flags);
|
||||
int cgroup_bpf_detach(struct cgroup *cgrp, struct bpf_prog *prog,
|
||||
enum bpf_attach_type type, u32 flags);
|
||||
enum bpf_attach_type type);
|
||||
int cgroup_bpf_replace(struct bpf_link *link, struct bpf_prog *old_prog,
|
||||
struct bpf_prog *new_prog);
|
||||
int cgroup_bpf_query(struct cgroup *cgrp, const union bpf_attr *attr,
|
||||
union bpf_attr __user *uattr);
|
||||
|
||||
|
|
@ -332,11 +348,13 @@ int cgroup_bpf_prog_attach(const union bpf_attr *attr,
|
|||
enum bpf_prog_type ptype, struct bpf_prog *prog);
|
||||
int cgroup_bpf_prog_detach(const union bpf_attr *attr,
|
||||
enum bpf_prog_type ptype);
|
||||
int cgroup_bpf_link_attach(const union bpf_attr *attr, struct bpf_prog *prog);
|
||||
int cgroup_bpf_prog_query(const union bpf_attr *attr,
|
||||
union bpf_attr __user *uattr);
|
||||
#else
|
||||
|
||||
struct bpf_prog;
|
||||
struct bpf_link;
|
||||
struct cgroup_bpf {};
|
||||
static inline int cgroup_bpf_inherit(struct cgroup *cgrp) { return 0; }
|
||||
static inline void cgroup_bpf_offline(struct cgroup *cgrp) {}
|
||||
|
|
@ -354,6 +372,19 @@ static inline int cgroup_bpf_prog_detach(const union bpf_attr *attr,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int cgroup_bpf_link_attach(const union bpf_attr *attr,
|
||||
struct bpf_prog *prog)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int cgroup_bpf_replace(struct bpf_link *link,
|
||||
struct bpf_prog *old_prog,
|
||||
struct bpf_prog *new_prog)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int cgroup_bpf_prog_query(const union bpf_attr *attr,
|
||||
union bpf_attr __user *uattr)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@
|
|||
#include <linux/refcount.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kallsyms.h>
|
||||
|
||||
struct bpf_verifier_env;
|
||||
struct bpf_verifier_log;
|
||||
|
|
@ -160,6 +161,7 @@ static inline void copy_map_value(struct bpf_map *map, void *dst, void *src)
|
|||
}
|
||||
void copy_map_value_locked(struct bpf_map *map, void *dst, void *src,
|
||||
bool lock_src);
|
||||
int bpf_obj_name_cpy(char *dst, const char *src, unsigned int size);
|
||||
|
||||
struct bpf_offload_dev;
|
||||
struct bpf_offloaded_map;
|
||||
|
|
@ -232,6 +234,7 @@ enum bpf_arg_type {
|
|||
ARG_CONST_SIZE_OR_ZERO, /* number of bytes accessed from memory or 0 */
|
||||
|
||||
ARG_PTR_TO_CTX, /* pointer to context */
|
||||
ARG_PTR_TO_CTX_OR_NULL, /* pointer to context or NULL */
|
||||
ARG_ANYTHING, /* any (initialized) argument is ok */
|
||||
ARG_PTR_TO_SPIN_LOCK, /* pointer to bpf_spin_lock */
|
||||
ARG_PTR_TO_SOCK_COMMON, /* pointer to sock_common */
|
||||
|
|
@ -433,6 +436,16 @@ struct btf_func_model {
|
|||
*/
|
||||
#define BPF_TRAMP_F_SKIP_FRAME BIT(2)
|
||||
|
||||
/* Each call __bpf_prog_enter + call bpf_func + call __bpf_prog_exit is ~50
|
||||
* bytes on x86. Pick a number to fit into BPF_IMAGE_SIZE / 2
|
||||
*/
|
||||
#define BPF_MAX_TRAMP_PROGS 40
|
||||
|
||||
struct bpf_tramp_progs {
|
||||
struct bpf_prog *progs[BPF_MAX_TRAMP_PROGS];
|
||||
int nr_progs;
|
||||
};
|
||||
|
||||
/* Different use cases for BPF trampoline:
|
||||
* 1. replace nop at the function entry (kprobe equivalent)
|
||||
* flags = BPF_TRAMP_F_RESTORE_REGS
|
||||
|
|
@ -455,16 +468,25 @@ struct btf_func_model {
|
|||
*/
|
||||
int arch_prepare_bpf_trampoline(void *image, void *image_end,
|
||||
const struct btf_func_model *m, u32 flags,
|
||||
struct bpf_prog **fentry_progs, int fentry_cnt,
|
||||
struct bpf_prog **fexit_progs, int fexit_cnt,
|
||||
struct bpf_tramp_progs *tprogs,
|
||||
void *orig_call);
|
||||
/* these two functions are called from generated trampoline */
|
||||
u64 notrace __bpf_prog_enter(void);
|
||||
void notrace __bpf_prog_exit(struct bpf_prog *prog, u64 start);
|
||||
|
||||
struct bpf_ksym {
|
||||
unsigned long start;
|
||||
unsigned long end;
|
||||
char name[KSYM_NAME_LEN];
|
||||
struct list_head lnode;
|
||||
struct latch_tree_node tnode;
|
||||
bool prog;
|
||||
};
|
||||
|
||||
enum bpf_tramp_prog_type {
|
||||
BPF_TRAMP_FENTRY,
|
||||
BPF_TRAMP_FEXIT,
|
||||
BPF_TRAMP_MODIFY_RETURN,
|
||||
BPF_TRAMP_MAX,
|
||||
BPF_TRAMP_REPLACE, /* more than MAX */
|
||||
};
|
||||
|
|
@ -493,6 +515,7 @@ struct bpf_trampoline {
|
|||
/* Executable image of trampoline */
|
||||
void *image;
|
||||
u64 selector;
|
||||
struct bpf_ksym ksym;
|
||||
};
|
||||
|
||||
#define BPF_DISPATCHER_MAX 48 /* Fits in 2048B */
|
||||
|
|
@ -510,9 +533,10 @@ struct bpf_dispatcher {
|
|||
int num_progs;
|
||||
void *image;
|
||||
u32 image_off;
|
||||
struct bpf_ksym ksym;
|
||||
};
|
||||
|
||||
static __always_inline unsigned int bpf_dispatcher_nopfunc(
|
||||
static __always_inline unsigned int bpf_dispatcher_nop_func(
|
||||
const void *ctx,
|
||||
const struct bpf_insn *insnsi,
|
||||
unsigned int (*bpf_func)(const void *,
|
||||
|
|
@ -525,17 +549,21 @@ struct bpf_trampoline *bpf_trampoline_lookup(u64 key);
|
|||
int bpf_trampoline_link_prog(struct bpf_prog *prog);
|
||||
int bpf_trampoline_unlink_prog(struct bpf_prog *prog);
|
||||
void bpf_trampoline_put(struct bpf_trampoline *tr);
|
||||
#define BPF_DISPATCHER_INIT(name) { \
|
||||
.mutex = __MUTEX_INITIALIZER(name.mutex), \
|
||||
.func = &name##func, \
|
||||
.progs = {}, \
|
||||
.num_progs = 0, \
|
||||
.image = NULL, \
|
||||
.image_off = 0 \
|
||||
#define BPF_DISPATCHER_INIT(_name) { \
|
||||
.mutex = __MUTEX_INITIALIZER(_name.mutex), \
|
||||
.func = &_name##_func, \
|
||||
.progs = {}, \
|
||||
.num_progs = 0, \
|
||||
.image = NULL, \
|
||||
.image_off = 0, \
|
||||
.ksym = { \
|
||||
.name = #_name, \
|
||||
.lnode = LIST_HEAD_INIT(_name.ksym.lnode), \
|
||||
}, \
|
||||
}
|
||||
|
||||
#define DEFINE_BPF_DISPATCHER(name) \
|
||||
noinline unsigned int name##func( \
|
||||
noinline unsigned int bpf_dispatcher_##name##_func( \
|
||||
const void *ctx, \
|
||||
const struct bpf_insn *insnsi, \
|
||||
unsigned int (*bpf_func)(const void *, \
|
||||
|
|
@ -543,26 +571,26 @@ void bpf_trampoline_put(struct bpf_trampoline *tr);
|
|||
{ \
|
||||
return bpf_func(ctx, insnsi); \
|
||||
} \
|
||||
EXPORT_SYMBOL(name##func); \
|
||||
struct bpf_dispatcher name = BPF_DISPATCHER_INIT(name);
|
||||
EXPORT_SYMBOL(bpf_dispatcher_##name##_func); \
|
||||
struct bpf_dispatcher bpf_dispatcher_##name = \
|
||||
BPF_DISPATCHER_INIT(bpf_dispatcher_##name);
|
||||
#define DECLARE_BPF_DISPATCHER(name) \
|
||||
unsigned int name##func( \
|
||||
unsigned int bpf_dispatcher_##name##_func( \
|
||||
const void *ctx, \
|
||||
const struct bpf_insn *insnsi, \
|
||||
unsigned int (*bpf_func)(const void *, \
|
||||
const struct bpf_insn *)); \
|
||||
extern struct bpf_dispatcher name;
|
||||
#define BPF_DISPATCHER_FUNC(name) name##func
|
||||
#define BPF_DISPATCHER_PTR(name) (&name)
|
||||
extern struct bpf_dispatcher bpf_dispatcher_##name;
|
||||
#define BPF_DISPATCHER_FUNC(name) bpf_dispatcher_##name##_func
|
||||
#define BPF_DISPATCHER_PTR(name) (&bpf_dispatcher_##name)
|
||||
void bpf_dispatcher_change_prog(struct bpf_dispatcher *d, struct bpf_prog *from,
|
||||
struct bpf_prog *to);
|
||||
struct bpf_image {
|
||||
struct latch_tree_node tnode;
|
||||
unsigned char data[];
|
||||
};
|
||||
#define BPF_IMAGE_SIZE (PAGE_SIZE - sizeof(struct bpf_image))
|
||||
bool is_bpf_image_address(unsigned long address);
|
||||
void *bpf_image_alloc(void);
|
||||
/* Called only from JIT-enabled code, so there's no need for stubs. */
|
||||
void *bpf_jit_alloc_exec_page(void);
|
||||
void bpf_image_ksym_add(void *data, struct bpf_ksym *ksym);
|
||||
void bpf_image_ksym_del(struct bpf_ksym *ksym);
|
||||
void bpf_ksym_add(struct bpf_ksym *ksym);
|
||||
void bpf_ksym_del(struct bpf_ksym *ksym);
|
||||
#else
|
||||
static inline struct bpf_trampoline *bpf_trampoline_lookup(u64 key)
|
||||
{
|
||||
|
|
@ -579,7 +607,7 @@ static inline int bpf_trampoline_unlink_prog(struct bpf_prog *prog)
|
|||
static inline void bpf_trampoline_put(struct bpf_trampoline *tr) {}
|
||||
#define DEFINE_BPF_DISPATCHER(name)
|
||||
#define DECLARE_BPF_DISPATCHER(name)
|
||||
#define BPF_DISPATCHER_FUNC(name) bpf_dispatcher_nopfunc
|
||||
#define BPF_DISPATCHER_FUNC(name) bpf_dispatcher_nop_func
|
||||
#define BPF_DISPATCHER_PTR(name) NULL
|
||||
static inline void bpf_dispatcher_change_prog(struct bpf_dispatcher *d,
|
||||
struct bpf_prog *from,
|
||||
|
|
@ -640,8 +668,7 @@ struct bpf_prog_aux {
|
|||
void *jit_data; /* JIT specific data. arch dependent */
|
||||
struct bpf_jit_poke_descriptor *poke_tab;
|
||||
u32 size_poke_tab;
|
||||
struct latch_tree_node ksym_tnode;
|
||||
struct list_head ksym_lnode;
|
||||
struct bpf_ksym ksym;
|
||||
const struct bpf_prog_ops *ops;
|
||||
struct bpf_map **used_maps;
|
||||
struct bpf_prog *prog;
|
||||
|
|
@ -859,7 +886,7 @@ struct bpf_prog_array_item {
|
|||
|
||||
struct bpf_prog_array {
|
||||
struct rcu_head rcu;
|
||||
struct bpf_prog_array_item items[0];
|
||||
struct bpf_prog_array_item items[];
|
||||
};
|
||||
|
||||
struct bpf_prog_array *bpf_prog_array_alloc(u32 prog_cnt, gfp_t flags);
|
||||
|
|
@ -885,7 +912,7 @@ int bpf_prog_array_copy(struct bpf_prog_array *old_array,
|
|||
struct bpf_prog *_prog; \
|
||||
struct bpf_prog_array *_array; \
|
||||
u32 _ret = 1; \
|
||||
preempt_disable(); \
|
||||
migrate_disable(); \
|
||||
rcu_read_lock(); \
|
||||
_array = rcu_dereference(array); \
|
||||
if (unlikely(check_non_null && !_array))\
|
||||
|
|
@ -898,7 +925,7 @@ int bpf_prog_array_copy(struct bpf_prog_array *old_array,
|
|||
} \
|
||||
_out: \
|
||||
rcu_read_unlock(); \
|
||||
preempt_enable(); \
|
||||
migrate_enable(); \
|
||||
_ret; \
|
||||
})
|
||||
|
||||
|
|
@ -932,7 +959,7 @@ _out: \
|
|||
u32 ret; \
|
||||
u32 _ret = 1; \
|
||||
u32 _cn = 0; \
|
||||
preempt_disable(); \
|
||||
migrate_disable(); \
|
||||
rcu_read_lock(); \
|
||||
_array = rcu_dereference(array); \
|
||||
_item = &_array->items[0]; \
|
||||
|
|
@ -944,7 +971,7 @@ _out: \
|
|||
_item++; \
|
||||
} \
|
||||
rcu_read_unlock(); \
|
||||
preempt_enable(); \
|
||||
migrate_enable(); \
|
||||
if (_ret) \
|
||||
_ret = (_cn ? NET_XMIT_CN : NET_XMIT_SUCCESS); \
|
||||
else \
|
||||
|
|
@ -961,6 +988,36 @@ _out: \
|
|||
#ifdef CONFIG_BPF_SYSCALL
|
||||
DECLARE_PER_CPU(int, bpf_prog_active);
|
||||
|
||||
/*
|
||||
* Block execution of BPF programs attached to instrumentation (perf,
|
||||
* kprobes, tracepoints) to prevent deadlocks on map operations as any of
|
||||
* these events can happen inside a region which holds a map bucket lock
|
||||
* and can deadlock on it.
|
||||
*
|
||||
* Use the preemption safe inc/dec variants on RT because migrate disable
|
||||
* is preemptible on RT and preemption in the middle of the RMW operation
|
||||
* might lead to inconsistent state. Use the raw variants for non RT
|
||||
* kernels as migrate_disable() maps to preempt_disable() so the slightly
|
||||
* more expensive save operation can be avoided.
|
||||
*/
|
||||
static inline void bpf_disable_instrumentation(void)
|
||||
{
|
||||
migrate_disable();
|
||||
if (IS_ENABLED(CONFIG_PREEMPT_RT))
|
||||
this_cpu_inc(bpf_prog_active);
|
||||
else
|
||||
__this_cpu_inc(bpf_prog_active);
|
||||
}
|
||||
|
||||
static inline void bpf_enable_instrumentation(void)
|
||||
{
|
||||
if (IS_ENABLED(CONFIG_PREEMPT_RT))
|
||||
this_cpu_dec(bpf_prog_active);
|
||||
else
|
||||
__this_cpu_dec(bpf_prog_active);
|
||||
migrate_enable();
|
||||
}
|
||||
|
||||
extern const struct file_operations bpf_map_fops;
|
||||
extern const struct file_operations bpf_prog_fops;
|
||||
|
||||
|
|
@ -993,6 +1050,7 @@ void __bpf_free_used_maps(struct bpf_prog_aux *aux,
|
|||
void bpf_prog_free_id(struct bpf_prog *prog, bool do_idr_lock);
|
||||
void bpf_map_free_id(struct bpf_map *map, bool do_idr_lock);
|
||||
|
||||
struct bpf_map *bpf_map_get(u32 ufd);
|
||||
struct bpf_map *bpf_map_get_with_uref(u32 ufd);
|
||||
struct bpf_map *__bpf_map_get(struct fd f);
|
||||
void bpf_map_inc(struct bpf_map *map);
|
||||
|
|
@ -1025,6 +1083,29 @@ extern int sysctl_unprivileged_bpf_disabled;
|
|||
int bpf_map_new_fd(struct bpf_map *map, int flags);
|
||||
int bpf_prog_new_fd(struct bpf_prog *prog);
|
||||
|
||||
struct bpf_link {
|
||||
atomic64_t refcnt;
|
||||
const struct bpf_link_ops *ops;
|
||||
struct bpf_prog *prog;
|
||||
struct work_struct work;
|
||||
};
|
||||
|
||||
struct bpf_link_ops {
|
||||
void (*release)(struct bpf_link *link);
|
||||
void (*dealloc)(struct bpf_link *link);
|
||||
|
||||
};
|
||||
|
||||
void bpf_link_init(struct bpf_link *link, const struct bpf_link_ops *ops,
|
||||
struct bpf_prog *prog);
|
||||
void bpf_link_cleanup(struct bpf_link *link, struct file *link_file,
|
||||
int link_fd);
|
||||
void bpf_link_inc(struct bpf_link *link);
|
||||
void bpf_link_put(struct bpf_link *link);
|
||||
int bpf_link_new_fd(struct bpf_link *link);
|
||||
struct file *bpf_link_new_file(struct bpf_link *link, int *reserved_fd);
|
||||
struct bpf_link *bpf_link_get_from_fd(u32 ufd);
|
||||
|
||||
int bpf_obj_pin_user(u32 ufd, const char __user *pathname);
|
||||
int bpf_obj_get_user(const char __user *pathname, int flags);
|
||||
|
||||
|
|
@ -1102,6 +1183,9 @@ int bpf_prog_test_run_xdp(struct bpf_prog *prog, const union bpf_attr *kattr,
|
|||
union bpf_attr __user *uattr);
|
||||
int bpf_prog_test_run_skb(struct bpf_prog *prog, const union bpf_attr *kattr,
|
||||
union bpf_attr __user *uattr);
|
||||
int bpf_prog_test_run_tracing(struct bpf_prog *prog,
|
||||
const union bpf_attr *kattr,
|
||||
union bpf_attr __user *uattr);
|
||||
int bpf_prog_test_run_flow_dissector(struct bpf_prog *prog,
|
||||
const union bpf_attr *kattr,
|
||||
union bpf_attr __user *uattr);
|
||||
|
|
@ -1259,6 +1343,13 @@ static inline int bpf_prog_test_run_skb(struct bpf_prog *prog,
|
|||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
static inline int bpf_prog_test_run_tracing(struct bpf_prog *prog,
|
||||
const union bpf_attr *kattr,
|
||||
union bpf_attr __user *uattr)
|
||||
{
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
static inline int bpf_prog_test_run_flow_dissector(struct bpf_prog *prog,
|
||||
const union bpf_attr *kattr,
|
||||
union bpf_attr __user *uattr)
|
||||
|
|
@ -1355,6 +1446,8 @@ static inline void bpf_map_offload_map_free(struct bpf_map *map)
|
|||
#if defined(CONFIG_BPF_STREAM_PARSER)
|
||||
int sock_map_prog_update(struct bpf_map *map, struct bpf_prog *prog, u32 which);
|
||||
int sock_map_get_from_fd(const union bpf_attr *attr, struct bpf_prog *prog);
|
||||
void sock_map_unhash(struct sock *sk);
|
||||
void sock_map_close(struct sock *sk, long timeout);
|
||||
#else
|
||||
static inline int sock_map_prog_update(struct bpf_map *map,
|
||||
struct bpf_prog *prog, u32 which)
|
||||
|
|
@ -1367,7 +1460,7 @@ static inline int sock_map_get_from_fd(const union bpf_attr *attr,
|
|||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
#endif
|
||||
#endif /* CONFIG_BPF_STREAM_PARSER */
|
||||
|
||||
#if defined(CONFIG_INET) && defined(CONFIG_BPF_SYSCALL)
|
||||
void bpf_sk_reuseport_detach(struct sock *sk);
|
||||
|
|
@ -1417,6 +1510,7 @@ extern const struct bpf_func_proto bpf_get_stack_proto;
|
|||
extern const struct bpf_func_proto bpf_sock_map_update_proto;
|
||||
extern const struct bpf_func_proto bpf_sock_hash_update_proto;
|
||||
extern const struct bpf_func_proto bpf_get_current_cgroup_id_proto;
|
||||
extern const struct bpf_func_proto bpf_get_current_ancestor_cgroup_id_proto;
|
||||
extern const struct bpf_func_proto bpf_msg_redirect_hash_proto;
|
||||
extern const struct bpf_func_proto bpf_msg_redirect_map_proto;
|
||||
extern const struct bpf_func_proto bpf_sk_redirect_hash_proto;
|
||||
|
|
@ -1428,6 +1522,10 @@ extern const struct bpf_func_proto bpf_strtol_proto;
|
|||
extern const struct bpf_func_proto bpf_strtoul_proto;
|
||||
extern const struct bpf_func_proto bpf_tcp_sock_proto;
|
||||
extern const struct bpf_func_proto bpf_jiffies64_proto;
|
||||
extern const struct bpf_func_proto bpf_get_ns_current_pid_tgid_proto;
|
||||
|
||||
const struct bpf_func_proto *bpf_tracing_func_proto(
|
||||
enum bpf_func_id func_id, const struct bpf_prog *prog);
|
||||
|
||||
/* Shared helpers among cBPF and eBPF. */
|
||||
void bpf_user_rnd_init_once(void);
|
||||
|
|
|
|||
33
include/linux/bpf_lsm.h
Normal file
33
include/linux/bpf_lsm.h
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2020 Google LLC.
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_BPF_LSM_H
|
||||
#define _LINUX_BPF_LSM_H
|
||||
|
||||
#include <linux/bpf.h>
|
||||
#include <linux/lsm_hooks.h>
|
||||
|
||||
#ifdef CONFIG_BPF_LSM
|
||||
|
||||
#define LSM_HOOK(RET, DEFAULT, NAME, ...) \
|
||||
RET bpf_lsm_##NAME(__VA_ARGS__);
|
||||
#include <linux/lsm_hook_defs.h>
|
||||
#undef LSM_HOOK
|
||||
|
||||
int bpf_lsm_verify_prog(struct bpf_verifier_log *vlog,
|
||||
const struct bpf_prog *prog);
|
||||
|
||||
#else /* !CONFIG_BPF_LSM */
|
||||
|
||||
static inline int bpf_lsm_verify_prog(struct bpf_verifier_log *vlog,
|
||||
const struct bpf_prog *prog)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_BPF_LSM */
|
||||
|
||||
#endif /* _LINUX_BPF_LSM_H */
|
||||
|
|
@ -70,6 +70,10 @@ BPF_PROG_TYPE(BPF_PROG_TYPE_STRUCT_OPS, bpf_struct_ops,
|
|||
void *, void *)
|
||||
BPF_PROG_TYPE(BPF_PROG_TYPE_EXT, bpf_extension,
|
||||
void *, void *)
|
||||
#ifdef CONFIG_BPF_LSM
|
||||
BPF_PROG_TYPE(BPF_PROG_TYPE_LSM, lsm,
|
||||
void *, void *)
|
||||
#endif /* CONFIG_BPF_LSM */
|
||||
#endif
|
||||
|
||||
BPF_MAP_TYPE(BPF_MAP_TYPE_ARRAY, array_map_ops)
|
||||
|
|
|
|||
|
|
@ -123,6 +123,10 @@ struct bpf_reg_state {
|
|||
s64 smax_value; /* maximum possible (s64)value */
|
||||
u64 umin_value; /* minimum possible (u64)value */
|
||||
u64 umax_value; /* maximum possible (u64)value */
|
||||
s32 s32_min_value; /* minimum possible (s32)value */
|
||||
s32 s32_max_value; /* maximum possible (s32)value */
|
||||
u32 u32_min_value; /* minimum possible (u32)value */
|
||||
u32 u32_max_value; /* maximum possible (u32)value */
|
||||
/* parentage chain for liveness checking */
|
||||
struct bpf_reg_state *parent;
|
||||
/* Inside the callee two registers can be both PTR_TO_STACK like
|
||||
|
|
|
|||
|
|
@ -79,6 +79,7 @@
|
|||
#define MII_BCM54XX_ECR 0x10 /* BCM54xx extended control register */
|
||||
#define MII_BCM54XX_ECR_IM 0x1000 /* Interrupt mask */
|
||||
#define MII_BCM54XX_ECR_IF 0x0800 /* Interrupt force */
|
||||
#define MII_BCM54XX_ECR_FIFOE 0x0001 /* FIFO elasticity */
|
||||
|
||||
#define MII_BCM54XX_ESR 0x11 /* BCM54xx extended status register */
|
||||
#define MII_BCM54XX_ESR_IS 0x1000 /* Interrupt status */
|
||||
|
|
@ -119,6 +120,7 @@
|
|||
#define MII_BCM54XX_AUXCTL_SHDWSEL_AUXCTL 0x00
|
||||
#define MII_BCM54XX_AUXCTL_ACTL_TX_6DB 0x0400
|
||||
#define MII_BCM54XX_AUXCTL_ACTL_SMDSP_ENA 0x0800
|
||||
#define MII_BCM54XX_AUXCTL_ACTL_EXT_PKT_LEN 0x4000
|
||||
|
||||
#define MII_BCM54XX_AUXCTL_SHDWSEL_MISC 0x07
|
||||
#define MII_BCM54XX_AUXCTL_SHDWSEL_MISC_WIRESPEED_EN 0x0010
|
||||
|
|
|
|||
|
|
@ -22,9 +22,6 @@ enum bh_state_bits {
|
|||
BH_Dirty, /* Is dirty */
|
||||
BH_Lock, /* Is locked */
|
||||
BH_Req, /* Has been submitted for I/O */
|
||||
BH_Uptodate_Lock,/* Used by the first bh in a page, to serialise
|
||||
* IO completion of other buffers in the page
|
||||
*/
|
||||
|
||||
BH_Mapped, /* Has a disk mapping */
|
||||
BH_New, /* Disk mapping was newly created by get_block */
|
||||
|
|
@ -76,6 +73,9 @@ struct buffer_head {
|
|||
struct address_space *b_assoc_map; /* mapping this buffer is
|
||||
associated with */
|
||||
atomic_t b_count; /* users using this buffer_head */
|
||||
spinlock_t b_uptodate_lock; /* Used by the first bh in a page, to
|
||||
* serialise IO completion of other
|
||||
* buffers in the page */
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -444,8 +444,9 @@ union ceph_mds_request_args {
|
|||
} __attribute__ ((packed)) lookupino;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#define CEPH_MDS_FLAG_REPLAY 1 /* this is a replayed op */
|
||||
#define CEPH_MDS_FLAG_WANT_DENTRY 2 /* want dentry in reply */
|
||||
#define CEPH_MDS_FLAG_REPLAY 1 /* this is a replayed op */
|
||||
#define CEPH_MDS_FLAG_WANT_DENTRY 2 /* want dentry in reply */
|
||||
#define CEPH_MDS_FLAG_ASYNC 4 /* request is asynchronous */
|
||||
|
||||
struct ceph_mds_request_head {
|
||||
__le64 oldest_client_tid;
|
||||
|
|
@ -530,6 +531,9 @@ struct ceph_mds_reply_lease {
|
|||
__le32 seq;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#define CEPH_LEASE_VALID (1 | 2) /* old and new bit values */
|
||||
#define CEPH_LEASE_PRIMARY_LINK 4 /* primary linkage */
|
||||
|
||||
struct ceph_mds_reply_dirfrag {
|
||||
__le32 frag; /* fragment */
|
||||
__le32 auth; /* auth mds, if this is a delegation point */
|
||||
|
|
@ -564,6 +568,7 @@ struct ceph_filelock {
|
|||
#define CEPH_FILE_MODE_RDWR 3 /* RD | WR */
|
||||
#define CEPH_FILE_MODE_LAZY 4 /* lazy io */
|
||||
#define CEPH_FILE_MODE_BITS 4
|
||||
#define CEPH_FILE_MODE_MASK ((1 << CEPH_FILE_MODE_BITS) - 1)
|
||||
|
||||
int ceph_flags_to_mode(int flags);
|
||||
|
||||
|
|
@ -655,10 +660,19 @@ int ceph_flags_to_mode(int flags);
|
|||
#define CEPH_CAP_ANY (CEPH_CAP_ANY_RD | CEPH_CAP_ANY_EXCL | \
|
||||
CEPH_CAP_ANY_FILE_WR | CEPH_CAP_FILE_LAZYIO | \
|
||||
CEPH_CAP_PIN)
|
||||
#define CEPH_CAP_ALL_FILE (CEPH_CAP_PIN | CEPH_CAP_ANY_SHARED | \
|
||||
CEPH_CAP_AUTH_EXCL | CEPH_CAP_XATTR_EXCL | \
|
||||
CEPH_CAP_ANY_FILE_RD | CEPH_CAP_ANY_FILE_WR)
|
||||
|
||||
#define CEPH_CAP_LOCKS (CEPH_LOCK_IFILE | CEPH_LOCK_IAUTH | CEPH_LOCK_ILINK | \
|
||||
CEPH_LOCK_IXATTR)
|
||||
|
||||
/* cap masks async dir operations */
|
||||
#define CEPH_CAP_DIR_CREATE CEPH_CAP_FILE_CACHE
|
||||
#define CEPH_CAP_DIR_UNLINK CEPH_CAP_FILE_RD
|
||||
#define CEPH_CAP_ANY_DIR_OPS (CEPH_CAP_FILE_CACHE | CEPH_CAP_FILE_RD | \
|
||||
CEPH_CAP_FILE_WREXTEND | CEPH_CAP_FILE_LAZYIO)
|
||||
|
||||
int ceph_caps_for_mode(int mode);
|
||||
|
||||
enum {
|
||||
|
|
|
|||
|
|
@ -2,22 +2,8 @@
|
|||
#ifndef _FS_CEPH_DEBUGFS_H
|
||||
#define _FS_CEPH_DEBUGFS_H
|
||||
|
||||
#include <linux/ceph/ceph_debug.h>
|
||||
#include <linux/ceph/types.h>
|
||||
|
||||
#define CEPH_DEFINE_SHOW_FUNC(name) \
|
||||
static int name##_open(struct inode *inode, struct file *file) \
|
||||
{ \
|
||||
return single_open(file, name, inode->i_private); \
|
||||
} \
|
||||
\
|
||||
static const struct file_operations name##_fops = { \
|
||||
.open = name##_open, \
|
||||
.read = seq_read, \
|
||||
.llseek = seq_lseek, \
|
||||
.release = single_release, \
|
||||
};
|
||||
|
||||
/* debugfs.c */
|
||||
extern void ceph_debugfs_init(void);
|
||||
extern void ceph_debugfs_cleanup(void);
|
||||
|
|
|
|||
|
|
@ -272,6 +272,7 @@ extern struct kmem_cache *ceph_cap_flush_cachep;
|
|||
extern struct kmem_cache *ceph_dentry_cachep;
|
||||
extern struct kmem_cache *ceph_file_cachep;
|
||||
extern struct kmem_cache *ceph_dir_file_cachep;
|
||||
extern struct kmem_cache *ceph_mds_request_cachep;
|
||||
|
||||
/* ceph_common.c */
|
||||
extern bool libceph_compatible(void *data);
|
||||
|
|
|
|||
|
|
@ -175,9 +175,10 @@ struct ceph_msg_data {
|
|||
#endif /* CONFIG_BLOCK */
|
||||
struct ceph_bvec_iter bvec_pos;
|
||||
struct {
|
||||
struct page **pages; /* NOT OWNER. */
|
||||
struct page **pages;
|
||||
size_t length; /* total # bytes */
|
||||
unsigned int alignment; /* first page */
|
||||
bool own_pages;
|
||||
};
|
||||
struct ceph_pagelist *pagelist;
|
||||
};
|
||||
|
|
@ -356,8 +357,8 @@ extern void ceph_con_keepalive(struct ceph_connection *con);
|
|||
extern bool ceph_con_keepalive_expired(struct ceph_connection *con,
|
||||
unsigned long interval);
|
||||
|
||||
extern void ceph_msg_data_add_pages(struct ceph_msg *msg, struct page **pages,
|
||||
size_t length, size_t alignment);
|
||||
void ceph_msg_data_add_pages(struct ceph_msg *msg, struct page **pages,
|
||||
size_t length, size_t alignment, bool own_pages);
|
||||
extern void ceph_msg_data_add_pagelist(struct ceph_msg *msg,
|
||||
struct ceph_pagelist *pagelist);
|
||||
#ifdef CONFIG_BLOCK
|
||||
|
|
|
|||
|
|
@ -509,23 +509,6 @@ int ceph_osdc_call(struct ceph_osd_client *osdc,
|
|||
struct page *req_page, size_t req_len,
|
||||
struct page **resp_pages, size_t *resp_len);
|
||||
|
||||
extern int ceph_osdc_readpages(struct ceph_osd_client *osdc,
|
||||
struct ceph_vino vino,
|
||||
struct ceph_file_layout *layout,
|
||||
u64 off, u64 *plen,
|
||||
u32 truncate_seq, u64 truncate_size,
|
||||
struct page **pages, int nr_pages,
|
||||
int page_align);
|
||||
|
||||
extern int ceph_osdc_writepages(struct ceph_osd_client *osdc,
|
||||
struct ceph_vino vino,
|
||||
struct ceph_file_layout *layout,
|
||||
struct ceph_snap_context *sc,
|
||||
u64 off, u64 len,
|
||||
u32 truncate_seq, u64 truncate_size,
|
||||
struct timespec64 *mtime,
|
||||
struct page **pages, int nr_pages);
|
||||
|
||||
int ceph_osdc_copy_from(struct ceph_osd_client *osdc,
|
||||
u64 src_snapid, u64 src_version,
|
||||
struct ceph_object_id *src_oid,
|
||||
|
|
|
|||
|
|
@ -37,6 +37,9 @@ int ceph_spg_compare(const struct ceph_spg *lhs, const struct ceph_spg *rhs);
|
|||
#define CEPH_POOL_FLAG_HASHPSPOOL (1ULL << 0) /* hash pg seed and pool id
|
||||
together */
|
||||
#define CEPH_POOL_FLAG_FULL (1ULL << 1) /* pool is full */
|
||||
#define CEPH_POOL_FLAG_FULL_QUOTA (1ULL << 10) /* pool ran out of quota,
|
||||
will set FULL too */
|
||||
#define CEPH_POOL_FLAG_NEARFULL (1ULL << 11) /* pool is nearfull */
|
||||
|
||||
struct ceph_pg_pool_info {
|
||||
struct rb_node node;
|
||||
|
|
@ -304,5 +307,6 @@ extern struct ceph_pg_pool_info *ceph_pg_pool_by_id(struct ceph_osdmap *map,
|
|||
|
||||
extern const char *ceph_pg_pool_name_by_id(struct ceph_osdmap *map, u64 id);
|
||||
extern int ceph_pg_poolid_by_name(struct ceph_osdmap *map, const char *name);
|
||||
u64 ceph_pg_pool_flags(struct ceph_osdmap *map, u64 id);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -143,8 +143,10 @@ extern const char *ceph_osd_state_name(int s);
|
|||
/*
|
||||
* osd map flag bits
|
||||
*/
|
||||
#define CEPH_OSDMAP_NEARFULL (1<<0) /* sync writes (near ENOSPC) */
|
||||
#define CEPH_OSDMAP_FULL (1<<1) /* no data writes (ENOSPC) */
|
||||
#define CEPH_OSDMAP_NEARFULL (1<<0) /* sync writes (near ENOSPC),
|
||||
not set since ~luminous */
|
||||
#define CEPH_OSDMAP_FULL (1<<1) /* no data writes (ENOSPC),
|
||||
not set since ~luminous */
|
||||
#define CEPH_OSDMAP_PAUSERD (1<<2) /* pause all reads */
|
||||
#define CEPH_OSDMAP_PAUSEWR (1<<3) /* pause all writes */
|
||||
#define CEPH_OSDMAP_PAUSEREC (1<<4) /* pause recovery */
|
||||
|
|
|
|||
|
|
@ -94,6 +94,11 @@ enum {
|
|||
* Enable legacy local memory.events.
|
||||
*/
|
||||
CGRP_ROOT_MEMORY_LOCAL_EVENTS = (1 << 5),
|
||||
|
||||
/*
|
||||
* Enable recursive subtree protection
|
||||
*/
|
||||
CGRP_ROOT_MEMORY_RECURSIVE_PROT = (1 << 6),
|
||||
};
|
||||
|
||||
/* cftype->flags */
|
||||
|
|
@ -628,8 +633,9 @@ struct cgroup_subsys {
|
|||
void (*cancel_attach)(struct cgroup_taskset *tset);
|
||||
void (*attach)(struct cgroup_taskset *tset);
|
||||
void (*post_attach)(void);
|
||||
int (*can_fork)(struct task_struct *task);
|
||||
void (*cancel_fork)(struct task_struct *task);
|
||||
int (*can_fork)(struct task_struct *task,
|
||||
struct css_set *cset);
|
||||
void (*cancel_fork)(struct task_struct *task, struct css_set *cset);
|
||||
void (*fork)(struct task_struct *task);
|
||||
void (*exit)(struct task_struct *task);
|
||||
void (*release)(struct task_struct *task);
|
||||
|
|
|
|||
|
|
@ -27,6 +27,8 @@
|
|||
|
||||
#include <linux/cgroup-defs.h>
|
||||
|
||||
struct kernel_clone_args;
|
||||
|
||||
#ifdef CONFIG_CGROUPS
|
||||
|
||||
/*
|
||||
|
|
@ -58,10 +60,8 @@ struct css_task_iter {
|
|||
struct list_head *tcset_head;
|
||||
|
||||
struct list_head *task_pos;
|
||||
struct list_head *tasks_head;
|
||||
struct list_head *mg_tasks_head;
|
||||
struct list_head *dying_tasks_head;
|
||||
|
||||
struct list_head *cur_tasks_head;
|
||||
struct css_set *cur_cset;
|
||||
struct css_set *cur_dcset;
|
||||
struct task_struct *cur_task;
|
||||
|
|
@ -121,9 +121,12 @@ int proc_cgroup_show(struct seq_file *m, struct pid_namespace *ns,
|
|||
struct pid *pid, struct task_struct *tsk);
|
||||
|
||||
void cgroup_fork(struct task_struct *p);
|
||||
extern int cgroup_can_fork(struct task_struct *p);
|
||||
extern void cgroup_cancel_fork(struct task_struct *p);
|
||||
extern void cgroup_post_fork(struct task_struct *p);
|
||||
extern int cgroup_can_fork(struct task_struct *p,
|
||||
struct kernel_clone_args *kargs);
|
||||
extern void cgroup_cancel_fork(struct task_struct *p,
|
||||
struct kernel_clone_args *kargs);
|
||||
extern void cgroup_post_fork(struct task_struct *p,
|
||||
struct kernel_clone_args *kargs);
|
||||
void cgroup_exit(struct task_struct *p);
|
||||
void cgroup_release(struct task_struct *p);
|
||||
void cgroup_free(struct task_struct *p);
|
||||
|
|
@ -707,9 +710,12 @@ static inline int cgroupstats_build(struct cgroupstats *stats,
|
|||
struct dentry *dentry) { return -EINVAL; }
|
||||
|
||||
static inline void cgroup_fork(struct task_struct *p) {}
|
||||
static inline int cgroup_can_fork(struct task_struct *p) { return 0; }
|
||||
static inline void cgroup_cancel_fork(struct task_struct *p) {}
|
||||
static inline void cgroup_post_fork(struct task_struct *p) {}
|
||||
static inline int cgroup_can_fork(struct task_struct *p,
|
||||
struct kernel_clone_args *kargs) { return 0; }
|
||||
static inline void cgroup_cancel_fork(struct task_struct *p,
|
||||
struct kernel_clone_args *kargs) {}
|
||||
static inline void cgroup_post_fork(struct task_struct *p,
|
||||
struct kernel_clone_args *kargs) {}
|
||||
static inline void cgroup_exit(struct task_struct *p) {}
|
||||
static inline void cgroup_release(struct task_struct *p) {}
|
||||
static inline void cgroup_free(struct task_struct *p) {}
|
||||
|
|
|
|||
|
|
@ -522,9 +522,9 @@ struct clk *clk_register_gate(struct device *dev, const char *name,
|
|||
* @clk_gate_flags: gate-specific flags for this clock
|
||||
* @lock: shared register lock for this clock
|
||||
*/
|
||||
#define clk_hw_register_gate_parent_hw(dev, name, parent_name, flags, reg, \
|
||||
#define clk_hw_register_gate_parent_hw(dev, name, parent_hw, flags, reg, \
|
||||
bit_idx, clk_gate_flags, lock) \
|
||||
__clk_hw_register_gate((dev), NULL, (name), (parent_name), NULL, \
|
||||
__clk_hw_register_gate((dev), NULL, (name), NULL, (parent_hw), \
|
||||
NULL, (flags), (reg), (bit_idx), \
|
||||
(clk_gate_flags), (lock))
|
||||
/**
|
||||
|
|
@ -539,10 +539,10 @@ struct clk *clk_register_gate(struct device *dev, const char *name,
|
|||
* @clk_gate_flags: gate-specific flags for this clock
|
||||
* @lock: shared register lock for this clock
|
||||
*/
|
||||
#define clk_hw_register_gate_parent_data(dev, name, parent_name, flags, reg, \
|
||||
#define clk_hw_register_gate_parent_data(dev, name, parent_data, flags, reg, \
|
||||
bit_idx, clk_gate_flags, lock) \
|
||||
__clk_hw_register_gate((dev), NULL, (name), (parent_name), NULL, \
|
||||
NULL, (flags), (reg), (bit_idx), \
|
||||
__clk_hw_register_gate((dev), NULL, (name), NULL, NULL, (parent_data), \
|
||||
(flags), (reg), (bit_idx), \
|
||||
(clk_gate_flags), (lock))
|
||||
void clk_unregister_gate(struct clk *clk);
|
||||
void clk_hw_unregister_gate(struct clk_hw *hw);
|
||||
|
|
|
|||
|
|
@ -12,6 +12,9 @@
|
|||
#ifndef AT91_PMC_H
|
||||
#define AT91_PMC_H
|
||||
|
||||
#define AT91_PMC_V1 (1) /* PMC version 1 */
|
||||
#define AT91_PMC_V2 (2) /* PMC version 2 [SAM9X60] */
|
||||
|
||||
#define AT91_PMC_SCER 0x00 /* System Clock Enable Register */
|
||||
#define AT91_PMC_SCDR 0x04 /* System Clock Disable Register */
|
||||
|
||||
|
|
@ -30,16 +33,34 @@
|
|||
#define AT91_PMC_HCK0 (1 << 16) /* AHB Clock (USB host) [AT91SAM9261 only] */
|
||||
#define AT91_PMC_HCK1 (1 << 17) /* AHB Clock (LCD) [AT91SAM9261 only] */
|
||||
|
||||
#define AT91_PMC_PLL_CTRL0 0x0C /* PLL Control Register 0 [for SAM9X60] */
|
||||
#define AT91_PMC_PLL_CTRL0_ENPLL (1 << 28) /* Enable PLL */
|
||||
#define AT91_PMC_PLL_CTRL0_ENPLLCK (1 << 29) /* Enable PLL clock for PMC */
|
||||
#define AT91_PMC_PLL_CTRL0_ENLOCK (1 << 31) /* Enable PLL lock */
|
||||
|
||||
#define AT91_PMC_PLL_CTRL1 0x10 /* PLL Control Register 1 [for SAM9X60] */
|
||||
|
||||
#define AT91_PMC_PCER 0x10 /* Peripheral Clock Enable Register */
|
||||
#define AT91_PMC_PCDR 0x14 /* Peripheral Clock Disable Register */
|
||||
#define AT91_PMC_PCSR 0x18 /* Peripheral Clock Status Register */
|
||||
|
||||
#define AT91_PMC_PLL_ACR 0x18 /* PLL Analog Control Register [for SAM9X60] */
|
||||
#define AT91_PMC_PLL_ACR_DEFAULT_UPLL 0x12020010UL /* Default PLL ACR value for UPLL */
|
||||
#define AT91_PMC_PLL_ACR_DEFAULT_PLLA 0x00020010UL /* Default PLL ACR value for PLLA */
|
||||
#define AT91_PMC_PLL_ACR_UTMIVR (1 << 12) /* UPLL Voltage regulator Control */
|
||||
#define AT91_PMC_PLL_ACR_UTMIBG (1 << 13) /* UPLL Bandgap Control */
|
||||
|
||||
#define AT91_CKGR_UCKR 0x1C /* UTMI Clock Register [some SAM9] */
|
||||
#define AT91_PMC_UPLLEN (1 << 16) /* UTMI PLL Enable */
|
||||
#define AT91_PMC_UPLLCOUNT (0xf << 20) /* UTMI PLL Start-up Time */
|
||||
#define AT91_PMC_BIASEN (1 << 24) /* UTMI BIAS Enable */
|
||||
#define AT91_PMC_BIASCOUNT (0xf << 28) /* UTMI BIAS Start-up Time */
|
||||
|
||||
#define AT91_PMC_PLL_UPDT 0x1C /* PMC PLL update register [for SAM9X60] */
|
||||
#define AT91_PMC_PLL_UPDT_UPDATE (1 << 8) /* Update PLL settings */
|
||||
#define AT91_PMC_PLL_UPDT_ID (1 << 0) /* PLL ID */
|
||||
#define AT91_PMC_PLL_UPDT_STUPTIM (0xff << 16) /* Startup time */
|
||||
|
||||
#define AT91_CKGR_MOR 0x20 /* Main Oscillator Register [not on SAM9RL] */
|
||||
#define AT91_PMC_MOSCEN (1 << 0) /* Main Oscillator Enable */
|
||||
#define AT91_PMC_OSCBYPASS (1 << 1) /* Oscillator Bypass */
|
||||
|
|
@ -180,6 +201,8 @@
|
|||
#define AT91_PMC_WPVS (0x1 << 0) /* Write Protect Violation Status */
|
||||
#define AT91_PMC_WPVSRC (0xffff << 8) /* Write Protect Violation Source */
|
||||
|
||||
#define AT91_PMC_PLL_ISR0 0xEC /* PLL Interrupt Status Register 0 [SAM9X60 only] */
|
||||
|
||||
#define AT91_PMC_PCER1 0x100 /* Peripheral Clock Enable Register 1 [SAMA5 only]*/
|
||||
#define AT91_PMC_PCDR1 0x104 /* Peripheral Clock Enable Register 1 */
|
||||
#define AT91_PMC_PCSR1 0x108 /* Peripheral Clock Enable Register 1 */
|
||||
|
|
|
|||
|
|
@ -23,18 +23,31 @@
|
|||
struct clocksource;
|
||||
struct module;
|
||||
|
||||
#ifdef CONFIG_ARCH_CLOCKSOURCE_DATA
|
||||
#if defined(CONFIG_ARCH_CLOCKSOURCE_DATA) || \
|
||||
defined(CONFIG_GENERIC_GETTIMEOFDAY)
|
||||
#include <asm/clocksource.h>
|
||||
#endif
|
||||
|
||||
#include <vdso/clocksource.h>
|
||||
|
||||
/**
|
||||
* struct clocksource - hardware abstraction for a free running counter
|
||||
* Provides mostly state-free accessors to the underlying hardware.
|
||||
* This is the structure used for system time.
|
||||
*
|
||||
* @name: ptr to clocksource name
|
||||
* @list: list head for registration
|
||||
* @rating: rating value for selection (higher is better)
|
||||
* @read: Returns a cycle value, passes clocksource as argument
|
||||
* @mask: Bitmask for two's complement
|
||||
* subtraction of non 64 bit counters
|
||||
* @mult: Cycle to nanosecond multiplier
|
||||
* @shift: Cycle to nanosecond divisor (power of two)
|
||||
* @max_idle_ns: Maximum idle time permitted by the clocksource (nsecs)
|
||||
* @maxadj: Maximum adjustment value to mult (~11%)
|
||||
* @archdata: Optional arch-specific data
|
||||
* @max_cycles: Maximum safe cycle value which won't overflow on
|
||||
* multiplication
|
||||
* @name: Pointer to clocksource name
|
||||
* @list: List head for registration (internal)
|
||||
* @rating: Rating value for selection (higher is better)
|
||||
* To avoid rating inflation the following
|
||||
* list should give you a guide as to how
|
||||
* to assign your clocksource a rating
|
||||
|
|
@ -49,27 +62,23 @@ struct module;
|
|||
* 400-499: Perfect
|
||||
* The ideal clocksource. A must-use where
|
||||
* available.
|
||||
* @read: returns a cycle value, passes clocksource as argument
|
||||
* @enable: optional function to enable the clocksource
|
||||
* @disable: optional function to disable the clocksource
|
||||
* @mask: bitmask for two's complement
|
||||
* subtraction of non 64 bit counters
|
||||
* @mult: cycle to nanosecond multiplier
|
||||
* @shift: cycle to nanosecond divisor (power of two)
|
||||
* @max_idle_ns: max idle time permitted by the clocksource (nsecs)
|
||||
* @maxadj: maximum adjustment value to mult (~11%)
|
||||
* @max_cycles: maximum safe cycle value which won't overflow on multiplication
|
||||
* @flags: flags describing special properties
|
||||
* @archdata: arch-specific data
|
||||
* @suspend: suspend function for the clocksource, if necessary
|
||||
* @resume: resume function for the clocksource, if necessary
|
||||
* @flags: Flags describing special properties
|
||||
* @enable: Optional function to enable the clocksource
|
||||
* @disable: Optional function to disable the clocksource
|
||||
* @suspend: Optional suspend function for the clocksource
|
||||
* @resume: Optional resume function for the clocksource
|
||||
* @mark_unstable: Optional function to inform the clocksource driver that
|
||||
* the watchdog marked the clocksource unstable
|
||||
* @owner: module reference, must be set by clocksource in modules
|
||||
* @tick_stable: Optional function called periodically from the watchdog
|
||||
* code to provide stable syncrhonization points
|
||||
* @wd_list: List head to enqueue into the watchdog list (internal)
|
||||
* @cs_last: Last clocksource value for clocksource watchdog
|
||||
* @wd_last: Last watchdog value corresponding to @cs_last
|
||||
* @owner: Module reference, must be set by clocksource in modules
|
||||
*
|
||||
* Note: This struct is not used in hotpathes of the timekeeping code
|
||||
* because the timekeeper caches the hot path fields in its own data
|
||||
* structure, so no line cache alignment is required,
|
||||
* structure, so no cache line alignment is required,
|
||||
*
|
||||
* The pointer to the clocksource itself is handed to the read
|
||||
* callback. If you need extra information there you can wrap struct
|
||||
|
|
@ -78,35 +87,37 @@ struct module;
|
|||
* structure.
|
||||
*/
|
||||
struct clocksource {
|
||||
u64 (*read)(struct clocksource *cs);
|
||||
u64 mask;
|
||||
u32 mult;
|
||||
u32 shift;
|
||||
u64 max_idle_ns;
|
||||
u32 maxadj;
|
||||
u64 (*read)(struct clocksource *cs);
|
||||
u64 mask;
|
||||
u32 mult;
|
||||
u32 shift;
|
||||
u64 max_idle_ns;
|
||||
u32 maxadj;
|
||||
#ifdef CONFIG_ARCH_CLOCKSOURCE_DATA
|
||||
struct arch_clocksource_data archdata;
|
||||
#endif
|
||||
u64 max_cycles;
|
||||
const char *name;
|
||||
struct list_head list;
|
||||
int rating;
|
||||
int (*enable)(struct clocksource *cs);
|
||||
void (*disable)(struct clocksource *cs);
|
||||
unsigned long flags;
|
||||
void (*suspend)(struct clocksource *cs);
|
||||
void (*resume)(struct clocksource *cs);
|
||||
void (*mark_unstable)(struct clocksource *cs);
|
||||
void (*tick_stable)(struct clocksource *cs);
|
||||
u64 max_cycles;
|
||||
const char *name;
|
||||
struct list_head list;
|
||||
int rating;
|
||||
enum vdso_clock_mode vdso_clock_mode;
|
||||
unsigned long flags;
|
||||
|
||||
int (*enable)(struct clocksource *cs);
|
||||
void (*disable)(struct clocksource *cs);
|
||||
void (*suspend)(struct clocksource *cs);
|
||||
void (*resume)(struct clocksource *cs);
|
||||
void (*mark_unstable)(struct clocksource *cs);
|
||||
void (*tick_stable)(struct clocksource *cs);
|
||||
|
||||
/* private: */
|
||||
#ifdef CONFIG_CLOCKSOURCE_WATCHDOG
|
||||
/* Watchdog related data, used by the framework */
|
||||
struct list_head wd_list;
|
||||
u64 cs_last;
|
||||
u64 wd_last;
|
||||
struct list_head wd_list;
|
||||
u64 cs_last;
|
||||
u64 wd_last;
|
||||
#endif
|
||||
struct module *owner;
|
||||
struct module *owner;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
#include <linux/init.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/numa.h>
|
||||
|
||||
/*
|
||||
* There is always at least global CMA area and a few optional
|
||||
|
|
@ -24,10 +25,19 @@ extern phys_addr_t cma_get_base(const struct cma *cma);
|
|||
extern unsigned long cma_get_size(const struct cma *cma);
|
||||
extern const char *cma_get_name(const struct cma *cma);
|
||||
|
||||
extern int __init cma_declare_contiguous(phys_addr_t base,
|
||||
extern int __init cma_declare_contiguous_nid(phys_addr_t base,
|
||||
phys_addr_t size, phys_addr_t limit,
|
||||
phys_addr_t alignment, unsigned int order_per_bit,
|
||||
bool fixed, const char *name, struct cma **res_cma);
|
||||
bool fixed, const char *name, struct cma **res_cma,
|
||||
int nid);
|
||||
static inline int __init cma_declare_contiguous(phys_addr_t base,
|
||||
phys_addr_t size, phys_addr_t limit,
|
||||
phys_addr_t alignment, unsigned int order_per_bit,
|
||||
bool fixed, const char *name, struct cma **res_cma)
|
||||
{
|
||||
return cma_declare_contiguous_nid(base, size, limit, alignment,
|
||||
order_per_bit, fixed, name, res_cma, NUMA_NO_NODE);
|
||||
}
|
||||
extern int cma_init_reserved_mem(phys_addr_t base, phys_addr_t size,
|
||||
unsigned int order_per_bit,
|
||||
const char *name,
|
||||
|
|
|
|||
|
|
@ -454,12 +454,13 @@ extern void __user *compat_alloc_user_space(unsigned long len);
|
|||
|
||||
int compat_restore_altstack(const compat_stack_t __user *uss);
|
||||
int __compat_save_altstack(compat_stack_t __user *, unsigned long);
|
||||
#define compat_save_altstack_ex(uss, sp) do { \
|
||||
#define unsafe_compat_save_altstack(uss, sp, label) do { \
|
||||
compat_stack_t __user *__uss = uss; \
|
||||
struct task_struct *t = current; \
|
||||
put_user_ex(ptr_to_compat((void __user *)t->sas_ss_sp), &__uss->ss_sp); \
|
||||
put_user_ex(t->sas_ss_flags, &__uss->ss_flags); \
|
||||
put_user_ex(t->sas_ss_size, &__uss->ss_size); \
|
||||
unsafe_put_user(ptr_to_compat((void __user *)t->sas_ss_sp), \
|
||||
&__uss->ss_sp, label); \
|
||||
unsafe_put_user(t->sas_ss_flags, &__uss->ss_flags, label); \
|
||||
unsafe_put_user(t->sas_ss_size, &__uss->ss_size, label); \
|
||||
if (t->sas_ss_flags & SS_AUTODISARM) \
|
||||
sas_ss_reset(t); \
|
||||
} while (0);
|
||||
|
|
|
|||
|
|
@ -347,7 +347,7 @@ static inline void *offset_to_ptr(const int *off)
|
|||
* compiler has support to do so.
|
||||
*/
|
||||
#define compiletime_assert(condition, msg) \
|
||||
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
|
||||
_compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
|
||||
|
||||
#define compiletime_assert_atomic_type(t) \
|
||||
compiletime_assert(__native_word(t), \
|
||||
|
|
|
|||
|
|
@ -129,22 +129,13 @@ struct ftrace_likely_data {
|
|||
#define __compiler_offsetof(a, b) __builtin_offsetof(a, b)
|
||||
|
||||
/*
|
||||
* Force always-inline if the user requests it so via the .config.
|
||||
* Prefer gnu_inline, so that extern inline functions do not emit an
|
||||
* externally visible function. This makes extern inline behave as per gnu89
|
||||
* semantics rather than c99. This prevents multiple symbol definition errors
|
||||
* of extern inline functions at link time.
|
||||
* A lot of inline functions can cause havoc with function tracing.
|
||||
* Do not use __always_inline here, since currently it expands to inline again
|
||||
* (which would break users of __always_inline).
|
||||
*/
|
||||
#if !defined(CONFIG_OPTIMIZE_INLINING)
|
||||
#define inline inline __attribute__((__always_inline__)) __gnu_inline \
|
||||
__inline_maybe_unused notrace
|
||||
#else
|
||||
#define inline inline __gnu_inline \
|
||||
__inline_maybe_unused notrace
|
||||
#endif
|
||||
#define inline inline __gnu_inline __inline_maybe_unused notrace
|
||||
|
||||
/*
|
||||
* gcc provides both __inline__ and __inline as alternate spellings of
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@
|
|||
* See kernel/sched/completion.c for details.
|
||||
*/
|
||||
|
||||
#include <linux/wait.h>
|
||||
#include <linux/swait.h>
|
||||
|
||||
/*
|
||||
* struct completion - structure used to maintain state for a "completion"
|
||||
|
|
@ -25,7 +25,7 @@
|
|||
*/
|
||||
struct completion {
|
||||
unsigned int done;
|
||||
wait_queue_head_t wait;
|
||||
struct swait_queue_head wait;
|
||||
};
|
||||
|
||||
#define init_completion_map(x, m) __init_completion(x)
|
||||
|
|
@ -34,7 +34,7 @@ static inline void complete_acquire(struct completion *x) {}
|
|||
static inline void complete_release(struct completion *x) {}
|
||||
|
||||
#define COMPLETION_INITIALIZER(work) \
|
||||
{ 0, __WAIT_QUEUE_HEAD_INITIALIZER((work).wait) }
|
||||
{ 0, __SWAIT_QUEUE_HEAD_INITIALIZER((work).wait) }
|
||||
|
||||
#define COMPLETION_INITIALIZER_ONSTACK_MAP(work, map) \
|
||||
(*({ init_completion_map(&(work), &(map)); &(work); }))
|
||||
|
|
@ -85,7 +85,7 @@ static inline void complete_release(struct completion *x) {}
|
|||
static inline void __init_completion(struct completion *x)
|
||||
{
|
||||
x->done = 0;
|
||||
init_waitqueue_head(&x->wait);
|
||||
init_swait_queue_head(&x->wait);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -148,6 +148,7 @@ struct console {
|
|||
struct tty_driver *(*device)(struct console *, int *);
|
||||
void (*unblank)(void);
|
||||
int (*setup)(struct console *, char *);
|
||||
int (*exit)(struct console *);
|
||||
int (*match)(struct console *, char *name, int idx, char *options);
|
||||
short flags;
|
||||
short index;
|
||||
|
|
|
|||
|
|
@ -1,9 +1,6 @@
|
|||
#ifndef _LINUX_CONST_H
|
||||
#define _LINUX_CONST_H
|
||||
|
||||
#include <uapi/linux/const.h>
|
||||
|
||||
#define UL(x) (_UL(x))
|
||||
#define ULL(x) (_ULL(x))
|
||||
#include <vdso/const.h>
|
||||
|
||||
#endif /* _LINUX_CONST_H */
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ enum coresight_dev_type {
|
|||
CORESIGHT_DEV_TYPE_LINKSINK,
|
||||
CORESIGHT_DEV_TYPE_SOURCE,
|
||||
CORESIGHT_DEV_TYPE_HELPER,
|
||||
CORESIGHT_DEV_TYPE_ECT,
|
||||
};
|
||||
|
||||
enum coresight_dev_subtype_sink {
|
||||
|
|
@ -68,6 +69,12 @@ enum coresight_dev_subtype_helper {
|
|||
CORESIGHT_DEV_SUBTYPE_HELPER_CATU,
|
||||
};
|
||||
|
||||
/* Embedded Cross Trigger (ECT) sub-types */
|
||||
enum coresight_dev_subtype_ect {
|
||||
CORESIGHT_DEV_SUBTYPE_ECT_NONE,
|
||||
CORESIGHT_DEV_SUBTYPE_ECT_CTI,
|
||||
};
|
||||
|
||||
/**
|
||||
* union coresight_dev_subtype - further characterisation of a type
|
||||
* @sink_subtype: type of sink this component is, as defined
|
||||
|
|
@ -78,6 +85,8 @@ enum coresight_dev_subtype_helper {
|
|||
* by @coresight_dev_subtype_source.
|
||||
* @helper_subtype: type of helper this component is, as defined
|
||||
* by @coresight_dev_subtype_helper.
|
||||
* @ect_subtype: type of cross trigger this component is, as
|
||||
* defined by @coresight_dev_subtype_ect
|
||||
*/
|
||||
union coresight_dev_subtype {
|
||||
/* We have some devices which acts as LINK and SINK */
|
||||
|
|
@ -87,6 +96,7 @@ union coresight_dev_subtype {
|
|||
};
|
||||
enum coresight_dev_subtype_source source_subtype;
|
||||
enum coresight_dev_subtype_helper helper_subtype;
|
||||
enum coresight_dev_subtype_ect ect_subtype;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -153,6 +163,8 @@ struct coresight_connection {
|
|||
* activated but not yet enabled. Enabling for a _sink_
|
||||
* appens when a source has been selected for that it.
|
||||
* @ea: Device attribute for sink representation under PMU directory.
|
||||
* @ect_dev: Associated cross trigger device. Not part of the trace data
|
||||
* path or connections.
|
||||
*/
|
||||
struct coresight_device {
|
||||
struct coresight_platform_data *pdata;
|
||||
|
|
@ -166,6 +178,8 @@ struct coresight_device {
|
|||
/* sink specific fields */
|
||||
bool activated; /* true only if a sink is part of a path */
|
||||
struct dev_ext_attribute *ea;
|
||||
/* cross trigger handling */
|
||||
struct coresight_device *ect_dev;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -196,6 +210,7 @@ static struct coresight_dev_list (var) = { \
|
|||
#define sink_ops(csdev) csdev->ops->sink_ops
|
||||
#define link_ops(csdev) csdev->ops->link_ops
|
||||
#define helper_ops(csdev) csdev->ops->helper_ops
|
||||
#define ect_ops(csdev) csdev->ops->ect_ops
|
||||
|
||||
/**
|
||||
* struct coresight_ops_sink - basic operations for a sink
|
||||
|
|
@ -262,11 +277,23 @@ struct coresight_ops_helper {
|
|||
int (*disable)(struct coresight_device *csdev, void *data);
|
||||
};
|
||||
|
||||
/**
|
||||
* struct coresight_ops_ect - Ops for an embedded cross trigger device
|
||||
*
|
||||
* @enable : Enable the device
|
||||
* @disable : Disable the device
|
||||
*/
|
||||
struct coresight_ops_ect {
|
||||
int (*enable)(struct coresight_device *csdev);
|
||||
int (*disable)(struct coresight_device *csdev);
|
||||
};
|
||||
|
||||
struct coresight_ops {
|
||||
const struct coresight_ops_sink *sink_ops;
|
||||
const struct coresight_ops_link *link_ops;
|
||||
const struct coresight_ops_source *source_ops;
|
||||
const struct coresight_ops_helper *helper_ops;
|
||||
const struct coresight_ops_ect *ect_ops;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_CORESIGHT
|
||||
|
|
|
|||
|
|
@ -88,10 +88,13 @@ extern ssize_t arch_cpu_release(const char *, size_t);
|
|||
|
||||
#ifdef CONFIG_SMP
|
||||
extern bool cpuhp_tasks_frozen;
|
||||
int cpu_up(unsigned int cpu);
|
||||
int add_cpu(unsigned int cpu);
|
||||
int cpu_device_up(struct device *dev);
|
||||
void notify_cpu_starting(unsigned int cpu);
|
||||
extern void cpu_maps_update_begin(void);
|
||||
extern void cpu_maps_update_done(void);
|
||||
int bringup_hibernate_cpu(unsigned int sleep_cpu);
|
||||
void bringup_nonboot_cpus(unsigned int setup_max_cpus);
|
||||
|
||||
#else /* CONFIG_SMP */
|
||||
#define cpuhp_tasks_frozen 0
|
||||
|
|
@ -117,7 +120,9 @@ extern void lockdep_assert_cpus_held(void);
|
|||
extern void cpu_hotplug_disable(void);
|
||||
extern void cpu_hotplug_enable(void);
|
||||
void clear_tasks_mm_cpumask(int cpu);
|
||||
int cpu_down(unsigned int cpu);
|
||||
int remove_cpu(unsigned int cpu);
|
||||
int cpu_device_down(struct device *dev);
|
||||
extern void smp_shutdown_nonboot_cpus(unsigned int primary_cpu);
|
||||
|
||||
#else /* CONFIG_HOTPLUG_CPU */
|
||||
|
||||
|
|
@ -129,6 +134,7 @@ static inline int cpus_read_trylock(void) { return true; }
|
|||
static inline void lockdep_assert_cpus_held(void) { }
|
||||
static inline void cpu_hotplug_disable(void) { }
|
||||
static inline void cpu_hotplug_enable(void) { }
|
||||
static inline void smp_shutdown_nonboot_cpus(unsigned int primary_cpu) { }
|
||||
#endif /* !CONFIG_HOTPLUG_CPU */
|
||||
|
||||
/* Wrappers which go away once all code is converted */
|
||||
|
|
@ -138,12 +144,18 @@ static inline void get_online_cpus(void) { cpus_read_lock(); }
|
|||
static inline void put_online_cpus(void) { cpus_read_unlock(); }
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP_SMP
|
||||
extern int freeze_secondary_cpus(int primary);
|
||||
int __freeze_secondary_cpus(int primary, bool suspend);
|
||||
static inline int freeze_secondary_cpus(int primary)
|
||||
{
|
||||
return __freeze_secondary_cpus(primary, true);
|
||||
}
|
||||
|
||||
static inline int disable_nonboot_cpus(void)
|
||||
{
|
||||
return freeze_secondary_cpus(0);
|
||||
return __freeze_secondary_cpus(0, false);
|
||||
}
|
||||
extern void enable_nonboot_cpus(void);
|
||||
|
||||
void enable_nonboot_cpus(void);
|
||||
|
||||
static inline int suspend_disable_secondary_cpus(void)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -205,6 +205,7 @@ static inline bool policy_is_shared(struct cpufreq_policy *policy)
|
|||
unsigned int cpufreq_get(unsigned int cpu);
|
||||
unsigned int cpufreq_quick_get(unsigned int cpu);
|
||||
unsigned int cpufreq_quick_get_max(unsigned int cpu);
|
||||
unsigned int cpufreq_get_hw_max_freq(unsigned int cpu);
|
||||
void disable_cpufreq(void);
|
||||
|
||||
u64 get_cpu_idle_time(unsigned int cpu, u64 *wall, int io_busy);
|
||||
|
|
@ -232,6 +233,10 @@ static inline unsigned int cpufreq_quick_get_max(unsigned int cpu)
|
|||
{
|
||||
return 0;
|
||||
}
|
||||
static inline unsigned int cpufreq_get_hw_max_freq(unsigned int cpu)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline void disable_cpufreq(void) { }
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -102,6 +102,7 @@ enum cpuhp_state {
|
|||
CPUHP_AP_IRQ_ARMADA_XP_STARTING,
|
||||
CPUHP_AP_IRQ_BCM2836_STARTING,
|
||||
CPUHP_AP_IRQ_MIPS_GIC_STARTING,
|
||||
CPUHP_AP_IRQ_SIFIVE_PLIC_STARTING,
|
||||
CPUHP_AP_ARM_MVEBU_COHERENCY,
|
||||
CPUHP_AP_MICROCODE_LOADER,
|
||||
CPUHP_AP_PERF_X86_AMD_UNCORE_STARTING,
|
||||
|
|
|
|||
|
|
@ -194,6 +194,11 @@ static inline unsigned int cpumask_local_spread(unsigned int i, int node)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline int cpumask_any_and_distribute(const struct cpumask *src1p,
|
||||
const struct cpumask *src2p) {
|
||||
return cpumask_next_and(-1, src1p, src2p);
|
||||
}
|
||||
|
||||
#define for_each_cpu(cpu, mask) \
|
||||
for ((cpu) = 0; (cpu) < 1; (cpu)++, (void)mask)
|
||||
#define for_each_cpu_not(cpu, mask) \
|
||||
|
|
@ -245,6 +250,8 @@ static inline unsigned int cpumask_next_zero(int n, const struct cpumask *srcp)
|
|||
int cpumask_next_and(int n, const struct cpumask *, const struct cpumask *);
|
||||
int cpumask_any_but(const struct cpumask *mask, unsigned int cpu);
|
||||
unsigned int cpumask_local_spread(unsigned int i, int node);
|
||||
int cpumask_any_and_distribute(const struct cpumask *src1p,
|
||||
const struct cpumask *src2p);
|
||||
|
||||
/**
|
||||
* for_each_cpu - iterate over every cpu in a mask
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
typedef unsigned long dax_entry_t;
|
||||
|
||||
struct iomap_ops;
|
||||
struct iomap;
|
||||
struct dax_device;
|
||||
struct dax_operations {
|
||||
/*
|
||||
|
|
@ -34,6 +35,8 @@ struct dax_operations {
|
|||
/* copy_to_iter: required operation for fs-dax direct-i/o */
|
||||
size_t (*copy_to_iter)(struct dax_device *, pgoff_t, void *, size_t,
|
||||
struct iov_iter *);
|
||||
/* zero_page_range: required operation. Zero page range */
|
||||
int (*zero_page_range)(struct dax_device *, pgoff_t, size_t);
|
||||
};
|
||||
|
||||
extern struct attribute_group dax_attribute_group;
|
||||
|
|
@ -199,6 +202,8 @@ size_t dax_copy_from_iter(struct dax_device *dax_dev, pgoff_t pgoff, void *addr,
|
|||
size_t bytes, struct iov_iter *i);
|
||||
size_t dax_copy_to_iter(struct dax_device *dax_dev, pgoff_t pgoff, void *addr,
|
||||
size_t bytes, struct iov_iter *i);
|
||||
int dax_zero_page_range(struct dax_device *dax_dev, pgoff_t pgoff,
|
||||
size_t nr_pages);
|
||||
void dax_flush(struct dax_device *dax_dev, void *addr, size_t size);
|
||||
|
||||
ssize_t dax_iomap_rw(struct kiocb *iocb, struct iov_iter *iter,
|
||||
|
|
@ -210,20 +215,8 @@ vm_fault_t dax_finish_sync_fault(struct vm_fault *vmf,
|
|||
int dax_delete_mapping_entry(struct address_space *mapping, pgoff_t index);
|
||||
int dax_invalidate_mapping_entry_sync(struct address_space *mapping,
|
||||
pgoff_t index);
|
||||
|
||||
#ifdef CONFIG_FS_DAX
|
||||
int __dax_zero_page_range(struct block_device *bdev,
|
||||
struct dax_device *dax_dev, sector_t sector,
|
||||
unsigned int offset, unsigned int length);
|
||||
#else
|
||||
static inline int __dax_zero_page_range(struct block_device *bdev,
|
||||
struct dax_device *dax_dev, sector_t sector,
|
||||
unsigned int offset, unsigned int length)
|
||||
{
|
||||
return -ENXIO;
|
||||
}
|
||||
#endif
|
||||
|
||||
int dax_iomap_zero(loff_t pos, unsigned offset, unsigned size,
|
||||
struct iomap *iomap);
|
||||
static inline bool dax_mapping(struct address_space *mapping)
|
||||
{
|
||||
return mapping->host && IS_DAX(mapping->host);
|
||||
|
|
|
|||
|
|
@ -198,7 +198,7 @@ enum dccp_role {
|
|||
|
||||
struct dccp_service_list {
|
||||
__u32 dccpsl_nr;
|
||||
__be32 dccpsl_list[0];
|
||||
__be32 dccpsl_list[];
|
||||
};
|
||||
|
||||
#define DCCP_SERVICE_INVALID_VALUE htonl((__u32)-1)
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@ struct debugfs_regset32 {
|
|||
const struct debugfs_reg32 *regs;
|
||||
int nregs;
|
||||
void __iomem *base;
|
||||
struct device *dev; /* Optional device for Runtime PM */
|
||||
};
|
||||
|
||||
extern struct dentry *arch_debugfs_dir;
|
||||
|
|
@ -67,10 +68,10 @@ struct dentry *debugfs_create_file_unsafe(const char *name, umode_t mode,
|
|||
struct dentry *parent, void *data,
|
||||
const struct file_operations *fops);
|
||||
|
||||
struct dentry *debugfs_create_file_size(const char *name, umode_t mode,
|
||||
struct dentry *parent, void *data,
|
||||
const struct file_operations *fops,
|
||||
loff_t file_size);
|
||||
void debugfs_create_file_size(const char *name, umode_t mode,
|
||||
struct dentry *parent, void *data,
|
||||
const struct file_operations *fops,
|
||||
loff_t file_size);
|
||||
|
||||
struct dentry *debugfs_create_dir(const char *name, struct dentry *parent);
|
||||
|
||||
|
|
@ -181,13 +182,11 @@ static inline struct dentry *debugfs_create_file_unsafe(const char *name,
|
|||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
|
||||
static inline struct dentry *debugfs_create_file_size(const char *name, umode_t mode,
|
||||
struct dentry *parent, void *data,
|
||||
const struct file_operations *fops,
|
||||
loff_t file_size)
|
||||
{
|
||||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
static inline void debugfs_create_file_size(const char *name, umode_t mode,
|
||||
struct dentry *parent, void *data,
|
||||
const struct file_operations *fops,
|
||||
loff_t file_size)
|
||||
{ }
|
||||
|
||||
static inline struct dentry *debugfs_create_dir(const char *name,
|
||||
struct dentry *parent)
|
||||
|
|
|
|||
|
|
@ -158,7 +158,7 @@ struct devfreq_stats {
|
|||
* functions except for the context of callbacks defined in struct
|
||||
* devfreq_governor, the governor should protect its access with the
|
||||
* struct mutex lock in struct devfreq. A governor may use this mutex
|
||||
* to protect its own private data in void *data as well.
|
||||
* to protect its own private data in ``void *data`` as well.
|
||||
*/
|
||||
struct devfreq {
|
||||
struct list_head node;
|
||||
|
|
@ -201,24 +201,23 @@ struct devfreq_freqs {
|
|||
};
|
||||
|
||||
#if defined(CONFIG_PM_DEVFREQ)
|
||||
extern struct devfreq *devfreq_add_device(struct device *dev,
|
||||
struct devfreq_dev_profile *profile,
|
||||
const char *governor_name,
|
||||
void *data);
|
||||
extern int devfreq_remove_device(struct devfreq *devfreq);
|
||||
extern struct devfreq *devm_devfreq_add_device(struct device *dev,
|
||||
struct devfreq_dev_profile *profile,
|
||||
const char *governor_name,
|
||||
void *data);
|
||||
extern void devm_devfreq_remove_device(struct device *dev,
|
||||
struct devfreq *devfreq);
|
||||
struct devfreq *devfreq_add_device(struct device *dev,
|
||||
struct devfreq_dev_profile *profile,
|
||||
const char *governor_name,
|
||||
void *data);
|
||||
int devfreq_remove_device(struct devfreq *devfreq);
|
||||
struct devfreq *devm_devfreq_add_device(struct device *dev,
|
||||
struct devfreq_dev_profile *profile,
|
||||
const char *governor_name,
|
||||
void *data);
|
||||
void devm_devfreq_remove_device(struct device *dev, struct devfreq *devfreq);
|
||||
|
||||
/* Supposed to be called by PM callbacks */
|
||||
extern int devfreq_suspend_device(struct devfreq *devfreq);
|
||||
extern int devfreq_resume_device(struct devfreq *devfreq);
|
||||
int devfreq_suspend_device(struct devfreq *devfreq);
|
||||
int devfreq_resume_device(struct devfreq *devfreq);
|
||||
|
||||
extern void devfreq_suspend(void);
|
||||
extern void devfreq_resume(void);
|
||||
void devfreq_suspend(void);
|
||||
void devfreq_resume(void);
|
||||
|
||||
/**
|
||||
* update_devfreq() - Reevaluate the device and configure frequency
|
||||
|
|
@ -226,39 +225,38 @@ extern void devfreq_resume(void);
|
|||
*
|
||||
* Note: devfreq->lock must be held
|
||||
*/
|
||||
extern int update_devfreq(struct devfreq *devfreq);
|
||||
int update_devfreq(struct devfreq *devfreq);
|
||||
|
||||
/* Helper functions for devfreq user device driver with OPP. */
|
||||
extern struct dev_pm_opp *devfreq_recommended_opp(struct device *dev,
|
||||
unsigned long *freq, u32 flags);
|
||||
extern int devfreq_register_opp_notifier(struct device *dev,
|
||||
struct devfreq *devfreq);
|
||||
extern int devfreq_unregister_opp_notifier(struct device *dev,
|
||||
struct devfreq *devfreq);
|
||||
extern int devm_devfreq_register_opp_notifier(struct device *dev,
|
||||
struct devfreq *devfreq);
|
||||
extern void devm_devfreq_unregister_opp_notifier(struct device *dev,
|
||||
struct devfreq *devfreq);
|
||||
extern int devfreq_register_notifier(struct devfreq *devfreq,
|
||||
struct notifier_block *nb,
|
||||
unsigned int list);
|
||||
extern int devfreq_unregister_notifier(struct devfreq *devfreq,
|
||||
struct notifier_block *nb,
|
||||
unsigned int list);
|
||||
extern int devm_devfreq_register_notifier(struct device *dev,
|
||||
struct dev_pm_opp *devfreq_recommended_opp(struct device *dev,
|
||||
unsigned long *freq, u32 flags);
|
||||
int devfreq_register_opp_notifier(struct device *dev,
|
||||
struct devfreq *devfreq);
|
||||
int devfreq_unregister_opp_notifier(struct device *dev,
|
||||
struct devfreq *devfreq);
|
||||
int devm_devfreq_register_opp_notifier(struct device *dev,
|
||||
struct devfreq *devfreq);
|
||||
void devm_devfreq_unregister_opp_notifier(struct device *dev,
|
||||
struct devfreq *devfreq);
|
||||
int devfreq_register_notifier(struct devfreq *devfreq,
|
||||
struct notifier_block *nb,
|
||||
unsigned int list);
|
||||
int devfreq_unregister_notifier(struct devfreq *devfreq,
|
||||
struct notifier_block *nb,
|
||||
unsigned int list);
|
||||
int devm_devfreq_register_notifier(struct device *dev,
|
||||
struct devfreq *devfreq,
|
||||
struct notifier_block *nb,
|
||||
unsigned int list);
|
||||
extern void devm_devfreq_unregister_notifier(struct device *dev,
|
||||
void devm_devfreq_unregister_notifier(struct device *dev,
|
||||
struct devfreq *devfreq,
|
||||
struct notifier_block *nb,
|
||||
unsigned int list);
|
||||
extern struct devfreq *devfreq_get_devfreq_by_phandle(struct device *dev,
|
||||
int index);
|
||||
struct devfreq *devfreq_get_devfreq_by_phandle(struct device *dev, int index);
|
||||
|
||||
#if IS_ENABLED(CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND)
|
||||
/**
|
||||
* struct devfreq_simple_ondemand_data - void *data fed to struct devfreq
|
||||
* struct devfreq_simple_ondemand_data - ``void *data`` fed to struct devfreq
|
||||
* and devfreq_add_device
|
||||
* @upthreshold: If the load is over this value, the frequency jumps.
|
||||
* Specify 0 to use the default. Valid value = 0 to 100.
|
||||
|
|
@ -278,7 +276,7 @@ struct devfreq_simple_ondemand_data {
|
|||
|
||||
#if IS_ENABLED(CONFIG_DEVFREQ_GOV_PASSIVE)
|
||||
/**
|
||||
* struct devfreq_passive_data - void *data fed to struct devfreq
|
||||
* struct devfreq_passive_data - ``void *data`` fed to struct devfreq
|
||||
* and devfreq_add_device
|
||||
* @parent: the devfreq instance of parent device.
|
||||
* @get_target_freq: Optional callback, Returns desired operating frequency
|
||||
|
|
@ -311,9 +309,9 @@ struct devfreq_passive_data {
|
|||
|
||||
#else /* !CONFIG_PM_DEVFREQ */
|
||||
static inline struct devfreq *devfreq_add_device(struct device *dev,
|
||||
struct devfreq_dev_profile *profile,
|
||||
const char *governor_name,
|
||||
void *data)
|
||||
struct devfreq_dev_profile *profile,
|
||||
const char *governor_name,
|
||||
void *data)
|
||||
{
|
||||
return ERR_PTR(-ENOSYS);
|
||||
}
|
||||
|
|
@ -350,31 +348,31 @@ static inline void devfreq_suspend(void) {}
|
|||
static inline void devfreq_resume(void) {}
|
||||
|
||||
static inline struct dev_pm_opp *devfreq_recommended_opp(struct device *dev,
|
||||
unsigned long *freq, u32 flags)
|
||||
unsigned long *freq, u32 flags)
|
||||
{
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
static inline int devfreq_register_opp_notifier(struct device *dev,
|
||||
struct devfreq *devfreq)
|
||||
struct devfreq *devfreq)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int devfreq_unregister_opp_notifier(struct device *dev,
|
||||
struct devfreq *devfreq)
|
||||
struct devfreq *devfreq)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int devm_devfreq_register_opp_notifier(struct device *dev,
|
||||
struct devfreq *devfreq)
|
||||
struct devfreq *devfreq)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline void devm_devfreq_unregister_opp_notifier(struct device *dev,
|
||||
struct devfreq *devfreq)
|
||||
struct devfreq *devfreq)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -393,22 +391,22 @@ static inline int devfreq_unregister_notifier(struct devfreq *devfreq,
|
|||
}
|
||||
|
||||
static inline int devm_devfreq_register_notifier(struct device *dev,
|
||||
struct devfreq *devfreq,
|
||||
struct notifier_block *nb,
|
||||
unsigned int list)
|
||||
struct devfreq *devfreq,
|
||||
struct notifier_block *nb,
|
||||
unsigned int list)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void devm_devfreq_unregister_notifier(struct device *dev,
|
||||
struct devfreq *devfreq,
|
||||
struct notifier_block *nb,
|
||||
unsigned int list)
|
||||
struct devfreq *devfreq,
|
||||
struct notifier_block *nb,
|
||||
unsigned int list)
|
||||
{
|
||||
}
|
||||
|
||||
static inline struct devfreq *devfreq_get_devfreq_by_phandle(struct device *dev,
|
||||
int index)
|
||||
int index)
|
||||
{
|
||||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -75,7 +75,7 @@ void devfreq_cooling_unregister(struct thermal_cooling_device *dfc);
|
|||
|
||||
#else /* !CONFIG_DEVFREQ_THERMAL */
|
||||
|
||||
struct thermal_cooling_device *
|
||||
static inline struct thermal_cooling_device *
|
||||
of_devfreq_cooling_register_power(struct device_node *np, struct devfreq *df,
|
||||
struct devfreq_cooling_power *dfc_power)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -141,6 +141,8 @@ typedef long (*dm_dax_direct_access_fn) (struct dm_target *ti, pgoff_t pgoff,
|
|||
long nr_pages, void **kaddr, pfn_t *pfn);
|
||||
typedef size_t (*dm_dax_copy_iter_fn)(struct dm_target *ti, pgoff_t pgoff,
|
||||
void *addr, size_t bytes, struct iov_iter *i);
|
||||
typedef int (*dm_dax_zero_page_range_fn)(struct dm_target *ti, pgoff_t pgoff,
|
||||
size_t nr_pages);
|
||||
#define PAGE_SECTORS (PAGE_SIZE / 512)
|
||||
|
||||
void dm_error(const char *message);
|
||||
|
|
@ -195,6 +197,7 @@ struct target_type {
|
|||
dm_dax_direct_access_fn direct_access;
|
||||
dm_dax_copy_iter_fn dax_copy_from_iter;
|
||||
dm_dax_copy_iter_fn dax_copy_to_iter;
|
||||
dm_dax_zero_page_range_fn dax_zero_page_range;
|
||||
|
||||
/* For internal device-mapper use. */
|
||||
struct list_head list;
|
||||
|
|
|
|||
|
|
@ -42,9 +42,8 @@ struct device_node;
|
|||
struct fwnode_handle;
|
||||
struct iommu_ops;
|
||||
struct iommu_group;
|
||||
struct iommu_fwspec;
|
||||
struct dev_pin_info;
|
||||
struct iommu_param;
|
||||
struct dev_iommu;
|
||||
|
||||
/**
|
||||
* struct subsys_interface - interfaces to device functions
|
||||
|
|
@ -513,8 +512,7 @@ struct dev_links_info {
|
|||
* gone away. This should be set by the allocator of the
|
||||
* device (i.e. the bus driver that discovered the device).
|
||||
* @iommu_group: IOMMU group the device belongs to.
|
||||
* @iommu_fwspec: IOMMU-specific properties supplied by firmware.
|
||||
* @iommu_param: Per device generic IOMMU runtime data
|
||||
* @iommu: Per device generic IOMMU runtime data
|
||||
*
|
||||
* @offline_disabled: If set, the device is permanently online.
|
||||
* @offline: Set after successful invocation of bus type's .offline().
|
||||
|
|
@ -613,8 +611,7 @@ struct device {
|
|||
|
||||
void (*release)(struct device *dev);
|
||||
struct iommu_group *iommu_group;
|
||||
struct iommu_fwspec *iommu_fwspec;
|
||||
struct iommu_param *iommu_param;
|
||||
struct dev_iommu *iommu;
|
||||
|
||||
bool offline_disabled:1;
|
||||
bool offline:1;
|
||||
|
|
@ -828,6 +825,7 @@ extern struct device *device_find_child_by_name(struct device *parent,
|
|||
extern int device_rename(struct device *dev, const char *new_name);
|
||||
extern int device_move(struct device *dev, struct device *new_parent,
|
||||
enum dpm_order dpm_order);
|
||||
extern int device_change_owner(struct device *dev, kuid_t kuid, kgid_t kgid);
|
||||
extern const char *device_get_devnode(struct device *dev,
|
||||
umode_t *mode, kuid_t *uid, kgid_t *gid,
|
||||
const char **tmp);
|
||||
|
|
|
|||
|
|
@ -236,9 +236,9 @@ driver_find_device_by_acpi_dev(struct device_driver *drv, const void *adev)
|
|||
}
|
||||
#endif
|
||||
|
||||
extern int driver_deferred_probe_timeout;
|
||||
void driver_deferred_probe_add(struct device *dev);
|
||||
int driver_deferred_probe_check_state(struct device *dev);
|
||||
int driver_deferred_probe_check_state_continue(struct device *dev);
|
||||
void driver_init(void);
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -247,11 +247,6 @@ extern int dio_create_sysfs_dev_files(struct dio_dev *);
|
|||
/* New-style probing */
|
||||
extern int dio_register_driver(struct dio_driver *);
|
||||
extern void dio_unregister_driver(struct dio_driver *);
|
||||
extern const struct dio_device_id *dio_match_device(const struct dio_device_id *ids, const struct dio_dev *z);
|
||||
static inline struct dio_driver *dio_dev_driver(const struct dio_dev *d)
|
||||
{
|
||||
return d->driver;
|
||||
}
|
||||
|
||||
#define dio_resource_start(d) ((d)->resource.start)
|
||||
#define dio_resource_end(d) ((d)->resource.end)
|
||||
|
|
|
|||
|
|
@ -108,7 +108,7 @@ static inline void arch_dma_prep_coherent(struct page *page, size_t size)
|
|||
}
|
||||
#endif /* CONFIG_ARCH_HAS_DMA_PREP_COHERENT */
|
||||
|
||||
void *uncached_kernel_address(void *addr);
|
||||
void *cached_kernel_address(void *addr);
|
||||
void *arch_dma_set_uncached(void *addr, size_t size);
|
||||
void arch_dma_clear_uncached(void *addr, size_t size);
|
||||
|
||||
#endif /* _LINUX_DMA_NONCOHERENT_H */
|
||||
|
|
|
|||
|
|
@ -300,6 +300,8 @@ struct dma_router {
|
|||
* @chan_id: channel ID for sysfs
|
||||
* @dev: class device for sysfs
|
||||
* @name: backlink name for sysfs
|
||||
* @dbg_client_name: slave name for debugfs in format:
|
||||
* dev_name(requester's dev):channel name, for example: "2b00000.mcasp:tx"
|
||||
* @device_node: used to add this to the device chan list
|
||||
* @local: per-cpu pointer to a struct dma_chan_percpu
|
||||
* @client_count: how many clients are using this channel
|
||||
|
|
@ -318,6 +320,9 @@ struct dma_chan {
|
|||
int chan_id;
|
||||
struct dma_chan_dev *dev;
|
||||
const char *name;
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
char *dbg_client_name;
|
||||
#endif
|
||||
|
||||
struct list_head device_node;
|
||||
struct dma_chan_percpu __percpu *local;
|
||||
|
|
@ -618,10 +623,11 @@ static inline void dmaengine_unmap_put(struct dmaengine_unmap_data *unmap)
|
|||
|
||||
static inline void dma_descriptor_unmap(struct dma_async_tx_descriptor *tx)
|
||||
{
|
||||
if (tx->unmap) {
|
||||
dmaengine_unmap_put(tx->unmap);
|
||||
tx->unmap = NULL;
|
||||
}
|
||||
if (!tx->unmap)
|
||||
return;
|
||||
|
||||
dmaengine_unmap_put(tx->unmap);
|
||||
tx->unmap = NULL;
|
||||
}
|
||||
|
||||
#ifndef CONFIG_ASYNC_TX_ENABLE_CHANNEL_SWITCH
|
||||
|
|
@ -805,7 +811,9 @@ struct dma_filter {
|
|||
* called and there are no further references to this structure. This
|
||||
* must be implemented to free resources however many existing drivers
|
||||
* do not and are therefore not safe to unbind while in use.
|
||||
*
|
||||
* @dbg_summary_show: optional routine to show contents in debugfs; default code
|
||||
* will be used when this is omitted, but custom code can show extra,
|
||||
* controller specific information.
|
||||
*/
|
||||
struct dma_device {
|
||||
struct kref ref;
|
||||
|
|
@ -891,6 +899,11 @@ struct dma_device {
|
|||
struct dma_tx_state *txstate);
|
||||
void (*device_issue_pending)(struct dma_chan *chan);
|
||||
void (*device_release)(struct dma_device *dev);
|
||||
/* debugfs support */
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
void (*dbg_summary_show)(struct seq_file *s, struct dma_device *dev);
|
||||
struct dentry *dbg_dev_root;
|
||||
#endif
|
||||
};
|
||||
|
||||
static inline int dmaengine_slave_config(struct dma_chan *chan,
|
||||
|
|
@ -1155,14 +1168,7 @@ static inline dma_cookie_t dmaengine_submit(struct dma_async_tx_descriptor *desc
|
|||
static inline bool dmaengine_check_align(enum dmaengine_alignment align,
|
||||
size_t off1, size_t off2, size_t len)
|
||||
{
|
||||
size_t mask;
|
||||
|
||||
if (!align)
|
||||
return true;
|
||||
mask = (1 << align) - 1;
|
||||
if (mask & (off1 | off2 | len))
|
||||
return false;
|
||||
return true;
|
||||
return !(((1 << align) - 1) & (off1 | off2 | len));
|
||||
}
|
||||
|
||||
static inline bool is_dma_copy_aligned(struct dma_device *dev, size_t off1,
|
||||
|
|
@ -1236,9 +1242,9 @@ static inline int dma_maxpq(struct dma_device *dma, enum dma_ctrl_flags flags)
|
|||
{
|
||||
if (dma_dev_has_pq_continue(dma) || !dmaf_continue(flags))
|
||||
return dma_dev_to_maxpq(dma);
|
||||
else if (dmaf_p_disabled_continue(flags))
|
||||
if (dmaf_p_disabled_continue(flags))
|
||||
return dma_dev_to_maxpq(dma) - 1;
|
||||
else if (dmaf_continue(flags))
|
||||
if (dmaf_continue(flags))
|
||||
return dma_dev_to_maxpq(dma) - 3;
|
||||
BUG();
|
||||
}
|
||||
|
|
@ -1249,7 +1255,7 @@ static inline size_t dmaengine_get_icg(bool inc, bool sgl, size_t icg,
|
|||
if (inc) {
|
||||
if (dir_icg)
|
||||
return dir_icg;
|
||||
else if (sgl)
|
||||
if (sgl)
|
||||
return icg;
|
||||
}
|
||||
|
||||
|
|
@ -1415,11 +1421,12 @@ static inline enum dma_status dma_async_is_complete(dma_cookie_t cookie,
|
|||
static inline void
|
||||
dma_set_tx_state(struct dma_tx_state *st, dma_cookie_t last, dma_cookie_t used, u32 residue)
|
||||
{
|
||||
if (st) {
|
||||
st->last = last;
|
||||
st->used = used;
|
||||
st->residue = residue;
|
||||
}
|
||||
if (!st)
|
||||
return;
|
||||
|
||||
st->last = last;
|
||||
st->used = used;
|
||||
st->residue = residue;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DMA_ENGINE
|
||||
|
|
@ -1496,12 +1503,11 @@ static inline int dmaengine_desc_set_reuse(struct dma_async_tx_descriptor *tx)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (caps.descriptor_reuse) {
|
||||
tx->flags |= DMA_CTRL_REUSE;
|
||||
return 0;
|
||||
} else {
|
||||
if (!caps.descriptor_reuse)
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
tx->flags |= DMA_CTRL_REUSE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void dmaengine_desc_clear_reuse(struct dma_async_tx_descriptor *tx)
|
||||
|
|
@ -1517,10 +1523,10 @@ static inline bool dmaengine_desc_test_reuse(struct dma_async_tx_descriptor *tx)
|
|||
static inline int dmaengine_desc_free(struct dma_async_tx_descriptor *desc)
|
||||
{
|
||||
/* this is supported for reusable desc, so check that */
|
||||
if (dmaengine_desc_test_reuse(desc))
|
||||
return desc->desc_free(desc);
|
||||
else
|
||||
if (!dmaengine_desc_test_reuse(desc))
|
||||
return -EPERM;
|
||||
|
||||
return desc->desc_free(desc);
|
||||
}
|
||||
|
||||
/* --- DMA device --- */
|
||||
|
|
@ -1566,9 +1572,7 @@ dmaengine_get_direction_text(enum dma_transfer_direction dir)
|
|||
case DMA_DEV_TO_DEV:
|
||||
return "DEV_TO_DEV";
|
||||
default:
|
||||
break;
|
||||
return "invalid";
|
||||
}
|
||||
|
||||
return "invalid";
|
||||
}
|
||||
#endif /* DMAENGINE_H */
|
||||
|
|
|
|||
|
|
@ -69,19 +69,23 @@ struct dmar_pci_notify_info {
|
|||
extern struct rw_semaphore dmar_global_lock;
|
||||
extern struct list_head dmar_drhd_units;
|
||||
|
||||
#define for_each_drhd_unit(drhd) \
|
||||
list_for_each_entry_rcu(drhd, &dmar_drhd_units, list)
|
||||
#define for_each_drhd_unit(drhd) \
|
||||
list_for_each_entry_rcu(drhd, &dmar_drhd_units, list, \
|
||||
dmar_rcu_check())
|
||||
|
||||
#define for_each_active_drhd_unit(drhd) \
|
||||
list_for_each_entry_rcu(drhd, &dmar_drhd_units, list) \
|
||||
list_for_each_entry_rcu(drhd, &dmar_drhd_units, list, \
|
||||
dmar_rcu_check()) \
|
||||
if (drhd->ignored) {} else
|
||||
|
||||
#define for_each_active_iommu(i, drhd) \
|
||||
list_for_each_entry_rcu(drhd, &dmar_drhd_units, list) \
|
||||
list_for_each_entry_rcu(drhd, &dmar_drhd_units, list, \
|
||||
dmar_rcu_check()) \
|
||||
if (i=drhd->iommu, drhd->ignored) {} else
|
||||
|
||||
#define for_each_iommu(i, drhd) \
|
||||
list_for_each_entry_rcu(drhd, &dmar_drhd_units, list) \
|
||||
list_for_each_entry_rcu(drhd, &dmar_drhd_units, list, \
|
||||
dmar_rcu_check()) \
|
||||
if (i=drhd->iommu, 0) {} else
|
||||
|
||||
static inline bool dmar_rcu_check(void)
|
||||
|
|
|
|||
|
|
@ -28,8 +28,6 @@ int dsa_8021q_rx_switch_id(u16 vid);
|
|||
|
||||
int dsa_8021q_rx_source_port(u16 vid);
|
||||
|
||||
struct sk_buff *dsa_8021q_remove_header(struct sk_buff *skb);
|
||||
|
||||
#else
|
||||
|
||||
int dsa_port_setup_8021q_tagging(struct dsa_switch *ds, int index,
|
||||
|
|
@ -64,11 +62,6 @@ int dsa_8021q_rx_source_port(u16 vid)
|
|||
return 0;
|
||||
}
|
||||
|
||||
struct sk_buff *dsa_8021q_remove_header(struct sk_buff *skb)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif /* IS_ENABLED(CONFIG_NET_DSA_TAG_8021Q) */
|
||||
|
||||
#endif /* _NET_DSA_8021Q_H */
|
||||
|
|
|
|||
|
|
@ -25,7 +25,6 @@ struct dw_apb_timer {
|
|||
struct dw_apb_clock_event_device {
|
||||
struct clock_event_device ced;
|
||||
struct dw_apb_timer timer;
|
||||
struct irqaction irqaction;
|
||||
void (*eoi)(struct dw_apb_timer *);
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -383,6 +383,9 @@ struct dimm_info {
|
|||
unsigned int csrow, cschannel; /* Points to the old API data */
|
||||
|
||||
u16 smbios_handle; /* Handle for SMBIOS type 17 */
|
||||
|
||||
u32 ce_count;
|
||||
u32 ue_count;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -442,6 +445,7 @@ struct errcount_attribute_data {
|
|||
* struct edac_raw_error_desc - Raw error report structure
|
||||
* @grain: minimum granularity for an error report, in bytes
|
||||
* @error_count: number of errors of the same type
|
||||
* @type: severity of the error (CE/UE/Fatal)
|
||||
* @top_layer: top layer of the error (layer[0])
|
||||
* @mid_layer: middle layer of the error (layer[1])
|
||||
* @low_layer: low layer of the error (layer[2])
|
||||
|
|
@ -453,8 +457,6 @@ struct errcount_attribute_data {
|
|||
* @location: location of the error
|
||||
* @label: label of the affected DIMM(s)
|
||||
* @other_detail: other driver-specific detail about the error
|
||||
* @enable_per_layer_report: if false, the error affects all layers
|
||||
* (typically, a memory controller error)
|
||||
*/
|
||||
struct edac_raw_error_desc {
|
||||
char location[LOCATION_SIZE];
|
||||
|
|
@ -462,6 +464,7 @@ struct edac_raw_error_desc {
|
|||
long grain;
|
||||
|
||||
u16 error_count;
|
||||
enum hw_event_mc_err_type type;
|
||||
int top_layer;
|
||||
int mid_layer;
|
||||
int low_layer;
|
||||
|
|
@ -470,7 +473,6 @@ struct edac_raw_error_desc {
|
|||
unsigned long syndrome;
|
||||
const char *msg;
|
||||
const char *other_detail;
|
||||
bool enable_per_layer_report;
|
||||
};
|
||||
|
||||
/* MEMORY controller information structure
|
||||
|
|
@ -560,7 +562,6 @@ struct mem_ctl_info {
|
|||
*/
|
||||
u32 ce_noinfo_count, ue_noinfo_count;
|
||||
u32 ue_mc, ce_mc;
|
||||
u32 *ce_per_layer[EDAC_MAX_LAYERS], *ue_per_layer[EDAC_MAX_LAYERS];
|
||||
|
||||
struct completion complete;
|
||||
|
||||
|
|
|
|||
|
|
@ -56,19 +56,6 @@ typedef void *efi_handle_t;
|
|||
#define __efiapi
|
||||
#endif
|
||||
|
||||
#define efi_get_handle_at(array, idx) \
|
||||
(efi_is_native() ? (array)[idx] \
|
||||
: (efi_handle_t)(unsigned long)((u32 *)(array))[idx])
|
||||
|
||||
#define efi_get_handle_num(size) \
|
||||
((size) / (efi_is_native() ? sizeof(efi_handle_t) : sizeof(u32)))
|
||||
|
||||
#define for_each_efi_handle(handle, array, size, i) \
|
||||
for (i = 0; \
|
||||
i < efi_get_handle_num(size) && \
|
||||
((handle = efi_get_handle_at((array), i)) || true); \
|
||||
i++)
|
||||
|
||||
/*
|
||||
* The UEFI spec and EDK2 reference implementation both define EFI_GUID as
|
||||
* struct { u32 a; u16; b; u16 c; u8 d[8]; }; and so the implied alignment
|
||||
|
|
@ -157,15 +144,6 @@ typedef struct {
|
|||
u32 imagesize;
|
||||
} efi_capsule_header_t;
|
||||
|
||||
struct efi_boot_memmap {
|
||||
efi_memory_desc_t **map;
|
||||
unsigned long *map_size;
|
||||
unsigned long *desc_size;
|
||||
u32 *desc_ver;
|
||||
unsigned long *key_ptr;
|
||||
unsigned long *buff_size;
|
||||
};
|
||||
|
||||
/*
|
||||
* EFI capsule flags
|
||||
*/
|
||||
|
|
@ -187,14 +165,6 @@ struct capsule_info {
|
|||
|
||||
int __efi_capsule_setup_info(struct capsule_info *cap_info);
|
||||
|
||||
/*
|
||||
* Allocation types for calls to boottime->allocate_pages.
|
||||
*/
|
||||
#define EFI_ALLOCATE_ANY_PAGES 0
|
||||
#define EFI_ALLOCATE_MAX_ADDRESS 1
|
||||
#define EFI_ALLOCATE_ADDRESS 2
|
||||
#define EFI_MAX_ALLOCATE_TYPE 3
|
||||
|
||||
typedef int (*efi_freemem_callback_t) (u64 start, u64 end, void *arg);
|
||||
|
||||
/*
|
||||
|
|
@ -224,291 +194,7 @@ typedef struct {
|
|||
u8 sets_to_zero;
|
||||
} efi_time_cap_t;
|
||||
|
||||
typedef struct {
|
||||
efi_table_hdr_t hdr;
|
||||
u32 raise_tpl;
|
||||
u32 restore_tpl;
|
||||
u32 allocate_pages;
|
||||
u32 free_pages;
|
||||
u32 get_memory_map;
|
||||
u32 allocate_pool;
|
||||
u32 free_pool;
|
||||
u32 create_event;
|
||||
u32 set_timer;
|
||||
u32 wait_for_event;
|
||||
u32 signal_event;
|
||||
u32 close_event;
|
||||
u32 check_event;
|
||||
u32 install_protocol_interface;
|
||||
u32 reinstall_protocol_interface;
|
||||
u32 uninstall_protocol_interface;
|
||||
u32 handle_protocol;
|
||||
u32 __reserved;
|
||||
u32 register_protocol_notify;
|
||||
u32 locate_handle;
|
||||
u32 locate_device_path;
|
||||
u32 install_configuration_table;
|
||||
u32 load_image;
|
||||
u32 start_image;
|
||||
u32 exit;
|
||||
u32 unload_image;
|
||||
u32 exit_boot_services;
|
||||
u32 get_next_monotonic_count;
|
||||
u32 stall;
|
||||
u32 set_watchdog_timer;
|
||||
u32 connect_controller;
|
||||
u32 disconnect_controller;
|
||||
u32 open_protocol;
|
||||
u32 close_protocol;
|
||||
u32 open_protocol_information;
|
||||
u32 protocols_per_handle;
|
||||
u32 locate_handle_buffer;
|
||||
u32 locate_protocol;
|
||||
u32 install_multiple_protocol_interfaces;
|
||||
u32 uninstall_multiple_protocol_interfaces;
|
||||
u32 calculate_crc32;
|
||||
u32 copy_mem;
|
||||
u32 set_mem;
|
||||
u32 create_event_ex;
|
||||
} __packed efi_boot_services_32_t;
|
||||
|
||||
/*
|
||||
* EFI Boot Services table
|
||||
*/
|
||||
typedef union {
|
||||
struct {
|
||||
efi_table_hdr_t hdr;
|
||||
void *raise_tpl;
|
||||
void *restore_tpl;
|
||||
efi_status_t (__efiapi *allocate_pages)(int, int, unsigned long,
|
||||
efi_physical_addr_t *);
|
||||
efi_status_t (__efiapi *free_pages)(efi_physical_addr_t,
|
||||
unsigned long);
|
||||
efi_status_t (__efiapi *get_memory_map)(unsigned long *, void *,
|
||||
unsigned long *,
|
||||
unsigned long *, u32 *);
|
||||
efi_status_t (__efiapi *allocate_pool)(int, unsigned long,
|
||||
void **);
|
||||
efi_status_t (__efiapi *free_pool)(void *);
|
||||
void *create_event;
|
||||
void *set_timer;
|
||||
void *wait_for_event;
|
||||
void *signal_event;
|
||||
void *close_event;
|
||||
void *check_event;
|
||||
void *install_protocol_interface;
|
||||
void *reinstall_protocol_interface;
|
||||
void *uninstall_protocol_interface;
|
||||
efi_status_t (__efiapi *handle_protocol)(efi_handle_t,
|
||||
efi_guid_t *, void **);
|
||||
void *__reserved;
|
||||
void *register_protocol_notify;
|
||||
efi_status_t (__efiapi *locate_handle)(int, efi_guid_t *,
|
||||
void *, unsigned long *,
|
||||
efi_handle_t *);
|
||||
void *locate_device_path;
|
||||
efi_status_t (__efiapi *install_configuration_table)(efi_guid_t *,
|
||||
void *);
|
||||
void *load_image;
|
||||
void *start_image;
|
||||
void *exit;
|
||||
void *unload_image;
|
||||
efi_status_t (__efiapi *exit_boot_services)(efi_handle_t,
|
||||
unsigned long);
|
||||
void *get_next_monotonic_count;
|
||||
void *stall;
|
||||
void *set_watchdog_timer;
|
||||
void *connect_controller;
|
||||
efi_status_t (__efiapi *disconnect_controller)(efi_handle_t,
|
||||
efi_handle_t,
|
||||
efi_handle_t);
|
||||
void *open_protocol;
|
||||
void *close_protocol;
|
||||
void *open_protocol_information;
|
||||
void *protocols_per_handle;
|
||||
void *locate_handle_buffer;
|
||||
efi_status_t (__efiapi *locate_protocol)(efi_guid_t *, void *,
|
||||
void **);
|
||||
void *install_multiple_protocol_interfaces;
|
||||
void *uninstall_multiple_protocol_interfaces;
|
||||
void *calculate_crc32;
|
||||
void *copy_mem;
|
||||
void *set_mem;
|
||||
void *create_event_ex;
|
||||
};
|
||||
efi_boot_services_32_t mixed_mode;
|
||||
} efi_boot_services_t;
|
||||
|
||||
typedef enum {
|
||||
EfiPciIoWidthUint8,
|
||||
EfiPciIoWidthUint16,
|
||||
EfiPciIoWidthUint32,
|
||||
EfiPciIoWidthUint64,
|
||||
EfiPciIoWidthFifoUint8,
|
||||
EfiPciIoWidthFifoUint16,
|
||||
EfiPciIoWidthFifoUint32,
|
||||
EfiPciIoWidthFifoUint64,
|
||||
EfiPciIoWidthFillUint8,
|
||||
EfiPciIoWidthFillUint16,
|
||||
EfiPciIoWidthFillUint32,
|
||||
EfiPciIoWidthFillUint64,
|
||||
EfiPciIoWidthMaximum
|
||||
} EFI_PCI_IO_PROTOCOL_WIDTH;
|
||||
|
||||
typedef enum {
|
||||
EfiPciIoAttributeOperationGet,
|
||||
EfiPciIoAttributeOperationSet,
|
||||
EfiPciIoAttributeOperationEnable,
|
||||
EfiPciIoAttributeOperationDisable,
|
||||
EfiPciIoAttributeOperationSupported,
|
||||
EfiPciIoAttributeOperationMaximum
|
||||
} EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION;
|
||||
|
||||
typedef struct {
|
||||
u32 read;
|
||||
u32 write;
|
||||
} efi_pci_io_protocol_access_32_t;
|
||||
|
||||
typedef union efi_pci_io_protocol efi_pci_io_protocol_t;
|
||||
|
||||
typedef
|
||||
efi_status_t (__efiapi *efi_pci_io_protocol_cfg_t)(efi_pci_io_protocol_t *,
|
||||
EFI_PCI_IO_PROTOCOL_WIDTH,
|
||||
u32 offset,
|
||||
unsigned long count,
|
||||
void *buffer);
|
||||
|
||||
typedef struct {
|
||||
void *read;
|
||||
void *write;
|
||||
} efi_pci_io_protocol_access_t;
|
||||
|
||||
typedef struct {
|
||||
efi_pci_io_protocol_cfg_t read;
|
||||
efi_pci_io_protocol_cfg_t write;
|
||||
} efi_pci_io_protocol_config_access_t;
|
||||
|
||||
union efi_pci_io_protocol {
|
||||
struct {
|
||||
void *poll_mem;
|
||||
void *poll_io;
|
||||
efi_pci_io_protocol_access_t mem;
|
||||
efi_pci_io_protocol_access_t io;
|
||||
efi_pci_io_protocol_config_access_t pci;
|
||||
void *copy_mem;
|
||||
void *map;
|
||||
void *unmap;
|
||||
void *allocate_buffer;
|
||||
void *free_buffer;
|
||||
void *flush;
|
||||
efi_status_t (__efiapi *get_location)(efi_pci_io_protocol_t *,
|
||||
unsigned long *segment_nr,
|
||||
unsigned long *bus_nr,
|
||||
unsigned long *device_nr,
|
||||
unsigned long *func_nr);
|
||||
void *attributes;
|
||||
void *get_bar_attributes;
|
||||
void *set_bar_attributes;
|
||||
uint64_t romsize;
|
||||
void *romimage;
|
||||
};
|
||||
struct {
|
||||
u32 poll_mem;
|
||||
u32 poll_io;
|
||||
efi_pci_io_protocol_access_32_t mem;
|
||||
efi_pci_io_protocol_access_32_t io;
|
||||
efi_pci_io_protocol_access_32_t pci;
|
||||
u32 copy_mem;
|
||||
u32 map;
|
||||
u32 unmap;
|
||||
u32 allocate_buffer;
|
||||
u32 free_buffer;
|
||||
u32 flush;
|
||||
u32 get_location;
|
||||
u32 attributes;
|
||||
u32 get_bar_attributes;
|
||||
u32 set_bar_attributes;
|
||||
u64 romsize;
|
||||
u32 romimage;
|
||||
} mixed_mode;
|
||||
};
|
||||
|
||||
#define EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO 0x0001
|
||||
#define EFI_PCI_IO_ATTRIBUTE_ISA_IO 0x0002
|
||||
#define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO 0x0004
|
||||
#define EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY 0x0008
|
||||
#define EFI_PCI_IO_ATTRIBUTE_VGA_IO 0x0010
|
||||
#define EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO 0x0020
|
||||
#define EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO 0x0040
|
||||
#define EFI_PCI_IO_ATTRIBUTE_MEMORY_WRITE_COMBINE 0x0080
|
||||
#define EFI_PCI_IO_ATTRIBUTE_IO 0x0100
|
||||
#define EFI_PCI_IO_ATTRIBUTE_MEMORY 0x0200
|
||||
#define EFI_PCI_IO_ATTRIBUTE_BUS_MASTER 0x0400
|
||||
#define EFI_PCI_IO_ATTRIBUTE_MEMORY_CACHED 0x0800
|
||||
#define EFI_PCI_IO_ATTRIBUTE_MEMORY_DISABLE 0x1000
|
||||
#define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_DEVICE 0x2000
|
||||
#define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM 0x4000
|
||||
#define EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE 0x8000
|
||||
#define EFI_PCI_IO_ATTRIBUTE_ISA_IO_16 0x10000
|
||||
#define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16 0x20000
|
||||
#define EFI_PCI_IO_ATTRIBUTE_VGA_IO_16 0x40000
|
||||
|
||||
struct efi_dev_path;
|
||||
|
||||
typedef union apple_properties_protocol apple_properties_protocol_t;
|
||||
|
||||
union apple_properties_protocol {
|
||||
struct {
|
||||
unsigned long version;
|
||||
efi_status_t (__efiapi *get)(apple_properties_protocol_t *,
|
||||
struct efi_dev_path *,
|
||||
efi_char16_t *, void *, u32 *);
|
||||
efi_status_t (__efiapi *set)(apple_properties_protocol_t *,
|
||||
struct efi_dev_path *,
|
||||
efi_char16_t *, void *, u32);
|
||||
efi_status_t (__efiapi *del)(apple_properties_protocol_t *,
|
||||
struct efi_dev_path *,
|
||||
efi_char16_t *);
|
||||
efi_status_t (__efiapi *get_all)(apple_properties_protocol_t *,
|
||||
void *buffer, u32 *);
|
||||
};
|
||||
struct {
|
||||
u32 version;
|
||||
u32 get;
|
||||
u32 set;
|
||||
u32 del;
|
||||
u32 get_all;
|
||||
} mixed_mode;
|
||||
};
|
||||
|
||||
typedef u32 efi_tcg2_event_log_format;
|
||||
|
||||
typedef union efi_tcg2_protocol efi_tcg2_protocol_t;
|
||||
|
||||
union efi_tcg2_protocol {
|
||||
struct {
|
||||
void *get_capability;
|
||||
efi_status_t (__efiapi *get_event_log)(efi_handle_t,
|
||||
efi_tcg2_event_log_format,
|
||||
efi_physical_addr_t *,
|
||||
efi_physical_addr_t *,
|
||||
efi_bool_t *);
|
||||
void *hash_log_extend_event;
|
||||
void *submit_command;
|
||||
void *get_active_pcr_banks;
|
||||
void *set_active_pcr_banks;
|
||||
void *get_result_of_set_active_pcr_banks;
|
||||
};
|
||||
struct {
|
||||
u32 get_capability;
|
||||
u32 get_event_log;
|
||||
u32 hash_log_extend_event;
|
||||
u32 submit_command;
|
||||
u32 get_active_pcr_banks;
|
||||
u32 set_active_pcr_banks;
|
||||
u32 get_result_of_set_active_pcr_banks;
|
||||
} mixed_mode;
|
||||
};
|
||||
typedef union efi_boot_services efi_boot_services_t;
|
||||
|
||||
/*
|
||||
* Types and defines for EFI ResetSystem
|
||||
|
|
@ -646,6 +332,9 @@ void efi_native_runtime_setup(void);
|
|||
#define EFI_CONSOLE_OUT_DEVICE_GUID EFI_GUID(0xd3b36f2c, 0xd551, 0x11d4, 0x9a, 0x46, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
|
||||
#define APPLE_PROPERTIES_PROTOCOL_GUID EFI_GUID(0x91bd12fe, 0xf6c3, 0x44fb, 0xa5, 0xb7, 0x51, 0x22, 0xab, 0x30, 0x3a, 0xe0)
|
||||
#define EFI_TCG2_PROTOCOL_GUID EFI_GUID(0x607f766c, 0x7455, 0x42be, 0x93, 0x0b, 0xe4, 0xd7, 0x6d, 0xb2, 0x72, 0x0f)
|
||||
#define EFI_LOAD_FILE_PROTOCOL_GUID EFI_GUID(0x56ec3091, 0x954c, 0x11d2, 0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
|
||||
#define EFI_LOAD_FILE2_PROTOCOL_GUID EFI_GUID(0x4006c0c1, 0xfcb3, 0x403e, 0x99, 0x6d, 0x4a, 0x6c, 0x87, 0x24, 0xe0, 0x6d)
|
||||
#define EFI_RT_PROPERTIES_TABLE_GUID EFI_GUID(0xeb66918a, 0x7eef, 0x402a, 0x84, 0x2e, 0x93, 0x1d, 0x21, 0xc3, 0x8a, 0xe9)
|
||||
|
||||
#define EFI_IMAGE_SECURITY_DATABASE_GUID EFI_GUID(0xd719b2cb, 0x3d3a, 0x4596, 0xa3, 0xbc, 0xda, 0xd0, 0x0e, 0x67, 0x65, 0x6f)
|
||||
#define EFI_SHIM_LOCK_GUID EFI_GUID(0x605dab50, 0xe046, 0x4300, 0xab, 0xb6, 0x3d, 0xd8, 0x10, 0xdd, 0x8b, 0x23)
|
||||
|
|
@ -665,6 +354,7 @@ void efi_native_runtime_setup(void);
|
|||
#define LINUX_EFI_TPM_EVENT_LOG_GUID EFI_GUID(0xb7799cb0, 0xeca2, 0x4943, 0x96, 0x67, 0x1f, 0xae, 0x07, 0xb7, 0x47, 0xfa)
|
||||
#define LINUX_EFI_TPM_FINAL_LOG_GUID EFI_GUID(0x1e2ed096, 0x30e2, 0x4254, 0xbd, 0x89, 0x86, 0x3b, 0xbe, 0xf8, 0x23, 0x25)
|
||||
#define LINUX_EFI_MEMRESERVE_TABLE_GUID EFI_GUID(0x888eb0c6, 0x8ede, 0x4ff5, 0xa8, 0xf0, 0x9a, 0xee, 0x5c, 0xb9, 0x77, 0xc2)
|
||||
#define LINUX_EFI_INITRD_MEDIA_GUID EFI_GUID(0x5568e427, 0x68fc, 0x4f3d, 0xac, 0x74, 0xca, 0x55, 0x52, 0x31, 0xcc, 0x68)
|
||||
|
||||
/* OEM GUIDs */
|
||||
#define DELLEMC_EFI_RCI2_TABLE_GUID EFI_GUID(0x2d9f28a2, 0xa886, 0x456a, 0x97, 0xa8, 0xf1, 0x1e, 0xf2, 0x4f, 0xf4, 0x55)
|
||||
|
|
@ -788,74 +478,6 @@ struct efi_mem_range {
|
|||
u64 attribute;
|
||||
};
|
||||
|
||||
struct efi_fdt_params {
|
||||
u64 system_table;
|
||||
u64 mmap;
|
||||
u32 mmap_size;
|
||||
u32 desc_size;
|
||||
u32 desc_ver;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
u32 revision;
|
||||
efi_handle_t parent_handle;
|
||||
efi_system_table_t *system_table;
|
||||
efi_handle_t device_handle;
|
||||
void *file_path;
|
||||
void *reserved;
|
||||
u32 load_options_size;
|
||||
void *load_options;
|
||||
void *image_base;
|
||||
__aligned_u64 image_size;
|
||||
unsigned int image_code_type;
|
||||
unsigned int image_data_type;
|
||||
efi_status_t ( __efiapi *unload)(efi_handle_t image_handle);
|
||||
} efi_loaded_image_t;
|
||||
|
||||
typedef struct {
|
||||
u64 size;
|
||||
u64 file_size;
|
||||
u64 phys_size;
|
||||
efi_time_t create_time;
|
||||
efi_time_t last_access_time;
|
||||
efi_time_t modification_time;
|
||||
__aligned_u64 attribute;
|
||||
efi_char16_t filename[1];
|
||||
} efi_file_info_t;
|
||||
|
||||
typedef struct efi_file_handle efi_file_handle_t;
|
||||
|
||||
struct efi_file_handle {
|
||||
u64 revision;
|
||||
efi_status_t (__efiapi *open)(efi_file_handle_t *,
|
||||
efi_file_handle_t **,
|
||||
efi_char16_t *, u64, u64);
|
||||
efi_status_t (__efiapi *close)(efi_file_handle_t *);
|
||||
void *delete;
|
||||
efi_status_t (__efiapi *read)(efi_file_handle_t *,
|
||||
unsigned long *, void *);
|
||||
void *write;
|
||||
void *get_position;
|
||||
void *set_position;
|
||||
efi_status_t (__efiapi *get_info)(efi_file_handle_t *,
|
||||
efi_guid_t *, unsigned long *,
|
||||
void *);
|
||||
void *set_info;
|
||||
void *flush;
|
||||
};
|
||||
|
||||
typedef struct efi_file_io_interface efi_file_io_interface_t;
|
||||
|
||||
struct efi_file_io_interface {
|
||||
u64 revision;
|
||||
int (__efiapi *open_volume)(efi_file_io_interface_t *,
|
||||
efi_file_handle_t **);
|
||||
};
|
||||
|
||||
#define EFI_FILE_MODE_READ 0x0000000000000001
|
||||
#define EFI_FILE_MODE_WRITE 0x0000000000000002
|
||||
#define EFI_FILE_MODE_CREATE 0x8000000000000000
|
||||
|
||||
typedef struct {
|
||||
u32 version;
|
||||
u32 length;
|
||||
|
|
@ -865,6 +487,14 @@ typedef struct {
|
|||
#define EFI_PROPERTIES_TABLE_VERSION 0x00010000
|
||||
#define EFI_PROPERTIES_RUNTIME_MEMORY_PROTECTION_NON_EXECUTABLE_PE_DATA 0x1
|
||||
|
||||
typedef struct {
|
||||
u16 version;
|
||||
u16 length;
|
||||
u32 runtime_services_supported;
|
||||
} efi_rt_properties_table_t;
|
||||
|
||||
#define EFI_RT_PROPERTIES_TABLE_VERSION 0x1
|
||||
|
||||
#define EFI_INVALID_TABLE_ADDR (~0UL)
|
||||
|
||||
typedef struct {
|
||||
|
|
@ -896,48 +526,63 @@ typedef struct {
|
|||
efi_time_t time_of_revocation;
|
||||
} efi_cert_x509_sha256_t;
|
||||
|
||||
extern unsigned long __ro_after_init efi_rng_seed; /* RNG Seed table */
|
||||
|
||||
/*
|
||||
* All runtime access to EFI goes through this structure:
|
||||
*/
|
||||
extern struct efi {
|
||||
efi_system_table_t *systab; /* EFI system table */
|
||||
unsigned int runtime_version; /* Runtime services version */
|
||||
unsigned long mps; /* MPS table */
|
||||
unsigned long acpi; /* ACPI table (IA64 ext 0.71) */
|
||||
unsigned long acpi20; /* ACPI table (ACPI 2.0) */
|
||||
unsigned long smbios; /* SMBIOS table (32 bit entry point) */
|
||||
unsigned long smbios3; /* SMBIOS table (64 bit entry point) */
|
||||
unsigned long boot_info; /* boot info table */
|
||||
unsigned long hcdp; /* HCDP table */
|
||||
unsigned long uga; /* UGA table */
|
||||
unsigned long fw_vendor; /* fw_vendor */
|
||||
unsigned long runtime; /* runtime table */
|
||||
unsigned long config_table; /* config tables */
|
||||
unsigned long esrt; /* ESRT table */
|
||||
unsigned long properties_table; /* properties table */
|
||||
unsigned long mem_attr_table; /* memory attributes table */
|
||||
unsigned long rng_seed; /* UEFI firmware random seed */
|
||||
unsigned long tpm_log; /* TPM2 Event Log table */
|
||||
unsigned long tpm_final_log; /* TPM2 Final Events Log table */
|
||||
unsigned long mem_reserve; /* Linux EFI memreserve table */
|
||||
efi_get_time_t *get_time;
|
||||
efi_set_time_t *set_time;
|
||||
efi_get_wakeup_time_t *get_wakeup_time;
|
||||
efi_set_wakeup_time_t *set_wakeup_time;
|
||||
efi_get_variable_t *get_variable;
|
||||
efi_get_next_variable_t *get_next_variable;
|
||||
efi_set_variable_t *set_variable;
|
||||
efi_set_variable_t *set_variable_nonblocking;
|
||||
efi_query_variable_info_t *query_variable_info;
|
||||
efi_query_variable_info_t *query_variable_info_nonblocking;
|
||||
efi_update_capsule_t *update_capsule;
|
||||
efi_query_capsule_caps_t *query_capsule_caps;
|
||||
efi_get_next_high_mono_count_t *get_next_high_mono_count;
|
||||
efi_reset_system_t *reset_system;
|
||||
struct efi_memory_map memmap;
|
||||
unsigned long flags;
|
||||
const efi_runtime_services_t *runtime; /* EFI runtime services table */
|
||||
unsigned int runtime_version; /* Runtime services version */
|
||||
unsigned int runtime_supported_mask;
|
||||
|
||||
unsigned long acpi; /* ACPI table (IA64 ext 0.71) */
|
||||
unsigned long acpi20; /* ACPI table (ACPI 2.0) */
|
||||
unsigned long smbios; /* SMBIOS table (32 bit entry point) */
|
||||
unsigned long smbios3; /* SMBIOS table (64 bit entry point) */
|
||||
unsigned long esrt; /* ESRT table */
|
||||
unsigned long tpm_log; /* TPM2 Event Log table */
|
||||
unsigned long tpm_final_log; /* TPM2 Final Events Log table */
|
||||
|
||||
efi_get_time_t *get_time;
|
||||
efi_set_time_t *set_time;
|
||||
efi_get_wakeup_time_t *get_wakeup_time;
|
||||
efi_set_wakeup_time_t *set_wakeup_time;
|
||||
efi_get_variable_t *get_variable;
|
||||
efi_get_next_variable_t *get_next_variable;
|
||||
efi_set_variable_t *set_variable;
|
||||
efi_set_variable_t *set_variable_nonblocking;
|
||||
efi_query_variable_info_t *query_variable_info;
|
||||
efi_query_variable_info_t *query_variable_info_nonblocking;
|
||||
efi_update_capsule_t *update_capsule;
|
||||
efi_query_capsule_caps_t *query_capsule_caps;
|
||||
efi_get_next_high_mono_count_t *get_next_high_mono_count;
|
||||
efi_reset_system_t *reset_system;
|
||||
|
||||
struct efi_memory_map memmap;
|
||||
unsigned long flags;
|
||||
} efi;
|
||||
|
||||
#define EFI_RT_SUPPORTED_GET_TIME 0x0001
|
||||
#define EFI_RT_SUPPORTED_SET_TIME 0x0002
|
||||
#define EFI_RT_SUPPORTED_GET_WAKEUP_TIME 0x0004
|
||||
#define EFI_RT_SUPPORTED_SET_WAKEUP_TIME 0x0008
|
||||
#define EFI_RT_SUPPORTED_GET_VARIABLE 0x0010
|
||||
#define EFI_RT_SUPPORTED_GET_NEXT_VARIABLE_NAME 0x0020
|
||||
#define EFI_RT_SUPPORTED_SET_VARIABLE 0x0040
|
||||
#define EFI_RT_SUPPORTED_SET_VIRTUAL_ADDRESS_MAP 0x0080
|
||||
#define EFI_RT_SUPPORTED_CONVERT_POINTER 0x0100
|
||||
#define EFI_RT_SUPPORTED_GET_NEXT_HIGH_MONOTONIC_COUNT 0x0200
|
||||
#define EFI_RT_SUPPORTED_RESET_SYSTEM 0x0400
|
||||
#define EFI_RT_SUPPORTED_UPDATE_CAPSULE 0x0800
|
||||
#define EFI_RT_SUPPORTED_QUERY_CAPSULE_CAPABILITIES 0x1000
|
||||
#define EFI_RT_SUPPORTED_QUERY_VARIABLE_INFO 0x2000
|
||||
|
||||
#define EFI_RT_SUPPORTED_ALL 0x3fff
|
||||
|
||||
#define EFI_RT_SUPPORTED_TIME_SERVICES 0x000f
|
||||
#define EFI_RT_SUPPORTED_VARIABLE_SERVICES 0x0070
|
||||
|
||||
extern struct mm_struct efi_mm;
|
||||
|
||||
static inline int
|
||||
|
|
@ -987,14 +632,18 @@ extern int __init efi_memmap_split_count(efi_memory_desc_t *md,
|
|||
extern void __init efi_memmap_insert(struct efi_memory_map *old_memmap,
|
||||
void *buf, struct efi_mem_range *mem);
|
||||
|
||||
extern int efi_config_init(efi_config_table_type_t *arch_tables);
|
||||
#ifdef CONFIG_EFI_ESRT
|
||||
extern void __init efi_esrt_init(void);
|
||||
#else
|
||||
static inline void efi_esrt_init(void) { }
|
||||
#endif
|
||||
extern int efi_config_parse_tables(void *config_tables, int count, int sz,
|
||||
efi_config_table_type_t *arch_tables);
|
||||
extern int efi_config_parse_tables(const efi_config_table_t *config_tables,
|
||||
int count,
|
||||
const efi_config_table_type_t *arch_tables);
|
||||
extern int efi_systab_check_header(const efi_table_hdr_t *systab_hdr,
|
||||
int min_major_version);
|
||||
extern void efi_systab_report_header(const efi_table_hdr_t *systab_hdr,
|
||||
unsigned long fw_vendor);
|
||||
extern u64 efi_get_iobase (void);
|
||||
extern int efi_mem_type(unsigned long phys_addr);
|
||||
extern u64 efi_mem_attributes (unsigned long phys_addr);
|
||||
|
|
@ -1006,7 +655,7 @@ extern void efi_mem_reserve(phys_addr_t addr, u64 size);
|
|||
extern int efi_mem_reserve_persistent(phys_addr_t addr, u64 size);
|
||||
extern void efi_initialize_iomem_resources(struct resource *code_resource,
|
||||
struct resource *data_resource, struct resource *bss_resource);
|
||||
extern int efi_get_fdt_params(struct efi_fdt_params *params);
|
||||
extern u64 efi_get_fdt_params(struct efi_memory_map_data *data);
|
||||
extern struct kobject *efi_kobj;
|
||||
|
||||
extern int efi_reboot_quirk_mode;
|
||||
|
|
@ -1018,6 +667,8 @@ extern void __init efi_fake_memmap(void);
|
|||
static inline void efi_fake_memmap(void) { }
|
||||
#endif
|
||||
|
||||
extern unsigned long efi_mem_attr_table;
|
||||
|
||||
/*
|
||||
* efi_memattr_perm_setter - arch specific callback function passed into
|
||||
* efi_memattr_apply_permissions() that updates the
|
||||
|
|
@ -1124,6 +775,7 @@ extern int __init efi_setup_pcdp_console(char *);
|
|||
#define EFI_NX_PE_DATA 9 /* Can runtime data regions be mapped non-executable? */
|
||||
#define EFI_MEM_ATTR 10 /* Did firmware publish an EFI_MEMORY_ATTRIBUTES table? */
|
||||
#define EFI_MEM_NO_SOFT_RESERVE 11 /* Is the kernel configured to ignore soft reservations? */
|
||||
#define EFI_PRESERVE_BS_REGIONS 12 /* Are EFI boot-services memory segments available? */
|
||||
|
||||
#ifdef CONFIG_EFI
|
||||
/*
|
||||
|
|
@ -1142,6 +794,11 @@ static inline bool __pure efi_soft_reserve_enabled(void)
|
|||
return IS_ENABLED(CONFIG_EFI_SOFT_RESERVE)
|
||||
&& __efi_soft_reserve_enabled();
|
||||
}
|
||||
|
||||
static inline bool efi_rt_services_supported(unsigned int mask)
|
||||
{
|
||||
return (efi.runtime_supported_mask & mask) == mask;
|
||||
}
|
||||
#else
|
||||
static inline bool efi_enabled(int feature)
|
||||
{
|
||||
|
|
@ -1160,6 +817,11 @@ static inline bool efi_soft_reserve_enabled(void)
|
|||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool efi_rt_services_supported(unsigned int mask)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
extern int efi_status_to_err(efi_status_t status);
|
||||
|
|
@ -1188,13 +850,6 @@ extern int efi_status_to_err(efi_status_t status);
|
|||
*/
|
||||
#define EFI_VARIABLE_GUID_LEN UUID_STRING_LEN
|
||||
|
||||
/*
|
||||
* The type of search to perform when calling boottime->locate_handle
|
||||
*/
|
||||
#define EFI_LOCATE_ALL_HANDLES 0
|
||||
#define EFI_LOCATE_BY_REGISTER_NOTIFY 1
|
||||
#define EFI_LOCATE_BY_PROTOCOL 2
|
||||
|
||||
/*
|
||||
* EFI Device Path information
|
||||
*/
|
||||
|
|
@ -1234,30 +889,40 @@ extern int efi_status_to_err(efi_status_t status);
|
|||
#define EFI_DEV_END_ENTIRE 0xFF
|
||||
|
||||
struct efi_generic_dev_path {
|
||||
u8 type;
|
||||
u8 sub_type;
|
||||
u16 length;
|
||||
} __attribute ((packed));
|
||||
u8 type;
|
||||
u8 sub_type;
|
||||
u16 length;
|
||||
} __packed;
|
||||
|
||||
struct efi_acpi_dev_path {
|
||||
struct efi_generic_dev_path header;
|
||||
u32 hid;
|
||||
u32 uid;
|
||||
} __packed;
|
||||
|
||||
struct efi_pci_dev_path {
|
||||
struct efi_generic_dev_path header;
|
||||
u8 fn;
|
||||
u8 dev;
|
||||
} __packed;
|
||||
|
||||
struct efi_vendor_dev_path {
|
||||
struct efi_generic_dev_path header;
|
||||
efi_guid_t vendorguid;
|
||||
u8 vendordata[];
|
||||
} __packed;
|
||||
|
||||
struct efi_dev_path {
|
||||
u8 type; /* can be replaced with unnamed */
|
||||
u8 sub_type; /* struct efi_generic_dev_path; */
|
||||
u16 length; /* once we've moved to -std=c11 */
|
||||
union {
|
||||
struct {
|
||||
u32 hid;
|
||||
u32 uid;
|
||||
} acpi;
|
||||
struct {
|
||||
u8 fn;
|
||||
u8 dev;
|
||||
} pci;
|
||||
struct efi_generic_dev_path header;
|
||||
struct efi_acpi_dev_path acpi;
|
||||
struct efi_pci_dev_path pci;
|
||||
struct efi_vendor_dev_path vendor;
|
||||
};
|
||||
} __attribute ((packed));
|
||||
} __packed;
|
||||
|
||||
#if IS_ENABLED(CONFIG_EFI_DEV_PATH_PARSER)
|
||||
struct device *efi_get_device_by_path(struct efi_dev_path **node, size_t *len);
|
||||
#endif
|
||||
struct device *efi_get_device_by_path(const struct efi_dev_path **node,
|
||||
size_t *len);
|
||||
|
||||
static inline void memrange_efi_to_native(u64 *addr, u64 *npages)
|
||||
{
|
||||
|
|
@ -1312,80 +977,6 @@ struct efivar_entry {
|
|||
bool deleting;
|
||||
};
|
||||
|
||||
union efi_simple_text_output_protocol {
|
||||
struct {
|
||||
void *reset;
|
||||
efi_status_t (__efiapi *output_string)(efi_simple_text_output_protocol_t *,
|
||||
efi_char16_t *);
|
||||
void *test_string;
|
||||
};
|
||||
struct {
|
||||
u32 reset;
|
||||
u32 output_string;
|
||||
u32 test_string;
|
||||
} mixed_mode;
|
||||
};
|
||||
|
||||
#define PIXEL_RGB_RESERVED_8BIT_PER_COLOR 0
|
||||
#define PIXEL_BGR_RESERVED_8BIT_PER_COLOR 1
|
||||
#define PIXEL_BIT_MASK 2
|
||||
#define PIXEL_BLT_ONLY 3
|
||||
#define PIXEL_FORMAT_MAX 4
|
||||
|
||||
typedef struct {
|
||||
u32 red_mask;
|
||||
u32 green_mask;
|
||||
u32 blue_mask;
|
||||
u32 reserved_mask;
|
||||
} efi_pixel_bitmask_t;
|
||||
|
||||
typedef struct {
|
||||
u32 version;
|
||||
u32 horizontal_resolution;
|
||||
u32 vertical_resolution;
|
||||
int pixel_format;
|
||||
efi_pixel_bitmask_t pixel_information;
|
||||
u32 pixels_per_scan_line;
|
||||
} efi_graphics_output_mode_info_t;
|
||||
|
||||
typedef union efi_graphics_output_protocol_mode efi_graphics_output_protocol_mode_t;
|
||||
|
||||
union efi_graphics_output_protocol_mode {
|
||||
struct {
|
||||
u32 max_mode;
|
||||
u32 mode;
|
||||
efi_graphics_output_mode_info_t *info;
|
||||
unsigned long size_of_info;
|
||||
efi_physical_addr_t frame_buffer_base;
|
||||
unsigned long frame_buffer_size;
|
||||
};
|
||||
struct {
|
||||
u32 max_mode;
|
||||
u32 mode;
|
||||
u32 info;
|
||||
u32 size_of_info;
|
||||
u64 frame_buffer_base;
|
||||
u32 frame_buffer_size;
|
||||
} mixed_mode;
|
||||
};
|
||||
|
||||
typedef union efi_graphics_output_protocol efi_graphics_output_protocol_t;
|
||||
|
||||
union efi_graphics_output_protocol {
|
||||
struct {
|
||||
void *query_mode;
|
||||
void *set_mode;
|
||||
void *blt;
|
||||
efi_graphics_output_protocol_mode_t *mode;
|
||||
};
|
||||
struct {
|
||||
u32 query_mode;
|
||||
u32 set_mode;
|
||||
u32 blt;
|
||||
u32 mode;
|
||||
} mixed_mode;
|
||||
};
|
||||
|
||||
extern struct list_head efivar_sysfs_list;
|
||||
|
||||
static inline void
|
||||
|
|
@ -1483,52 +1074,6 @@ static inline int efi_runtime_map_copy(void *buf, size_t bufsz)
|
|||
|
||||
#endif
|
||||
|
||||
/* prototypes shared between arch specific and generic stub code */
|
||||
|
||||
void efi_printk(char *str);
|
||||
|
||||
void efi_free(unsigned long size, unsigned long addr);
|
||||
|
||||
char *efi_convert_cmdline(efi_loaded_image_t *image, int *cmd_line_len);
|
||||
|
||||
efi_status_t efi_get_memory_map(struct efi_boot_memmap *map);
|
||||
|
||||
efi_status_t efi_low_alloc_above(unsigned long size, unsigned long align,
|
||||
unsigned long *addr, unsigned long min);
|
||||
|
||||
static inline
|
||||
efi_status_t efi_low_alloc(unsigned long size, unsigned long align,
|
||||
unsigned long *addr)
|
||||
{
|
||||
/*
|
||||
* Don't allocate at 0x0. It will confuse code that
|
||||
* checks pointers against NULL. Skip the first 8
|
||||
* bytes so we start at a nice even number.
|
||||
*/
|
||||
return efi_low_alloc_above(size, align, addr, 0x8);
|
||||
}
|
||||
|
||||
efi_status_t efi_high_alloc(unsigned long size, unsigned long align,
|
||||
unsigned long *addr, unsigned long max);
|
||||
|
||||
efi_status_t efi_relocate_kernel(unsigned long *image_addr,
|
||||
unsigned long image_size,
|
||||
unsigned long alloc_size,
|
||||
unsigned long preferred_addr,
|
||||
unsigned long alignment,
|
||||
unsigned long min_addr);
|
||||
|
||||
efi_status_t handle_cmdline_files(efi_loaded_image_t *image,
|
||||
char *cmd_line, char *option_string,
|
||||
unsigned long max_addr,
|
||||
unsigned long *load_addr,
|
||||
unsigned long *load_size);
|
||||
|
||||
efi_status_t efi_parse_options(char const *cmdline);
|
||||
|
||||
efi_status_t efi_setup_gop(struct screen_info *si, efi_guid_t *proto,
|
||||
unsigned long size);
|
||||
|
||||
#ifdef CONFIG_EFI
|
||||
extern bool efi_runtime_disabled(void);
|
||||
#else
|
||||
|
|
@ -1553,6 +1098,12 @@ static inline void
|
|||
efi_enable_reset_attack_mitigation(void) { }
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_EFI_EMBEDDED_FIRMWARE
|
||||
void efi_check_for_embedded_firmwares(void);
|
||||
#else
|
||||
static inline void efi_check_for_embedded_firmwares(void) { }
|
||||
#endif
|
||||
|
||||
efi_status_t efi_random_get_seed(void);
|
||||
|
||||
void efi_retrieve_tpm2_eventlog(void);
|
||||
|
|
@ -1606,15 +1157,6 @@ void efi_retrieve_tpm2_eventlog(void);
|
|||
arch_efi_call_virt_teardown(); \
|
||||
})
|
||||
|
||||
typedef efi_status_t (*efi_exit_boot_map_processing)(
|
||||
struct efi_boot_memmap *map,
|
||||
void *priv);
|
||||
|
||||
efi_status_t efi_exit_boot_services(void *handle,
|
||||
struct efi_boot_memmap *map,
|
||||
void *priv,
|
||||
efi_exit_boot_map_processing priv_func);
|
||||
|
||||
#define EFI_RANDOM_SEED_SIZE 64U
|
||||
|
||||
struct linux_efi_random_seed {
|
||||
|
|
@ -1701,6 +1243,6 @@ struct linux_efi_memreserve {
|
|||
#define EFI_MEMRESERVE_COUNT(size) (((size) - sizeof(struct linux_efi_memreserve)) \
|
||||
/ sizeof(((struct linux_efi_memreserve *)0)->entry[0]))
|
||||
|
||||
void efi_pci_disable_bridge_busmaster(void);
|
||||
void __init efi_arch_mem_reserve(phys_addr_t addr, u64 size);
|
||||
|
||||
#endif /* _LINUX_EFI_H */
|
||||
|
|
|
|||
43
include/linux/efi_embedded_fw.h
Normal file
43
include/linux/efi_embedded_fw.h
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _LINUX_EFI_EMBEDDED_FW_H
|
||||
#define _LINUX_EFI_EMBEDDED_FW_H
|
||||
|
||||
#include <linux/list.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
|
||||
#define EFI_EMBEDDED_FW_PREFIX_LEN 8
|
||||
|
||||
/*
|
||||
* This struct and efi_embedded_fw_list are private to the efi-embedded fw
|
||||
* implementation they are in this header for use by lib/test_firmware.c only!
|
||||
*/
|
||||
struct efi_embedded_fw {
|
||||
struct list_head list;
|
||||
const char *name;
|
||||
const u8 *data;
|
||||
size_t length;
|
||||
};
|
||||
|
||||
extern struct list_head efi_embedded_fw_list;
|
||||
|
||||
/**
|
||||
* struct efi_embedded_fw_desc - This struct is used by the EFI embedded-fw
|
||||
* code to search for embedded firmwares.
|
||||
*
|
||||
* @name: Name to register the firmware with if found
|
||||
* @prefix: First 8 bytes of the firmware
|
||||
* @length: Length of the firmware in bytes including prefix
|
||||
* @sha256: SHA256 of the firmware
|
||||
*/
|
||||
struct efi_embedded_fw_desc {
|
||||
const char *name;
|
||||
u8 prefix[EFI_EMBEDDED_FW_PREFIX_LEN];
|
||||
u32 length;
|
||||
u8 sha256[32];
|
||||
};
|
||||
|
||||
extern const struct dmi_system_id touchscreen_dmi_table[];
|
||||
|
||||
int efi_get_embedded_fw(const char *name, const u8 **dat, size_t *sz);
|
||||
|
||||
#endif
|
||||
|
|
@ -59,7 +59,7 @@
|
|||
ELFNOTE_END
|
||||
|
||||
#else /* !__ASSEMBLER__ */
|
||||
#include <linux/elf.h>
|
||||
#include <uapi/linux/elf.h>
|
||||
/*
|
||||
* Use an anonymous structure which matches the shape of
|
||||
* Elf{32,64}_Nhdr, but includes the name and desc data. The size and
|
||||
|
|
|
|||
|
|
@ -62,9 +62,6 @@ static inline int __must_check PTR_ERR_OR_ZERO(__force const void *ptr)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* Deprecated */
|
||||
#define PTR_RET(p) PTR_ERR_OR_ZERO(p)
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* _LINUX_ERR_H */
|
||||
|
|
|
|||
|
|
@ -177,8 +177,57 @@ void ethtool_convert_legacy_u32_to_link_mode(unsigned long *dst,
|
|||
bool ethtool_convert_link_mode_to_legacy_u32(u32 *legacy_u32,
|
||||
const unsigned long *src);
|
||||
|
||||
#define ETHTOOL_COALESCE_RX_USECS BIT(0)
|
||||
#define ETHTOOL_COALESCE_RX_MAX_FRAMES BIT(1)
|
||||
#define ETHTOOL_COALESCE_RX_USECS_IRQ BIT(2)
|
||||
#define ETHTOOL_COALESCE_RX_MAX_FRAMES_IRQ BIT(3)
|
||||
#define ETHTOOL_COALESCE_TX_USECS BIT(4)
|
||||
#define ETHTOOL_COALESCE_TX_MAX_FRAMES BIT(5)
|
||||
#define ETHTOOL_COALESCE_TX_USECS_IRQ BIT(6)
|
||||
#define ETHTOOL_COALESCE_TX_MAX_FRAMES_IRQ BIT(7)
|
||||
#define ETHTOOL_COALESCE_STATS_BLOCK_USECS BIT(8)
|
||||
#define ETHTOOL_COALESCE_USE_ADAPTIVE_RX BIT(9)
|
||||
#define ETHTOOL_COALESCE_USE_ADAPTIVE_TX BIT(10)
|
||||
#define ETHTOOL_COALESCE_PKT_RATE_LOW BIT(11)
|
||||
#define ETHTOOL_COALESCE_RX_USECS_LOW BIT(12)
|
||||
#define ETHTOOL_COALESCE_RX_MAX_FRAMES_LOW BIT(13)
|
||||
#define ETHTOOL_COALESCE_TX_USECS_LOW BIT(14)
|
||||
#define ETHTOOL_COALESCE_TX_MAX_FRAMES_LOW BIT(15)
|
||||
#define ETHTOOL_COALESCE_PKT_RATE_HIGH BIT(16)
|
||||
#define ETHTOOL_COALESCE_RX_USECS_HIGH BIT(17)
|
||||
#define ETHTOOL_COALESCE_RX_MAX_FRAMES_HIGH BIT(18)
|
||||
#define ETHTOOL_COALESCE_TX_USECS_HIGH BIT(19)
|
||||
#define ETHTOOL_COALESCE_TX_MAX_FRAMES_HIGH BIT(20)
|
||||
#define ETHTOOL_COALESCE_RATE_SAMPLE_INTERVAL BIT(21)
|
||||
|
||||
#define ETHTOOL_COALESCE_USECS \
|
||||
(ETHTOOL_COALESCE_RX_USECS | ETHTOOL_COALESCE_TX_USECS)
|
||||
#define ETHTOOL_COALESCE_MAX_FRAMES \
|
||||
(ETHTOOL_COALESCE_RX_MAX_FRAMES | ETHTOOL_COALESCE_TX_MAX_FRAMES)
|
||||
#define ETHTOOL_COALESCE_USECS_IRQ \
|
||||
(ETHTOOL_COALESCE_RX_USECS_IRQ | ETHTOOL_COALESCE_TX_USECS_IRQ)
|
||||
#define ETHTOOL_COALESCE_MAX_FRAMES_IRQ \
|
||||
(ETHTOOL_COALESCE_RX_MAX_FRAMES_IRQ | \
|
||||
ETHTOOL_COALESCE_TX_MAX_FRAMES_IRQ)
|
||||
#define ETHTOOL_COALESCE_USE_ADAPTIVE \
|
||||
(ETHTOOL_COALESCE_USE_ADAPTIVE_RX | ETHTOOL_COALESCE_USE_ADAPTIVE_TX)
|
||||
#define ETHTOOL_COALESCE_USECS_LOW_HIGH \
|
||||
(ETHTOOL_COALESCE_RX_USECS_LOW | ETHTOOL_COALESCE_TX_USECS_LOW | \
|
||||
ETHTOOL_COALESCE_RX_USECS_HIGH | ETHTOOL_COALESCE_TX_USECS_HIGH)
|
||||
#define ETHTOOL_COALESCE_MAX_FRAMES_LOW_HIGH \
|
||||
(ETHTOOL_COALESCE_RX_MAX_FRAMES_LOW | \
|
||||
ETHTOOL_COALESCE_TX_MAX_FRAMES_LOW | \
|
||||
ETHTOOL_COALESCE_RX_MAX_FRAMES_HIGH | \
|
||||
ETHTOOL_COALESCE_TX_MAX_FRAMES_HIGH)
|
||||
#define ETHTOOL_COALESCE_PKT_RATE_RX_USECS \
|
||||
(ETHTOOL_COALESCE_USE_ADAPTIVE_RX | \
|
||||
ETHTOOL_COALESCE_RX_USECS_LOW | ETHTOOL_COALESCE_RX_USECS_HIGH | \
|
||||
ETHTOOL_COALESCE_PKT_RATE_LOW | ETHTOOL_COALESCE_PKT_RATE_HIGH | \
|
||||
ETHTOOL_COALESCE_RATE_SAMPLE_INTERVAL)
|
||||
|
||||
/**
|
||||
* struct ethtool_ops - optional netdev operations
|
||||
* @supported_coalesce_params: supported types of interrupt coalescing.
|
||||
* @get_drvinfo: Report driver/device information. Should only set the
|
||||
* @driver, @version, @fw_version and @bus_info fields. If not
|
||||
* implemented, the @driver and @bus_info fields will be filled in
|
||||
|
|
@ -207,8 +256,9 @@ bool ethtool_convert_link_mode_to_legacy_u32(u32 *legacy_u32,
|
|||
* or zero.
|
||||
* @get_coalesce: Get interrupt coalescing parameters. Returns a negative
|
||||
* error code or zero.
|
||||
* @set_coalesce: Set interrupt coalescing parameters. Returns a negative
|
||||
* error code or zero.
|
||||
* @set_coalesce: Set interrupt coalescing parameters. Supported coalescing
|
||||
* types should be set in @supported_coalesce_params.
|
||||
* Returns a negative error code or zero.
|
||||
* @get_ringparam: Report ring sizes
|
||||
* @set_ringparam: Set ring sizes. Returns a negative error code or zero.
|
||||
* @get_pauseparam: Report pause parameters
|
||||
|
|
@ -292,7 +342,8 @@ bool ethtool_convert_link_mode_to_legacy_u32(u32 *legacy_u32,
|
|||
* @set_per_queue_coalesce: Set interrupt coalescing parameters per queue.
|
||||
* It must check that the given queue number is valid. If neither a RX nor
|
||||
* a TX queue has this number, return -EINVAL. If only a RX queue or a TX
|
||||
* queue has this number, ignore the inapplicable fields.
|
||||
* queue has this number, ignore the inapplicable fields. Supported
|
||||
* coalescing types should be set in @supported_coalesce_params.
|
||||
* Returns a negative error code or zero.
|
||||
* @get_link_ksettings: Get various device settings including Ethernet link
|
||||
* settings. The %cmd and %link_mode_masks_nwords fields should be
|
||||
|
|
@ -323,6 +374,7 @@ bool ethtool_convert_link_mode_to_legacy_u32(u32 *legacy_u32,
|
|||
* of the generic netdev features interface.
|
||||
*/
|
||||
struct ethtool_ops {
|
||||
u32 supported_coalesce_params;
|
||||
void (*get_drvinfo)(struct net_device *, struct ethtool_drvinfo *);
|
||||
int (*get_regs_len)(struct net_device *);
|
||||
void (*get_regs)(struct net_device *, struct ethtool_regs *, void *);
|
||||
|
|
@ -406,6 +458,8 @@ struct ethtool_ops {
|
|||
struct ethtool_stats *, u64 *);
|
||||
};
|
||||
|
||||
int ethtool_check_ops(const struct ethtool_ops *ops);
|
||||
|
||||
struct ethtool_rx_flow_rule {
|
||||
struct flow_rule *rule;
|
||||
unsigned long priv[0];
|
||||
|
|
@ -420,4 +474,10 @@ struct ethtool_rx_flow_rule *
|
|||
ethtool_rx_flow_rule_create(const struct ethtool_rx_flow_spec_input *input);
|
||||
void ethtool_rx_flow_rule_destroy(struct ethtool_rx_flow_rule *rule);
|
||||
|
||||
bool ethtool_virtdev_validate_cmd(const struct ethtool_link_ksettings *cmd);
|
||||
int ethtool_virtdev_set_link_ksettings(struct net_device *dev,
|
||||
const struct ethtool_link_ksettings *cmd,
|
||||
u32 *dev_speed, u8 *dev_duplex);
|
||||
|
||||
|
||||
#endif /* _LINUX_ETHTOOL_H */
|
||||
|
|
|
|||
|
|
@ -17,30 +17,30 @@ struct extcon_dev;
|
|||
#if IS_ENABLED(CONFIG_EXTCON)
|
||||
|
||||
/* Following APIs register/unregister the extcon device. */
|
||||
extern int extcon_dev_register(struct extcon_dev *edev);
|
||||
extern void extcon_dev_unregister(struct extcon_dev *edev);
|
||||
extern int devm_extcon_dev_register(struct device *dev,
|
||||
int extcon_dev_register(struct extcon_dev *edev);
|
||||
void extcon_dev_unregister(struct extcon_dev *edev);
|
||||
int devm_extcon_dev_register(struct device *dev,
|
||||
struct extcon_dev *edev);
|
||||
extern void devm_extcon_dev_unregister(struct device *dev,
|
||||
void devm_extcon_dev_unregister(struct device *dev,
|
||||
struct extcon_dev *edev);
|
||||
|
||||
/* Following APIs allocate/free the memory of the extcon device. */
|
||||
extern struct extcon_dev *extcon_dev_allocate(const unsigned int *cable);
|
||||
extern void extcon_dev_free(struct extcon_dev *edev);
|
||||
extern struct extcon_dev *devm_extcon_dev_allocate(struct device *dev,
|
||||
struct extcon_dev *extcon_dev_allocate(const unsigned int *cable);
|
||||
void extcon_dev_free(struct extcon_dev *edev);
|
||||
struct extcon_dev *devm_extcon_dev_allocate(struct device *dev,
|
||||
const unsigned int *cable);
|
||||
extern void devm_extcon_dev_free(struct device *dev, struct extcon_dev *edev);
|
||||
void devm_extcon_dev_free(struct device *dev, struct extcon_dev *edev);
|
||||
|
||||
/* Synchronize the state and property value for each external connector. */
|
||||
extern int extcon_sync(struct extcon_dev *edev, unsigned int id);
|
||||
int extcon_sync(struct extcon_dev *edev, unsigned int id);
|
||||
|
||||
/*
|
||||
* Following APIs set the connected state of each external connector.
|
||||
* The 'id' argument indicates the defined external connector.
|
||||
*/
|
||||
extern int extcon_set_state(struct extcon_dev *edev, unsigned int id,
|
||||
int extcon_set_state(struct extcon_dev *edev, unsigned int id,
|
||||
bool state);
|
||||
extern int extcon_set_state_sync(struct extcon_dev *edev, unsigned int id,
|
||||
int extcon_set_state_sync(struct extcon_dev *edev, unsigned int id,
|
||||
bool state);
|
||||
|
||||
/*
|
||||
|
|
@ -52,13 +52,13 @@ extern int extcon_set_state_sync(struct extcon_dev *edev, unsigned int id,
|
|||
* for each external connector. They are used to set the capability of the
|
||||
* property of each external connector based on the id and property.
|
||||
*/
|
||||
extern int extcon_set_property(struct extcon_dev *edev, unsigned int id,
|
||||
int extcon_set_property(struct extcon_dev *edev, unsigned int id,
|
||||
unsigned int prop,
|
||||
union extcon_property_value prop_val);
|
||||
extern int extcon_set_property_sync(struct extcon_dev *edev, unsigned int id,
|
||||
int extcon_set_property_sync(struct extcon_dev *edev, unsigned int id,
|
||||
unsigned int prop,
|
||||
union extcon_property_value prop_val);
|
||||
extern int extcon_set_property_capability(struct extcon_dev *edev,
|
||||
int extcon_set_property_capability(struct extcon_dev *edev,
|
||||
unsigned int id, unsigned int prop);
|
||||
|
||||
#else /* CONFIG_EXTCON */
|
||||
|
|
|
|||
|
|
@ -286,6 +286,11 @@ static inline struct extcon_dev *extcon_get_edev_by_phandle(struct device *dev,
|
|||
{
|
||||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
|
||||
static inline const char *extcon_get_edev_name(struct extcon_dev *edev)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
#endif /* CONFIG_EXTCON */
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -125,6 +125,7 @@ struct f2fs_super_block {
|
|||
/*
|
||||
* For checkpoint
|
||||
*/
|
||||
#define CP_RESIZEFS_FLAG 0x00004000
|
||||
#define CP_DISABLED_QUICK_FLAG 0x00002000
|
||||
#define CP_DISABLED_FLAG 0x00001000
|
||||
#define CP_QUOTA_NEED_FSCK_FLAG 0x00000800
|
||||
|
|
|
|||
|
|
@ -47,7 +47,8 @@
|
|||
* Directory entry modification events - reported only to directory
|
||||
* where entry is modified and not to a watching parent.
|
||||
*/
|
||||
#define FANOTIFY_DIRENT_EVENTS (FAN_MOVE | FAN_CREATE | FAN_DELETE)
|
||||
#define FANOTIFY_DIRENT_EVENTS (FAN_MOVE | FAN_CREATE | FAN_DELETE | \
|
||||
FAN_DIR_MODIFY)
|
||||
|
||||
/* Events that can only be reported with data type FSNOTIFY_EVENT_INODE */
|
||||
#define FANOTIFY_INODE_EVENTS (FANOTIFY_DIRENT_EVENTS | \
|
||||
|
|
|
|||
|
|
@ -85,6 +85,7 @@ extern int f_dupfd(unsigned int from, struct file *file, unsigned flags);
|
|||
extern int replace_fd(unsigned fd, struct file *file, unsigned flags);
|
||||
extern void set_close_on_exec(unsigned int fd, int flag);
|
||||
extern bool get_close_on_exec(unsigned int fd);
|
||||
extern int __get_unused_fd_flags(unsigned flags, unsigned long nofile);
|
||||
extern int get_unused_fd_flags(unsigned flags);
|
||||
extern void put_unused_fd(unsigned int fd);
|
||||
|
||||
|
|
|
|||
|
|
@ -561,7 +561,7 @@ DECLARE_STATIC_KEY_FALSE(bpf_stats_enabled_key);
|
|||
|
||||
#define __BPF_PROG_RUN(prog, ctx, dfunc) ({ \
|
||||
u32 ret; \
|
||||
cant_sleep(); \
|
||||
cant_migrate(); \
|
||||
if (static_branch_unlikely(&bpf_stats_enabled_key)) { \
|
||||
struct bpf_prog_stats *stats; \
|
||||
u64 start = sched_clock(); \
|
||||
|
|
@ -576,8 +576,30 @@ DECLARE_STATIC_KEY_FALSE(bpf_stats_enabled_key);
|
|||
} \
|
||||
ret; })
|
||||
|
||||
#define BPF_PROG_RUN(prog, ctx) __BPF_PROG_RUN(prog, ctx, \
|
||||
bpf_dispatcher_nopfunc)
|
||||
#define BPF_PROG_RUN(prog, ctx) \
|
||||
__BPF_PROG_RUN(prog, ctx, bpf_dispatcher_nop_func)
|
||||
|
||||
/*
|
||||
* Use in preemptible and therefore migratable context to make sure that
|
||||
* the execution of the BPF program runs on one CPU.
|
||||
*
|
||||
* This uses migrate_disable/enable() explicitly to document that the
|
||||
* invocation of a BPF program does not require reentrancy protection
|
||||
* against a BPF program which is invoked from a preempting task.
|
||||
*
|
||||
* For non RT enabled kernels migrate_disable/enable() maps to
|
||||
* preempt_disable/enable(), i.e. it disables also preemption.
|
||||
*/
|
||||
static inline u32 bpf_prog_run_pin_on_cpu(const struct bpf_prog *prog,
|
||||
const void *ctx)
|
||||
{
|
||||
u32 ret;
|
||||
|
||||
migrate_disable();
|
||||
ret = __BPF_PROG_RUN(prog, ctx, bpf_dispatcher_nop_func);
|
||||
migrate_enable();
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define BPF_SKB_CB_LEN QDISC_CB_PRIV_LEN
|
||||
|
||||
|
|
@ -655,6 +677,7 @@ static inline u8 *bpf_skb_cb(struct sk_buff *skb)
|
|||
return qdisc_skb_cb(skb)->data;
|
||||
}
|
||||
|
||||
/* Must be invoked with migration disabled */
|
||||
static inline u32 __bpf_prog_run_save_cb(const struct bpf_prog *prog,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
|
|
@ -680,9 +703,9 @@ static inline u32 bpf_prog_run_save_cb(const struct bpf_prog *prog,
|
|||
{
|
||||
u32 res;
|
||||
|
||||
preempt_disable();
|
||||
migrate_disable();
|
||||
res = __bpf_prog_run_save_cb(prog, skb);
|
||||
preempt_enable();
|
||||
migrate_enable();
|
||||
return res;
|
||||
}
|
||||
|
||||
|
|
@ -695,13 +718,11 @@ static inline u32 bpf_prog_run_clear_cb(const struct bpf_prog *prog,
|
|||
if (unlikely(prog->cb_access))
|
||||
memset(cb_data, 0, BPF_SKB_CB_LEN);
|
||||
|
||||
preempt_disable();
|
||||
res = BPF_PROG_RUN(prog, skb);
|
||||
preempt_enable();
|
||||
res = bpf_prog_run_pin_on_cpu(prog, skb);
|
||||
return res;
|
||||
}
|
||||
|
||||
DECLARE_BPF_DISPATCHER(bpf_dispatcher_xdp)
|
||||
DECLARE_BPF_DISPATCHER(xdp)
|
||||
|
||||
static __always_inline u32 bpf_prog_run_xdp(const struct bpf_prog *prog,
|
||||
struct xdp_buff *xdp)
|
||||
|
|
@ -712,8 +733,7 @@ static __always_inline u32 bpf_prog_run_xdp(const struct bpf_prog *prog,
|
|||
* already takes rcu_read_lock() when fetching the program, so
|
||||
* it's not necessary here anymore.
|
||||
*/
|
||||
return __BPF_PROG_RUN(prog, xdp,
|
||||
BPF_DISPATCHER_FUNC(bpf_dispatcher_xdp));
|
||||
return __BPF_PROG_RUN(prog, xdp, BPF_DISPATCHER_FUNC(xdp));
|
||||
}
|
||||
|
||||
void bpf_prog_change_xdp(struct bpf_prog *prev_prog, struct bpf_prog *prog);
|
||||
|
|
@ -1063,7 +1083,6 @@ bpf_address_lookup(unsigned long addr, unsigned long *size,
|
|||
|
||||
void bpf_prog_kallsyms_add(struct bpf_prog *fp);
|
||||
void bpf_prog_kallsyms_del(struct bpf_prog *fp);
|
||||
void bpf_get_prog_name(const struct bpf_prog *prog, char *sym);
|
||||
|
||||
#else /* CONFIG_BPF_JIT */
|
||||
|
||||
|
|
@ -1132,11 +1151,6 @@ static inline void bpf_prog_kallsyms_del(struct bpf_prog *fp)
|
|||
{
|
||||
}
|
||||
|
||||
static inline void bpf_get_prog_name(const struct bpf_prog *prog, char *sym)
|
||||
{
|
||||
sym[0] = '\0';
|
||||
}
|
||||
|
||||
#endif /* CONFIG_BPF_JIT */
|
||||
|
||||
void bpf_prog_kallsyms_del_all(struct bpf_prog *fp);
|
||||
|
|
|
|||
|
|
@ -44,6 +44,8 @@ int request_firmware(const struct firmware **fw, const char *name,
|
|||
struct device *device);
|
||||
int firmware_request_nowarn(const struct firmware **fw, const char *name,
|
||||
struct device *device);
|
||||
int firmware_request_platform(const struct firmware **fw, const char *name,
|
||||
struct device *device);
|
||||
int request_firmware_nowait(
|
||||
struct module *module, bool uevent,
|
||||
const char *name, struct device *device, gfp_t gfp, void *context,
|
||||
|
|
@ -69,6 +71,13 @@ static inline int firmware_request_nowarn(const struct firmware **fw,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int firmware_request_platform(const struct firmware **fw,
|
||||
const char *name,
|
||||
struct device *device)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int request_firmware_nowait(
|
||||
struct module *module, bool uevent,
|
||||
const char *name, struct device *device, gfp_t gfp, void *context,
|
||||
|
|
|
|||
|
|
@ -25,7 +25,6 @@ enum imx_sc_rpc_svc {
|
|||
IMX_SC_RPC_SVC_PAD = 6,
|
||||
IMX_SC_RPC_SVC_MISC = 7,
|
||||
IMX_SC_RPC_SVC_IRQ = 8,
|
||||
IMX_SC_RPC_SVC_ABORT = 9
|
||||
};
|
||||
|
||||
struct imx_sc_rpc_msg {
|
||||
|
|
|
|||
|
|
@ -12,6 +12,8 @@ enum {
|
|||
SM_EFUSE_WRITE,
|
||||
SM_EFUSE_USER_MAX,
|
||||
SM_GET_CHIP_ID,
|
||||
SM_A1_PWRC_SET,
|
||||
SM_A1_PWRC_GET,
|
||||
};
|
||||
|
||||
struct meson_sm_firmware;
|
||||
|
|
|
|||
|
|
@ -82,6 +82,7 @@ enum pm_api_id {
|
|||
PM_CLOCK_GETRATE,
|
||||
PM_CLOCK_SETPARENT,
|
||||
PM_CLOCK_GETPARENT,
|
||||
PM_SECURE_AES = 47,
|
||||
PM_FEATURE_CHECK = 63,
|
||||
PM_API_MAX,
|
||||
};
|
||||
|
|
@ -100,7 +101,8 @@ enum pm_ret_status {
|
|||
};
|
||||
|
||||
enum pm_ioctl_id {
|
||||
IOCTL_SET_SD_TAPDELAY = 7,
|
||||
IOCTL_SD_DLL_RESET = 6,
|
||||
IOCTL_SET_SD_TAPDELAY,
|
||||
IOCTL_SET_PLL_FRAC_MODE,
|
||||
IOCTL_GET_PLL_FRAC_MODE,
|
||||
IOCTL_SET_PLL_FRAC_DATA,
|
||||
|
|
@ -271,6 +273,12 @@ enum tap_delay_type {
|
|||
PM_TAPDELAY_OUTPUT,
|
||||
};
|
||||
|
||||
enum dll_reset_type {
|
||||
PM_DLL_RESET_ASSERT,
|
||||
PM_DLL_RESET_RELEASE,
|
||||
PM_DLL_RESET_PULSE,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct zynqmp_pm_query_data - PM query data
|
||||
* @qid: query ID
|
||||
|
|
@ -315,12 +323,13 @@ struct zynqmp_eemi_ops {
|
|||
const u32 capabilities,
|
||||
const u32 qos,
|
||||
const enum zynqmp_pm_request_ack ack);
|
||||
int (*aes)(const u64 address, u32 *out);
|
||||
};
|
||||
|
||||
int zynqmp_pm_invoke_fn(u32 pm_api_id, u32 arg0, u32 arg1,
|
||||
u32 arg2, u32 arg3, u32 *ret_payload);
|
||||
|
||||
#if IS_REACHABLE(CONFIG_ARCH_ZYNQMP)
|
||||
#if IS_REACHABLE(CONFIG_ZYNQMP_FIRMWARE)
|
||||
const struct zynqmp_eemi_ops *zynqmp_pm_get_eemi_ops(void);
|
||||
#else
|
||||
static inline struct zynqmp_eemi_ops *zynqmp_pm_get_eemi_ops(void)
|
||||
|
|
|
|||
|
|
@ -526,6 +526,11 @@ static inline void i_mmap_lock_write(struct address_space *mapping)
|
|||
down_write(&mapping->i_mmap_rwsem);
|
||||
}
|
||||
|
||||
static inline int i_mmap_trylock_write(struct address_space *mapping)
|
||||
{
|
||||
return down_write_trylock(&mapping->i_mmap_rwsem);
|
||||
}
|
||||
|
||||
static inline void i_mmap_unlock_write(struct address_space *mapping)
|
||||
{
|
||||
up_write(&mapping->i_mmap_rwsem);
|
||||
|
|
@ -698,6 +703,7 @@ struct inode {
|
|||
struct rcu_head i_rcu;
|
||||
};
|
||||
atomic64_t i_version;
|
||||
atomic64_t i_sequence; /* see futex */
|
||||
atomic_t i_count;
|
||||
atomic_t i_dio_count;
|
||||
atomic_t i_writecount;
|
||||
|
|
@ -2699,7 +2705,6 @@ static inline void unregister_chrdev(unsigned int major, const char *name)
|
|||
|
||||
#ifdef CONFIG_BLOCK
|
||||
#define BLKDEV_MAJOR_MAX 512
|
||||
extern const char *__bdevname(dev_t, char *buffer);
|
||||
extern const char *bdevname(struct block_device *bdev, char *buffer);
|
||||
extern struct block_device *lookup_bdev(const char *);
|
||||
extern void blkdev_show(struct seq_file *,off_t);
|
||||
|
|
@ -2982,6 +2987,7 @@ extern int do_pipe_flags(int *, int);
|
|||
id(UNKNOWN, unknown) \
|
||||
id(FIRMWARE, firmware) \
|
||||
id(FIRMWARE_PREALLOC_BUFFER, firmware) \
|
||||
id(FIRMWARE_EFI_EMBEDDED, firmware) \
|
||||
id(MODULE, kernel-module) \
|
||||
id(KEXEC_IMAGE, kexec-image) \
|
||||
id(KEXEC_INITRAMFS, kexec-initramfs) \
|
||||
|
|
@ -3012,6 +3018,8 @@ extern int kernel_read_file(struct file *, void **, loff_t *, loff_t,
|
|||
enum kernel_read_file_id);
|
||||
extern int kernel_read_file_from_path(const char *, void **, loff_t *, loff_t,
|
||||
enum kernel_read_file_id);
|
||||
extern int kernel_read_file_from_path_initns(const char *, void **, loff_t *, loff_t,
|
||||
enum kernel_read_file_id);
|
||||
extern int kernel_read_file_from_fd(int, void **, loff_t *, loff_t,
|
||||
enum kernel_read_file_id);
|
||||
extern ssize_t kernel_read(struct file *, void *, size_t, loff_t *);
|
||||
|
|
@ -3391,7 +3399,7 @@ static inline bool io_is_direct(struct file *filp)
|
|||
return (filp->f_flags & O_DIRECT) || IS_DAX(filp->f_mapping->host);
|
||||
}
|
||||
|
||||
static inline bool vma_is_dax(struct vm_area_struct *vma)
|
||||
static inline bool vma_is_dax(const struct vm_area_struct *vma)
|
||||
{
|
||||
return vma->vm_file && IS_DAX(vma->vm_file->f_mapping->host);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -139,6 +139,7 @@ extern void fscrypt_free_bounce_page(struct page *bounce_page);
|
|||
extern int fscrypt_ioctl_set_policy(struct file *, const void __user *);
|
||||
extern int fscrypt_ioctl_get_policy(struct file *, void __user *);
|
||||
extern int fscrypt_ioctl_get_policy_ex(struct file *, void __user *);
|
||||
extern int fscrypt_ioctl_get_nonce(struct file *filp, void __user *arg);
|
||||
extern int fscrypt_has_permitted_context(struct inode *, struct inode *);
|
||||
extern int fscrypt_inherit_context(struct inode *, struct inode *,
|
||||
void *, bool);
|
||||
|
|
@ -300,6 +301,11 @@ static inline int fscrypt_ioctl_get_policy_ex(struct file *filp,
|
|||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int fscrypt_ioctl_get_nonce(struct file *filp, void __user *arg)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int fscrypt_has_permitted_context(struct inode *parent,
|
||||
struct inode *child)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -381,6 +381,22 @@ int __must_check __fsl_mc_driver_register(struct fsl_mc_driver *fsl_mc_driver,
|
|||
|
||||
void fsl_mc_driver_unregister(struct fsl_mc_driver *driver);
|
||||
|
||||
/**
|
||||
* struct fsl_mc_version
|
||||
* @major: Major version number: incremented on API compatibility changes
|
||||
* @minor: Minor version number: incremented on API additions (that are
|
||||
* backward compatible); reset when major version is incremented
|
||||
* @revision: Internal revision number: incremented on implementation changes
|
||||
* and/or bug fixes that have no impact on API
|
||||
*/
|
||||
struct fsl_mc_version {
|
||||
u32 major;
|
||||
u32 minor;
|
||||
u32 revision;
|
||||
};
|
||||
|
||||
struct fsl_mc_version *fsl_mc_get_version(void);
|
||||
|
||||
int __must_check fsl_mc_portal_allocate(struct fsl_mc_device *mc_dev,
|
||||
u16 mc_io_flags,
|
||||
struct fsl_mc_io **new_mc_io);
|
||||
|
|
|
|||
|
|
@ -149,8 +149,6 @@ struct ptp_qoriq {
|
|||
bool extts_fifo_support;
|
||||
int irq;
|
||||
int phc_index;
|
||||
u64 alarm_interval; /* for periodic alarm */
|
||||
u64 alarm_value;
|
||||
u32 tclk_period; /* nanoseconds */
|
||||
u32 tmr_prsc;
|
||||
u32 tmr_add;
|
||||
|
|
|
|||
|
|
@ -18,39 +18,63 @@
|
|||
#include <linux/bug.h>
|
||||
|
||||
/*
|
||||
* Notify this @dir inode about a change in the directory entry @dentry.
|
||||
* Notify this @dir inode about a change in a child directory entry.
|
||||
* The directory entry may have turned positive or negative or its inode may
|
||||
* have changed (i.e. renamed over).
|
||||
*
|
||||
* Unlike fsnotify_parent(), the event will be reported regardless of the
|
||||
* FS_EVENT_ON_CHILD mask on the parent inode.
|
||||
*/
|
||||
static inline int fsnotify_dirent(struct inode *dir, struct dentry *dentry,
|
||||
__u32 mask)
|
||||
static inline void fsnotify_name(struct inode *dir, __u32 mask,
|
||||
struct inode *child,
|
||||
const struct qstr *name, u32 cookie)
|
||||
{
|
||||
return fsnotify(dir, mask, d_inode(dentry), FSNOTIFY_EVENT_INODE,
|
||||
&dentry->d_name, 0);
|
||||
fsnotify(dir, mask, child, FSNOTIFY_EVENT_INODE, name, cookie);
|
||||
/*
|
||||
* Send another flavor of the event without child inode data and
|
||||
* without the specific event type (e.g. FS_CREATE|FS_IS_DIR).
|
||||
* The name is relative to the dir inode the event is reported to.
|
||||
*/
|
||||
fsnotify(dir, FS_DIR_MODIFY, dir, FSNOTIFY_EVENT_INODE, name, 0);
|
||||
}
|
||||
|
||||
/* Notify this dentry's parent about a child's events. */
|
||||
static inline int fsnotify_parent(const struct path *path,
|
||||
struct dentry *dentry, __u32 mask)
|
||||
static inline void fsnotify_dirent(struct inode *dir, struct dentry *dentry,
|
||||
__u32 mask)
|
||||
{
|
||||
if (!dentry)
|
||||
dentry = path->dentry;
|
||||
|
||||
return __fsnotify_parent(path, dentry, mask);
|
||||
fsnotify_name(dir, mask, d_inode(dentry), &dentry->d_name, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Simple wrapper to consolidate calls fsnotify_parent()/fsnotify() when
|
||||
* an event is on a path.
|
||||
* Simple wrappers to consolidate calls fsnotify_parent()/fsnotify() when
|
||||
* an event is on a file/dentry.
|
||||
*/
|
||||
static inline int fsnotify_path(struct inode *inode, const struct path *path,
|
||||
__u32 mask)
|
||||
static inline void fsnotify_dentry(struct dentry *dentry, __u32 mask)
|
||||
{
|
||||
int ret = fsnotify_parent(path, NULL, mask);
|
||||
struct inode *inode = d_inode(dentry);
|
||||
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
mask |= FS_ISDIR;
|
||||
|
||||
fsnotify_parent(dentry, mask, inode, FSNOTIFY_EVENT_INODE);
|
||||
fsnotify(inode, mask, inode, FSNOTIFY_EVENT_INODE, NULL, 0);
|
||||
}
|
||||
|
||||
static inline int fsnotify_file(struct file *file, __u32 mask)
|
||||
{
|
||||
const struct path *path = &file->f_path;
|
||||
struct inode *inode = file_inode(file);
|
||||
int ret;
|
||||
|
||||
if (file->f_mode & FMODE_NONOTIFY)
|
||||
return 0;
|
||||
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
mask |= FS_ISDIR;
|
||||
|
||||
ret = fsnotify_parent(path->dentry, mask, path, FSNOTIFY_EVENT_PATH);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return fsnotify(inode, mask, path, FSNOTIFY_EVENT_PATH, NULL, 0);
|
||||
}
|
||||
|
||||
|
|
@ -58,19 +82,16 @@ static inline int fsnotify_path(struct inode *inode, const struct path *path,
|
|||
static inline int fsnotify_perm(struct file *file, int mask)
|
||||
{
|
||||
int ret;
|
||||
const struct path *path = &file->f_path;
|
||||
struct inode *inode = file_inode(file);
|
||||
__u32 fsnotify_mask = 0;
|
||||
|
||||
if (file->f_mode & FMODE_NONOTIFY)
|
||||
return 0;
|
||||
if (!(mask & (MAY_READ | MAY_OPEN)))
|
||||
return 0;
|
||||
|
||||
if (mask & MAY_OPEN) {
|
||||
fsnotify_mask = FS_OPEN_PERM;
|
||||
|
||||
if (file->f_flags & __FMODE_EXEC) {
|
||||
ret = fsnotify_path(inode, path, FS_OPEN_EXEC_PERM);
|
||||
ret = fsnotify_file(file, FS_OPEN_EXEC_PERM);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
|
@ -79,10 +100,7 @@ static inline int fsnotify_perm(struct file *file, int mask)
|
|||
fsnotify_mask = FS_ACCESS_PERM;
|
||||
}
|
||||
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
fsnotify_mask |= FS_ISDIR;
|
||||
|
||||
return fsnotify_path(inode, path, fsnotify_mask);
|
||||
return fsnotify_file(file, fsnotify_mask);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -122,10 +140,8 @@ static inline void fsnotify_move(struct inode *old_dir, struct inode *new_dir,
|
|||
mask |= FS_ISDIR;
|
||||
}
|
||||
|
||||
fsnotify(old_dir, old_dir_mask, source, FSNOTIFY_EVENT_INODE, old_name,
|
||||
fs_cookie);
|
||||
fsnotify(new_dir, new_dir_mask, source, FSNOTIFY_EVENT_INODE, new_name,
|
||||
fs_cookie);
|
||||
fsnotify_name(old_dir, old_dir_mask, source, old_name, fs_cookie);
|
||||
fsnotify_name(new_dir, new_dir_mask, source, new_name, fs_cookie);
|
||||
|
||||
if (target)
|
||||
fsnotify_link_count(target);
|
||||
|
|
@ -180,12 +196,13 @@ static inline void fsnotify_create(struct inode *inode, struct dentry *dentry)
|
|||
* Note: We have to pass also the linked inode ptr as some filesystems leave
|
||||
* new_dentry->d_inode NULL and instantiate inode pointer later
|
||||
*/
|
||||
static inline void fsnotify_link(struct inode *dir, struct inode *inode, struct dentry *new_dentry)
|
||||
static inline void fsnotify_link(struct inode *dir, struct inode *inode,
|
||||
struct dentry *new_dentry)
|
||||
{
|
||||
fsnotify_link_count(inode);
|
||||
audit_inode_child(dir, new_dentry, AUDIT_TYPE_CHILD_CREATE);
|
||||
|
||||
fsnotify(dir, FS_CREATE, inode, FSNOTIFY_EVENT_INODE, &new_dentry->d_name, 0);
|
||||
fsnotify_name(dir, FS_CREATE, inode, &new_dentry->d_name, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -229,15 +246,7 @@ static inline void fsnotify_rmdir(struct inode *dir, struct dentry *dentry)
|
|||
*/
|
||||
static inline void fsnotify_access(struct file *file)
|
||||
{
|
||||
const struct path *path = &file->f_path;
|
||||
struct inode *inode = file_inode(file);
|
||||
__u32 mask = FS_ACCESS;
|
||||
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
mask |= FS_ISDIR;
|
||||
|
||||
if (!(file->f_mode & FMODE_NONOTIFY))
|
||||
fsnotify_path(inode, path, mask);
|
||||
fsnotify_file(file, FS_ACCESS);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -245,15 +254,7 @@ static inline void fsnotify_access(struct file *file)
|
|||
*/
|
||||
static inline void fsnotify_modify(struct file *file)
|
||||
{
|
||||
const struct path *path = &file->f_path;
|
||||
struct inode *inode = file_inode(file);
|
||||
__u32 mask = FS_MODIFY;
|
||||
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
mask |= FS_ISDIR;
|
||||
|
||||
if (!(file->f_mode & FMODE_NONOTIFY))
|
||||
fsnotify_path(inode, path, mask);
|
||||
fsnotify_file(file, FS_MODIFY);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -261,16 +262,12 @@ static inline void fsnotify_modify(struct file *file)
|
|||
*/
|
||||
static inline void fsnotify_open(struct file *file)
|
||||
{
|
||||
const struct path *path = &file->f_path;
|
||||
struct inode *inode = file_inode(file);
|
||||
__u32 mask = FS_OPEN;
|
||||
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
mask |= FS_ISDIR;
|
||||
if (file->f_flags & __FMODE_EXEC)
|
||||
mask |= FS_OPEN_EXEC;
|
||||
|
||||
fsnotify_path(inode, path, mask);
|
||||
fsnotify_file(file, mask);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -278,16 +275,10 @@ static inline void fsnotify_open(struct file *file)
|
|||
*/
|
||||
static inline void fsnotify_close(struct file *file)
|
||||
{
|
||||
const struct path *path = &file->f_path;
|
||||
struct inode *inode = file_inode(file);
|
||||
fmode_t mode = file->f_mode;
|
||||
__u32 mask = (mode & FMODE_WRITE) ? FS_CLOSE_WRITE : FS_CLOSE_NOWRITE;
|
||||
__u32 mask = (file->f_mode & FMODE_WRITE) ? FS_CLOSE_WRITE :
|
||||
FS_CLOSE_NOWRITE;
|
||||
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
mask |= FS_ISDIR;
|
||||
|
||||
if (!(file->f_mode & FMODE_NONOTIFY))
|
||||
fsnotify_path(inode, path, mask);
|
||||
fsnotify_file(file, mask);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -295,14 +286,7 @@ static inline void fsnotify_close(struct file *file)
|
|||
*/
|
||||
static inline void fsnotify_xattr(struct dentry *dentry)
|
||||
{
|
||||
struct inode *inode = dentry->d_inode;
|
||||
__u32 mask = FS_ATTRIB;
|
||||
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
mask |= FS_ISDIR;
|
||||
|
||||
fsnotify_parent(NULL, dentry, mask);
|
||||
fsnotify(inode, mask, inode, FSNOTIFY_EVENT_INODE, NULL, 0);
|
||||
fsnotify_dentry(dentry, FS_ATTRIB);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -311,7 +295,6 @@ static inline void fsnotify_xattr(struct dentry *dentry)
|
|||
*/
|
||||
static inline void fsnotify_change(struct dentry *dentry, unsigned int ia_valid)
|
||||
{
|
||||
struct inode *inode = dentry->d_inode;
|
||||
__u32 mask = 0;
|
||||
|
||||
if (ia_valid & ATTR_UID)
|
||||
|
|
@ -332,13 +315,8 @@ static inline void fsnotify_change(struct dentry *dentry, unsigned int ia_valid)
|
|||
if (ia_valid & ATTR_MODE)
|
||||
mask |= FS_ATTRIB;
|
||||
|
||||
if (mask) {
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
mask |= FS_ISDIR;
|
||||
|
||||
fsnotify_parent(NULL, dentry, mask);
|
||||
fsnotify(inode, mask, inode, FSNOTIFY_EVENT_INODE, NULL, 0);
|
||||
}
|
||||
if (mask)
|
||||
fsnotify_dentry(dentry, mask);
|
||||
}
|
||||
|
||||
#endif /* _LINUX_FS_NOTIFY_H */
|
||||
|
|
|
|||
|
|
@ -47,18 +47,18 @@
|
|||
#define FS_OPEN_PERM 0x00010000 /* open event in an permission hook */
|
||||
#define FS_ACCESS_PERM 0x00020000 /* access event in a permissions hook */
|
||||
#define FS_OPEN_EXEC_PERM 0x00040000 /* open/exec event in a permission hook */
|
||||
#define FS_DIR_MODIFY 0x00080000 /* Directory entry was modified */
|
||||
|
||||
#define FS_EXCL_UNLINK 0x04000000 /* do not send events if object is unlinked */
|
||||
#define FS_ISDIR 0x40000000 /* event occurred against dir */
|
||||
#define FS_IN_ONESHOT 0x80000000 /* only send event once */
|
||||
|
||||
#define FS_DN_RENAME 0x10000000 /* file renamed */
|
||||
#define FS_DN_MULTISHOT 0x20000000 /* dnotify multishot */
|
||||
|
||||
/* This inode cares about things that happen to its children. Always set for
|
||||
* dnotify and inotify. */
|
||||
#define FS_EVENT_ON_CHILD 0x08000000
|
||||
|
||||
#define FS_DN_RENAME 0x10000000 /* file renamed */
|
||||
#define FS_DN_MULTISHOT 0x20000000 /* dnotify multishot */
|
||||
#define FS_ISDIR 0x40000000 /* event occurred against dir */
|
||||
#define FS_IN_ONESHOT 0x80000000 /* only send event once */
|
||||
|
||||
#define FS_MOVE (FS_MOVED_FROM | FS_MOVED_TO)
|
||||
|
||||
/*
|
||||
|
|
@ -67,7 +67,8 @@
|
|||
* The watching parent may get an FS_ATTRIB|FS_EVENT_ON_CHILD event
|
||||
* when a directory entry inside a child subdir changes.
|
||||
*/
|
||||
#define ALL_FSNOTIFY_DIRENT_EVENTS (FS_CREATE | FS_DELETE | FS_MOVE)
|
||||
#define ALL_FSNOTIFY_DIRENT_EVENTS (FS_CREATE | FS_DELETE | FS_MOVE | \
|
||||
FS_DIR_MODIFY)
|
||||
|
||||
#define ALL_FSNOTIFY_PERM_EVENTS (FS_OPEN_PERM | FS_ACCESS_PERM | \
|
||||
FS_OPEN_EXEC_PERM)
|
||||
|
|
@ -133,8 +134,7 @@ struct fsnotify_ops {
|
|||
*/
|
||||
struct fsnotify_event {
|
||||
struct list_head list;
|
||||
/* inode may ONLY be dereferenced during handle_event(). */
|
||||
struct inode *inode; /* either the inode the event happened to or its parent */
|
||||
unsigned long objectid; /* identifier for queue merges */
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -213,10 +213,36 @@ struct fsnotify_group {
|
|||
};
|
||||
};
|
||||
|
||||
/* when calling fsnotify tell it if the data is a path or inode */
|
||||
#define FSNOTIFY_EVENT_NONE 0
|
||||
#define FSNOTIFY_EVENT_PATH 1
|
||||
#define FSNOTIFY_EVENT_INODE 2
|
||||
/* When calling fsnotify tell it if the data is a path or inode */
|
||||
enum fsnotify_data_type {
|
||||
FSNOTIFY_EVENT_NONE,
|
||||
FSNOTIFY_EVENT_PATH,
|
||||
FSNOTIFY_EVENT_INODE,
|
||||
};
|
||||
|
||||
static inline const struct inode *fsnotify_data_inode(const void *data,
|
||||
int data_type)
|
||||
{
|
||||
switch (data_type) {
|
||||
case FSNOTIFY_EVENT_INODE:
|
||||
return data;
|
||||
case FSNOTIFY_EVENT_PATH:
|
||||
return d_inode(((const struct path *)data)->dentry);
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static inline const struct path *fsnotify_data_path(const void *data,
|
||||
int data_type)
|
||||
{
|
||||
switch (data_type) {
|
||||
case FSNOTIFY_EVENT_PATH:
|
||||
return data;
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
enum fsnotify_obj_type {
|
||||
FSNOTIFY_OBJ_TYPE_INODE,
|
||||
|
|
@ -351,9 +377,10 @@ struct fsnotify_mark {
|
|||
/* called from the vfs helpers */
|
||||
|
||||
/* main fsnotify call to send events */
|
||||
extern int fsnotify(struct inode *to_tell, __u32 mask, const void *data, int data_is,
|
||||
const struct qstr *name, u32 cookie);
|
||||
extern int __fsnotify_parent(const struct path *path, struct dentry *dentry, __u32 mask);
|
||||
extern int fsnotify(struct inode *to_tell, __u32 mask, const void *data,
|
||||
int data_type, const struct qstr *name, u32 cookie);
|
||||
extern int fsnotify_parent(struct dentry *dentry, __u32 mask, const void *data,
|
||||
int data_type);
|
||||
extern void __fsnotify_inode_delete(struct inode *inode);
|
||||
extern void __fsnotify_vfsmount_delete(struct vfsmount *mnt);
|
||||
extern void fsnotify_sb_delete(struct super_block *sb);
|
||||
|
|
@ -500,21 +527,22 @@ extern void fsnotify_finish_user_wait(struct fsnotify_iter_info *iter_info);
|
|||
extern bool fsnotify_prepare_user_wait(struct fsnotify_iter_info *iter_info);
|
||||
|
||||
static inline void fsnotify_init_event(struct fsnotify_event *event,
|
||||
struct inode *inode)
|
||||
unsigned long objectid)
|
||||
{
|
||||
INIT_LIST_HEAD(&event->list);
|
||||
event->inode = inode;
|
||||
event->objectid = objectid;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static inline int fsnotify(struct inode *to_tell, __u32 mask, const void *data, int data_is,
|
||||
const struct qstr *name, u32 cookie)
|
||||
static inline int fsnotify(struct inode *to_tell, __u32 mask, const void *data,
|
||||
int data_type, const struct qstr *name, u32 cookie)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int __fsnotify_parent(const struct path *path, struct dentry *dentry, __u32 mask)
|
||||
static inline int fsnotify_parent(struct dentry *dentry, __u32 mask,
|
||||
const void *data, int data_type)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,23 +31,26 @@ struct task_struct;
|
|||
|
||||
union futex_key {
|
||||
struct {
|
||||
u64 i_seq;
|
||||
unsigned long pgoff;
|
||||
struct inode *inode;
|
||||
int offset;
|
||||
unsigned int offset;
|
||||
} shared;
|
||||
struct {
|
||||
union {
|
||||
struct mm_struct *mm;
|
||||
u64 __tmp;
|
||||
};
|
||||
unsigned long address;
|
||||
struct mm_struct *mm;
|
||||
int offset;
|
||||
unsigned int offset;
|
||||
} private;
|
||||
struct {
|
||||
u64 ptr;
|
||||
unsigned long word;
|
||||
void *ptr;
|
||||
int offset;
|
||||
unsigned int offset;
|
||||
} both;
|
||||
};
|
||||
|
||||
#define FUTEX_KEY_INIT (union futex_key) { .both = { .ptr = NULL } }
|
||||
#define FUTEX_KEY_INIT (union futex_key) { .both = { .ptr = 0ULL } }
|
||||
|
||||
#ifdef CONFIG_FUTEX
|
||||
enum {
|
||||
|
|
|
|||
|
|
@ -170,4 +170,6 @@ struct fwnode_operations {
|
|||
} while (false)
|
||||
#define get_dev_from_fwnode(fwnode) get_device((fwnode)->dev)
|
||||
|
||||
extern u32 fw_devlink_get_flags(void);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -27,39 +27,8 @@
|
|||
#define part_to_dev(part) (&((part)->__dev))
|
||||
|
||||
extern struct device_type part_type;
|
||||
extern struct kobject *block_depr;
|
||||
extern struct class block_class;
|
||||
|
||||
enum {
|
||||
/* These three have identical behaviour; use the second one if DOS FDISK gets
|
||||
confused about extended/logical partitions starting past cylinder 1023. */
|
||||
DOS_EXTENDED_PARTITION = 5,
|
||||
LINUX_EXTENDED_PARTITION = 0x85,
|
||||
WIN98_EXTENDED_PARTITION = 0x0f,
|
||||
|
||||
SUN_WHOLE_DISK = DOS_EXTENDED_PARTITION,
|
||||
|
||||
LINUX_SWAP_PARTITION = 0x82,
|
||||
LINUX_DATA_PARTITION = 0x83,
|
||||
LINUX_LVM_PARTITION = 0x8e,
|
||||
LINUX_RAID_PARTITION = 0xfd, /* autodetect RAID partition */
|
||||
|
||||
SOLARIS_X86_PARTITION = LINUX_SWAP_PARTITION,
|
||||
NEW_SOLARIS_X86_PARTITION = 0xbf,
|
||||
|
||||
DM6_AUX1PARTITION = 0x51, /* no DDO: use xlated geom */
|
||||
DM6_AUX3PARTITION = 0x53, /* no DDO: use xlated geom */
|
||||
DM6_PARTITION = 0x54, /* has DDO: use xlated geom & offset */
|
||||
EZD_PARTITION = 0x55, /* EZ-DRIVE */
|
||||
|
||||
FREEBSD_PARTITION = 0xa5, /* FreeBSD Partition ID */
|
||||
OPENBSD_PARTITION = 0xa6, /* OpenBSD Partition ID */
|
||||
NETBSD_PARTITION = 0xa9, /* NetBSD Partition ID */
|
||||
BSDI_PARTITION = 0xb7, /* BSDI Partition ID */
|
||||
MINIX_PARTITION = 0x81, /* Minix Partition ID */
|
||||
UNIXWARE_PARTITION = 0x63, /* Same as GNU_HURD and SCO Unix */
|
||||
};
|
||||
|
||||
#define DISK_MAX_PARTS 256
|
||||
#define DISK_NAME_LEN 32
|
||||
|
||||
|
|
@ -70,26 +39,12 @@ enum {
|
|||
#include <linux/fs.h>
|
||||
#include <linux/workqueue.h>
|
||||
|
||||
struct partition {
|
||||
unsigned char boot_ind; /* 0x80 - active */
|
||||
unsigned char head; /* starting head */
|
||||
unsigned char sector; /* starting sector */
|
||||
unsigned char cyl; /* starting cylinder */
|
||||
unsigned char sys_ind; /* What partition type */
|
||||
unsigned char end_head; /* end head */
|
||||
unsigned char end_sector; /* end sector */
|
||||
unsigned char end_cyl; /* end cylinder */
|
||||
__le32 start_sect; /* starting sector counting from 0 */
|
||||
__le32 nr_sects; /* nr of sectors in partition */
|
||||
} __attribute__((packed));
|
||||
|
||||
struct disk_stats {
|
||||
u64 nsecs[NR_STAT_GROUPS];
|
||||
unsigned long sectors[NR_STAT_GROUPS];
|
||||
unsigned long ios[NR_STAT_GROUPS];
|
||||
unsigned long merges[NR_STAT_GROUPS];
|
||||
unsigned long io_ticks;
|
||||
unsigned long time_in_queue;
|
||||
local_t in_flight[2];
|
||||
};
|
||||
|
||||
|
|
@ -133,17 +88,64 @@ struct hd_struct {
|
|||
struct rcu_work rcu_work;
|
||||
};
|
||||
|
||||
#define GENHD_FL_REMOVABLE 1
|
||||
/* 2 is unused */
|
||||
#define GENHD_FL_MEDIA_CHANGE_NOTIFY 4
|
||||
#define GENHD_FL_CD 8
|
||||
#define GENHD_FL_UP 16
|
||||
#define GENHD_FL_SUPPRESS_PARTITION_INFO 32
|
||||
#define GENHD_FL_EXT_DEVT 64 /* allow extended devt */
|
||||
#define GENHD_FL_NATIVE_CAPACITY 128
|
||||
#define GENHD_FL_BLOCK_EVENTS_ON_EXCL_WRITE 256
|
||||
#define GENHD_FL_NO_PART_SCAN 512
|
||||
#define GENHD_FL_HIDDEN 1024
|
||||
/**
|
||||
* DOC: genhd capability flags
|
||||
*
|
||||
* ``GENHD_FL_REMOVABLE`` (0x0001): indicates that the block device
|
||||
* gives access to removable media.
|
||||
* When set, the device remains present even when media is not
|
||||
* inserted.
|
||||
* Must not be set for devices which are removed entirely when the
|
||||
* media is removed.
|
||||
*
|
||||
* ``GENHD_FL_CD`` (0x0008): the block device is a CD-ROM-style
|
||||
* device.
|
||||
* Affects responses to the ``CDROM_GET_CAPABILITY`` ioctl.
|
||||
*
|
||||
* ``GENHD_FL_UP`` (0x0010): indicates that the block device is "up",
|
||||
* with a similar meaning to network interfaces.
|
||||
*
|
||||
* ``GENHD_FL_SUPPRESS_PARTITION_INFO`` (0x0020): don't include
|
||||
* partition information in ``/proc/partitions`` or in the output of
|
||||
* printk_all_partitions().
|
||||
* Used for the null block device and some MMC devices.
|
||||
*
|
||||
* ``GENHD_FL_EXT_DEVT`` (0x0040): the driver supports extended
|
||||
* dynamic ``dev_t``, i.e. it wants extended device numbers
|
||||
* (``BLOCK_EXT_MAJOR``).
|
||||
* This affects the maximum number of partitions.
|
||||
*
|
||||
* ``GENHD_FL_NATIVE_CAPACITY`` (0x0080): based on information in the
|
||||
* partition table, the device's capacity has been extended to its
|
||||
* native capacity; i.e. the device has hidden capacity used by one
|
||||
* of the partitions (this is a flag used so that native capacity is
|
||||
* only ever unlocked once).
|
||||
*
|
||||
* ``GENHD_FL_BLOCK_EVENTS_ON_EXCL_WRITE`` (0x0100): event polling is
|
||||
* blocked whenever a writer holds an exclusive lock.
|
||||
*
|
||||
* ``GENHD_FL_NO_PART_SCAN`` (0x0200): partition scanning is disabled.
|
||||
* Used for loop devices in their default settings and some MMC
|
||||
* devices.
|
||||
*
|
||||
* ``GENHD_FL_HIDDEN`` (0x0400): the block device is hidden; it
|
||||
* doesn't produce events, doesn't appear in sysfs, and doesn't have
|
||||
* an associated ``bdev``.
|
||||
* Implies ``GENHD_FL_SUPPRESS_PARTITION_INFO`` and
|
||||
* ``GENHD_FL_NO_PART_SCAN``.
|
||||
* Used for multipath devices.
|
||||
*/
|
||||
#define GENHD_FL_REMOVABLE 0x0001
|
||||
/* 2 is unused (used to be GENHD_FL_DRIVERFS) */
|
||||
/* 4 is unused (used to be GENHD_FL_MEDIA_CHANGE_NOTIFY) */
|
||||
#define GENHD_FL_CD 0x0008
|
||||
#define GENHD_FL_UP 0x0010
|
||||
#define GENHD_FL_SUPPRESS_PARTITION_INFO 0x0020
|
||||
#define GENHD_FL_EXT_DEVT 0x0040
|
||||
#define GENHD_FL_NATIVE_CAPACITY 0x0080
|
||||
#define GENHD_FL_BLOCK_EVENTS_ON_EXCL_WRITE 0x0100
|
||||
#define GENHD_FL_NO_PART_SCAN 0x0200
|
||||
#define GENHD_FL_HIDDEN 0x0400
|
||||
|
||||
enum {
|
||||
DISK_EVENT_MEDIA_CHANGE = 1 << 0, /* media changed */
|
||||
|
|
@ -189,7 +191,6 @@ struct gendisk {
|
|||
* disks that can't be partitioned. */
|
||||
|
||||
char disk_name[DISK_NAME_LEN]; /* name of major driver */
|
||||
char *(*devnode)(struct gendisk *gd, umode_t *mode);
|
||||
|
||||
unsigned short events; /* supported events */
|
||||
unsigned short event_flags; /* flags related to event processing */
|
||||
|
|
@ -245,18 +246,6 @@ static inline bool disk_part_scan_enabled(struct gendisk *disk)
|
|||
!(disk->flags & GENHD_FL_NO_PART_SCAN);
|
||||
}
|
||||
|
||||
static inline bool disk_has_partitions(struct gendisk *disk)
|
||||
{
|
||||
bool ret = false;
|
||||
|
||||
rcu_read_lock();
|
||||
if (rcu_dereference(disk->part_tbl)->len > 1)
|
||||
ret = true;
|
||||
rcu_read_unlock();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline dev_t disk_devt(struct gendisk *disk)
|
||||
{
|
||||
return MKDEV(disk->major, disk->first_minor);
|
||||
|
|
@ -295,143 +284,7 @@ extern void disk_part_iter_init(struct disk_part_iter *piter,
|
|||
struct gendisk *disk, unsigned int flags);
|
||||
extern struct hd_struct *disk_part_iter_next(struct disk_part_iter *piter);
|
||||
extern void disk_part_iter_exit(struct disk_part_iter *piter);
|
||||
|
||||
extern struct hd_struct *disk_map_sector_rcu(struct gendisk *disk,
|
||||
sector_t sector);
|
||||
|
||||
/*
|
||||
* Macros to operate on percpu disk statistics:
|
||||
*
|
||||
* {disk|part|all}_stat_{add|sub|inc|dec}() modify the stat counters
|
||||
* and should be called between disk_stat_lock() and
|
||||
* disk_stat_unlock().
|
||||
*
|
||||
* part_stat_read() can be called at any time.
|
||||
*
|
||||
* part_stat_{add|set_all}() and {init|free}_part_stats are for
|
||||
* internal use only.
|
||||
*/
|
||||
#ifdef CONFIG_SMP
|
||||
#define part_stat_lock() ({ rcu_read_lock(); get_cpu(); })
|
||||
#define part_stat_unlock() do { put_cpu(); rcu_read_unlock(); } while (0)
|
||||
|
||||
#define part_stat_get_cpu(part, field, cpu) \
|
||||
(per_cpu_ptr((part)->dkstats, (cpu))->field)
|
||||
|
||||
#define part_stat_get(part, field) \
|
||||
part_stat_get_cpu(part, field, smp_processor_id())
|
||||
|
||||
#define part_stat_read(part, field) \
|
||||
({ \
|
||||
typeof((part)->dkstats->field) res = 0; \
|
||||
unsigned int _cpu; \
|
||||
for_each_possible_cpu(_cpu) \
|
||||
res += per_cpu_ptr((part)->dkstats, _cpu)->field; \
|
||||
res; \
|
||||
})
|
||||
|
||||
static inline void part_stat_set_all(struct hd_struct *part, int value)
|
||||
{
|
||||
int i;
|
||||
|
||||
for_each_possible_cpu(i)
|
||||
memset(per_cpu_ptr(part->dkstats, i), value,
|
||||
sizeof(struct disk_stats));
|
||||
}
|
||||
|
||||
static inline int init_part_stats(struct hd_struct *part)
|
||||
{
|
||||
part->dkstats = alloc_percpu(struct disk_stats);
|
||||
if (!part->dkstats)
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline void free_part_stats(struct hd_struct *part)
|
||||
{
|
||||
free_percpu(part->dkstats);
|
||||
}
|
||||
|
||||
#else /* !CONFIG_SMP */
|
||||
#define part_stat_lock() ({ rcu_read_lock(); 0; })
|
||||
#define part_stat_unlock() rcu_read_unlock()
|
||||
|
||||
#define part_stat_get(part, field) ((part)->dkstats.field)
|
||||
#define part_stat_get_cpu(part, field, cpu) part_stat_get(part, field)
|
||||
#define part_stat_read(part, field) part_stat_get(part, field)
|
||||
|
||||
static inline void part_stat_set_all(struct hd_struct *part, int value)
|
||||
{
|
||||
memset(&part->dkstats, value, sizeof(struct disk_stats));
|
||||
}
|
||||
|
||||
static inline int init_part_stats(struct hd_struct *part)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline void free_part_stats(struct hd_struct *part)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
#define part_stat_read_msecs(part, which) \
|
||||
div_u64(part_stat_read(part, nsecs[which]), NSEC_PER_MSEC)
|
||||
|
||||
#define part_stat_read_accum(part, field) \
|
||||
(part_stat_read(part, field[STAT_READ]) + \
|
||||
part_stat_read(part, field[STAT_WRITE]) + \
|
||||
part_stat_read(part, field[STAT_DISCARD]))
|
||||
|
||||
#define __part_stat_add(part, field, addnd) \
|
||||
(part_stat_get(part, field) += (addnd))
|
||||
|
||||
#define part_stat_add(part, field, addnd) do { \
|
||||
__part_stat_add((part), field, addnd); \
|
||||
if ((part)->partno) \
|
||||
__part_stat_add(&part_to_disk((part))->part0, \
|
||||
field, addnd); \
|
||||
} while (0)
|
||||
|
||||
#define part_stat_dec(gendiskp, field) \
|
||||
part_stat_add(gendiskp, field, -1)
|
||||
#define part_stat_inc(gendiskp, field) \
|
||||
part_stat_add(gendiskp, field, 1)
|
||||
#define part_stat_sub(gendiskp, field, subnd) \
|
||||
part_stat_add(gendiskp, field, -subnd)
|
||||
|
||||
#define part_stat_local_dec(gendiskp, field) \
|
||||
local_dec(&(part_stat_get(gendiskp, field)))
|
||||
#define part_stat_local_inc(gendiskp, field) \
|
||||
local_inc(&(part_stat_get(gendiskp, field)))
|
||||
#define part_stat_local_read(gendiskp, field) \
|
||||
local_read(&(part_stat_get(gendiskp, field)))
|
||||
#define part_stat_local_read_cpu(gendiskp, field, cpu) \
|
||||
local_read(&(part_stat_get_cpu(gendiskp, field, cpu)))
|
||||
|
||||
unsigned int part_in_flight(struct request_queue *q, struct hd_struct *part);
|
||||
void part_in_flight_rw(struct request_queue *q, struct hd_struct *part,
|
||||
unsigned int inflight[2]);
|
||||
void part_dec_in_flight(struct request_queue *q, struct hd_struct *part,
|
||||
int rw);
|
||||
void part_inc_in_flight(struct request_queue *q, struct hd_struct *part,
|
||||
int rw);
|
||||
|
||||
static inline struct partition_meta_info *alloc_part_info(struct gendisk *disk)
|
||||
{
|
||||
if (disk)
|
||||
return kzalloc_node(sizeof(struct partition_meta_info),
|
||||
GFP_KERNEL, disk->node_id);
|
||||
return kzalloc(sizeof(struct partition_meta_info), GFP_KERNEL);
|
||||
}
|
||||
|
||||
static inline void free_part_info(struct hd_struct *part)
|
||||
{
|
||||
kfree(part->info);
|
||||
}
|
||||
|
||||
void update_io_ticks(struct hd_struct *part, unsigned long now);
|
||||
extern bool disk_has_partitions(struct gendisk *disk);
|
||||
|
||||
/* block/genhd.c */
|
||||
extern void device_add_disk(struct device *parent, struct gendisk *disk,
|
||||
|
|
@ -461,6 +314,8 @@ static inline int get_disk_ro(struct gendisk *disk)
|
|||
extern void disk_block_events(struct gendisk *disk);
|
||||
extern void disk_unblock_events(struct gendisk *disk);
|
||||
extern void disk_flush_events(struct gendisk *disk, unsigned int mask);
|
||||
extern void set_capacity_revalidate_and_notify(struct gendisk *disk,
|
||||
sector_t size, bool revalidate);
|
||||
extern unsigned int disk_clear_events(struct gendisk *disk, unsigned int mask);
|
||||
|
||||
/* drivers/char/random.c */
|
||||
|
|
@ -480,170 +335,11 @@ static inline void set_capacity(struct gendisk *disk, sector_t size)
|
|||
disk->part0.nr_sects = size;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SOLARIS_X86_PARTITION
|
||||
|
||||
#define SOLARIS_X86_NUMSLICE 16
|
||||
#define SOLARIS_X86_VTOC_SANE (0x600DDEEEUL)
|
||||
|
||||
struct solaris_x86_slice {
|
||||
__le16 s_tag; /* ID tag of partition */
|
||||
__le16 s_flag; /* permission flags */
|
||||
__le32 s_start; /* start sector no of partition */
|
||||
__le32 s_size; /* # of blocks in partition */
|
||||
};
|
||||
|
||||
struct solaris_x86_vtoc {
|
||||
unsigned int v_bootinfo[3]; /* info needed by mboot (unsupported) */
|
||||
__le32 v_sanity; /* to verify vtoc sanity */
|
||||
__le32 v_version; /* layout version */
|
||||
char v_volume[8]; /* volume name */
|
||||
__le16 v_sectorsz; /* sector size in bytes */
|
||||
__le16 v_nparts; /* number of partitions */
|
||||
unsigned int v_reserved[10]; /* free space */
|
||||
struct solaris_x86_slice
|
||||
v_slice[SOLARIS_X86_NUMSLICE]; /* slice headers */
|
||||
unsigned int timestamp[SOLARIS_X86_NUMSLICE]; /* timestamp (unsupported) */
|
||||
char v_asciilabel[128]; /* for compatibility */
|
||||
};
|
||||
|
||||
#endif /* CONFIG_SOLARIS_X86_PARTITION */
|
||||
|
||||
#ifdef CONFIG_BSD_DISKLABEL
|
||||
/*
|
||||
* BSD disklabel support by Yossi Gottlieb <yogo@math.tau.ac.il>
|
||||
* updated by Marc Espie <Marc.Espie@openbsd.org>
|
||||
*/
|
||||
|
||||
/* check against BSD src/sys/sys/disklabel.h for consistency */
|
||||
|
||||
#define BSD_DISKMAGIC (0x82564557UL) /* The disk magic number */
|
||||
#define BSD_MAXPARTITIONS 16
|
||||
#define OPENBSD_MAXPARTITIONS 16
|
||||
#define BSD_FS_UNUSED 0 /* disklabel unused partition entry ID */
|
||||
struct bsd_disklabel {
|
||||
__le32 d_magic; /* the magic number */
|
||||
__s16 d_type; /* drive type */
|
||||
__s16 d_subtype; /* controller/d_type specific */
|
||||
char d_typename[16]; /* type name, e.g. "eagle" */
|
||||
char d_packname[16]; /* pack identifier */
|
||||
__u32 d_secsize; /* # of bytes per sector */
|
||||
__u32 d_nsectors; /* # of data sectors per track */
|
||||
__u32 d_ntracks; /* # of tracks per cylinder */
|
||||
__u32 d_ncylinders; /* # of data cylinders per unit */
|
||||
__u32 d_secpercyl; /* # of data sectors per cylinder */
|
||||
__u32 d_secperunit; /* # of data sectors per unit */
|
||||
__u16 d_sparespertrack; /* # of spare sectors per track */
|
||||
__u16 d_sparespercyl; /* # of spare sectors per cylinder */
|
||||
__u32 d_acylinders; /* # of alt. cylinders per unit */
|
||||
__u16 d_rpm; /* rotational speed */
|
||||
__u16 d_interleave; /* hardware sector interleave */
|
||||
__u16 d_trackskew; /* sector 0 skew, per track */
|
||||
__u16 d_cylskew; /* sector 0 skew, per cylinder */
|
||||
__u32 d_headswitch; /* head switch time, usec */
|
||||
__u32 d_trkseek; /* track-to-track seek, usec */
|
||||
__u32 d_flags; /* generic flags */
|
||||
#define NDDATA 5
|
||||
__u32 d_drivedata[NDDATA]; /* drive-type specific information */
|
||||
#define NSPARE 5
|
||||
__u32 d_spare[NSPARE]; /* reserved for future use */
|
||||
__le32 d_magic2; /* the magic number (again) */
|
||||
__le16 d_checksum; /* xor of data incl. partitions */
|
||||
|
||||
/* filesystem and partition information: */
|
||||
__le16 d_npartitions; /* number of partitions in following */
|
||||
__le32 d_bbsize; /* size of boot area at sn0, bytes */
|
||||
__le32 d_sbsize; /* max size of fs superblock, bytes */
|
||||
struct bsd_partition { /* the partition table */
|
||||
__le32 p_size; /* number of sectors in partition */
|
||||
__le32 p_offset; /* starting sector */
|
||||
__le32 p_fsize; /* filesystem basic fragment size */
|
||||
__u8 p_fstype; /* filesystem type, see below */
|
||||
__u8 p_frag; /* filesystem fragments per block */
|
||||
__le16 p_cpg; /* filesystem cylinders per group */
|
||||
} d_partitions[BSD_MAXPARTITIONS]; /* actually may be more */
|
||||
};
|
||||
|
||||
#endif /* CONFIG_BSD_DISKLABEL */
|
||||
|
||||
#ifdef CONFIG_UNIXWARE_DISKLABEL
|
||||
/*
|
||||
* Unixware slices support by Andrzej Krzysztofowicz <ankry@mif.pg.gda.pl>
|
||||
* and Krzysztof G. Baranowski <kgb@knm.org.pl>
|
||||
*/
|
||||
|
||||
#define UNIXWARE_DISKMAGIC (0xCA5E600DUL) /* The disk magic number */
|
||||
#define UNIXWARE_DISKMAGIC2 (0x600DDEEEUL) /* The slice table magic nr */
|
||||
#define UNIXWARE_NUMSLICE 16
|
||||
#define UNIXWARE_FS_UNUSED 0 /* Unused slice entry ID */
|
||||
|
||||
struct unixware_slice {
|
||||
__le16 s_label; /* label */
|
||||
__le16 s_flags; /* permission flags */
|
||||
__le32 start_sect; /* starting sector */
|
||||
__le32 nr_sects; /* number of sectors in slice */
|
||||
};
|
||||
|
||||
struct unixware_disklabel {
|
||||
__le32 d_type; /* drive type */
|
||||
__le32 d_magic; /* the magic number */
|
||||
__le32 d_version; /* version number */
|
||||
char d_serial[12]; /* serial number of the device */
|
||||
__le32 d_ncylinders; /* # of data cylinders per device */
|
||||
__le32 d_ntracks; /* # of tracks per cylinder */
|
||||
__le32 d_nsectors; /* # of data sectors per track */
|
||||
__le32 d_secsize; /* # of bytes per sector */
|
||||
__le32 d_part_start; /* # of first sector of this partition */
|
||||
__le32 d_unknown1[12]; /* ? */
|
||||
__le32 d_alt_tbl; /* byte offset of alternate table */
|
||||
__le32 d_alt_len; /* byte length of alternate table */
|
||||
__le32 d_phys_cyl; /* # of physical cylinders per device */
|
||||
__le32 d_phys_trk; /* # of physical tracks per cylinder */
|
||||
__le32 d_phys_sec; /* # of physical sectors per track */
|
||||
__le32 d_phys_bytes; /* # of physical bytes per sector */
|
||||
__le32 d_unknown2; /* ? */
|
||||
__le32 d_unknown3; /* ? */
|
||||
__le32 d_pad[8]; /* pad */
|
||||
|
||||
struct unixware_vtoc {
|
||||
__le32 v_magic; /* the magic number */
|
||||
__le32 v_version; /* version number */
|
||||
char v_name[8]; /* volume name */
|
||||
__le16 v_nslices; /* # of slices */
|
||||
__le16 v_unknown1; /* ? */
|
||||
__le32 v_reserved[10]; /* reserved */
|
||||
struct unixware_slice
|
||||
v_slice[UNIXWARE_NUMSLICE]; /* slice headers */
|
||||
} vtoc;
|
||||
|
||||
}; /* 408 */
|
||||
|
||||
#endif /* CONFIG_UNIXWARE_DISKLABEL */
|
||||
|
||||
#ifdef CONFIG_MINIX_SUBPARTITION
|
||||
# define MINIX_NR_SUBPARTITIONS 4
|
||||
#endif /* CONFIG_MINIX_SUBPARTITION */
|
||||
|
||||
#define ADDPART_FLAG_NONE 0
|
||||
#define ADDPART_FLAG_RAID 1
|
||||
#define ADDPART_FLAG_WHOLEDISK 2
|
||||
|
||||
extern int blk_alloc_devt(struct hd_struct *part, dev_t *devt);
|
||||
extern void blk_free_devt(dev_t devt);
|
||||
extern void blk_invalidate_devt(dev_t devt);
|
||||
extern dev_t blk_lookup_devt(const char *name, int partno);
|
||||
extern char *disk_name (struct gendisk *hd, int partno, char *buf);
|
||||
|
||||
int bdev_disk_changed(struct block_device *bdev, bool invalidate);
|
||||
int blk_add_partitions(struct gendisk *disk, struct block_device *bdev);
|
||||
int blk_drop_partitions(struct gendisk *disk, struct block_device *bdev);
|
||||
extern int disk_expand_part_tbl(struct gendisk *disk, int target);
|
||||
extern struct hd_struct * __must_check add_partition(struct gendisk *disk,
|
||||
int partno, sector_t start,
|
||||
sector_t len, int flags,
|
||||
struct partition_meta_info
|
||||
*info);
|
||||
extern void __delete_partition(struct percpu_ref *);
|
||||
extern void delete_partition(struct gendisk *, int);
|
||||
extern void printk_all_partitions(void);
|
||||
|
||||
extern struct gendisk *__alloc_disk_node(int minors, int node_id);
|
||||
|
|
@ -657,20 +353,6 @@ extern void blk_register_region(dev_t devt, unsigned long range,
|
|||
void *data);
|
||||
extern void blk_unregister_region(dev_t devt, unsigned long range);
|
||||
|
||||
extern ssize_t part_size_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf);
|
||||
extern ssize_t part_stat_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf);
|
||||
extern ssize_t part_inflight_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf);
|
||||
#ifdef CONFIG_FAIL_MAKE_REQUEST
|
||||
extern ssize_t part_fail_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf);
|
||||
extern ssize_t part_fail_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count);
|
||||
#endif /* CONFIG_FAIL_MAKE_REQUEST */
|
||||
|
||||
#define alloc_disk_node(minors, node_id) \
|
||||
({ \
|
||||
static struct lock_class_key __key; \
|
||||
|
|
@ -689,100 +371,6 @@ extern ssize_t part_fail_store(struct device *dev,
|
|||
|
||||
#define alloc_disk(minors) alloc_disk_node(minors, NUMA_NO_NODE)
|
||||
|
||||
static inline int hd_ref_init(struct hd_struct *part)
|
||||
{
|
||||
if (percpu_ref_init(&part->ref, __delete_partition, 0,
|
||||
GFP_KERNEL))
|
||||
return -ENOMEM;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void hd_struct_get(struct hd_struct *part)
|
||||
{
|
||||
percpu_ref_get(&part->ref);
|
||||
}
|
||||
|
||||
static inline int hd_struct_try_get(struct hd_struct *part)
|
||||
{
|
||||
return percpu_ref_tryget_live(&part->ref);
|
||||
}
|
||||
|
||||
static inline void hd_struct_put(struct hd_struct *part)
|
||||
{
|
||||
percpu_ref_put(&part->ref);
|
||||
}
|
||||
|
||||
static inline void hd_struct_kill(struct hd_struct *part)
|
||||
{
|
||||
percpu_ref_kill(&part->ref);
|
||||
}
|
||||
|
||||
static inline void hd_free_part(struct hd_struct *part)
|
||||
{
|
||||
free_part_stats(part);
|
||||
free_part_info(part);
|
||||
percpu_ref_exit(&part->ref);
|
||||
}
|
||||
|
||||
/*
|
||||
* Any access of part->nr_sects which is not protected by partition
|
||||
* bd_mutex or gendisk bdev bd_mutex, should be done using this
|
||||
* accessor function.
|
||||
*
|
||||
* Code written along the lines of i_size_read() and i_size_write().
|
||||
* CONFIG_PREEMPTION case optimizes the case of UP kernel with preemption
|
||||
* on.
|
||||
*/
|
||||
static inline sector_t part_nr_sects_read(struct hd_struct *part)
|
||||
{
|
||||
#if BITS_PER_LONG==32 && defined(CONFIG_SMP)
|
||||
sector_t nr_sects;
|
||||
unsigned seq;
|
||||
do {
|
||||
seq = read_seqcount_begin(&part->nr_sects_seq);
|
||||
nr_sects = part->nr_sects;
|
||||
} while (read_seqcount_retry(&part->nr_sects_seq, seq));
|
||||
return nr_sects;
|
||||
#elif BITS_PER_LONG==32 && defined(CONFIG_PREEMPTION)
|
||||
sector_t nr_sects;
|
||||
|
||||
preempt_disable();
|
||||
nr_sects = part->nr_sects;
|
||||
preempt_enable();
|
||||
return nr_sects;
|
||||
#else
|
||||
return part->nr_sects;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* Should be called with mutex lock held (typically bd_mutex) of partition
|
||||
* to provide mutual exlusion among writers otherwise seqcount might be
|
||||
* left in wrong state leaving the readers spinning infinitely.
|
||||
*/
|
||||
static inline void part_nr_sects_write(struct hd_struct *part, sector_t size)
|
||||
{
|
||||
#if BITS_PER_LONG==32 && defined(CONFIG_SMP)
|
||||
write_seqcount_begin(&part->nr_sects_seq);
|
||||
part->nr_sects = size;
|
||||
write_seqcount_end(&part->nr_sects_seq);
|
||||
#elif BITS_PER_LONG==32 && defined(CONFIG_PREEMPTION)
|
||||
preempt_disable();
|
||||
part->nr_sects = size;
|
||||
preempt_enable();
|
||||
#else
|
||||
part->nr_sects = size;
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined(CONFIG_BLK_DEV_INTEGRITY)
|
||||
extern void blk_integrity_add(struct gendisk *);
|
||||
extern void blk_integrity_del(struct gendisk *);
|
||||
#else /* CONFIG_BLK_DEV_INTEGRITY */
|
||||
static inline void blk_integrity_add(struct gendisk *disk) { }
|
||||
static inline void blk_integrity_del(struct gendisk *disk) { }
|
||||
#endif /* CONFIG_BLK_DEV_INTEGRITY */
|
||||
|
||||
#else /* CONFIG_BLOCK */
|
||||
|
||||
static inline void printk_all_partitions(void) { }
|
||||
|
|
|
|||
|
|
@ -124,6 +124,8 @@ struct vm_area_struct;
|
|||
*
|
||||
* Reclaim modifiers
|
||||
* ~~~~~~~~~~~~~~~~~
|
||||
* Please note that all the following flags are only applicable to sleepable
|
||||
* allocations (e.g. %GFP_NOWAIT and %GFP_ATOMIC will ignore them).
|
||||
*
|
||||
* %__GFP_IO can start physical IO.
|
||||
*
|
||||
|
|
@ -485,6 +487,12 @@ static inline void arch_free_page(struct page *page, int order) { }
|
|||
#ifndef HAVE_ARCH_ALLOC_PAGE
|
||||
static inline void arch_alloc_page(struct page *page, int order) { }
|
||||
#endif
|
||||
#ifndef HAVE_ARCH_MAKE_PAGE_ACCESSIBLE
|
||||
static inline int arch_make_page_accessible(struct page *page)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
struct page *
|
||||
__alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order, int preferred_nid,
|
||||
|
|
|
|||
|
|
@ -102,11 +102,9 @@ void devm_gpio_free(struct device *dev, unsigned int gpio);
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/bug.h>
|
||||
#include <linux/pinctrl/pinctrl.h>
|
||||
|
||||
struct device;
|
||||
struct gpio_chip;
|
||||
struct pinctrl_dev;
|
||||
|
||||
static inline bool gpio_is_valid(int number)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -2,9 +2,10 @@
|
|||
#ifndef __LINUX_GPIO_CONSUMER_H
|
||||
#define __LINUX_GPIO_CONSUMER_H
|
||||
|
||||
#include <linux/bits.h>
|
||||
#include <linux/bug.h>
|
||||
#include <linux/compiler_types.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
struct device;
|
||||
|
||||
|
|
@ -156,6 +157,7 @@ int gpiod_set_raw_array_value_cansleep(unsigned int array_size,
|
|||
struct gpio_array *array_info,
|
||||
unsigned long *value_bitmap);
|
||||
|
||||
int gpiod_set_config(struct gpio_desc *desc, unsigned long config);
|
||||
int gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce);
|
||||
int gpiod_set_transitory(struct gpio_desc *desc, bool transitory);
|
||||
void gpiod_toggle_active_low(struct gpio_desc *desc);
|
||||
|
|
@ -189,6 +191,8 @@ struct gpio_desc *devm_fwnode_gpiod_get_index(struct device *dev,
|
|||
|
||||
#else /* CONFIG_GPIOLIB */
|
||||
|
||||
#include <linux/kernel.h>
|
||||
|
||||
static inline int gpiod_count(struct device *dev, const char *con_id)
|
||||
{
|
||||
return 0;
|
||||
|
|
@ -470,6 +474,13 @@ static inline int gpiod_set_raw_array_value_cansleep(unsigned int array_size,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline int gpiod_set_config(struct gpio_desc *desc, unsigned long config)
|
||||
{
|
||||
/* GPIO can never have been requested */
|
||||
WARN_ON(desc);
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static inline int gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce)
|
||||
{
|
||||
/* GPIO can never have been requested */
|
||||
|
|
|
|||
|
|
@ -87,7 +87,7 @@ struct gpio_irq_chip {
|
|||
* @need_valid_mask to make these GPIO lines unavailable for
|
||||
* translation.
|
||||
*/
|
||||
int (*child_to_parent_hwirq)(struct gpio_chip *chip,
|
||||
int (*child_to_parent_hwirq)(struct gpio_chip *gc,
|
||||
unsigned int child_hwirq,
|
||||
unsigned int child_type,
|
||||
unsigned int *parent_hwirq,
|
||||
|
|
@ -102,7 +102,7 @@ struct gpio_irq_chip {
|
|||
* variant named &gpiochip_populate_parent_fwspec_fourcell is also
|
||||
* available.
|
||||
*/
|
||||
void *(*populate_parent_alloc_arg)(struct gpio_chip *chip,
|
||||
void *(*populate_parent_alloc_arg)(struct gpio_chip *gc,
|
||||
unsigned int parent_hwirq,
|
||||
unsigned int parent_type);
|
||||
|
||||
|
|
@ -114,7 +114,7 @@ struct gpio_irq_chip {
|
|||
* callback. If this is not specified, then a default callback will be
|
||||
* provided that returns the line offset.
|
||||
*/
|
||||
unsigned int (*child_offset_to_irq)(struct gpio_chip *chip,
|
||||
unsigned int (*child_offset_to_irq)(struct gpio_chip *gc,
|
||||
unsigned int pin);
|
||||
|
||||
/**
|
||||
|
|
@ -209,7 +209,7 @@ struct gpio_irq_chip {
|
|||
* a particular driver wants to clear IRQ related registers
|
||||
* in order to avoid undesired events.
|
||||
*/
|
||||
int (*init_hw)(struct gpio_chip *chip);
|
||||
int (*init_hw)(struct gpio_chip *gc);
|
||||
|
||||
/**
|
||||
* @init_valid_mask: optional routine to initialize @valid_mask, to be
|
||||
|
|
@ -220,7 +220,7 @@ struct gpio_irq_chip {
|
|||
* then directly set some bits to "0" if they cannot be used for
|
||||
* interrupts.
|
||||
*/
|
||||
void (*init_valid_mask)(struct gpio_chip *chip,
|
||||
void (*init_valid_mask)(struct gpio_chip *gc,
|
||||
unsigned long *valid_mask,
|
||||
unsigned int ngpios);
|
||||
|
||||
|
|
@ -348,40 +348,40 @@ struct gpio_chip {
|
|||
struct device *parent;
|
||||
struct module *owner;
|
||||
|
||||
int (*request)(struct gpio_chip *chip,
|
||||
int (*request)(struct gpio_chip *gc,
|
||||
unsigned offset);
|
||||
void (*free)(struct gpio_chip *chip,
|
||||
void (*free)(struct gpio_chip *gc,
|
||||
unsigned offset);
|
||||
int (*get_direction)(struct gpio_chip *chip,
|
||||
int (*get_direction)(struct gpio_chip *gc,
|
||||
unsigned offset);
|
||||
int (*direction_input)(struct gpio_chip *chip,
|
||||
int (*direction_input)(struct gpio_chip *gc,
|
||||
unsigned offset);
|
||||
int (*direction_output)(struct gpio_chip *chip,
|
||||
int (*direction_output)(struct gpio_chip *gc,
|
||||
unsigned offset, int value);
|
||||
int (*get)(struct gpio_chip *chip,
|
||||
int (*get)(struct gpio_chip *gc,
|
||||
unsigned offset);
|
||||
int (*get_multiple)(struct gpio_chip *chip,
|
||||
int (*get_multiple)(struct gpio_chip *gc,
|
||||
unsigned long *mask,
|
||||
unsigned long *bits);
|
||||
void (*set)(struct gpio_chip *chip,
|
||||
void (*set)(struct gpio_chip *gc,
|
||||
unsigned offset, int value);
|
||||
void (*set_multiple)(struct gpio_chip *chip,
|
||||
void (*set_multiple)(struct gpio_chip *gc,
|
||||
unsigned long *mask,
|
||||
unsigned long *bits);
|
||||
int (*set_config)(struct gpio_chip *chip,
|
||||
int (*set_config)(struct gpio_chip *gc,
|
||||
unsigned offset,
|
||||
unsigned long config);
|
||||
int (*to_irq)(struct gpio_chip *chip,
|
||||
int (*to_irq)(struct gpio_chip *gc,
|
||||
unsigned offset);
|
||||
|
||||
void (*dbg_show)(struct seq_file *s,
|
||||
struct gpio_chip *chip);
|
||||
struct gpio_chip *gc);
|
||||
|
||||
int (*init_valid_mask)(struct gpio_chip *chip,
|
||||
int (*init_valid_mask)(struct gpio_chip *gc,
|
||||
unsigned long *valid_mask,
|
||||
unsigned int ngpios);
|
||||
|
||||
int (*add_pin_ranges)(struct gpio_chip *chip);
|
||||
int (*add_pin_ranges)(struct gpio_chip *gc);
|
||||
|
||||
int base;
|
||||
u16 ngpio;
|
||||
|
|
@ -458,11 +458,11 @@ struct gpio_chip {
|
|||
#endif /* CONFIG_OF_GPIO */
|
||||
};
|
||||
|
||||
extern const char *gpiochip_is_requested(struct gpio_chip *chip,
|
||||
extern const char *gpiochip_is_requested(struct gpio_chip *gc,
|
||||
unsigned offset);
|
||||
|
||||
/* add/remove chips */
|
||||
extern int gpiochip_add_data_with_key(struct gpio_chip *chip, void *data,
|
||||
extern int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data,
|
||||
struct lock_class_key *lock_key,
|
||||
struct lock_class_key *request_key);
|
||||
|
||||
|
|
@ -490,43 +490,43 @@ extern int gpiochip_add_data_with_key(struct gpio_chip *chip, void *data,
|
|||
* Otherwise it returns zero as a success code.
|
||||
*/
|
||||
#ifdef CONFIG_LOCKDEP
|
||||
#define gpiochip_add_data(chip, data) ({ \
|
||||
#define gpiochip_add_data(gc, data) ({ \
|
||||
static struct lock_class_key lock_key; \
|
||||
static struct lock_class_key request_key; \
|
||||
gpiochip_add_data_with_key(chip, data, &lock_key, \
|
||||
gpiochip_add_data_with_key(gc, data, &lock_key, \
|
||||
&request_key); \
|
||||
})
|
||||
#else
|
||||
#define gpiochip_add_data(chip, data) gpiochip_add_data_with_key(chip, data, NULL, NULL)
|
||||
#define gpiochip_add_data(gc, data) gpiochip_add_data_with_key(gc, data, NULL, NULL)
|
||||
#endif /* CONFIG_LOCKDEP */
|
||||
|
||||
static inline int gpiochip_add(struct gpio_chip *chip)
|
||||
static inline int gpiochip_add(struct gpio_chip *gc)
|
||||
{
|
||||
return gpiochip_add_data(chip, NULL);
|
||||
return gpiochip_add_data(gc, NULL);
|
||||
}
|
||||
extern void gpiochip_remove(struct gpio_chip *chip);
|
||||
extern int devm_gpiochip_add_data(struct device *dev, struct gpio_chip *chip,
|
||||
extern void gpiochip_remove(struct gpio_chip *gc);
|
||||
extern int devm_gpiochip_add_data(struct device *dev, struct gpio_chip *gc,
|
||||
void *data);
|
||||
|
||||
extern struct gpio_chip *gpiochip_find(void *data,
|
||||
int (*match)(struct gpio_chip *chip, void *data));
|
||||
int (*match)(struct gpio_chip *gc, void *data));
|
||||
|
||||
bool gpiochip_line_is_irq(struct gpio_chip *chip, unsigned int offset);
|
||||
int gpiochip_reqres_irq(struct gpio_chip *chip, unsigned int offset);
|
||||
void gpiochip_relres_irq(struct gpio_chip *chip, unsigned int offset);
|
||||
void gpiochip_disable_irq(struct gpio_chip *chip, unsigned int offset);
|
||||
void gpiochip_enable_irq(struct gpio_chip *chip, unsigned int offset);
|
||||
bool gpiochip_line_is_irq(struct gpio_chip *gc, unsigned int offset);
|
||||
int gpiochip_reqres_irq(struct gpio_chip *gc, unsigned int offset);
|
||||
void gpiochip_relres_irq(struct gpio_chip *gc, unsigned int offset);
|
||||
void gpiochip_disable_irq(struct gpio_chip *gc, unsigned int offset);
|
||||
void gpiochip_enable_irq(struct gpio_chip *gc, unsigned int offset);
|
||||
|
||||
/* Line status inquiry for drivers */
|
||||
bool gpiochip_line_is_open_drain(struct gpio_chip *chip, unsigned int offset);
|
||||
bool gpiochip_line_is_open_source(struct gpio_chip *chip, unsigned int offset);
|
||||
bool gpiochip_line_is_open_drain(struct gpio_chip *gc, unsigned int offset);
|
||||
bool gpiochip_line_is_open_source(struct gpio_chip *gc, unsigned int offset);
|
||||
|
||||
/* Sleep persistence inquiry for drivers */
|
||||
bool gpiochip_line_is_persistent(struct gpio_chip *chip, unsigned int offset);
|
||||
bool gpiochip_line_is_valid(const struct gpio_chip *chip, unsigned int offset);
|
||||
bool gpiochip_line_is_persistent(struct gpio_chip *gc, unsigned int offset);
|
||||
bool gpiochip_line_is_valid(const struct gpio_chip *gc, unsigned int offset);
|
||||
|
||||
/* get driver data */
|
||||
void *gpiochip_get_data(struct gpio_chip *chip);
|
||||
void *gpiochip_get_data(struct gpio_chip *gc);
|
||||
|
||||
struct bgpio_pdata {
|
||||
const char *label;
|
||||
|
|
@ -536,23 +536,23 @@ struct bgpio_pdata {
|
|||
|
||||
#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY
|
||||
|
||||
void *gpiochip_populate_parent_fwspec_twocell(struct gpio_chip *chip,
|
||||
void *gpiochip_populate_parent_fwspec_twocell(struct gpio_chip *gc,
|
||||
unsigned int parent_hwirq,
|
||||
unsigned int parent_type);
|
||||
void *gpiochip_populate_parent_fwspec_fourcell(struct gpio_chip *chip,
|
||||
void *gpiochip_populate_parent_fwspec_fourcell(struct gpio_chip *gc,
|
||||
unsigned int parent_hwirq,
|
||||
unsigned int parent_type);
|
||||
|
||||
#else
|
||||
|
||||
static inline void *gpiochip_populate_parent_fwspec_twocell(struct gpio_chip *chip,
|
||||
static inline void *gpiochip_populate_parent_fwspec_twocell(struct gpio_chip *gc,
|
||||
unsigned int parent_hwirq,
|
||||
unsigned int parent_type)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline void *gpiochip_populate_parent_fwspec_fourcell(struct gpio_chip *chip,
|
||||
static inline void *gpiochip_populate_parent_fwspec_fourcell(struct gpio_chip *gc,
|
||||
unsigned int parent_hwirq,
|
||||
unsigned int parent_type)
|
||||
{
|
||||
|
|
@ -572,6 +572,7 @@ int bgpio_init(struct gpio_chip *gc, struct device *dev,
|
|||
#define BGPIOF_BIG_ENDIAN_BYTE_ORDER BIT(3)
|
||||
#define BGPIOF_READ_OUTPUT_REG_SET BIT(4) /* reg_set stores output value */
|
||||
#define BGPIOF_NO_OUTPUT BIT(5) /* only input */
|
||||
#define BGPIOF_NO_SET_ON_INPUT BIT(6)
|
||||
|
||||
int gpiochip_irq_map(struct irq_domain *d, unsigned int irq,
|
||||
irq_hw_number_t hwirq);
|
||||
|
|
@ -582,11 +583,11 @@ int gpiochip_irq_domain_activate(struct irq_domain *domain,
|
|||
void gpiochip_irq_domain_deactivate(struct irq_domain *domain,
|
||||
struct irq_data *data);
|
||||
|
||||
void gpiochip_set_nested_irqchip(struct gpio_chip *gpiochip,
|
||||
void gpiochip_set_nested_irqchip(struct gpio_chip *gc,
|
||||
struct irq_chip *irqchip,
|
||||
unsigned int parent_irq);
|
||||
|
||||
int gpiochip_irqchip_add_key(struct gpio_chip *gpiochip,
|
||||
int gpiochip_irqchip_add_key(struct gpio_chip *gc,
|
||||
struct irq_chip *irqchip,
|
||||
unsigned int first_irq,
|
||||
irq_flow_handler_t handler,
|
||||
|
|
@ -595,7 +596,7 @@ int gpiochip_irqchip_add_key(struct gpio_chip *gpiochip,
|
|||
struct lock_class_key *lock_key,
|
||||
struct lock_class_key *request_key);
|
||||
|
||||
bool gpiochip_irqchip_irq_valid(const struct gpio_chip *gpiochip,
|
||||
bool gpiochip_irqchip_irq_valid(const struct gpio_chip *gc,
|
||||
unsigned int offset);
|
||||
|
||||
#ifdef CONFIG_LOCKDEP
|
||||
|
|
@ -606,7 +607,7 @@ bool gpiochip_irqchip_irq_valid(const struct gpio_chip *gpiochip,
|
|||
* boilerplate static inlines provides such a key for each
|
||||
* unique instance.
|
||||
*/
|
||||
static inline int gpiochip_irqchip_add(struct gpio_chip *gpiochip,
|
||||
static inline int gpiochip_irqchip_add(struct gpio_chip *gc,
|
||||
struct irq_chip *irqchip,
|
||||
unsigned int first_irq,
|
||||
irq_flow_handler_t handler,
|
||||
|
|
@ -615,12 +616,12 @@ static inline int gpiochip_irqchip_add(struct gpio_chip *gpiochip,
|
|||
static struct lock_class_key lock_key;
|
||||
static struct lock_class_key request_key;
|
||||
|
||||
return gpiochip_irqchip_add_key(gpiochip, irqchip, first_irq,
|
||||
return gpiochip_irqchip_add_key(gc, irqchip, first_irq,
|
||||
handler, type, false,
|
||||
&lock_key, &request_key);
|
||||
}
|
||||
|
||||
static inline int gpiochip_irqchip_add_nested(struct gpio_chip *gpiochip,
|
||||
static inline int gpiochip_irqchip_add_nested(struct gpio_chip *gc,
|
||||
struct irq_chip *irqchip,
|
||||
unsigned int first_irq,
|
||||
irq_flow_handler_t handler,
|
||||
|
|
@ -630,35 +631,35 @@ static inline int gpiochip_irqchip_add_nested(struct gpio_chip *gpiochip,
|
|||
static struct lock_class_key lock_key;
|
||||
static struct lock_class_key request_key;
|
||||
|
||||
return gpiochip_irqchip_add_key(gpiochip, irqchip, first_irq,
|
||||
return gpiochip_irqchip_add_key(gc, irqchip, first_irq,
|
||||
handler, type, true,
|
||||
&lock_key, &request_key);
|
||||
}
|
||||
#else /* ! CONFIG_LOCKDEP */
|
||||
static inline int gpiochip_irqchip_add(struct gpio_chip *gpiochip,
|
||||
static inline int gpiochip_irqchip_add(struct gpio_chip *gc,
|
||||
struct irq_chip *irqchip,
|
||||
unsigned int first_irq,
|
||||
irq_flow_handler_t handler,
|
||||
unsigned int type)
|
||||
{
|
||||
return gpiochip_irqchip_add_key(gpiochip, irqchip, first_irq,
|
||||
return gpiochip_irqchip_add_key(gc, irqchip, first_irq,
|
||||
handler, type, false, NULL, NULL);
|
||||
}
|
||||
|
||||
static inline int gpiochip_irqchip_add_nested(struct gpio_chip *gpiochip,
|
||||
static inline int gpiochip_irqchip_add_nested(struct gpio_chip *gc,
|
||||
struct irq_chip *irqchip,
|
||||
unsigned int first_irq,
|
||||
irq_flow_handler_t handler,
|
||||
unsigned int type)
|
||||
{
|
||||
return gpiochip_irqchip_add_key(gpiochip, irqchip, first_irq,
|
||||
return gpiochip_irqchip_add_key(gc, irqchip, first_irq,
|
||||
handler, type, true, NULL, NULL);
|
||||
}
|
||||
#endif /* CONFIG_LOCKDEP */
|
||||
|
||||
int gpiochip_generic_request(struct gpio_chip *chip, unsigned offset);
|
||||
void gpiochip_generic_free(struct gpio_chip *chip, unsigned offset);
|
||||
int gpiochip_generic_config(struct gpio_chip *chip, unsigned offset,
|
||||
int gpiochip_generic_request(struct gpio_chip *gc, unsigned offset);
|
||||
void gpiochip_generic_free(struct gpio_chip *gc, unsigned offset);
|
||||
int gpiochip_generic_config(struct gpio_chip *gc, unsigned offset,
|
||||
unsigned long config);
|
||||
|
||||
/**
|
||||
|
|
@ -675,25 +676,25 @@ struct gpio_pin_range {
|
|||
|
||||
#ifdef CONFIG_PINCTRL
|
||||
|
||||
int gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name,
|
||||
int gpiochip_add_pin_range(struct gpio_chip *gc, const char *pinctl_name,
|
||||
unsigned int gpio_offset, unsigned int pin_offset,
|
||||
unsigned int npins);
|
||||
int gpiochip_add_pingroup_range(struct gpio_chip *chip,
|
||||
int gpiochip_add_pingroup_range(struct gpio_chip *gc,
|
||||
struct pinctrl_dev *pctldev,
|
||||
unsigned int gpio_offset, const char *pin_group);
|
||||
void gpiochip_remove_pin_ranges(struct gpio_chip *chip);
|
||||
void gpiochip_remove_pin_ranges(struct gpio_chip *gc);
|
||||
|
||||
#else /* ! CONFIG_PINCTRL */
|
||||
|
||||
static inline int
|
||||
gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name,
|
||||
gpiochip_add_pin_range(struct gpio_chip *gc, const char *pinctl_name,
|
||||
unsigned int gpio_offset, unsigned int pin_offset,
|
||||
unsigned int npins)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int
|
||||
gpiochip_add_pingroup_range(struct gpio_chip *chip,
|
||||
gpiochip_add_pingroup_range(struct gpio_chip *gc,
|
||||
struct pinctrl_dev *pctldev,
|
||||
unsigned int gpio_offset, const char *pin_group)
|
||||
{
|
||||
|
|
@ -701,27 +702,27 @@ gpiochip_add_pingroup_range(struct gpio_chip *chip,
|
|||
}
|
||||
|
||||
static inline void
|
||||
gpiochip_remove_pin_ranges(struct gpio_chip *chip)
|
||||
gpiochip_remove_pin_ranges(struct gpio_chip *gc)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* CONFIG_PINCTRL */
|
||||
|
||||
struct gpio_desc *gpiochip_request_own_desc(struct gpio_chip *chip,
|
||||
struct gpio_desc *gpiochip_request_own_desc(struct gpio_chip *gc,
|
||||
unsigned int hwnum,
|
||||
const char *label,
|
||||
enum gpio_lookup_flags lflags,
|
||||
enum gpiod_flags dflags);
|
||||
void gpiochip_free_own_desc(struct gpio_desc *desc);
|
||||
|
||||
void devprop_gpiochip_set_names(struct gpio_chip *chip,
|
||||
void devprop_gpiochip_set_names(struct gpio_chip *gc,
|
||||
const struct fwnode_handle *fwnode);
|
||||
|
||||
#ifdef CONFIG_GPIOLIB
|
||||
|
||||
/* lock/unlock as IRQ */
|
||||
int gpiochip_lock_as_irq(struct gpio_chip *chip, unsigned int offset);
|
||||
void gpiochip_unlock_as_irq(struct gpio_chip *chip, unsigned int offset);
|
||||
int gpiochip_lock_as_irq(struct gpio_chip *gc, unsigned int offset);
|
||||
void gpiochip_unlock_as_irq(struct gpio_chip *gc, unsigned int offset);
|
||||
|
||||
|
||||
struct gpio_chip *gpiod_to_chip(const struct gpio_desc *desc);
|
||||
|
|
@ -735,14 +736,14 @@ static inline struct gpio_chip *gpiod_to_chip(const struct gpio_desc *desc)
|
|||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
|
||||
static inline int gpiochip_lock_as_irq(struct gpio_chip *chip,
|
||||
static inline int gpiochip_lock_as_irq(struct gpio_chip *gc,
|
||||
unsigned int offset)
|
||||
{
|
||||
WARN_ON(1);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline void gpiochip_unlock_as_irq(struct gpio_chip *chip,
|
||||
static inline void gpiochip_unlock_as_irq(struct gpio_chip *gc,
|
||||
unsigned int offset)
|
||||
{
|
||||
WARN_ON(1);
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ extern void rcu_nmi_exit(void);
|
|||
do { \
|
||||
account_irq_enter_time(current); \
|
||||
preempt_count_add(HARDIRQ_OFFSET); \
|
||||
trace_hardirq_enter(); \
|
||||
lockdep_hardirq_enter(); \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
|
|
@ -50,7 +50,7 @@ extern void irq_enter(void);
|
|||
*/
|
||||
#define __irq_exit() \
|
||||
do { \
|
||||
trace_hardirq_exit(); \
|
||||
lockdep_hardirq_exit(); \
|
||||
account_irq_exit_time(current); \
|
||||
preempt_count_sub(HARDIRQ_OFFSET); \
|
||||
} while (0)
|
||||
|
|
@ -74,12 +74,12 @@ extern void irq_exit(void);
|
|||
BUG_ON(in_nmi()); \
|
||||
preempt_count_add(NMI_OFFSET + HARDIRQ_OFFSET); \
|
||||
rcu_nmi_enter(); \
|
||||
trace_hardirq_enter(); \
|
||||
lockdep_hardirq_enter(); \
|
||||
} while (0)
|
||||
|
||||
#define nmi_exit() \
|
||||
do { \
|
||||
trace_hardirq_exit(); \
|
||||
lockdep_hardirq_exit(); \
|
||||
rcu_nmi_exit(); \
|
||||
BUG_ON(!in_nmi()); \
|
||||
preempt_count_sub(NMI_OFFSET + HARDIRQ_OFFSET); \
|
||||
|
|
|
|||
|
|
@ -145,7 +145,7 @@ static inline void hash_del_rcu(struct hlist_node *node)
|
|||
* hash entry
|
||||
* @name: hashtable to iterate
|
||||
* @bkt: integer to use as bucket loop cursor
|
||||
* @tmp: a &struct used for temporary storage
|
||||
* @tmp: a &struct hlist_node used for temporary storage
|
||||
* @obj: the type * to use as a loop cursor for each entry
|
||||
* @member: the name of the hlist_node within the struct
|
||||
*/
|
||||
|
|
@ -197,7 +197,7 @@ static inline void hash_del_rcu(struct hlist_node *node)
|
|||
* same bucket safe against removals
|
||||
* @name: hashtable to iterate
|
||||
* @obj: the type * to use as a loop cursor for each entry
|
||||
* @tmp: a &struct used for temporary storage
|
||||
* @tmp: a &struct hlist_node used for temporary storage
|
||||
* @member: the name of the hlist_node within the struct
|
||||
* @key: the key of the objects to iterate over
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -3,58 +3,8 @@
|
|||
* Copyright 2013 Red Hat Inc.
|
||||
*
|
||||
* Authors: Jérôme Glisse <jglisse@redhat.com>
|
||||
*/
|
||||
/*
|
||||
* Heterogeneous Memory Management (HMM)
|
||||
*
|
||||
* See Documentation/vm/hmm.rst for reasons and overview of what HMM is and it
|
||||
* is for. Here we focus on the HMM API description, with some explanation of
|
||||
* the underlying implementation.
|
||||
*
|
||||
* Short description: HMM provides a set of helpers to share a virtual address
|
||||
* space between CPU and a device, so that the device can access any valid
|
||||
* address of the process (while still obeying memory protection). HMM also
|
||||
* provides helpers to migrate process memory to device memory, and back. Each
|
||||
* set of functionality (address space mirroring, and migration to and from
|
||||
* device memory) can be used independently of the other.
|
||||
*
|
||||
*
|
||||
* HMM address space mirroring API:
|
||||
*
|
||||
* Use HMM address space mirroring if you want to mirror a range of the CPU
|
||||
* page tables of a process into a device page table. Here, "mirror" means "keep
|
||||
* synchronized". Prerequisites: the device must provide the ability to write-
|
||||
* protect its page tables (at PAGE_SIZE granularity), and must be able to
|
||||
* recover from the resulting potential page faults.
|
||||
*
|
||||
* HMM guarantees that at any point in time, a given virtual address points to
|
||||
* either the same memory in both CPU and device page tables (that is: CPU and
|
||||
* device page tables each point to the same pages), or that one page table (CPU
|
||||
* or device) points to no entry, while the other still points to the old page
|
||||
* for the address. The latter case happens when the CPU page table update
|
||||
* happens first, and then the update is mirrored over to the device page table.
|
||||
* This does not cause any issue, because the CPU page table cannot start
|
||||
* pointing to a new page until the device page table is invalidated.
|
||||
*
|
||||
* HMM uses mmu_notifiers to monitor the CPU page tables, and forwards any
|
||||
* updates to each device driver that has registered a mirror. It also provides
|
||||
* some API calls to help with taking a snapshot of the CPU page table, and to
|
||||
* synchronize with any updates that might happen concurrently.
|
||||
*
|
||||
*
|
||||
* HMM migration to and from device memory:
|
||||
*
|
||||
* HMM provides a set of helpers to hotplug device memory as ZONE_DEVICE, with
|
||||
* a new MEMORY_DEVICE_PRIVATE type. This provides a struct page for each page
|
||||
* of the device memory, and allows the device driver to manage its memory
|
||||
* using those struct pages. Having struct pages for device memory makes
|
||||
* migration easier. Because that memory is not addressable by the CPU it must
|
||||
* never be pinned to the device; in other words, any CPU page fault can always
|
||||
* cause the device memory to be migrated (copied/moved) back to regular memory.
|
||||
*
|
||||
* A new migrate helper (migrate_vma()) has been added (see mm/migrate.c) that
|
||||
* allows use of a device DMA engine to perform the copy operation between
|
||||
* regular system memory and device memory.
|
||||
* See Documentation/vm/hmm.rst for reasons and overview of what HMM is.
|
||||
*/
|
||||
#ifndef LINUX_HMM_H
|
||||
#define LINUX_HMM_H
|
||||
|
|
@ -74,7 +24,6 @@
|
|||
* Flags:
|
||||
* HMM_PFN_VALID: pfn is valid. It has, at least, read permission.
|
||||
* HMM_PFN_WRITE: CPU page table has write permission set
|
||||
* HMM_PFN_DEVICE_PRIVATE: private device memory (ZONE_DEVICE)
|
||||
*
|
||||
* The driver provides a flags array for mapping page protections to device
|
||||
* PTE bits. If the driver valid bit for an entry is bit 3,
|
||||
|
|
@ -86,7 +35,6 @@
|
|||
enum hmm_pfn_flag_e {
|
||||
HMM_PFN_VALID = 0,
|
||||
HMM_PFN_WRITE,
|
||||
HMM_PFN_DEVICE_PRIVATE,
|
||||
HMM_PFN_FLAG_MAX
|
||||
};
|
||||
|
||||
|
|
@ -122,9 +70,6 @@ enum hmm_pfn_value_e {
|
|||
*
|
||||
* @notifier: a mmu_interval_notifier that includes the start/end
|
||||
* @notifier_seq: result of mmu_interval_read_begin()
|
||||
* @hmm: the core HMM structure this range is active against
|
||||
* @vma: the vm area struct for the range
|
||||
* @list: all range lock are on a list
|
||||
* @start: range virtual start address (inclusive)
|
||||
* @end: range virtual end address (exclusive)
|
||||
* @pfns: array of pfns (big enough for the range)
|
||||
|
|
@ -132,8 +77,8 @@ enum hmm_pfn_value_e {
|
|||
* @values: pfn value for some special case (none, special, error, ...)
|
||||
* @default_flags: default flags for the range (write, read, ... see hmm doc)
|
||||
* @pfn_flags_mask: allows to mask pfn flags so that only default_flags matter
|
||||
* @pfn_shifts: pfn shift value (should be <= PAGE_SHIFT)
|
||||
* @valid: pfns array did not change since it has been fill by an HMM function
|
||||
* @pfn_shift: pfn shift value (should be <= PAGE_SHIFT)
|
||||
* @dev_private_owner: owner of device private pages
|
||||
*/
|
||||
struct hmm_range {
|
||||
struct mmu_interval_notifier *notifier;
|
||||
|
|
@ -146,6 +91,7 @@ struct hmm_range {
|
|||
uint64_t default_flags;
|
||||
uint64_t pfn_flags_mask;
|
||||
uint8_t pfn_shift;
|
||||
void *dev_private_owner;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -171,71 +117,10 @@ static inline struct page *hmm_device_entry_to_page(const struct hmm_range *rang
|
|||
return pfn_to_page(entry >> range->pfn_shift);
|
||||
}
|
||||
|
||||
/*
|
||||
* hmm_device_entry_to_pfn() - return pfn value store in a device entry
|
||||
* @range: range use to decode device entry value
|
||||
* @entry: device entry to extract pfn from
|
||||
* Return: pfn value if device entry is valid, -1UL otherwise
|
||||
*/
|
||||
static inline unsigned long
|
||||
hmm_device_entry_to_pfn(const struct hmm_range *range, uint64_t pfn)
|
||||
{
|
||||
if (pfn == range->values[HMM_PFN_NONE])
|
||||
return -1UL;
|
||||
if (pfn == range->values[HMM_PFN_ERROR])
|
||||
return -1UL;
|
||||
if (pfn == range->values[HMM_PFN_SPECIAL])
|
||||
return -1UL;
|
||||
if (!(pfn & range->flags[HMM_PFN_VALID]))
|
||||
return -1UL;
|
||||
return (pfn >> range->pfn_shift);
|
||||
}
|
||||
|
||||
/*
|
||||
* hmm_device_entry_from_page() - create a valid device entry for a page
|
||||
* @range: range use to encode HMM pfn value
|
||||
* @page: page for which to create the device entry
|
||||
* Return: valid device entry for the page
|
||||
*/
|
||||
static inline uint64_t hmm_device_entry_from_page(const struct hmm_range *range,
|
||||
struct page *page)
|
||||
{
|
||||
return (page_to_pfn(page) << range->pfn_shift) |
|
||||
range->flags[HMM_PFN_VALID];
|
||||
}
|
||||
|
||||
/*
|
||||
* hmm_device_entry_from_pfn() - create a valid device entry value from pfn
|
||||
* @range: range use to encode HMM pfn value
|
||||
* @pfn: pfn value for which to create the device entry
|
||||
* Return: valid device entry for the pfn
|
||||
*/
|
||||
static inline uint64_t hmm_device_entry_from_pfn(const struct hmm_range *range,
|
||||
unsigned long pfn)
|
||||
{
|
||||
return (pfn << range->pfn_shift) |
|
||||
range->flags[HMM_PFN_VALID];
|
||||
}
|
||||
|
||||
/*
|
||||
* Retry fault if non-blocking, drop mmap_sem and return -EAGAIN in that case.
|
||||
*/
|
||||
#define HMM_FAULT_ALLOW_RETRY (1 << 0)
|
||||
|
||||
/* Don't fault in missing PTEs, just snapshot the current state. */
|
||||
#define HMM_FAULT_SNAPSHOT (1 << 1)
|
||||
|
||||
#ifdef CONFIG_HMM_MIRROR
|
||||
/*
|
||||
* Please see Documentation/vm/hmm.rst for how to use the range API.
|
||||
*/
|
||||
long hmm_range_fault(struct hmm_range *range, unsigned int flags);
|
||||
#else
|
||||
static inline long hmm_range_fault(struct hmm_range *range, unsigned int flags)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
#endif
|
||||
long hmm_range_fault(struct hmm_range *range);
|
||||
|
||||
/*
|
||||
* HMM_RANGE_DEFAULT_TIMEOUT - default timeout (ms) when waiting for a range
|
||||
|
|
|
|||
|
|
@ -46,9 +46,46 @@ extern bool move_huge_pmd(struct vm_area_struct *vma, unsigned long old_addr,
|
|||
pmd_t *old_pmd, pmd_t *new_pmd);
|
||||
extern int change_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd,
|
||||
unsigned long addr, pgprot_t newprot,
|
||||
int prot_numa);
|
||||
vm_fault_t vmf_insert_pfn_pmd(struct vm_fault *vmf, pfn_t pfn, bool write);
|
||||
vm_fault_t vmf_insert_pfn_pud(struct vm_fault *vmf, pfn_t pfn, bool write);
|
||||
unsigned long cp_flags);
|
||||
vm_fault_t vmf_insert_pfn_pmd_prot(struct vm_fault *vmf, pfn_t pfn,
|
||||
pgprot_t pgprot, bool write);
|
||||
|
||||
/**
|
||||
* vmf_insert_pfn_pmd - insert a pmd size pfn
|
||||
* @vmf: Structure describing the fault
|
||||
* @pfn: pfn to insert
|
||||
* @pgprot: page protection to use
|
||||
* @write: whether it's a write fault
|
||||
*
|
||||
* Insert a pmd size pfn. See vmf_insert_pfn() for additional info.
|
||||
*
|
||||
* Return: vm_fault_t value.
|
||||
*/
|
||||
static inline vm_fault_t vmf_insert_pfn_pmd(struct vm_fault *vmf, pfn_t pfn,
|
||||
bool write)
|
||||
{
|
||||
return vmf_insert_pfn_pmd_prot(vmf, pfn, vmf->vma->vm_page_prot, write);
|
||||
}
|
||||
vm_fault_t vmf_insert_pfn_pud_prot(struct vm_fault *vmf, pfn_t pfn,
|
||||
pgprot_t pgprot, bool write);
|
||||
|
||||
/**
|
||||
* vmf_insert_pfn_pud - insert a pud size pfn
|
||||
* @vmf: Structure describing the fault
|
||||
* @pfn: pfn to insert
|
||||
* @pgprot: page protection to use
|
||||
* @write: whether it's a write fault
|
||||
*
|
||||
* Insert a pud size pfn. See vmf_insert_pfn() for additional info.
|
||||
*
|
||||
* Return: vm_fault_t value.
|
||||
*/
|
||||
static inline vm_fault_t vmf_insert_pfn_pud(struct vm_fault *vmf, pfn_t pfn,
|
||||
bool write)
|
||||
{
|
||||
return vmf_insert_pfn_pud_prot(vmf, pfn, vmf->vma->vm_page_prot, write);
|
||||
}
|
||||
|
||||
enum transparent_hugepage_flag {
|
||||
TRANSPARENT_HUGEPAGE_FLAG,
|
||||
TRANSPARENT_HUGEPAGE_REQ_MADV_FLAG,
|
||||
|
|
@ -87,8 +124,6 @@ extern struct kobj_attribute shmem_enabled_attr;
|
|||
#define HPAGE_PUD_SIZE ((1UL) << HPAGE_PUD_SHIFT)
|
||||
#define HPAGE_PUD_MASK (~(HPAGE_PUD_SIZE - 1))
|
||||
|
||||
extern bool is_vma_temporary_stack(struct vm_area_struct *vma);
|
||||
|
||||
extern unsigned long transparent_hugepage_flags;
|
||||
|
||||
/*
|
||||
|
|
@ -100,7 +135,7 @@ static inline bool __transparent_hugepage_enabled(struct vm_area_struct *vma)
|
|||
if (vma->vm_flags & VM_NOHUGEPAGE)
|
||||
return false;
|
||||
|
||||
if (is_vma_temporary_stack(vma))
|
||||
if (vma_is_temporary_stack(vma))
|
||||
return false;
|
||||
|
||||
if (test_bit(MMF_DISABLE_THP, &vma->vm_mm->flags))
|
||||
|
|
@ -289,7 +324,11 @@ static inline struct list_head *page_deferred_list(struct page *page)
|
|||
#define HPAGE_PUD_MASK ({ BUILD_BUG(); 0; })
|
||||
#define HPAGE_PUD_SIZE ({ BUILD_BUG(); 0; })
|
||||
|
||||
#define hpage_nr_pages(x) 1
|
||||
static inline int hpage_nr_pages(struct page *page)
|
||||
{
|
||||
VM_BUG_ON_PAGE(PageTail(page), page);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline bool __transparent_hugepage_enabled(struct vm_area_struct *vma)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -46,7 +46,52 @@ struct resv_map {
|
|||
long adds_in_progress;
|
||||
struct list_head region_cache;
|
||||
long region_cache_count;
|
||||
#ifdef CONFIG_CGROUP_HUGETLB
|
||||
/*
|
||||
* On private mappings, the counter to uncharge reservations is stored
|
||||
* here. If these fields are 0, then either the mapping is shared, or
|
||||
* cgroup accounting is disabled for this resv_map.
|
||||
*/
|
||||
struct page_counter *reservation_counter;
|
||||
unsigned long pages_per_hpage;
|
||||
struct cgroup_subsys_state *css;
|
||||
#endif
|
||||
};
|
||||
|
||||
/*
|
||||
* Region tracking -- allows tracking of reservations and instantiated pages
|
||||
* across the pages in a mapping.
|
||||
*
|
||||
* The region data structures are embedded into a resv_map and protected
|
||||
* by a resv_map's lock. The set of regions within the resv_map represent
|
||||
* reservations for huge pages, or huge pages that have already been
|
||||
* instantiated within the map. The from and to elements are huge page
|
||||
* indicies into the associated mapping. from indicates the starting index
|
||||
* of the region. to represents the first index past the end of the region.
|
||||
*
|
||||
* For example, a file region structure with from == 0 and to == 4 represents
|
||||
* four huge pages in a mapping. It is important to note that the to element
|
||||
* represents the first element past the end of the region. This is used in
|
||||
* arithmetic as 4(to) - 0(from) = 4 huge pages in the region.
|
||||
*
|
||||
* Interval notation of the form [from, to) will be used to indicate that
|
||||
* the endpoint from is inclusive and to is exclusive.
|
||||
*/
|
||||
struct file_region {
|
||||
struct list_head link;
|
||||
long from;
|
||||
long to;
|
||||
#ifdef CONFIG_CGROUP_HUGETLB
|
||||
/*
|
||||
* On shared mappings, each reserved region appears as a struct
|
||||
* file_region in resv_map. These fields hold the info needed to
|
||||
* uncharge each reservation.
|
||||
*/
|
||||
struct page_counter *reservation_counter;
|
||||
struct cgroup_subsys_state *css;
|
||||
#endif
|
||||
};
|
||||
|
||||
extern struct resv_map *resv_map_alloc(void);
|
||||
void resv_map_release(struct kref *ref);
|
||||
|
||||
|
|
@ -109,6 +154,8 @@ u32 hugetlb_fault_mutex_hash(struct address_space *mapping, pgoff_t idx);
|
|||
|
||||
pte_t *huge_pmd_share(struct mm_struct *mm, unsigned long addr, pud_t *pud);
|
||||
|
||||
struct address_space *hugetlb_page_mapping_lock_write(struct page *hpage);
|
||||
|
||||
extern int sysctl_hugetlb_shm_group;
|
||||
extern struct list_head huge_boot_pages;
|
||||
|
||||
|
|
@ -151,6 +198,12 @@ static inline unsigned long hugetlb_total_pages(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline struct address_space *hugetlb_page_mapping_lock_write(
|
||||
struct page *hpage)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline int huge_pmd_unshare(struct mm_struct *mm, unsigned long *addr,
|
||||
pte_t *ptep)
|
||||
{
|
||||
|
|
@ -390,7 +443,10 @@ static inline bool is_file_hugepages(struct file *file)
|
|||
return is_file_shm_hugepages(file);
|
||||
}
|
||||
|
||||
|
||||
static inline struct hstate *hstate_inode(struct inode *i)
|
||||
{
|
||||
return HUGETLBFS_SB(i->i_sb)->hstate;
|
||||
}
|
||||
#else /* !CONFIG_HUGETLBFS */
|
||||
|
||||
#define is_file_hugepages(file) false
|
||||
|
|
@ -402,6 +458,10 @@ hugetlb_file_setup(const char *name, size_t size, vm_flags_t acctflag,
|
|||
return ERR_PTR(-ENOSYS);
|
||||
}
|
||||
|
||||
static inline struct hstate *hstate_inode(struct inode *i)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
#endif /* !CONFIG_HUGETLBFS */
|
||||
|
||||
#ifdef HAVE_ARCH_HUGETLB_UNMAPPED_AREA
|
||||
|
|
@ -432,8 +492,8 @@ struct hstate {
|
|||
unsigned int surplus_huge_pages_node[MAX_NUMNODES];
|
||||
#ifdef CONFIG_CGROUP_HUGETLB
|
||||
/* cgroup control files */
|
||||
struct cftype cgroup_files_dfl[5];
|
||||
struct cftype cgroup_files_legacy[5];
|
||||
struct cftype cgroup_files_dfl[7];
|
||||
struct cftype cgroup_files_legacy[9];
|
||||
#endif
|
||||
char name[HSTATE_NAME_LEN];
|
||||
};
|
||||
|
|
@ -472,11 +532,6 @@ extern unsigned int default_hstate_idx;
|
|||
|
||||
#define default_hstate (hstates[default_hstate_idx])
|
||||
|
||||
static inline struct hstate *hstate_inode(struct inode *i)
|
||||
{
|
||||
return HUGETLBFS_SB(i->i_sb)->hstate;
|
||||
}
|
||||
|
||||
static inline struct hstate *hstate_file(struct file *f)
|
||||
{
|
||||
return hstate_inode(file_inode(f));
|
||||
|
|
@ -729,11 +784,6 @@ static inline struct hstate *hstate_vma(struct vm_area_struct *vma)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static inline struct hstate *hstate_inode(struct inode *i)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline struct hstate *page_hstate(struct page *page)
|
||||
{
|
||||
return NULL;
|
||||
|
|
@ -845,4 +895,16 @@ static inline spinlock_t *huge_pte_lock(struct hstate *h,
|
|||
return ptl;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_HUGETLB_PAGE) && defined(CONFIG_CMA)
|
||||
extern void __init hugetlb_cma_reserve(int order);
|
||||
extern void __init hugetlb_cma_check(void);
|
||||
#else
|
||||
static inline __init void hugetlb_cma_reserve(int order)
|
||||
{
|
||||
}
|
||||
static inline __init void hugetlb_cma_check(void)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _LINUX_HUGETLB_H */
|
||||
|
|
|
|||
|
|
@ -18,34 +18,96 @@
|
|||
#include <linux/mmdebug.h>
|
||||
|
||||
struct hugetlb_cgroup;
|
||||
struct resv_map;
|
||||
struct file_region;
|
||||
|
||||
/*
|
||||
* Minimum page order trackable by hugetlb cgroup.
|
||||
* At least 3 pages are necessary for all the tracking information.
|
||||
* At least 4 pages are necessary for all the tracking information.
|
||||
* The second tail page (hpage[2]) is the fault usage cgroup.
|
||||
* The third tail page (hpage[3]) is the reservation usage cgroup.
|
||||
*/
|
||||
#define HUGETLB_CGROUP_MIN_ORDER 2
|
||||
|
||||
#ifdef CONFIG_CGROUP_HUGETLB
|
||||
enum hugetlb_memory_event {
|
||||
HUGETLB_MAX,
|
||||
HUGETLB_NR_MEMORY_EVENTS,
|
||||
};
|
||||
|
||||
static inline struct hugetlb_cgroup *hugetlb_cgroup_from_page(struct page *page)
|
||||
struct hugetlb_cgroup {
|
||||
struct cgroup_subsys_state css;
|
||||
|
||||
/*
|
||||
* the counter to account for hugepages from hugetlb.
|
||||
*/
|
||||
struct page_counter hugepage[HUGE_MAX_HSTATE];
|
||||
|
||||
/*
|
||||
* the counter to account for hugepage reservations from hugetlb.
|
||||
*/
|
||||
struct page_counter rsvd_hugepage[HUGE_MAX_HSTATE];
|
||||
|
||||
atomic_long_t events[HUGE_MAX_HSTATE][HUGETLB_NR_MEMORY_EVENTS];
|
||||
atomic_long_t events_local[HUGE_MAX_HSTATE][HUGETLB_NR_MEMORY_EVENTS];
|
||||
|
||||
/* Handle for "hugetlb.events" */
|
||||
struct cgroup_file events_file[HUGE_MAX_HSTATE];
|
||||
|
||||
/* Handle for "hugetlb.events.local" */
|
||||
struct cgroup_file events_local_file[HUGE_MAX_HSTATE];
|
||||
};
|
||||
|
||||
static inline struct hugetlb_cgroup *
|
||||
__hugetlb_cgroup_from_page(struct page *page, bool rsvd)
|
||||
{
|
||||
VM_BUG_ON_PAGE(!PageHuge(page), page);
|
||||
|
||||
if (compound_order(page) < HUGETLB_CGROUP_MIN_ORDER)
|
||||
return NULL;
|
||||
return (struct hugetlb_cgroup *)page[2].private;
|
||||
if (rsvd)
|
||||
return (struct hugetlb_cgroup *)page[3].private;
|
||||
else
|
||||
return (struct hugetlb_cgroup *)page[2].private;
|
||||
}
|
||||
|
||||
static inline
|
||||
int set_hugetlb_cgroup(struct page *page, struct hugetlb_cgroup *h_cg)
|
||||
static inline struct hugetlb_cgroup *hugetlb_cgroup_from_page(struct page *page)
|
||||
{
|
||||
return __hugetlb_cgroup_from_page(page, false);
|
||||
}
|
||||
|
||||
static inline struct hugetlb_cgroup *
|
||||
hugetlb_cgroup_from_page_rsvd(struct page *page)
|
||||
{
|
||||
return __hugetlb_cgroup_from_page(page, true);
|
||||
}
|
||||
|
||||
static inline int __set_hugetlb_cgroup(struct page *page,
|
||||
struct hugetlb_cgroup *h_cg, bool rsvd)
|
||||
{
|
||||
VM_BUG_ON_PAGE(!PageHuge(page), page);
|
||||
|
||||
if (compound_order(page) < HUGETLB_CGROUP_MIN_ORDER)
|
||||
return -1;
|
||||
page[2].private = (unsigned long)h_cg;
|
||||
if (rsvd)
|
||||
page[3].private = (unsigned long)h_cg;
|
||||
else
|
||||
page[2].private = (unsigned long)h_cg;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int set_hugetlb_cgroup(struct page *page,
|
||||
struct hugetlb_cgroup *h_cg)
|
||||
{
|
||||
return __set_hugetlb_cgroup(page, h_cg, false);
|
||||
}
|
||||
|
||||
static inline int set_hugetlb_cgroup_rsvd(struct page *page,
|
||||
struct hugetlb_cgroup *h_cg)
|
||||
{
|
||||
return __set_hugetlb_cgroup(page, h_cg, true);
|
||||
}
|
||||
|
||||
static inline bool hugetlb_cgroup_disabled(void)
|
||||
{
|
||||
return !cgroup_subsys_enabled(hugetlb_cgrp_subsys);
|
||||
|
|
@ -53,25 +115,67 @@ static inline bool hugetlb_cgroup_disabled(void)
|
|||
|
||||
extern int hugetlb_cgroup_charge_cgroup(int idx, unsigned long nr_pages,
|
||||
struct hugetlb_cgroup **ptr);
|
||||
extern int hugetlb_cgroup_charge_cgroup_rsvd(int idx, unsigned long nr_pages,
|
||||
struct hugetlb_cgroup **ptr);
|
||||
extern void hugetlb_cgroup_commit_charge(int idx, unsigned long nr_pages,
|
||||
struct hugetlb_cgroup *h_cg,
|
||||
struct page *page);
|
||||
extern void hugetlb_cgroup_commit_charge_rsvd(int idx, unsigned long nr_pages,
|
||||
struct hugetlb_cgroup *h_cg,
|
||||
struct page *page);
|
||||
extern void hugetlb_cgroup_uncharge_page(int idx, unsigned long nr_pages,
|
||||
struct page *page);
|
||||
extern void hugetlb_cgroup_uncharge_page_rsvd(int idx, unsigned long nr_pages,
|
||||
struct page *page);
|
||||
|
||||
extern void hugetlb_cgroup_uncharge_cgroup(int idx, unsigned long nr_pages,
|
||||
struct hugetlb_cgroup *h_cg);
|
||||
extern void hugetlb_cgroup_uncharge_cgroup_rsvd(int idx, unsigned long nr_pages,
|
||||
struct hugetlb_cgroup *h_cg);
|
||||
extern void hugetlb_cgroup_uncharge_counter(struct resv_map *resv,
|
||||
unsigned long start,
|
||||
unsigned long end);
|
||||
|
||||
extern void hugetlb_cgroup_uncharge_file_region(struct resv_map *resv,
|
||||
struct file_region *rg,
|
||||
unsigned long nr_pages);
|
||||
|
||||
extern void hugetlb_cgroup_file_init(void) __init;
|
||||
extern void hugetlb_cgroup_migrate(struct page *oldhpage,
|
||||
struct page *newhpage);
|
||||
|
||||
#else
|
||||
static inline void hugetlb_cgroup_uncharge_file_region(struct resv_map *resv,
|
||||
struct file_region *rg,
|
||||
unsigned long nr_pages)
|
||||
{
|
||||
}
|
||||
|
||||
static inline struct hugetlb_cgroup *hugetlb_cgroup_from_page(struct page *page)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline
|
||||
int set_hugetlb_cgroup(struct page *page, struct hugetlb_cgroup *h_cg)
|
||||
static inline struct hugetlb_cgroup *
|
||||
hugetlb_cgroup_from_page_resv(struct page *page)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline struct hugetlb_cgroup *
|
||||
hugetlb_cgroup_from_page_rsvd(struct page *page)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline int set_hugetlb_cgroup(struct page *page,
|
||||
struct hugetlb_cgroup *h_cg)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int set_hugetlb_cgroup_rsvd(struct page *page,
|
||||
struct hugetlb_cgroup *h_cg)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -81,28 +185,57 @@ static inline bool hugetlb_cgroup_disabled(void)
|
|||
return true;
|
||||
}
|
||||
|
||||
static inline int
|
||||
hugetlb_cgroup_charge_cgroup(int idx, unsigned long nr_pages,
|
||||
struct hugetlb_cgroup **ptr)
|
||||
static inline int hugetlb_cgroup_charge_cgroup(int idx, unsigned long nr_pages,
|
||||
struct hugetlb_cgroup **ptr)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void
|
||||
hugetlb_cgroup_commit_charge(int idx, unsigned long nr_pages,
|
||||
struct hugetlb_cgroup *h_cg,
|
||||
struct page *page)
|
||||
static inline int hugetlb_cgroup_charge_cgroup_rsvd(int idx,
|
||||
unsigned long nr_pages,
|
||||
struct hugetlb_cgroup **ptr)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void hugetlb_cgroup_commit_charge(int idx, unsigned long nr_pages,
|
||||
struct hugetlb_cgroup *h_cg,
|
||||
struct page *page)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void
|
||||
hugetlb_cgroup_uncharge_page(int idx, unsigned long nr_pages, struct page *page)
|
||||
hugetlb_cgroup_commit_charge_rsvd(int idx, unsigned long nr_pages,
|
||||
struct hugetlb_cgroup *h_cg,
|
||||
struct page *page)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void hugetlb_cgroup_uncharge_page(int idx, unsigned long nr_pages,
|
||||
struct page *page)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void hugetlb_cgroup_uncharge_page_rsvd(int idx,
|
||||
unsigned long nr_pages,
|
||||
struct page *page)
|
||||
{
|
||||
}
|
||||
static inline void hugetlb_cgroup_uncharge_cgroup(int idx,
|
||||
unsigned long nr_pages,
|
||||
struct hugetlb_cgroup *h_cg)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void
|
||||
hugetlb_cgroup_uncharge_cgroup(int idx, unsigned long nr_pages,
|
||||
struct hugetlb_cgroup *h_cg)
|
||||
hugetlb_cgroup_uncharge_cgroup_rsvd(int idx, unsigned long nr_pages,
|
||||
struct hugetlb_cgroup *h_cg)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void hugetlb_cgroup_uncharge_counter(struct resv_map *resv,
|
||||
unsigned long start,
|
||||
unsigned long end)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -15,24 +15,19 @@
|
|||
|
||||
/**
|
||||
* i2c_smbus_alert_setup - platform data for the smbus_alert i2c client
|
||||
* @alert_edge_triggered: whether the alert interrupt is edge (1) or level (0)
|
||||
* triggered
|
||||
* @irq: IRQ number, if the smbus_alert driver should take care of interrupt
|
||||
* handling
|
||||
*
|
||||
* If irq is not specified, the smbus_alert driver doesn't take care of
|
||||
* interrupt handling. In that case it is up to the I2C bus driver to either
|
||||
* handle the interrupts or to poll for alerts.
|
||||
*
|
||||
* If irq is specified then it it crucial that alert_edge_triggered is
|
||||
* properly set.
|
||||
*/
|
||||
struct i2c_smbus_alert_setup {
|
||||
int irq;
|
||||
};
|
||||
|
||||
struct i2c_client *i2c_setup_smbus_alert(struct i2c_adapter *adapter,
|
||||
struct i2c_smbus_alert_setup *setup);
|
||||
struct i2c_client *i2c_new_smbus_alert_device(struct i2c_adapter *adapter,
|
||||
struct i2c_smbus_alert_setup *setup);
|
||||
int i2c_handle_smbus_alert(struct i2c_client *ara);
|
||||
|
||||
#if IS_ENABLED(CONFIG_I2C_SMBUS) && IS_ENABLED(CONFIG_OF)
|
||||
|
|
|
|||
|
|
@ -39,6 +39,14 @@ enum i2c_slave_event;
|
|||
typedef int (*i2c_slave_cb_t)(struct i2c_client *client,
|
||||
enum i2c_slave_event event, u8 *val);
|
||||
|
||||
/* I2C Frequency Modes */
|
||||
#define I2C_MAX_STANDARD_MODE_FREQ 100000
|
||||
#define I2C_MAX_FAST_MODE_FREQ 400000
|
||||
#define I2C_MAX_FAST_MODE_PLUS_FREQ 1000000
|
||||
#define I2C_MAX_TURBO_MODE_FREQ 1400000
|
||||
#define I2C_MAX_HIGH_SPEED_MODE_FREQ 3400000
|
||||
#define I2C_MAX_ULTRA_FAST_MODE_FREQ 5000000
|
||||
|
||||
struct module;
|
||||
struct property_entry;
|
||||
|
||||
|
|
@ -506,7 +514,7 @@ i2c_register_board_info(int busnum, struct i2c_board_info const *info,
|
|||
* @smbus_xfer_atomic: same as @smbus_xfer. Yet, only using atomic context
|
||||
* so e.g. PMICs can be accessed very late before shutdown. Optional.
|
||||
* @functionality: Return the flags that this algorithm/adapter pair supports
|
||||
* from the I2C_FUNC_* flags.
|
||||
* from the ``I2C_FUNC_*`` flags.
|
||||
* @reg_slave: Register given client to I2C slave mode of this adapter
|
||||
* @unreg_slave: Unregister given client from I2C slave mode of this adapter
|
||||
*
|
||||
|
|
@ -515,7 +523,7 @@ i2c_register_board_info(int busnum, struct i2c_board_info const *info,
|
|||
* be addressed using the same bus algorithms - i.e. bit-banging or the PCF8584
|
||||
* to name two of the most common.
|
||||
*
|
||||
* The return codes from the @master_xfer{_atomic} fields should indicate the
|
||||
* The return codes from the ``master_xfer{_atomic}`` fields should indicate the
|
||||
* type of error code that occurred during the transfer, as documented in the
|
||||
* Kernel Documentation file Documentation/i2c/fault-codes.rst.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -619,6 +619,15 @@ static inline bool ieee80211_is_qos_nullfunc(__le16 fc)
|
|||
cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_QOS_NULLFUNC);
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_is_any_nullfunc - check if frame is regular or QoS nullfunc frame
|
||||
* @fc: frame control bytes in little-endian byteorder
|
||||
*/
|
||||
static inline bool ieee80211_is_any_nullfunc(__le16 fc)
|
||||
{
|
||||
return (ieee80211_is_nullfunc(fc) || ieee80211_is_qos_nullfunc(fc));
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_is_bufferable_mmpdu - check if frame is bufferable MMPDU
|
||||
* @fc: frame control field in little-endian byteorder
|
||||
|
|
@ -2047,13 +2056,13 @@ ieee80211_he_ppe_size(u8 ppe_thres_hdr, const u8 *phy_cap_info)
|
|||
#define IEEE80211_HE_OPERATION_ER_SU_DISABLE 0x00010000
|
||||
#define IEEE80211_HE_OPERATION_6GHZ_OP_INFO 0x00020000
|
||||
#define IEEE80211_HE_OPERATION_BSS_COLOR_MASK 0x3f000000
|
||||
#define IEEE80211_HE_OPERATION_BSS_COLOR_OFFSET 24
|
||||
#define IEEE80211_HE_OPERATION_BSS_COLOR_OFFSET 24
|
||||
#define IEEE80211_HE_OPERATION_PARTIAL_BSS_COLOR 0x40000000
|
||||
#define IEEE80211_HE_OPERATION_BSS_COLOR_DISABLED 0x80000000
|
||||
|
||||
/*
|
||||
* ieee80211_he_oper_size - calculate 802.11ax HE Operations IE size
|
||||
* @he_oper_ie: byte data of the He Operations IE, stating from the the byte
|
||||
* @he_oper_ie: byte data of the He Operations IE, stating from the byte
|
||||
* after the ext ID byte. It is assumed that he_oper_ie has at least
|
||||
* sizeof(struct ieee80211_he_operation) bytes, the caller must have
|
||||
* validated this.
|
||||
|
|
@ -2091,7 +2100,7 @@ ieee80211_he_oper_size(const u8 *he_oper_ie)
|
|||
|
||||
/*
|
||||
* ieee80211_he_spr_size - calculate 802.11ax HE Spatial Reuse IE size
|
||||
* @he_spr_ie: byte data of the He Spatial Reuse IE, stating from the the byte
|
||||
* @he_spr_ie: byte data of the He Spatial Reuse IE, stating from the byte
|
||||
* after the ext ID byte. It is assumed that he_spr_ie has at least
|
||||
* sizeof(struct ieee80211_he_spr) bytes, the caller must have validated
|
||||
* this
|
||||
|
|
@ -2102,14 +2111,14 @@ ieee80211_he_spr_size(const u8 *he_spr_ie)
|
|||
{
|
||||
struct ieee80211_he_spr *he_spr = (void *)he_spr_ie;
|
||||
u8 spr_len = sizeof(struct ieee80211_he_spr);
|
||||
u32 he_spr_params;
|
||||
u8 he_spr_params;
|
||||
|
||||
/* Make sure the input is not NULL */
|
||||
if (!he_spr_ie)
|
||||
return 0;
|
||||
|
||||
/* Calc required length */
|
||||
he_spr_params = le32_to_cpu(he_spr->he_sr_control);
|
||||
he_spr_params = he_spr->he_sr_control;
|
||||
if (he_spr_params & IEEE80211_HE_SPR_NON_SRG_OFFSET_PRESENT)
|
||||
spr_len++;
|
||||
if (he_spr_params & IEEE80211_HE_SPR_SRG_INFORMATION_PRESENT)
|
||||
|
|
@ -2523,6 +2532,7 @@ enum ieee80211_eid {
|
|||
WLAN_EID_FILS_INDICATION = 240,
|
||||
WLAN_EID_DILS = 241,
|
||||
WLAN_EID_FRAGMENT = 242,
|
||||
WLAN_EID_RSNX = 244,
|
||||
WLAN_EID_EXTENSION = 255
|
||||
};
|
||||
|
||||
|
|
@ -2734,7 +2744,7 @@ enum ieee80211_tdls_actioncode {
|
|||
*/
|
||||
#define WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT BIT(6)
|
||||
|
||||
/* TDLS capabilities in the the 4th byte of @WLAN_EID_EXT_CAPABILITY */
|
||||
/* TDLS capabilities in the 4th byte of @WLAN_EID_EXT_CAPABILITY */
|
||||
#define WLAN_EXT_CAPA4_TDLS_BUFFER_STA BIT(4)
|
||||
#define WLAN_EXT_CAPA4_TDLS_PEER_PSM BIT(5)
|
||||
#define WLAN_EXT_CAPA4_TDLS_CHAN_SWITCH BIT(6)
|
||||
|
|
@ -3034,6 +3044,7 @@ struct ieee80211_multiple_bssid_configuration {
|
|||
#define WLAN_AKM_SUITE_FILS_SHA384 SUITE(0x000FAC, 15)
|
||||
#define WLAN_AKM_SUITE_FT_FILS_SHA256 SUITE(0x000FAC, 16)
|
||||
#define WLAN_AKM_SUITE_FT_FILS_SHA384 SUITE(0x000FAC, 17)
|
||||
#define WLAN_AKM_SUITE_OWE SUITE(0x000FAC, 18)
|
||||
|
||||
#define WLAN_MAX_KEY_LEN 32
|
||||
|
||||
|
|
@ -3412,4 +3423,11 @@ static inline bool for_each_element_completed(const struct element *element,
|
|||
return (const u8 *)element == (const u8 *)data + datalen;
|
||||
}
|
||||
|
||||
/**
|
||||
* RSNX Capabilities:
|
||||
* bits 0-3: Field length (n-1)
|
||||
*/
|
||||
#define WLAN_RSNX_CAPA_PROTECTED_TWT BIT(4)
|
||||
#define WLAN_RSNX_CAPA_SAE_H2E BIT(5)
|
||||
|
||||
#endif /* LINUX_IEEE80211_H */
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@
|
|||
#include <linux/irqreturn.h>
|
||||
#include <linux/platform_data/cros_ec_commands.h>
|
||||
#include <linux/platform_data/cros_ec_proto.h>
|
||||
#include <linux/platform_data/cros_ec_sensorhub.h>
|
||||
|
||||
enum {
|
||||
CROS_EC_SENSOR_X,
|
||||
|
|
@ -29,8 +30,7 @@ enum {
|
|||
*/
|
||||
#define CROS_EC_SAMPLE_SIZE (sizeof(s64) * 2)
|
||||
|
||||
/* Minimum sampling period to use when device is suspending */
|
||||
#define CROS_EC_MIN_SUSPEND_SAMPLING_FREQUENCY 1000 /* 1 second */
|
||||
typedef irqreturn_t (*cros_ec_sensors_capture_t)(int irq, void *p);
|
||||
|
||||
/**
|
||||
* struct cros_ec_sensors_core_state - state data for EC sensors IIO driver
|
||||
|
|
@ -50,7 +50,9 @@ enum {
|
|||
* the timestamp. The timestamp is always last and
|
||||
* is always 8-byte aligned.
|
||||
* @read_ec_sensors_data: function used for accessing sensors values
|
||||
* @cuur_sampl_freq: current sampling period
|
||||
* @fifo_max_event_count: Size of the EC sensor FIFO
|
||||
* @frequencies: Table of known available frequencies:
|
||||
* 0, Min and Max in mHz
|
||||
*/
|
||||
struct cros_ec_sensors_core_state {
|
||||
struct cros_ec_device *ec;
|
||||
|
|
@ -73,101 +75,34 @@ struct cros_ec_sensors_core_state {
|
|||
int (*read_ec_sensors_data)(struct iio_dev *indio_dev,
|
||||
unsigned long scan_mask, s16 *data);
|
||||
|
||||
int curr_sampl_freq;
|
||||
|
||||
/* Table of known available frequencies : 0, Min and Max in mHz */
|
||||
int frequencies[3];
|
||||
u32 fifo_max_event_count;
|
||||
int frequencies[6];
|
||||
};
|
||||
|
||||
/**
|
||||
* cros_ec_sensors_read_lpc() - retrieve data from EC shared memory
|
||||
* @indio_dev: pointer to IIO device
|
||||
* @scan_mask: bitmap of the sensor indices to scan
|
||||
* @data: location to store data
|
||||
*
|
||||
* This is the safe function for reading the EC data. It guarantees that the
|
||||
* data sampled was not modified by the EC while being read.
|
||||
*
|
||||
* Return: 0 on success, -errno on failure.
|
||||
*/
|
||||
int cros_ec_sensors_read_lpc(struct iio_dev *indio_dev, unsigned long scan_mask,
|
||||
s16 *data);
|
||||
|
||||
/**
|
||||
* cros_ec_sensors_read_cmd() - retrieve data using the EC command protocol
|
||||
* @indio_dev: pointer to IIO device
|
||||
* @scan_mask: bitmap of the sensor indices to scan
|
||||
* @data: location to store data
|
||||
*
|
||||
* Return: 0 on success, -errno on failure.
|
||||
*/
|
||||
int cros_ec_sensors_read_cmd(struct iio_dev *indio_dev, unsigned long scan_mask,
|
||||
s16 *data);
|
||||
|
||||
struct platform_device;
|
||||
/**
|
||||
* cros_ec_sensors_core_init() - basic initialization of the core structure
|
||||
* @pdev: platform device created for the sensors
|
||||
* @indio_dev: iio device structure of the device
|
||||
* @physical_device: true if the device refers to a physical device
|
||||
*
|
||||
* Return: 0 on success, -errno on failure.
|
||||
*/
|
||||
int cros_ec_sensors_core_init(struct platform_device *pdev,
|
||||
struct iio_dev *indio_dev, bool physical_device);
|
||||
struct iio_dev *indio_dev, bool physical_device,
|
||||
cros_ec_sensors_capture_t trigger_capture,
|
||||
cros_ec_sensorhub_push_data_cb_t push_data);
|
||||
|
||||
/**
|
||||
* cros_ec_sensors_capture() - the trigger handler function
|
||||
* @irq: the interrupt number.
|
||||
* @p: a pointer to the poll function.
|
||||
*
|
||||
* On a trigger event occurring, if the pollfunc is attached then this
|
||||
* handler is called as a threaded interrupt (and hence may sleep). It
|
||||
* is responsible for grabbing data from the device and pushing it into
|
||||
* the associated buffer.
|
||||
*
|
||||
* Return: IRQ_HANDLED
|
||||
*/
|
||||
irqreturn_t cros_ec_sensors_capture(int irq, void *p);
|
||||
int cros_ec_sensors_push_data(struct iio_dev *indio_dev,
|
||||
s16 *data,
|
||||
s64 timestamp);
|
||||
|
||||
/**
|
||||
* cros_ec_motion_send_host_cmd() - send motion sense host command
|
||||
* @st: pointer to state information for device
|
||||
* @opt_length: optional length to reduce the response size, useful on the data
|
||||
* path. Otherwise, the maximal allowed response size is used
|
||||
*
|
||||
* When called, the sub-command is assumed to be set in param->cmd.
|
||||
*
|
||||
* Return: 0 on success, -errno on failure.
|
||||
*/
|
||||
int cros_ec_motion_send_host_cmd(struct cros_ec_sensors_core_state *st,
|
||||
u16 opt_length);
|
||||
|
||||
/**
|
||||
* cros_ec_sensors_core_read() - function to request a value from the sensor
|
||||
* @st: pointer to state information for device
|
||||
* @chan: channel specification structure table
|
||||
* @val: will contain one element making up the returned value
|
||||
* @val2: will contain another element making up the returned value
|
||||
* @mask: specifies which values to be requested
|
||||
*
|
||||
* Return: the type of value returned by the device
|
||||
*/
|
||||
int cros_ec_sensors_core_read(struct cros_ec_sensors_core_state *st,
|
||||
struct iio_chan_spec const *chan,
|
||||
int *val, int *val2, long mask);
|
||||
|
||||
/**
|
||||
* cros_ec_sensors_core_read_avail() - get available values
|
||||
* @indio_dev: pointer to state information for device
|
||||
* @chan: channel specification structure table
|
||||
* @vals: list of available values
|
||||
* @type: type of data returned
|
||||
* @length: number of data returned in the array
|
||||
* @mask: specifies which values to be requested
|
||||
*
|
||||
* Return: an error code, IIO_AVAIL_RANGE or IIO_AVAIL_LIST
|
||||
*/
|
||||
int cros_ec_sensors_core_read_avail(struct iio_dev *indio_dev,
|
||||
struct iio_chan_spec const *chan,
|
||||
const int **vals,
|
||||
|
|
@ -175,23 +110,12 @@ int cros_ec_sensors_core_read_avail(struct iio_dev *indio_dev,
|
|||
int *length,
|
||||
long mask);
|
||||
|
||||
/**
|
||||
* cros_ec_sensors_core_write() - function to write a value to the sensor
|
||||
* @st: pointer to state information for device
|
||||
* @chan: channel specification structure table
|
||||
* @val: first part of value to write
|
||||
* @val2: second part of value to write
|
||||
* @mask: specifies which values to write
|
||||
*
|
||||
* Return: the type of value returned by the device
|
||||
*/
|
||||
int cros_ec_sensors_core_write(struct cros_ec_sensors_core_state *st,
|
||||
struct iio_chan_spec const *chan,
|
||||
int val, int val2, long mask);
|
||||
|
||||
extern const struct dev_pm_ops cros_ec_sensors_pm_ops;
|
||||
|
||||
/* List of extended channel specification for all sensors */
|
||||
extern const struct iio_chan_spec_ext_info cros_ec_sensors_ext_info[];
|
||||
extern const struct attribute *cros_ec_sensor_fifo_attributes[];
|
||||
|
||||
#endif /* __CROS_EC_SENSORS_CORE_H */
|
||||
|
|
|
|||
|
|
@ -568,6 +568,8 @@ struct iio_dev {
|
|||
#if defined(CONFIG_DEBUG_FS)
|
||||
struct dentry *debugfs_dentry;
|
||||
unsigned cached_reg_addr;
|
||||
char read_buf[20];
|
||||
unsigned int read_buf_len;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
|
@ -627,6 +629,8 @@ static inline clockid_t iio_device_get_clock(const struct iio_dev *indio_dev)
|
|||
return indio_dev->clock_id;
|
||||
}
|
||||
|
||||
int iio_device_set_clock(struct iio_dev *indio_dev, clockid_t clock_id);
|
||||
|
||||
/**
|
||||
* dev_to_iio_dev() - Get IIO device struct from a device struct
|
||||
* @dev: The device embedded in the IIO device
|
||||
|
|
|
|||
|
|
@ -41,9 +41,16 @@ struct adis_timeout {
|
|||
* @glob_cmd_reg: Register address of the GLOB_CMD register
|
||||
* @msc_ctrl_reg: Register address of the MSC_CTRL register
|
||||
* @diag_stat_reg: Register address of the DIAG_STAT register
|
||||
* @prod_id_reg: Register address of the PROD_ID register
|
||||
* @prod_id: Product ID code that should be expected when reading @prod_id_reg
|
||||
* @self_test_mask: Bitmask of supported self-test operations
|
||||
* @self_test_reg: Register address to request self test command
|
||||
* @self_test_no_autoclear: True if device's self-test needs clear of ctrl reg
|
||||
* @status_error_msgs: Array of error messgaes
|
||||
* @status_error_mask:
|
||||
* @status_error_mask: Bitmask of errors supported by the device
|
||||
* @timeouts: Chip specific delays
|
||||
* @enable_irq: Hook for ADIS devices that have a special IRQ enable/disable
|
||||
* @has_paging: True if ADIS device has paged registers
|
||||
*/
|
||||
struct adis_data {
|
||||
unsigned int read_delay;
|
||||
|
|
@ -53,8 +60,12 @@ struct adis_data {
|
|||
unsigned int glob_cmd_reg;
|
||||
unsigned int msc_ctrl_reg;
|
||||
unsigned int diag_stat_reg;
|
||||
unsigned int prod_id_reg;
|
||||
|
||||
unsigned int prod_id;
|
||||
|
||||
unsigned int self_test_mask;
|
||||
unsigned int self_test_reg;
|
||||
bool self_test_no_autoclear;
|
||||
const struct adis_timeout *timeouts;
|
||||
|
||||
|
|
@ -66,6 +77,20 @@ struct adis_data {
|
|||
bool has_paging;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct adis - ADIS device instance data
|
||||
* @spi: Reference to SPI device which owns this ADIS IIO device
|
||||
* @trig: IIO trigger object data
|
||||
* @data: ADIS chip variant specific data
|
||||
* @burst: ADIS burst transfer information
|
||||
* @state_lock: Lock used by the device to protect state
|
||||
* @msg: SPI message object
|
||||
* @xfer: SPI transfer objects to be used for a @msg
|
||||
* @current_page: Some ADIS devices have registers, this selects current page
|
||||
* @buffer: Data buffer for information read from the device
|
||||
* @tx: DMA safe TX buffer for SPI transfers
|
||||
* @rx: DMA safe RX buffer for SPI transfers
|
||||
*/
|
||||
struct adis {
|
||||
struct spi_device *spi;
|
||||
struct iio_trigger *trig;
|
||||
|
|
@ -73,6 +98,17 @@ struct adis {
|
|||
const struct adis_data *data;
|
||||
struct adis_burst *burst;
|
||||
|
||||
/**
|
||||
* The state_lock is meant to be used during operations that require
|
||||
* a sequence of SPI R/W in order to protect the SPI transfer
|
||||
* information (fields 'xfer', 'msg' & 'current_page') between
|
||||
* potential concurrent accesses.
|
||||
* This lock is used by all "adis_{functions}" that have to read/write
|
||||
* registers. These functions also have unlocked variants
|
||||
* (see "__adis_{functions}"), which don't hold this lock.
|
||||
* This allows users of the ADIS library to group SPI R/W into
|
||||
* the drivers, but they also must manage this lock themselves.
|
||||
*/
|
||||
struct mutex state_lock;
|
||||
struct spi_message msg;
|
||||
struct spi_transfer *xfer;
|
||||
|
|
@ -297,6 +333,7 @@ static inline int adis_read_reg_32(struct adis *adis, unsigned int reg,
|
|||
|
||||
int adis_enable_irq(struct adis *adis, bool enable);
|
||||
int __adis_check_status(struct adis *adis);
|
||||
int __adis_initial_startup(struct adis *adis);
|
||||
|
||||
static inline int adis_check_status(struct adis *adis)
|
||||
{
|
||||
|
|
@ -309,7 +346,17 @@ static inline int adis_check_status(struct adis *adis)
|
|||
return ret;
|
||||
}
|
||||
|
||||
int adis_initial_startup(struct adis *adis);
|
||||
/* locked version of __adis_initial_startup() */
|
||||
static inline int adis_initial_startup(struct adis *adis)
|
||||
{
|
||||
int ret;
|
||||
|
||||
mutex_lock(&adis->state_lock);
|
||||
ret = __adis_initial_startup(adis);
|
||||
mutex_unlock(&adis->state_lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int adis_single_conversion(struct iio_dev *indio_dev,
|
||||
const struct iio_chan_spec *chan, unsigned int error_mask,
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue