mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-24 21:54:34 -04:00
* Avoid WARN_ON() when mapping BGRT on Baytrail (EFI 32-bit).
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJS9P2pAAoJEC84WcCNIz1VABsP/j0fwiWdaoEn/9p9EUQcBcMn CILuiKI8GoBR+0nH7vm/jSgUKfUxzM6T0+qjoZPVkO/u/qup+JCT5JxoywUyEbfb +wPNIhBgKSwJdWXPd4ZvObA9jknrP6r5sJTsixpESVpVWmcC8egPgkyBFILjokKS BCJqqruHZcXfWaDQTocYErl3T217J7RfnCG1o7yP96g4jteX8EdvIkPjEf2mM83I GXacHLy8IhGhdyPKSXcRqZ0ivhZ2WX1iFQYIY19FhmzBs364WulyXve+oV+l/4h4 Kx7ks4Ob5AlUIizchGNwVz7058F9o/v7m0CezTgi4Q/RrZi34samxbjk/95/Xc60 JSvWkekm3/jOODubad5zj+ZnJmG83/ZlCUuTaqsE47ftbaedSUHBN9QSpm8iHEex n3d4J3AdP/3amcP33kZ5MRALDYIFKb4ZxtDkADqDcXhS56COivGAdZe5hnyCpb/9 RPUDXTOlxfJQK/y2Atcdb400JjJ/Yr9Kew81LRIt0UMZU3dKSh05UZ+a7Ym0yCkt 3k0NNkgsFCZbYTO/Z3aPDcprwU5Lq9UrwjB17U2ev/qK+qRYDzCzSR0XGPrLMRv7 C5Bnov6uCn/0ZG/NlAx8UXK9wdWDsLhp1QkBz+daX3sGwRAS+OiKBv6+l8dqsdOc 1L8PMkTX2rgtELiv4PJ/ =hLCC -----END PGP SIGNATURE----- Merge tag 'efi-urgent' into x86/urgent * Avoid WARN_ON() when mapping BGRT on Baytrail (EFI 32-bit). Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
This commit is contained in:
commit
a3b072cd18
9081 changed files with 515431 additions and 199680 deletions
|
|
@ -42,6 +42,7 @@
|
|||
#include <acpi/acpi_bus.h>
|
||||
#include <acpi/acpi_drivers.h>
|
||||
#include <acpi/acpi_numa.h>
|
||||
#include <acpi/acpi_io.h>
|
||||
#include <asm/acpi.h>
|
||||
|
||||
static inline acpi_handle acpi_device_handle(struct acpi_device *adev)
|
||||
|
|
@ -53,6 +54,12 @@ static inline acpi_handle acpi_device_handle(struct acpi_device *adev)
|
|||
#define ACPI_COMPANION_SET(dev, adev) ACPI_COMPANION(dev) = (adev)
|
||||
#define ACPI_HANDLE(dev) acpi_device_handle(ACPI_COMPANION(dev))
|
||||
|
||||
static inline void acpi_preset_companion(struct device *dev,
|
||||
struct acpi_device *parent, u64 addr)
|
||||
{
|
||||
ACPI_COMPANION_SET(dev, acpi_find_child_device(parent, addr, NULL));
|
||||
}
|
||||
|
||||
static inline const char *acpi_dev_name(struct acpi_device *adev)
|
||||
{
|
||||
return dev_name(&adev->dev);
|
||||
|
|
@ -409,6 +416,9 @@ static inline bool acpi_driver_match_device(struct device *dev,
|
|||
return !!acpi_match_device(drv->acpi_match_table, dev);
|
||||
}
|
||||
|
||||
int acpi_device_uevent_modalias(struct device *, struct kobj_uevent_env *);
|
||||
int acpi_device_modalias(struct device *, char *, int);
|
||||
|
||||
#define ACPI_PTR(_ptr) (_ptr)
|
||||
|
||||
#else /* !CONFIG_ACPI */
|
||||
|
|
@ -460,7 +470,7 @@ struct acpi_table_header;
|
|||
static inline int acpi_table_parse(char *id,
|
||||
int (*handler)(struct acpi_table_header *))
|
||||
{
|
||||
return -1;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int acpi_nvs_register(__u64 start, __u64 size)
|
||||
|
|
@ -488,6 +498,18 @@ static inline bool acpi_driver_match_device(struct device *dev,
|
|||
return false;
|
||||
}
|
||||
|
||||
static inline int acpi_device_uevent_modalias(struct device *dev,
|
||||
struct kobj_uevent_env *env)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int acpi_device_modalias(struct device *dev,
|
||||
char *buf, int size)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
#define ACPI_PTR(_ptr) (NULL)
|
||||
|
||||
#endif /* !CONFIG_ACPI */
|
||||
|
|
|
|||
|
|
@ -1,51 +0,0 @@
|
|||
#ifndef _LINUX_ACPI_GPIO_H_
|
||||
#define _LINUX_ACPI_GPIO_H_
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
|
||||
/**
|
||||
* struct acpi_gpio_info - ACPI GPIO specific information
|
||||
* @gpioint: if %true this GPIO is of type GpioInt otherwise type is GpioIo
|
||||
* @active_low: in case of @gpioint, the pin is active low
|
||||
*/
|
||||
struct acpi_gpio_info {
|
||||
bool gpioint;
|
||||
bool active_low;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_GPIO_ACPI
|
||||
|
||||
struct gpio_desc *acpi_get_gpiod_by_index(struct device *dev, int index,
|
||||
struct acpi_gpio_info *info);
|
||||
void acpi_gpiochip_request_interrupts(struct gpio_chip *chip);
|
||||
void acpi_gpiochip_free_interrupts(struct gpio_chip *chip);
|
||||
|
||||
#else /* CONFIG_GPIO_ACPI */
|
||||
|
||||
static inline struct gpio_desc *
|
||||
acpi_get_gpiod_by_index(struct device *dev, int index,
|
||||
struct acpi_gpio_info *info)
|
||||
{
|
||||
return ERR_PTR(-ENOSYS);
|
||||
}
|
||||
|
||||
static inline void acpi_gpiochip_request_interrupts(struct gpio_chip *chip) { }
|
||||
static inline void acpi_gpiochip_free_interrupts(struct gpio_chip *chip) { }
|
||||
|
||||
#endif /* CONFIG_GPIO_ACPI */
|
||||
|
||||
static inline int acpi_get_gpio_by_index(struct device *dev, int index,
|
||||
struct acpi_gpio_info *info)
|
||||
{
|
||||
struct gpio_desc *desc = acpi_get_gpiod_by_index(dev, index, info);
|
||||
|
||||
if (IS_ERR(desc))
|
||||
return PTR_ERR(desc);
|
||||
return desc_to_gpio(desc);
|
||||
}
|
||||
|
||||
#endif /* _LINUX_ACPI_GPIO_H_ */
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
#ifndef _ACPI_IO_H_
|
||||
#define _ACPI_IO_H_
|
||||
|
||||
#include <linux/io.h>
|
||||
#include <acpi/acpi.h>
|
||||
|
||||
static inline void __iomem *acpi_os_ioremap(acpi_physical_address phys,
|
||||
acpi_size size)
|
||||
{
|
||||
return ioremap_cache(phys, size);
|
||||
}
|
||||
|
||||
void __iomem *acpi_os_get_iomem(acpi_physical_address phys, unsigned int size);
|
||||
|
||||
int acpi_os_map_generic_address(struct acpi_generic_address *addr);
|
||||
void acpi_os_unmap_generic_address(struct acpi_generic_address *addr);
|
||||
|
||||
#endif
|
||||
|
|
@ -1,6 +1,4 @@
|
|||
/*
|
||||
* arch/arm/include/asm/hardware/sp810.h
|
||||
*
|
||||
* ARM PrimeXsys System Controller SP810 header file
|
||||
*
|
||||
* Copyright (C) 2009 ST Microelectronics
|
||||
|
|
@ -11,8 +9,8 @@
|
|||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARM_SP810_H
|
||||
#define __ASM_ARM_SP810_H
|
||||
#ifndef __AMBA_SP810_H
|
||||
#define __AMBA_SP810_H
|
||||
|
||||
#include <linux/io.h>
|
||||
|
||||
|
|
@ -61,4 +59,4 @@ static inline void sysctl_soft_reset(void __iomem *base)
|
|||
writel(0, base + SCSYSSTAT);
|
||||
}
|
||||
|
||||
#endif /* __ASM_ARM_SP810_H */
|
||||
#endif /* __AMBA_SP810_H */
|
||||
|
|
|
|||
|
|
@ -32,6 +32,8 @@ struct ath9k_platform_data {
|
|||
u32 gpio_val;
|
||||
|
||||
bool is_clk_25mhz;
|
||||
bool tx_gain_buffalo;
|
||||
|
||||
int (*get_mac_revision)(void);
|
||||
int (*external_reset)(void);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -137,7 +137,7 @@ static inline void audit_syscall_exit(void *pt_regs)
|
|||
{
|
||||
if (unlikely(current->audit_context)) {
|
||||
int success = is_syscall_success(pt_regs);
|
||||
int return_code = regs_return_value(pt_regs);
|
||||
long return_code = regs_return_value(pt_regs);
|
||||
|
||||
__audit_syscall_exit(success, return_code);
|
||||
}
|
||||
|
|
@ -202,7 +202,7 @@ static inline kuid_t audit_get_loginuid(struct task_struct *tsk)
|
|||
return tsk->loginuid;
|
||||
}
|
||||
|
||||
static inline int audit_get_sessionid(struct task_struct *tsk)
|
||||
static inline unsigned int audit_get_sessionid(struct task_struct *tsk)
|
||||
{
|
||||
return tsk->sessionid;
|
||||
}
|
||||
|
|
@ -220,7 +220,7 @@ extern void __audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat);
|
|||
extern int __audit_log_bprm_fcaps(struct linux_binprm *bprm,
|
||||
const struct cred *new,
|
||||
const struct cred *old);
|
||||
extern void __audit_log_capset(pid_t pid, const struct cred *new, const struct cred *old);
|
||||
extern void __audit_log_capset(const struct cred *new, const struct cred *old);
|
||||
extern void __audit_mmap_fd(int fd, int flags);
|
||||
|
||||
static inline void audit_ipc_obj(struct kern_ipc_perm *ipcp)
|
||||
|
|
@ -285,11 +285,11 @@ static inline int audit_log_bprm_fcaps(struct linux_binprm *bprm,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline void audit_log_capset(pid_t pid, const struct cred *new,
|
||||
static inline void audit_log_capset(const struct cred *new,
|
||||
const struct cred *old)
|
||||
{
|
||||
if (unlikely(!audit_dummy_context()))
|
||||
__audit_log_capset(pid, new, old);
|
||||
__audit_log_capset(new, old);
|
||||
}
|
||||
|
||||
static inline void audit_mmap_fd(int fd, int flags)
|
||||
|
|
@ -359,7 +359,7 @@ static inline kuid_t audit_get_loginuid(struct task_struct *tsk)
|
|||
{
|
||||
return INVALID_UID;
|
||||
}
|
||||
static inline int audit_get_sessionid(struct task_struct *tsk)
|
||||
static inline unsigned int audit_get_sessionid(struct task_struct *tsk)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
|
@ -397,8 +397,8 @@ static inline int audit_log_bprm_fcaps(struct linux_binprm *bprm,
|
|||
{
|
||||
return 0;
|
||||
}
|
||||
static inline void audit_log_capset(pid_t pid, const struct cred *new,
|
||||
const struct cred *old)
|
||||
static inline void audit_log_capset(const struct cred *new,
|
||||
const struct cred *old)
|
||||
{ }
|
||||
static inline void audit_mmap_fd(int fd, int flags)
|
||||
{ }
|
||||
|
|
@ -461,9 +461,11 @@ extern int audit_update_lsm_rules(void);
|
|||
/* Private API (for audit.c only) */
|
||||
extern int audit_filter_user(int type);
|
||||
extern int audit_filter_type(int type);
|
||||
extern int audit_receive_filter(int type, int pid, int seq,
|
||||
extern int audit_rule_change(int type, __u32 portid, int seq,
|
||||
void *data, size_t datasz);
|
||||
extern int audit_enabled;
|
||||
extern int audit_list_rules_send(__u32 portid, int seq);
|
||||
|
||||
extern u32 audit_enabled;
|
||||
#else /* CONFIG_AUDIT */
|
||||
static inline __printf(4, 5)
|
||||
void audit_log(struct audit_context *ctx, gfp_t gfp_mask, int type,
|
||||
|
|
|
|||
|
|
@ -418,7 +418,14 @@ static inline void bcma_maskset16(struct bcma_device *cc,
|
|||
bcma_write16(cc, offset, (bcma_read16(cc, offset) & mask) | set);
|
||||
}
|
||||
|
||||
extern struct bcma_device *bcma_find_core(struct bcma_bus *bus, u16 coreid);
|
||||
extern struct bcma_device *bcma_find_core_unit(struct bcma_bus *bus, u16 coreid,
|
||||
u8 unit);
|
||||
static inline struct bcma_device *bcma_find_core(struct bcma_bus *bus,
|
||||
u16 coreid)
|
||||
{
|
||||
return bcma_find_core_unit(bus, coreid, 0);
|
||||
}
|
||||
|
||||
extern bool bcma_core_is_enabled(struct bcma_device *core);
|
||||
extern void bcma_core_disable(struct bcma_device *core, u32 flags);
|
||||
extern int bcma_core_enable(struct bcma_device *core, u32 flags);
|
||||
|
|
|
|||
|
|
@ -640,6 +640,7 @@ struct bcma_drv_cc {
|
|||
spinlock_t gpio_lock;
|
||||
#ifdef CONFIG_BCMA_DRIVER_GPIO
|
||||
struct gpio_chip gpio;
|
||||
struct irq_domain *irq_domain;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -61,25 +61,87 @@
|
|||
* various member access, note that bio_data should of course not be used
|
||||
* on highmem page vectors
|
||||
*/
|
||||
#define bio_iovec_idx(bio, idx) (&((bio)->bi_io_vec[(idx)]))
|
||||
#define bio_iovec(bio) bio_iovec_idx((bio), (bio)->bi_idx)
|
||||
#define bio_page(bio) bio_iovec((bio))->bv_page
|
||||
#define bio_offset(bio) bio_iovec((bio))->bv_offset
|
||||
#define bio_segments(bio) ((bio)->bi_vcnt - (bio)->bi_idx)
|
||||
#define bio_sectors(bio) ((bio)->bi_size >> 9)
|
||||
#define bio_end_sector(bio) ((bio)->bi_sector + bio_sectors((bio)))
|
||||
#define __bvec_iter_bvec(bvec, iter) (&(bvec)[(iter).bi_idx])
|
||||
|
||||
#define bvec_iter_page(bvec, iter) \
|
||||
(__bvec_iter_bvec((bvec), (iter))->bv_page)
|
||||
|
||||
#define bvec_iter_len(bvec, iter) \
|
||||
min((iter).bi_size, \
|
||||
__bvec_iter_bvec((bvec), (iter))->bv_len - (iter).bi_bvec_done)
|
||||
|
||||
#define bvec_iter_offset(bvec, iter) \
|
||||
(__bvec_iter_bvec((bvec), (iter))->bv_offset + (iter).bi_bvec_done)
|
||||
|
||||
#define bvec_iter_bvec(bvec, iter) \
|
||||
((struct bio_vec) { \
|
||||
.bv_page = bvec_iter_page((bvec), (iter)), \
|
||||
.bv_len = bvec_iter_len((bvec), (iter)), \
|
||||
.bv_offset = bvec_iter_offset((bvec), (iter)), \
|
||||
})
|
||||
|
||||
#define bio_iter_iovec(bio, iter) \
|
||||
bvec_iter_bvec((bio)->bi_io_vec, (iter))
|
||||
|
||||
#define bio_iter_page(bio, iter) \
|
||||
bvec_iter_page((bio)->bi_io_vec, (iter))
|
||||
#define bio_iter_len(bio, iter) \
|
||||
bvec_iter_len((bio)->bi_io_vec, (iter))
|
||||
#define bio_iter_offset(bio, iter) \
|
||||
bvec_iter_offset((bio)->bi_io_vec, (iter))
|
||||
|
||||
#define bio_page(bio) bio_iter_page((bio), (bio)->bi_iter)
|
||||
#define bio_offset(bio) bio_iter_offset((bio), (bio)->bi_iter)
|
||||
#define bio_iovec(bio) bio_iter_iovec((bio), (bio)->bi_iter)
|
||||
|
||||
#define bio_multiple_segments(bio) \
|
||||
((bio)->bi_iter.bi_size != bio_iovec(bio).bv_len)
|
||||
#define bio_sectors(bio) ((bio)->bi_iter.bi_size >> 9)
|
||||
#define bio_end_sector(bio) ((bio)->bi_iter.bi_sector + bio_sectors((bio)))
|
||||
|
||||
/*
|
||||
* Check whether this bio carries any data or not. A NULL bio is allowed.
|
||||
*/
|
||||
static inline bool bio_has_data(struct bio *bio)
|
||||
{
|
||||
if (bio &&
|
||||
bio->bi_iter.bi_size &&
|
||||
!(bio->bi_rw & REQ_DISCARD))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool bio_is_rw(struct bio *bio)
|
||||
{
|
||||
if (!bio_has_data(bio))
|
||||
return false;
|
||||
|
||||
if (bio->bi_rw & BIO_NO_ADVANCE_ITER_MASK)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static inline bool bio_mergeable(struct bio *bio)
|
||||
{
|
||||
if (bio->bi_rw & REQ_NOMERGE_FLAGS)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static inline unsigned int bio_cur_bytes(struct bio *bio)
|
||||
{
|
||||
if (bio->bi_vcnt)
|
||||
return bio_iovec(bio)->bv_len;
|
||||
if (bio_has_data(bio))
|
||||
return bio_iovec(bio).bv_len;
|
||||
else /* dataless requests such as discard */
|
||||
return bio->bi_size;
|
||||
return bio->bi_iter.bi_size;
|
||||
}
|
||||
|
||||
static inline void *bio_data(struct bio *bio)
|
||||
{
|
||||
if (bio->bi_vcnt)
|
||||
if (bio_has_data(bio))
|
||||
return page_address(bio_page(bio)) + bio_offset(bio);
|
||||
|
||||
return NULL;
|
||||
|
|
@ -97,19 +159,16 @@ static inline void *bio_data(struct bio *bio)
|
|||
* permanent PIO fall back, user is probably better off disabling highmem
|
||||
* I/O completely on that queue (see ide-dma for example)
|
||||
*/
|
||||
#define __bio_kmap_atomic(bio, idx) \
|
||||
(kmap_atomic(bio_iovec_idx((bio), (idx))->bv_page) + \
|
||||
bio_iovec_idx((bio), (idx))->bv_offset)
|
||||
#define __bio_kmap_atomic(bio, iter) \
|
||||
(kmap_atomic(bio_iter_iovec((bio), (iter)).bv_page) + \
|
||||
bio_iter_iovec((bio), (iter)).bv_offset)
|
||||
|
||||
#define __bio_kunmap_atomic(addr) kunmap_atomic(addr)
|
||||
#define __bio_kunmap_atomic(addr) kunmap_atomic(addr)
|
||||
|
||||
/*
|
||||
* merge helpers etc
|
||||
*/
|
||||
|
||||
#define __BVEC_END(bio) bio_iovec_idx((bio), (bio)->bi_vcnt - 1)
|
||||
#define __BVEC_START(bio) bio_iovec_idx((bio), (bio)->bi_idx)
|
||||
|
||||
/* Default implementation of BIOVEC_PHYS_MERGEABLE */
|
||||
#define __BIOVEC_PHYS_MERGEABLE(vec1, vec2) \
|
||||
((bvec_to_phys((vec1)) + (vec1)->bv_len) == bvec_to_phys((vec2)))
|
||||
|
|
@ -126,33 +185,76 @@ static inline void *bio_data(struct bio *bio)
|
|||
(((addr1) | (mask)) == (((addr2) - 1) | (mask)))
|
||||
#define BIOVEC_SEG_BOUNDARY(q, b1, b2) \
|
||||
__BIO_SEG_BOUNDARY(bvec_to_phys((b1)), bvec_to_phys((b2)) + (b2)->bv_len, queue_segment_boundary((q)))
|
||||
#define BIO_SEG_BOUNDARY(q, b1, b2) \
|
||||
BIOVEC_SEG_BOUNDARY((q), __BVEC_END((b1)), __BVEC_START((b2)))
|
||||
|
||||
#define bio_io_error(bio) bio_endio((bio), -EIO)
|
||||
|
||||
/*
|
||||
* drivers should not use the __ version unless they _really_ know what
|
||||
* they're doing
|
||||
*/
|
||||
#define __bio_for_each_segment(bvl, bio, i, start_idx) \
|
||||
for (bvl = bio_iovec_idx((bio), (start_idx)), i = (start_idx); \
|
||||
i < (bio)->bi_vcnt; \
|
||||
bvl++, i++)
|
||||
|
||||
/*
|
||||
* drivers should _never_ use the all version - the bio may have been split
|
||||
* before it got to the driver and the driver won't own all of it
|
||||
*/
|
||||
#define bio_for_each_segment_all(bvl, bio, i) \
|
||||
for (i = 0; \
|
||||
bvl = bio_iovec_idx((bio), (i)), i < (bio)->bi_vcnt; \
|
||||
i++)
|
||||
for (i = 0, bvl = (bio)->bi_io_vec; i < (bio)->bi_vcnt; i++, bvl++)
|
||||
|
||||
#define bio_for_each_segment(bvl, bio, i) \
|
||||
for (i = (bio)->bi_idx; \
|
||||
bvl = bio_iovec_idx((bio), (i)), i < (bio)->bi_vcnt; \
|
||||
i++)
|
||||
static inline void bvec_iter_advance(struct bio_vec *bv, struct bvec_iter *iter,
|
||||
unsigned bytes)
|
||||
{
|
||||
WARN_ONCE(bytes > iter->bi_size,
|
||||
"Attempted to advance past end of bvec iter\n");
|
||||
|
||||
while (bytes) {
|
||||
unsigned len = min(bytes, bvec_iter_len(bv, *iter));
|
||||
|
||||
bytes -= len;
|
||||
iter->bi_size -= len;
|
||||
iter->bi_bvec_done += len;
|
||||
|
||||
if (iter->bi_bvec_done == __bvec_iter_bvec(bv, *iter)->bv_len) {
|
||||
iter->bi_bvec_done = 0;
|
||||
iter->bi_idx++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#define for_each_bvec(bvl, bio_vec, iter, start) \
|
||||
for ((iter) = start; \
|
||||
(bvl) = bvec_iter_bvec((bio_vec), (iter)), \
|
||||
(iter).bi_size; \
|
||||
bvec_iter_advance((bio_vec), &(iter), (bvl).bv_len))
|
||||
|
||||
|
||||
static inline void bio_advance_iter(struct bio *bio, struct bvec_iter *iter,
|
||||
unsigned bytes)
|
||||
{
|
||||
iter->bi_sector += bytes >> 9;
|
||||
|
||||
if (bio->bi_rw & BIO_NO_ADVANCE_ITER_MASK)
|
||||
iter->bi_size -= bytes;
|
||||
else
|
||||
bvec_iter_advance(bio->bi_io_vec, iter, bytes);
|
||||
}
|
||||
|
||||
#define __bio_for_each_segment(bvl, bio, iter, start) \
|
||||
for (iter = (start); \
|
||||
(iter).bi_size && \
|
||||
((bvl = bio_iter_iovec((bio), (iter))), 1); \
|
||||
bio_advance_iter((bio), &(iter), (bvl).bv_len))
|
||||
|
||||
#define bio_for_each_segment(bvl, bio, iter) \
|
||||
__bio_for_each_segment(bvl, bio, iter, (bio)->bi_iter)
|
||||
|
||||
#define bio_iter_last(bvec, iter) ((iter).bi_size == (bvec).bv_len)
|
||||
|
||||
static inline unsigned bio_segments(struct bio *bio)
|
||||
{
|
||||
unsigned segs = 0;
|
||||
struct bio_vec bv;
|
||||
struct bvec_iter iter;
|
||||
|
||||
bio_for_each_segment(bv, bio, iter)
|
||||
segs++;
|
||||
|
||||
return segs;
|
||||
}
|
||||
|
||||
/*
|
||||
* get a reference to a bio, so it won't disappear. the intended use is
|
||||
|
|
@ -177,16 +279,15 @@ static inline void *bio_data(struct bio *bio)
|
|||
struct bio_integrity_payload {
|
||||
struct bio *bip_bio; /* parent bio */
|
||||
|
||||
sector_t bip_sector; /* virtual start sector */
|
||||
struct bvec_iter bip_iter;
|
||||
|
||||
/* kill - should just use bip_vec */
|
||||
void *bip_buf; /* generated integrity data */
|
||||
bio_end_io_t *bip_end_io; /* saved I/O completion fn */
|
||||
|
||||
unsigned int bip_size;
|
||||
bio_end_io_t *bip_end_io; /* saved I/O completion fn */
|
||||
|
||||
unsigned short bip_slab; /* slab the bip came from */
|
||||
unsigned short bip_vcnt; /* # of integrity bio_vecs */
|
||||
unsigned short bip_idx; /* current bip_vec index */
|
||||
unsigned bip_owns_buf:1; /* should free bip_buf */
|
||||
|
||||
struct work_struct bip_work; /* I/O completion */
|
||||
|
|
@ -196,29 +297,28 @@ struct bio_integrity_payload {
|
|||
};
|
||||
#endif /* CONFIG_BLK_DEV_INTEGRITY */
|
||||
|
||||
/*
|
||||
* A bio_pair is used when we need to split a bio.
|
||||
* This can only happen for a bio that refers to just one
|
||||
* page of data, and in the unusual situation when the
|
||||
* page crosses a chunk/device boundary
|
||||
*
|
||||
* The address of the master bio is stored in bio1.bi_private
|
||||
* The address of the pool the pair was allocated from is stored
|
||||
* in bio2.bi_private
|
||||
*/
|
||||
struct bio_pair {
|
||||
struct bio bio1, bio2;
|
||||
struct bio_vec bv1, bv2;
|
||||
#if defined(CONFIG_BLK_DEV_INTEGRITY)
|
||||
struct bio_integrity_payload bip1, bip2;
|
||||
struct bio_vec iv1, iv2;
|
||||
#endif
|
||||
atomic_t cnt;
|
||||
int error;
|
||||
};
|
||||
extern struct bio_pair *bio_split(struct bio *bi, int first_sectors);
|
||||
extern void bio_pair_release(struct bio_pair *dbio);
|
||||
extern void bio_trim(struct bio *bio, int offset, int size);
|
||||
extern struct bio *bio_split(struct bio *bio, int sectors,
|
||||
gfp_t gfp, struct bio_set *bs);
|
||||
|
||||
/**
|
||||
* bio_next_split - get next @sectors from a bio, splitting if necessary
|
||||
* @bio: bio to split
|
||||
* @sectors: number of sectors to split from the front of @bio
|
||||
* @gfp: gfp mask
|
||||
* @bs: bio set to allocate from
|
||||
*
|
||||
* Returns a bio representing the next @sectors of @bio - if the bio is smaller
|
||||
* than @sectors, returns the original bio unchanged.
|
||||
*/
|
||||
static inline struct bio *bio_next_split(struct bio *bio, int sectors,
|
||||
gfp_t gfp, struct bio_set *bs)
|
||||
{
|
||||
if (sectors >= bio_sectors(bio))
|
||||
return bio;
|
||||
|
||||
return bio_split(bio, sectors, gfp, bs);
|
||||
}
|
||||
|
||||
extern struct bio_set *bioset_create(unsigned int, unsigned int);
|
||||
extern void bioset_free(struct bio_set *);
|
||||
|
|
@ -227,7 +327,8 @@ extern mempool_t *biovec_create_pool(struct bio_set *bs, int pool_entries);
|
|||
extern struct bio *bio_alloc_bioset(gfp_t, int, struct bio_set *);
|
||||
extern void bio_put(struct bio *);
|
||||
|
||||
extern void __bio_clone(struct bio *, struct bio *);
|
||||
extern void __bio_clone_fast(struct bio *, struct bio *);
|
||||
extern struct bio *bio_clone_fast(struct bio *, gfp_t, struct bio_set *);
|
||||
extern struct bio *bio_clone_bioset(struct bio *, gfp_t, struct bio_set *bs);
|
||||
|
||||
extern struct bio_set *fs_bio_set;
|
||||
|
|
@ -254,6 +355,7 @@ static inline struct bio *bio_clone_kmalloc(struct bio *bio, gfp_t gfp_mask)
|
|||
}
|
||||
|
||||
extern void bio_endio(struct bio *, int);
|
||||
extern void bio_endio_nodec(struct bio *, int);
|
||||
struct request_queue;
|
||||
extern int bio_phys_segments(struct request_queue *, struct bio *);
|
||||
|
||||
|
|
@ -262,12 +364,12 @@ extern void bio_advance(struct bio *, unsigned);
|
|||
|
||||
extern void bio_init(struct bio *);
|
||||
extern void bio_reset(struct bio *);
|
||||
void bio_chain(struct bio *, struct bio *);
|
||||
|
||||
extern int bio_add_page(struct bio *, struct page *, unsigned int,unsigned int);
|
||||
extern int bio_add_pc_page(struct request_queue *, struct bio *, struct page *,
|
||||
unsigned int, unsigned int);
|
||||
extern int bio_get_nr_vecs(struct block_device *);
|
||||
extern sector_t bio_sector_offset(struct bio *, unsigned short, unsigned int);
|
||||
extern struct bio *bio_map_user(struct request_queue *, struct block_device *,
|
||||
unsigned long, unsigned int, int, gfp_t);
|
||||
struct sg_iovec;
|
||||
|
|
@ -357,47 +459,17 @@ static inline void bvec_kunmap_irq(char *buffer, unsigned long *flags)
|
|||
}
|
||||
#endif
|
||||
|
||||
static inline char *__bio_kmap_irq(struct bio *bio, unsigned short idx,
|
||||
static inline char *__bio_kmap_irq(struct bio *bio, struct bvec_iter iter,
|
||||
unsigned long *flags)
|
||||
{
|
||||
return bvec_kmap_irq(bio_iovec_idx(bio, idx), flags);
|
||||
return bvec_kmap_irq(&bio_iter_iovec(bio, iter), flags);
|
||||
}
|
||||
#define __bio_kunmap_irq(buf, flags) bvec_kunmap_irq(buf, flags)
|
||||
|
||||
#define bio_kmap_irq(bio, flags) \
|
||||
__bio_kmap_irq((bio), (bio)->bi_idx, (flags))
|
||||
__bio_kmap_irq((bio), (bio)->bi_iter, (flags))
|
||||
#define bio_kunmap_irq(buf,flags) __bio_kunmap_irq(buf, flags)
|
||||
|
||||
/*
|
||||
* Check whether this bio carries any data or not. A NULL bio is allowed.
|
||||
*/
|
||||
static inline bool bio_has_data(struct bio *bio)
|
||||
{
|
||||
if (bio && bio->bi_vcnt)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool bio_is_rw(struct bio *bio)
|
||||
{
|
||||
if (!bio_has_data(bio))
|
||||
return false;
|
||||
|
||||
if (bio->bi_rw & REQ_WRITE_SAME)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static inline bool bio_mergeable(struct bio *bio)
|
||||
{
|
||||
if (bio->bi_rw & REQ_NOMERGE_FLAGS)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* BIO list management for use by remapping drivers (e.g. DM or MD) and loop.
|
||||
*
|
||||
|
|
@ -559,16 +631,12 @@ struct biovec_slab {
|
|||
|
||||
#if defined(CONFIG_BLK_DEV_INTEGRITY)
|
||||
|
||||
|
||||
|
||||
#define bip_vec_idx(bip, idx) (&(bip->bip_vec[(idx)]))
|
||||
#define bip_vec(bip) bip_vec_idx(bip, 0)
|
||||
|
||||
#define __bip_for_each_vec(bvl, bip, i, start_idx) \
|
||||
for (bvl = bip_vec_idx((bip), (start_idx)), i = (start_idx); \
|
||||
i < (bip)->bip_vcnt; \
|
||||
bvl++, i++)
|
||||
|
||||
#define bip_for_each_vec(bvl, bip, i) \
|
||||
__bip_for_each_vec(bvl, bip, i, (bip)->bip_idx)
|
||||
#define bip_for_each_vec(bvl, bip, iter) \
|
||||
for_each_bvec(bvl, (bip)->bip_vec, iter, (bip)->bip_iter)
|
||||
|
||||
#define bio_for_each_integrity_vec(_bvl, _bio, _iter) \
|
||||
for_each_bio(_bio) \
|
||||
|
|
@ -586,7 +654,6 @@ extern int bio_integrity_prep(struct bio *);
|
|||
extern void bio_integrity_endio(struct bio *, int);
|
||||
extern void bio_integrity_advance(struct bio *, unsigned int);
|
||||
extern void bio_integrity_trim(struct bio *, unsigned int, unsigned int);
|
||||
extern void bio_integrity_split(struct bio *, struct bio_pair *, int);
|
||||
extern int bio_integrity_clone(struct bio *, struct bio *, gfp_t);
|
||||
extern int bioset_integrity_create(struct bio_set *, int);
|
||||
extern void bioset_integrity_free(struct bio_set *);
|
||||
|
|
@ -630,12 +697,6 @@ static inline int bio_integrity_clone(struct bio *bio, struct bio *bio_src,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline void bio_integrity_split(struct bio *bio, struct bio_pair *bp,
|
||||
int sectors)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
static inline void bio_integrity_advance(struct bio *bio,
|
||||
unsigned int bytes_done)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -113,7 +113,6 @@ enum {
|
|||
};
|
||||
|
||||
struct request_queue *blk_mq_init_queue(struct blk_mq_reg *, void *);
|
||||
void blk_mq_free_queue(struct request_queue *);
|
||||
int blk_mq_register_disk(struct gendisk *);
|
||||
void blk_mq_unregister_disk(struct gendisk *);
|
||||
void blk_mq_init_commands(struct request_queue *, void (*init)(void *data, struct blk_mq_hw_ctx *, struct request *, unsigned int), void *data);
|
||||
|
|
@ -159,16 +158,16 @@ static inline struct request *blk_mq_tag_to_rq(struct blk_mq_hw_ctx *hctx,
|
|||
}
|
||||
|
||||
#define queue_for_each_hw_ctx(q, hctx, i) \
|
||||
for ((i) = 0, hctx = (q)->queue_hw_ctx[0]; \
|
||||
(i) < (q)->nr_hw_queues; (i)++, hctx = (q)->queue_hw_ctx[i])
|
||||
for ((i) = 0; (i) < (q)->nr_hw_queues && \
|
||||
({ hctx = (q)->queue_hw_ctx[i]; 1; }); (i)++)
|
||||
|
||||
#define queue_for_each_ctx(q, ctx, i) \
|
||||
for ((i) = 0, ctx = per_cpu_ptr((q)->queue_ctx, 0); \
|
||||
(i) < (q)->nr_queues; (i)++, ctx = per_cpu_ptr(q->queue_ctx, (i)))
|
||||
for ((i) = 0; (i) < (q)->nr_queues && \
|
||||
({ ctx = per_cpu_ptr((q)->queue_ctx, (i)); 1; }); (i)++)
|
||||
|
||||
#define hctx_for_each_ctx(hctx, ctx, i) \
|
||||
for ((i) = 0, ctx = (hctx)->ctxs[0]; \
|
||||
(i) < (hctx)->nr_ctx; (i)++, ctx = (hctx)->ctxs[(i)])
|
||||
for ((i) = 0; (i) < (hctx)->nr_ctx && \
|
||||
({ ctx = (hctx)->ctxs[(i)]; 1; }); (i)++)
|
||||
|
||||
#define blk_ctx_sum(q, sum) \
|
||||
({ \
|
||||
|
|
|
|||
|
|
@ -28,13 +28,22 @@ struct bio_vec {
|
|||
unsigned int bv_offset;
|
||||
};
|
||||
|
||||
struct bvec_iter {
|
||||
sector_t bi_sector; /* device address in 512 byte
|
||||
sectors */
|
||||
unsigned int bi_size; /* residual I/O count */
|
||||
|
||||
unsigned int bi_idx; /* current index into bvl_vec */
|
||||
|
||||
unsigned int bi_bvec_done; /* number of bytes completed in
|
||||
current bvec */
|
||||
};
|
||||
|
||||
/*
|
||||
* main unit of I/O for the block layer and lower layers (ie drivers and
|
||||
* stacking drivers)
|
||||
*/
|
||||
struct bio {
|
||||
sector_t bi_sector; /* device address in 512 byte
|
||||
sectors */
|
||||
struct bio *bi_next; /* request queue link */
|
||||
struct block_device *bi_bdev;
|
||||
unsigned long bi_flags; /* status, command, etc */
|
||||
|
|
@ -42,16 +51,13 @@ struct bio {
|
|||
* top bits priority
|
||||
*/
|
||||
|
||||
unsigned short bi_vcnt; /* how many bio_vec's */
|
||||
unsigned short bi_idx; /* current index into bvl_vec */
|
||||
struct bvec_iter bi_iter;
|
||||
|
||||
/* Number of segments in this BIO after
|
||||
* physical address coalescing is performed.
|
||||
*/
|
||||
unsigned int bi_phys_segments;
|
||||
|
||||
unsigned int bi_size; /* residual I/O count */
|
||||
|
||||
/*
|
||||
* To keep track of the max segment size, we account for the
|
||||
* sizes of the first and last mergeable segments in this bio.
|
||||
|
|
@ -59,6 +65,8 @@ struct bio {
|
|||
unsigned int bi_seg_front_size;
|
||||
unsigned int bi_seg_back_size;
|
||||
|
||||
atomic_t bi_remaining;
|
||||
|
||||
bio_end_io_t *bi_end_io;
|
||||
|
||||
void *bi_private;
|
||||
|
|
@ -74,11 +82,13 @@ struct bio {
|
|||
struct bio_integrity_payload *bi_integrity; /* data integrity */
|
||||
#endif
|
||||
|
||||
unsigned short bi_vcnt; /* how many bio_vec's */
|
||||
|
||||
/*
|
||||
* Everything starting with bi_max_vecs will be preserved by bio_reset()
|
||||
*/
|
||||
|
||||
unsigned int bi_max_vecs; /* max bvl_vecs we can hold */
|
||||
unsigned short bi_max_vecs; /* max bvl_vecs we can hold */
|
||||
|
||||
atomic_t bi_cnt; /* pin count */
|
||||
|
||||
|
|
|
|||
|
|
@ -95,10 +95,7 @@ enum rq_cmd_type_bits {
|
|||
* as well!
|
||||
*/
|
||||
struct request {
|
||||
union {
|
||||
struct list_head queuelist;
|
||||
struct llist_node ll_list;
|
||||
};
|
||||
struct list_head queuelist;
|
||||
union {
|
||||
struct call_single_data csd;
|
||||
struct work_struct mq_flush_data;
|
||||
|
|
@ -291,6 +288,7 @@ struct queue_limits {
|
|||
unsigned char discard_misaligned;
|
||||
unsigned char cluster;
|
||||
unsigned char discard_zeroes_data;
|
||||
unsigned char raid_partial_stripes_expensive;
|
||||
};
|
||||
|
||||
struct request_queue {
|
||||
|
|
@ -735,7 +733,7 @@ struct rq_map_data {
|
|||
};
|
||||
|
||||
struct req_iterator {
|
||||
int i;
|
||||
struct bvec_iter iter;
|
||||
struct bio *bio;
|
||||
};
|
||||
|
||||
|
|
@ -748,10 +746,11 @@ struct req_iterator {
|
|||
|
||||
#define rq_for_each_segment(bvl, _rq, _iter) \
|
||||
__rq_for_each_bio(_iter.bio, _rq) \
|
||||
bio_for_each_segment(bvl, _iter.bio, _iter.i)
|
||||
bio_for_each_segment(bvl, _iter.bio, _iter.iter)
|
||||
|
||||
#define rq_iter_last(rq, _iter) \
|
||||
(_iter.bio->bi_next == NULL && _iter.i == _iter.bio->bi_vcnt-1)
|
||||
#define rq_iter_last(bvec, _iter) \
|
||||
(_iter.bio->bi_next == NULL && \
|
||||
bio_iter_last(bvec, _iter.iter))
|
||||
|
||||
#ifndef ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE
|
||||
# error "You should define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE for your platform"
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@
|
|||
#define _LINUX_BOOTMEM_H
|
||||
|
||||
#include <linux/mmzone.h>
|
||||
#include <linux/mm_types.h>
|
||||
#include <asm/dma.h>
|
||||
|
||||
/*
|
||||
|
|
@ -52,7 +53,6 @@ extern void free_bootmem_node(pg_data_t *pgdat,
|
|||
unsigned long size);
|
||||
extern void free_bootmem(unsigned long physaddr, unsigned long size);
|
||||
extern void free_bootmem_late(unsigned long physaddr, unsigned long size);
|
||||
extern void __free_pages_bootmem(struct page *page, unsigned int order);
|
||||
|
||||
/*
|
||||
* Flags for reserve_bootmem (also if CONFIG_HAVE_ARCH_BOOTMEM_NODE,
|
||||
|
|
@ -142,6 +142,194 @@ extern void *__alloc_bootmem_low_node(pg_data_t *pgdat,
|
|||
#define alloc_bootmem_low_pages_node(pgdat, x) \
|
||||
__alloc_bootmem_low_node(pgdat, x, PAGE_SIZE, 0)
|
||||
|
||||
|
||||
#if defined(CONFIG_HAVE_MEMBLOCK) && defined(CONFIG_NO_BOOTMEM)
|
||||
|
||||
/* FIXME: use MEMBLOCK_ALLOC_* variants here */
|
||||
#define BOOTMEM_ALLOC_ACCESSIBLE 0
|
||||
#define BOOTMEM_ALLOC_ANYWHERE (~(phys_addr_t)0)
|
||||
|
||||
/* FIXME: Move to memblock.h at a point where we remove nobootmem.c */
|
||||
void *memblock_virt_alloc_try_nid_nopanic(phys_addr_t size,
|
||||
phys_addr_t align, phys_addr_t min_addr,
|
||||
phys_addr_t max_addr, int nid);
|
||||
void *memblock_virt_alloc_try_nid(phys_addr_t size, phys_addr_t align,
|
||||
phys_addr_t min_addr, phys_addr_t max_addr, int nid);
|
||||
void __memblock_free_early(phys_addr_t base, phys_addr_t size);
|
||||
void __memblock_free_late(phys_addr_t base, phys_addr_t size);
|
||||
|
||||
static inline void * __init memblock_virt_alloc(
|
||||
phys_addr_t size, phys_addr_t align)
|
||||
{
|
||||
return memblock_virt_alloc_try_nid(size, align, BOOTMEM_LOW_LIMIT,
|
||||
BOOTMEM_ALLOC_ACCESSIBLE,
|
||||
NUMA_NO_NODE);
|
||||
}
|
||||
|
||||
static inline void * __init memblock_virt_alloc_nopanic(
|
||||
phys_addr_t size, phys_addr_t align)
|
||||
{
|
||||
return memblock_virt_alloc_try_nid_nopanic(size, align,
|
||||
BOOTMEM_LOW_LIMIT,
|
||||
BOOTMEM_ALLOC_ACCESSIBLE,
|
||||
NUMA_NO_NODE);
|
||||
}
|
||||
|
||||
#ifndef ARCH_LOW_ADDRESS_LIMIT
|
||||
#define ARCH_LOW_ADDRESS_LIMIT 0xffffffffUL
|
||||
#endif
|
||||
|
||||
static inline void * __init memblock_virt_alloc_low(
|
||||
phys_addr_t size, phys_addr_t align)
|
||||
{
|
||||
return memblock_virt_alloc_try_nid(size, align,
|
||||
BOOTMEM_LOW_LIMIT,
|
||||
ARCH_LOW_ADDRESS_LIMIT,
|
||||
NUMA_NO_NODE);
|
||||
}
|
||||
static inline void * __init memblock_virt_alloc_low_nopanic(
|
||||
phys_addr_t size, phys_addr_t align)
|
||||
{
|
||||
return memblock_virt_alloc_try_nid_nopanic(size, align,
|
||||
BOOTMEM_LOW_LIMIT,
|
||||
ARCH_LOW_ADDRESS_LIMIT,
|
||||
NUMA_NO_NODE);
|
||||
}
|
||||
|
||||
static inline void * __init memblock_virt_alloc_from_nopanic(
|
||||
phys_addr_t size, phys_addr_t align, phys_addr_t min_addr)
|
||||
{
|
||||
return memblock_virt_alloc_try_nid_nopanic(size, align, min_addr,
|
||||
BOOTMEM_ALLOC_ACCESSIBLE,
|
||||
NUMA_NO_NODE);
|
||||
}
|
||||
|
||||
static inline void * __init memblock_virt_alloc_node(
|
||||
phys_addr_t size, int nid)
|
||||
{
|
||||
return memblock_virt_alloc_try_nid(size, 0, BOOTMEM_LOW_LIMIT,
|
||||
BOOTMEM_ALLOC_ACCESSIBLE, nid);
|
||||
}
|
||||
|
||||
static inline void * __init memblock_virt_alloc_node_nopanic(
|
||||
phys_addr_t size, int nid)
|
||||
{
|
||||
return memblock_virt_alloc_try_nid_nopanic(size, 0, BOOTMEM_LOW_LIMIT,
|
||||
BOOTMEM_ALLOC_ACCESSIBLE,
|
||||
nid);
|
||||
}
|
||||
|
||||
static inline void __init memblock_free_early(
|
||||
phys_addr_t base, phys_addr_t size)
|
||||
{
|
||||
__memblock_free_early(base, size);
|
||||
}
|
||||
|
||||
static inline void __init memblock_free_early_nid(
|
||||
phys_addr_t base, phys_addr_t size, int nid)
|
||||
{
|
||||
__memblock_free_early(base, size);
|
||||
}
|
||||
|
||||
static inline void __init memblock_free_late(
|
||||
phys_addr_t base, phys_addr_t size)
|
||||
{
|
||||
__memblock_free_late(base, size);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#define BOOTMEM_ALLOC_ACCESSIBLE 0
|
||||
|
||||
|
||||
/* Fall back to all the existing bootmem APIs */
|
||||
static inline void * __init memblock_virt_alloc(
|
||||
phys_addr_t size, phys_addr_t align)
|
||||
{
|
||||
if (!align)
|
||||
align = SMP_CACHE_BYTES;
|
||||
return __alloc_bootmem(size, align, BOOTMEM_LOW_LIMIT);
|
||||
}
|
||||
|
||||
static inline void * __init memblock_virt_alloc_nopanic(
|
||||
phys_addr_t size, phys_addr_t align)
|
||||
{
|
||||
if (!align)
|
||||
align = SMP_CACHE_BYTES;
|
||||
return __alloc_bootmem_nopanic(size, align, BOOTMEM_LOW_LIMIT);
|
||||
}
|
||||
|
||||
static inline void * __init memblock_virt_alloc_low(
|
||||
phys_addr_t size, phys_addr_t align)
|
||||
{
|
||||
if (!align)
|
||||
align = SMP_CACHE_BYTES;
|
||||
return __alloc_bootmem_low(size, align, 0);
|
||||
}
|
||||
|
||||
static inline void * __init memblock_virt_alloc_low_nopanic(
|
||||
phys_addr_t size, phys_addr_t align)
|
||||
{
|
||||
if (!align)
|
||||
align = SMP_CACHE_BYTES;
|
||||
return __alloc_bootmem_low_nopanic(size, align, 0);
|
||||
}
|
||||
|
||||
static inline void * __init memblock_virt_alloc_from_nopanic(
|
||||
phys_addr_t size, phys_addr_t align, phys_addr_t min_addr)
|
||||
{
|
||||
return __alloc_bootmem_nopanic(size, align, min_addr);
|
||||
}
|
||||
|
||||
static inline void * __init memblock_virt_alloc_node(
|
||||
phys_addr_t size, int nid)
|
||||
{
|
||||
return __alloc_bootmem_node(NODE_DATA(nid), size, SMP_CACHE_BYTES,
|
||||
BOOTMEM_LOW_LIMIT);
|
||||
}
|
||||
|
||||
static inline void * __init memblock_virt_alloc_node_nopanic(
|
||||
phys_addr_t size, int nid)
|
||||
{
|
||||
return __alloc_bootmem_node_nopanic(NODE_DATA(nid), size,
|
||||
SMP_CACHE_BYTES,
|
||||
BOOTMEM_LOW_LIMIT);
|
||||
}
|
||||
|
||||
static inline void * __init memblock_virt_alloc_try_nid(phys_addr_t size,
|
||||
phys_addr_t align, phys_addr_t min_addr, phys_addr_t max_addr, int nid)
|
||||
{
|
||||
return __alloc_bootmem_node_high(NODE_DATA(nid), size, align,
|
||||
min_addr);
|
||||
}
|
||||
|
||||
static inline void * __init memblock_virt_alloc_try_nid_nopanic(
|
||||
phys_addr_t size, phys_addr_t align,
|
||||
phys_addr_t min_addr, phys_addr_t max_addr, int nid)
|
||||
{
|
||||
return ___alloc_bootmem_node_nopanic(NODE_DATA(nid), size, align,
|
||||
min_addr, max_addr);
|
||||
}
|
||||
|
||||
static inline void __init memblock_free_early(
|
||||
phys_addr_t base, phys_addr_t size)
|
||||
{
|
||||
free_bootmem(base, size);
|
||||
}
|
||||
|
||||
static inline void __init memblock_free_early_nid(
|
||||
phys_addr_t base, phys_addr_t size, int nid)
|
||||
{
|
||||
free_bootmem_node(NODE_DATA(nid), base, size);
|
||||
}
|
||||
|
||||
static inline void __init memblock_free_late(
|
||||
phys_addr_t base, phys_addr_t size)
|
||||
{
|
||||
free_bootmem_late(base, size);
|
||||
}
|
||||
#endif /* defined(CONFIG_HAVE_MEMBLOCK) && defined(CONFIG_NO_BOOTMEM) */
|
||||
|
||||
#ifdef CONFIG_HAVE_ARCH_ALLOC_REMAP
|
||||
extern void *alloc_remap(int nid, unsigned long size);
|
||||
#else
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
#ifndef __LINUX_CACHE_H
|
||||
#define __LINUX_CACHE_H
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <uapi/linux/kernel.h>
|
||||
#include <asm/cache.h>
|
||||
|
||||
#ifndef L1_CACHE_ALIGN
|
||||
#define L1_CACHE_ALIGN(x) ALIGN(x, L1_CACHE_BYTES)
|
||||
#define L1_CACHE_ALIGN(x) __ALIGN_KERNEL(x, L1_CACHE_BYTES)
|
||||
#endif
|
||||
|
||||
#ifndef SMP_CACHE_BYTES
|
||||
|
|
|
|||
537
include/linux/ccp.h
Normal file
537
include/linux/ccp.h
Normal file
|
|
@ -0,0 +1,537 @@
|
|||
/*
|
||||
* AMD Cryptographic Coprocessor (CCP) driver
|
||||
*
|
||||
* Copyright (C) 2013 Advanced Micro Devices, Inc.
|
||||
*
|
||||
* Author: Tom Lendacky <thomas.lendacky@amd.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __CPP_H__
|
||||
#define __CPP_H__
|
||||
|
||||
#include <linux/scatterlist.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/list.h>
|
||||
#include <crypto/aes.h>
|
||||
#include <crypto/sha.h>
|
||||
|
||||
|
||||
struct ccp_device;
|
||||
struct ccp_cmd;
|
||||
|
||||
#if defined(CONFIG_CRYPTO_DEV_CCP_DD) || \
|
||||
defined(CONFIG_CRYPTO_DEV_CCP_DD_MODULE)
|
||||
|
||||
/**
|
||||
* ccp_enqueue_cmd - queue an operation for processing by the CCP
|
||||
*
|
||||
* @cmd: ccp_cmd struct to be processed
|
||||
*
|
||||
* Refer to the ccp_cmd struct below for required fields.
|
||||
*
|
||||
* Queue a cmd to be processed by the CCP. If queueing the cmd
|
||||
* would exceed the defined length of the cmd queue the cmd will
|
||||
* only be queued if the CCP_CMD_MAY_BACKLOG flag is set and will
|
||||
* result in a return code of -EBUSY.
|
||||
*
|
||||
* The callback routine specified in the ccp_cmd struct will be
|
||||
* called to notify the caller of completion (if the cmd was not
|
||||
* backlogged) or advancement out of the backlog. If the cmd has
|
||||
* advanced out of the backlog the "err" value of the callback
|
||||
* will be -EINPROGRESS. Any other "err" value during callback is
|
||||
* the result of the operation.
|
||||
*
|
||||
* The cmd has been successfully queued if:
|
||||
* the return code is -EINPROGRESS or
|
||||
* the return code is -EBUSY and CCP_CMD_MAY_BACKLOG flag is set
|
||||
*/
|
||||
int ccp_enqueue_cmd(struct ccp_cmd *cmd);
|
||||
|
||||
#else /* CONFIG_CRYPTO_DEV_CCP_DD is not enabled */
|
||||
|
||||
static inline int ccp_enqueue_cmd(struct ccp_cmd *cmd)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_CRYPTO_DEV_CCP_DD */
|
||||
|
||||
|
||||
/***** AES engine *****/
|
||||
/**
|
||||
* ccp_aes_type - AES key size
|
||||
*
|
||||
* @CCP_AES_TYPE_128: 128-bit key
|
||||
* @CCP_AES_TYPE_192: 192-bit key
|
||||
* @CCP_AES_TYPE_256: 256-bit key
|
||||
*/
|
||||
enum ccp_aes_type {
|
||||
CCP_AES_TYPE_128 = 0,
|
||||
CCP_AES_TYPE_192,
|
||||
CCP_AES_TYPE_256,
|
||||
CCP_AES_TYPE__LAST,
|
||||
};
|
||||
|
||||
/**
|
||||
* ccp_aes_mode - AES operation mode
|
||||
*
|
||||
* @CCP_AES_MODE_ECB: ECB mode
|
||||
* @CCP_AES_MODE_CBC: CBC mode
|
||||
* @CCP_AES_MODE_OFB: OFB mode
|
||||
* @CCP_AES_MODE_CFB: CFB mode
|
||||
* @CCP_AES_MODE_CTR: CTR mode
|
||||
* @CCP_AES_MODE_CMAC: CMAC mode
|
||||
*/
|
||||
enum ccp_aes_mode {
|
||||
CCP_AES_MODE_ECB = 0,
|
||||
CCP_AES_MODE_CBC,
|
||||
CCP_AES_MODE_OFB,
|
||||
CCP_AES_MODE_CFB,
|
||||
CCP_AES_MODE_CTR,
|
||||
CCP_AES_MODE_CMAC,
|
||||
CCP_AES_MODE__LAST,
|
||||
};
|
||||
|
||||
/**
|
||||
* ccp_aes_mode - AES operation mode
|
||||
*
|
||||
* @CCP_AES_ACTION_DECRYPT: AES decrypt operation
|
||||
* @CCP_AES_ACTION_ENCRYPT: AES encrypt operation
|
||||
*/
|
||||
enum ccp_aes_action {
|
||||
CCP_AES_ACTION_DECRYPT = 0,
|
||||
CCP_AES_ACTION_ENCRYPT,
|
||||
CCP_AES_ACTION__LAST,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ccp_aes_engine - CCP AES operation
|
||||
* @type: AES operation key size
|
||||
* @mode: AES operation mode
|
||||
* @action: AES operation (decrypt/encrypt)
|
||||
* @key: key to be used for this AES operation
|
||||
* @key_len: length in bytes of key
|
||||
* @iv: IV to be used for this AES operation
|
||||
* @iv_len: length in bytes of iv
|
||||
* @src: data to be used for this operation
|
||||
* @dst: data produced by this operation
|
||||
* @src_len: length in bytes of data used for this operation
|
||||
* @cmac_final: indicates final operation when running in CMAC mode
|
||||
* @cmac_key: K1/K2 key used in final CMAC operation
|
||||
* @cmac_key_len: length in bytes of cmac_key
|
||||
*
|
||||
* Variables required to be set when calling ccp_enqueue_cmd():
|
||||
* - type, mode, action, key, key_len, src, dst, src_len
|
||||
* - iv, iv_len for any mode other than ECB
|
||||
* - cmac_final for CMAC mode
|
||||
* - cmac_key, cmac_key_len for CMAC mode if cmac_final is non-zero
|
||||
*
|
||||
* The iv variable is used as both input and output. On completion of the
|
||||
* AES operation the new IV overwrites the old IV.
|
||||
*/
|
||||
struct ccp_aes_engine {
|
||||
enum ccp_aes_type type;
|
||||
enum ccp_aes_mode mode;
|
||||
enum ccp_aes_action action;
|
||||
|
||||
struct scatterlist *key;
|
||||
u32 key_len; /* In bytes */
|
||||
|
||||
struct scatterlist *iv;
|
||||
u32 iv_len; /* In bytes */
|
||||
|
||||
struct scatterlist *src, *dst;
|
||||
u64 src_len; /* In bytes */
|
||||
|
||||
u32 cmac_final; /* Indicates final cmac cmd */
|
||||
struct scatterlist *cmac_key; /* K1/K2 cmac key required for
|
||||
* final cmac cmd */
|
||||
u32 cmac_key_len; /* In bytes */
|
||||
};
|
||||
|
||||
/***** XTS-AES engine *****/
|
||||
/**
|
||||
* ccp_xts_aes_unit_size - XTS unit size
|
||||
*
|
||||
* @CCP_XTS_AES_UNIT_SIZE_16: Unit size of 16 bytes
|
||||
* @CCP_XTS_AES_UNIT_SIZE_512: Unit size of 512 bytes
|
||||
* @CCP_XTS_AES_UNIT_SIZE_1024: Unit size of 1024 bytes
|
||||
* @CCP_XTS_AES_UNIT_SIZE_2048: Unit size of 2048 bytes
|
||||
* @CCP_XTS_AES_UNIT_SIZE_4096: Unit size of 4096 bytes
|
||||
*/
|
||||
enum ccp_xts_aes_unit_size {
|
||||
CCP_XTS_AES_UNIT_SIZE_16 = 0,
|
||||
CCP_XTS_AES_UNIT_SIZE_512,
|
||||
CCP_XTS_AES_UNIT_SIZE_1024,
|
||||
CCP_XTS_AES_UNIT_SIZE_2048,
|
||||
CCP_XTS_AES_UNIT_SIZE_4096,
|
||||
CCP_XTS_AES_UNIT_SIZE__LAST,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ccp_xts_aes_engine - CCP XTS AES operation
|
||||
* @action: AES operation (decrypt/encrypt)
|
||||
* @unit_size: unit size of the XTS operation
|
||||
* @key: key to be used for this XTS AES operation
|
||||
* @key_len: length in bytes of key
|
||||
* @iv: IV to be used for this XTS AES operation
|
||||
* @iv_len: length in bytes of iv
|
||||
* @src: data to be used for this operation
|
||||
* @dst: data produced by this operation
|
||||
* @src_len: length in bytes of data used for this operation
|
||||
* @final: indicates final XTS operation
|
||||
*
|
||||
* Variables required to be set when calling ccp_enqueue_cmd():
|
||||
* - action, unit_size, key, key_len, iv, iv_len, src, dst, src_len, final
|
||||
*
|
||||
* The iv variable is used as both input and output. On completion of the
|
||||
* AES operation the new IV overwrites the old IV.
|
||||
*/
|
||||
struct ccp_xts_aes_engine {
|
||||
enum ccp_aes_action action;
|
||||
enum ccp_xts_aes_unit_size unit_size;
|
||||
|
||||
struct scatterlist *key;
|
||||
u32 key_len; /* In bytes */
|
||||
|
||||
struct scatterlist *iv;
|
||||
u32 iv_len; /* In bytes */
|
||||
|
||||
struct scatterlist *src, *dst;
|
||||
u64 src_len; /* In bytes */
|
||||
|
||||
u32 final;
|
||||
};
|
||||
|
||||
/***** SHA engine *****/
|
||||
#define CCP_SHA_BLOCKSIZE SHA256_BLOCK_SIZE
|
||||
#define CCP_SHA_CTXSIZE SHA256_DIGEST_SIZE
|
||||
|
||||
/**
|
||||
* ccp_sha_type - type of SHA operation
|
||||
*
|
||||
* @CCP_SHA_TYPE_1: SHA-1 operation
|
||||
* @CCP_SHA_TYPE_224: SHA-224 operation
|
||||
* @CCP_SHA_TYPE_256: SHA-256 operation
|
||||
*/
|
||||
enum ccp_sha_type {
|
||||
CCP_SHA_TYPE_1 = 1,
|
||||
CCP_SHA_TYPE_224,
|
||||
CCP_SHA_TYPE_256,
|
||||
CCP_SHA_TYPE__LAST,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ccp_sha_engine - CCP SHA operation
|
||||
* @type: Type of SHA operation
|
||||
* @ctx: current hash value
|
||||
* @ctx_len: length in bytes of hash value
|
||||
* @src: data to be used for this operation
|
||||
* @src_len: length in bytes of data used for this operation
|
||||
* @final: indicates final SHA operation
|
||||
* @msg_bits: total length of the message in bits used in final SHA operation
|
||||
*
|
||||
* Variables required to be set when calling ccp_enqueue_cmd():
|
||||
* - type, ctx, ctx_len, src, src_len, final
|
||||
* - msg_bits if final is non-zero
|
||||
*
|
||||
* The ctx variable is used as both input and output. On completion of the
|
||||
* SHA operation the new hash value overwrites the old hash value.
|
||||
*/
|
||||
struct ccp_sha_engine {
|
||||
enum ccp_sha_type type;
|
||||
|
||||
struct scatterlist *ctx;
|
||||
u32 ctx_len; /* In bytes */
|
||||
|
||||
struct scatterlist *src;
|
||||
u64 src_len; /* In bytes */
|
||||
|
||||
u32 final; /* Indicates final sha cmd */
|
||||
u64 msg_bits; /* Message length in bits required for
|
||||
* final sha cmd */
|
||||
};
|
||||
|
||||
/***** RSA engine *****/
|
||||
/**
|
||||
* struct ccp_rsa_engine - CCP RSA operation
|
||||
* @key_size: length in bits of RSA key
|
||||
* @exp: RSA exponent
|
||||
* @exp_len: length in bytes of exponent
|
||||
* @mod: RSA modulus
|
||||
* @mod_len: length in bytes of modulus
|
||||
* @src: data to be used for this operation
|
||||
* @dst: data produced by this operation
|
||||
* @src_len: length in bytes of data used for this operation
|
||||
*
|
||||
* Variables required to be set when calling ccp_enqueue_cmd():
|
||||
* - key_size, exp, exp_len, mod, mod_len, src, dst, src_len
|
||||
*/
|
||||
struct ccp_rsa_engine {
|
||||
u32 key_size; /* In bits */
|
||||
|
||||
struct scatterlist *exp;
|
||||
u32 exp_len; /* In bytes */
|
||||
|
||||
struct scatterlist *mod;
|
||||
u32 mod_len; /* In bytes */
|
||||
|
||||
struct scatterlist *src, *dst;
|
||||
u32 src_len; /* In bytes */
|
||||
};
|
||||
|
||||
/***** Passthru engine *****/
|
||||
/**
|
||||
* ccp_passthru_bitwise - type of bitwise passthru operation
|
||||
*
|
||||
* @CCP_PASSTHRU_BITWISE_NOOP: no bitwise operation performed
|
||||
* @CCP_PASSTHRU_BITWISE_AND: perform bitwise AND of src with mask
|
||||
* @CCP_PASSTHRU_BITWISE_OR: perform bitwise OR of src with mask
|
||||
* @CCP_PASSTHRU_BITWISE_XOR: perform bitwise XOR of src with mask
|
||||
* @CCP_PASSTHRU_BITWISE_MASK: overwrite with mask
|
||||
*/
|
||||
enum ccp_passthru_bitwise {
|
||||
CCP_PASSTHRU_BITWISE_NOOP = 0,
|
||||
CCP_PASSTHRU_BITWISE_AND,
|
||||
CCP_PASSTHRU_BITWISE_OR,
|
||||
CCP_PASSTHRU_BITWISE_XOR,
|
||||
CCP_PASSTHRU_BITWISE_MASK,
|
||||
CCP_PASSTHRU_BITWISE__LAST,
|
||||
};
|
||||
|
||||
/**
|
||||
* ccp_passthru_byteswap - type of byteswap passthru operation
|
||||
*
|
||||
* @CCP_PASSTHRU_BYTESWAP_NOOP: no byte swapping performed
|
||||
* @CCP_PASSTHRU_BYTESWAP_32BIT: swap bytes within 32-bit words
|
||||
* @CCP_PASSTHRU_BYTESWAP_256BIT: swap bytes within 256-bit words
|
||||
*/
|
||||
enum ccp_passthru_byteswap {
|
||||
CCP_PASSTHRU_BYTESWAP_NOOP = 0,
|
||||
CCP_PASSTHRU_BYTESWAP_32BIT,
|
||||
CCP_PASSTHRU_BYTESWAP_256BIT,
|
||||
CCP_PASSTHRU_BYTESWAP__LAST,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ccp_passthru_engine - CCP pass-through operation
|
||||
* @bit_mod: bitwise operation to perform
|
||||
* @byte_swap: byteswap operation to perform
|
||||
* @mask: mask to be applied to data
|
||||
* @mask_len: length in bytes of mask
|
||||
* @src: data to be used for this operation
|
||||
* @dst: data produced by this operation
|
||||
* @src_len: length in bytes of data used for this operation
|
||||
* @final: indicate final pass-through operation
|
||||
*
|
||||
* Variables required to be set when calling ccp_enqueue_cmd():
|
||||
* - bit_mod, byte_swap, src, dst, src_len
|
||||
* - mask, mask_len if bit_mod is not CCP_PASSTHRU_BITWISE_NOOP
|
||||
*/
|
||||
struct ccp_passthru_engine {
|
||||
enum ccp_passthru_bitwise bit_mod;
|
||||
enum ccp_passthru_byteswap byte_swap;
|
||||
|
||||
struct scatterlist *mask;
|
||||
u32 mask_len; /* In bytes */
|
||||
|
||||
struct scatterlist *src, *dst;
|
||||
u64 src_len; /* In bytes */
|
||||
|
||||
u32 final;
|
||||
};
|
||||
|
||||
/***** ECC engine *****/
|
||||
#define CCP_ECC_MODULUS_BYTES 48 /* 384-bits */
|
||||
#define CCP_ECC_MAX_OPERANDS 6
|
||||
#define CCP_ECC_MAX_OUTPUTS 3
|
||||
|
||||
/**
|
||||
* ccp_ecc_function - type of ECC function
|
||||
*
|
||||
* @CCP_ECC_FUNCTION_MMUL_384BIT: 384-bit modular multiplication
|
||||
* @CCP_ECC_FUNCTION_MADD_384BIT: 384-bit modular addition
|
||||
* @CCP_ECC_FUNCTION_MINV_384BIT: 384-bit multiplicative inverse
|
||||
* @CCP_ECC_FUNCTION_PADD_384BIT: 384-bit point addition
|
||||
* @CCP_ECC_FUNCTION_PMUL_384BIT: 384-bit point multiplication
|
||||
* @CCP_ECC_FUNCTION_PDBL_384BIT: 384-bit point doubling
|
||||
*/
|
||||
enum ccp_ecc_function {
|
||||
CCP_ECC_FUNCTION_MMUL_384BIT = 0,
|
||||
CCP_ECC_FUNCTION_MADD_384BIT,
|
||||
CCP_ECC_FUNCTION_MINV_384BIT,
|
||||
CCP_ECC_FUNCTION_PADD_384BIT,
|
||||
CCP_ECC_FUNCTION_PMUL_384BIT,
|
||||
CCP_ECC_FUNCTION_PDBL_384BIT,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ccp_ecc_modular_math - CCP ECC modular math parameters
|
||||
* @operand_1: first operand for the modular math operation
|
||||
* @operand_1_len: length of the first operand
|
||||
* @operand_2: second operand for the modular math operation
|
||||
* (not used for CCP_ECC_FUNCTION_MINV_384BIT)
|
||||
* @operand_2_len: length of the second operand
|
||||
* (not used for CCP_ECC_FUNCTION_MINV_384BIT)
|
||||
* @result: result of the modular math operation
|
||||
* @result_len: length of the supplied result buffer
|
||||
*/
|
||||
struct ccp_ecc_modular_math {
|
||||
struct scatterlist *operand_1;
|
||||
unsigned int operand_1_len; /* In bytes */
|
||||
|
||||
struct scatterlist *operand_2;
|
||||
unsigned int operand_2_len; /* In bytes */
|
||||
|
||||
struct scatterlist *result;
|
||||
unsigned int result_len; /* In bytes */
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ccp_ecc_point - CCP ECC point definition
|
||||
* @x: the x coordinate of the ECC point
|
||||
* @x_len: the length of the x coordinate
|
||||
* @y: the y coordinate of the ECC point
|
||||
* @y_len: the length of the y coordinate
|
||||
*/
|
||||
struct ccp_ecc_point {
|
||||
struct scatterlist *x;
|
||||
unsigned int x_len; /* In bytes */
|
||||
|
||||
struct scatterlist *y;
|
||||
unsigned int y_len; /* In bytes */
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ccp_ecc_point_math - CCP ECC point math parameters
|
||||
* @point_1: the first point of the ECC point math operation
|
||||
* @point_2: the second point of the ECC point math operation
|
||||
* (only used for CCP_ECC_FUNCTION_PADD_384BIT)
|
||||
* @domain_a: the a parameter of the ECC curve
|
||||
* @domain_a_len: the length of the a parameter
|
||||
* @scalar: the scalar parameter for the point match operation
|
||||
* (only used for CCP_ECC_FUNCTION_PMUL_384BIT)
|
||||
* @scalar_len: the length of the scalar parameter
|
||||
* (only used for CCP_ECC_FUNCTION_PMUL_384BIT)
|
||||
* @result: the point resulting from the point math operation
|
||||
*/
|
||||
struct ccp_ecc_point_math {
|
||||
struct ccp_ecc_point point_1;
|
||||
struct ccp_ecc_point point_2;
|
||||
|
||||
struct scatterlist *domain_a;
|
||||
unsigned int domain_a_len; /* In bytes */
|
||||
|
||||
struct scatterlist *scalar;
|
||||
unsigned int scalar_len; /* In bytes */
|
||||
|
||||
struct ccp_ecc_point result;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ccp_ecc_engine - CCP ECC operation
|
||||
* @function: ECC function to perform
|
||||
* @mod: ECC modulus
|
||||
* @mod_len: length in bytes of modulus
|
||||
* @mm: module math parameters
|
||||
* @pm: point math parameters
|
||||
* @ecc_result: result of the ECC operation
|
||||
*
|
||||
* Variables required to be set when calling ccp_enqueue_cmd():
|
||||
* - function, mod, mod_len
|
||||
* - operand, operand_len, operand_count, output, output_len, output_count
|
||||
* - ecc_result
|
||||
*/
|
||||
struct ccp_ecc_engine {
|
||||
enum ccp_ecc_function function;
|
||||
|
||||
struct scatterlist *mod;
|
||||
u32 mod_len; /* In bytes */
|
||||
|
||||
union {
|
||||
struct ccp_ecc_modular_math mm;
|
||||
struct ccp_ecc_point_math pm;
|
||||
} u;
|
||||
|
||||
u16 ecc_result;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* ccp_engine - CCP operation identifiers
|
||||
*
|
||||
* @CCP_ENGINE_AES: AES operation
|
||||
* @CCP_ENGINE_XTS_AES: 128-bit XTS AES operation
|
||||
* @CCP_ENGINE_RSVD1: unused
|
||||
* @CCP_ENGINE_SHA: SHA operation
|
||||
* @CCP_ENGINE_RSA: RSA operation
|
||||
* @CCP_ENGINE_PASSTHRU: pass-through operation
|
||||
* @CCP_ENGINE_ZLIB_DECOMPRESS: unused
|
||||
* @CCP_ENGINE_ECC: ECC operation
|
||||
*/
|
||||
enum ccp_engine {
|
||||
CCP_ENGINE_AES = 0,
|
||||
CCP_ENGINE_XTS_AES_128,
|
||||
CCP_ENGINE_RSVD1,
|
||||
CCP_ENGINE_SHA,
|
||||
CCP_ENGINE_RSA,
|
||||
CCP_ENGINE_PASSTHRU,
|
||||
CCP_ENGINE_ZLIB_DECOMPRESS,
|
||||
CCP_ENGINE_ECC,
|
||||
CCP_ENGINE__LAST,
|
||||
};
|
||||
|
||||
/* Flag values for flags member of ccp_cmd */
|
||||
#define CCP_CMD_MAY_BACKLOG 0x00000001
|
||||
|
||||
/**
|
||||
* struct ccp_cmd - CPP operation request
|
||||
* @entry: list element (ccp driver use only)
|
||||
* @work: work element used for callbacks (ccp driver use only)
|
||||
* @ccp: CCP device to be run on (ccp driver use only)
|
||||
* @ret: operation return code (ccp driver use only)
|
||||
* @flags: cmd processing flags
|
||||
* @engine: CCP operation to perform
|
||||
* @engine_error: CCP engine return code
|
||||
* @u: engine specific structures, refer to specific engine struct below
|
||||
* @callback: operation completion callback function
|
||||
* @data: parameter value to be supplied to the callback function
|
||||
*
|
||||
* Variables required to be set when calling ccp_enqueue_cmd():
|
||||
* - engine, callback
|
||||
* - See the operation structures below for what is required for each
|
||||
* operation.
|
||||
*/
|
||||
struct ccp_cmd {
|
||||
/* The list_head, work_struct, ccp and ret variables are for use
|
||||
* by the CCP driver only.
|
||||
*/
|
||||
struct list_head entry;
|
||||
struct work_struct work;
|
||||
struct ccp_device *ccp;
|
||||
int ret;
|
||||
|
||||
u32 flags;
|
||||
|
||||
enum ccp_engine engine;
|
||||
u32 engine_error;
|
||||
|
||||
union {
|
||||
struct ccp_aes_engine aes;
|
||||
struct ccp_xts_aes_engine xts;
|
||||
struct ccp_sha_engine sha;
|
||||
struct ccp_rsa_engine rsa;
|
||||
struct ccp_passthru_engine passthru;
|
||||
struct ccp_ecc_engine ecc;
|
||||
} u;
|
||||
|
||||
/* Completion callback support */
|
||||
void (*callback)(void *data, int err);
|
||||
void *data;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
@ -17,7 +17,6 @@ struct ceph_buffer {
|
|||
struct kref kref;
|
||||
struct kvec vec;
|
||||
size_t alloc_len;
|
||||
bool is_vmalloc;
|
||||
};
|
||||
|
||||
extern struct ceph_buffer *ceph_buffer_new(size_t len, gfp_t gfp);
|
||||
|
|
|
|||
|
|
@ -4,42 +4,73 @@
|
|||
/*
|
||||
* feature bits
|
||||
*/
|
||||
#define CEPH_FEATURE_UID (1<<0)
|
||||
#define CEPH_FEATURE_NOSRCADDR (1<<1)
|
||||
#define CEPH_FEATURE_MONCLOCKCHECK (1<<2)
|
||||
#define CEPH_FEATURE_FLOCK (1<<3)
|
||||
#define CEPH_FEATURE_SUBSCRIBE2 (1<<4)
|
||||
#define CEPH_FEATURE_MONNAMES (1<<5)
|
||||
#define CEPH_FEATURE_RECONNECT_SEQ (1<<6)
|
||||
#define CEPH_FEATURE_DIRLAYOUTHASH (1<<7)
|
||||
#define CEPH_FEATURE_OBJECTLOCATOR (1<<8)
|
||||
#define CEPH_FEATURE_PGID64 (1<<9)
|
||||
#define CEPH_FEATURE_INCSUBOSDMAP (1<<10)
|
||||
#define CEPH_FEATURE_PGPOOL3 (1<<11)
|
||||
#define CEPH_FEATURE_OSDREPLYMUX (1<<12)
|
||||
#define CEPH_FEATURE_OSDENC (1<<13)
|
||||
#define CEPH_FEATURE_OMAP (1<<14)
|
||||
#define CEPH_FEATURE_MONENC (1<<15)
|
||||
#define CEPH_FEATURE_QUERY_T (1<<16)
|
||||
#define CEPH_FEATURE_INDEP_PG_MAP (1<<17)
|
||||
#define CEPH_FEATURE_CRUSH_TUNABLES (1<<18)
|
||||
#define CEPH_FEATURE_CHUNKY_SCRUB (1<<19)
|
||||
#define CEPH_FEATURE_MON_NULLROUTE (1<<20)
|
||||
#define CEPH_FEATURE_MON_GV (1<<21)
|
||||
#define CEPH_FEATURE_BACKFILL_RESERVATION (1<<22)
|
||||
#define CEPH_FEATURE_MSG_AUTH (1<<23)
|
||||
#define CEPH_FEATURE_RECOVERY_RESERVATION (1<<24)
|
||||
#define CEPH_FEATURE_CRUSH_TUNABLES2 (1<<25)
|
||||
#define CEPH_FEATURE_CREATEPOOLID (1<<26)
|
||||
#define CEPH_FEATURE_REPLY_CREATE_INODE (1<<27)
|
||||
#define CEPH_FEATURE_OSD_HBMSGS (1<<28)
|
||||
#define CEPH_FEATURE_MDSENC (1<<29)
|
||||
#define CEPH_FEATURE_OSDHASHPSPOOL (1<<30)
|
||||
#define CEPH_FEATURE_UID (1ULL<<0)
|
||||
#define CEPH_FEATURE_NOSRCADDR (1ULL<<1)
|
||||
#define CEPH_FEATURE_MONCLOCKCHECK (1ULL<<2)
|
||||
#define CEPH_FEATURE_FLOCK (1ULL<<3)
|
||||
#define CEPH_FEATURE_SUBSCRIBE2 (1ULL<<4)
|
||||
#define CEPH_FEATURE_MONNAMES (1ULL<<5)
|
||||
#define CEPH_FEATURE_RECONNECT_SEQ (1ULL<<6)
|
||||
#define CEPH_FEATURE_DIRLAYOUTHASH (1ULL<<7)
|
||||
#define CEPH_FEATURE_OBJECTLOCATOR (1ULL<<8)
|
||||
#define CEPH_FEATURE_PGID64 (1ULL<<9)
|
||||
#define CEPH_FEATURE_INCSUBOSDMAP (1ULL<<10)
|
||||
#define CEPH_FEATURE_PGPOOL3 (1ULL<<11)
|
||||
#define CEPH_FEATURE_OSDREPLYMUX (1ULL<<12)
|
||||
#define CEPH_FEATURE_OSDENC (1ULL<<13)
|
||||
#define CEPH_FEATURE_OMAP (1ULL<<14)
|
||||
#define CEPH_FEATURE_MONENC (1ULL<<15)
|
||||
#define CEPH_FEATURE_QUERY_T (1ULL<<16)
|
||||
#define CEPH_FEATURE_INDEP_PG_MAP (1ULL<<17)
|
||||
#define CEPH_FEATURE_CRUSH_TUNABLES (1ULL<<18)
|
||||
#define CEPH_FEATURE_CHUNKY_SCRUB (1ULL<<19)
|
||||
#define CEPH_FEATURE_MON_NULLROUTE (1ULL<<20)
|
||||
#define CEPH_FEATURE_MON_GV (1ULL<<21)
|
||||
#define CEPH_FEATURE_BACKFILL_RESERVATION (1ULL<<22)
|
||||
#define CEPH_FEATURE_MSG_AUTH (1ULL<<23)
|
||||
#define CEPH_FEATURE_RECOVERY_RESERVATION (1ULL<<24)
|
||||
#define CEPH_FEATURE_CRUSH_TUNABLES2 (1ULL<<25)
|
||||
#define CEPH_FEATURE_CREATEPOOLID (1ULL<<26)
|
||||
#define CEPH_FEATURE_REPLY_CREATE_INODE (1ULL<<27)
|
||||
#define CEPH_FEATURE_OSD_HBMSGS (1ULL<<28)
|
||||
#define CEPH_FEATURE_MDSENC (1ULL<<29)
|
||||
#define CEPH_FEATURE_OSDHASHPSPOOL (1ULL<<30)
|
||||
#define CEPH_FEATURE_MON_SINGLE_PAXOS (1ULL<<31)
|
||||
#define CEPH_FEATURE_OSD_SNAPMAPPER (1ULL<<32)
|
||||
#define CEPH_FEATURE_MON_SCRUB (1ULL<<33)
|
||||
#define CEPH_FEATURE_OSD_PACKED_RECOVERY (1ULL<<34)
|
||||
#define CEPH_FEATURE_OSD_CACHEPOOL (1ULL<<35)
|
||||
#define CEPH_FEATURE_CRUSH_V2 (1ULL<<36) /* new indep; SET_* steps */
|
||||
#define CEPH_FEATURE_EXPORT_PEER (1ULL<<37)
|
||||
#define CEPH_FEATURE_OSD_ERASURE_CODES (1ULL<<38)
|
||||
|
||||
/*
|
||||
* The introduction of CEPH_FEATURE_OSD_SNAPMAPPER caused the feature
|
||||
* vector to evaluate to 64 bit ~0. To cope, we designate 1ULL << 63
|
||||
* to mean 33 bit ~0, and introduce a helper below to do the
|
||||
* translation.
|
||||
*
|
||||
* This was introduced by ceph.git commit
|
||||
* 9ea02b84104045c2ffd7e7f4e7af512953855ecd v0.58-657-g9ea02b8
|
||||
* and fixed by ceph.git commit
|
||||
* 4255b5c2fb54ae40c53284b3ab700fdfc7e61748 v0.65-263-g4255b5c
|
||||
*/
|
||||
#define CEPH_FEATURE_RESERVED (1ULL<<63)
|
||||
|
||||
static inline u64 ceph_sanitize_features(u64 features)
|
||||
{
|
||||
if (features & CEPH_FEATURE_RESERVED) {
|
||||
/* everything through OSD_SNAPMAPPER */
|
||||
return 0x1ffffffffull;
|
||||
} else {
|
||||
return features;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Features supported.
|
||||
*/
|
||||
#define CEPH_FEATURES_SUPPORTED_DEFAULT \
|
||||
#define CEPH_FEATURES_SUPPORTED_DEFAULT \
|
||||
(CEPH_FEATURE_NOSRCADDR | \
|
||||
CEPH_FEATURE_RECONNECT_SEQ | \
|
||||
CEPH_FEATURE_PGID64 | \
|
||||
|
|
@ -48,7 +79,10 @@
|
|||
CEPH_FEATURE_CRUSH_TUNABLES | \
|
||||
CEPH_FEATURE_CRUSH_TUNABLES2 | \
|
||||
CEPH_FEATURE_REPLY_CREATE_INODE | \
|
||||
CEPH_FEATURE_OSDHASHPSPOOL)
|
||||
CEPH_FEATURE_OSDHASHPSPOOL | \
|
||||
CEPH_FEATURE_OSD_CACHEPOOL | \
|
||||
CEPH_FEATURE_CRUSH_V2 | \
|
||||
CEPH_FEATURE_EXPORT_PEER)
|
||||
|
||||
#define CEPH_FEATURES_REQUIRED_DEFAULT \
|
||||
(CEPH_FEATURE_NOSRCADDR | \
|
||||
|
|
@ -56,4 +90,5 @@
|
|||
CEPH_FEATURE_PGID64 | \
|
||||
CEPH_FEATURE_PGPOOL3 | \
|
||||
CEPH_FEATURE_OSDENC)
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -53,6 +53,29 @@ struct ceph_file_layout {
|
|||
__le32 fl_pg_pool; /* namespace, crush ruleset, rep level */
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#define ceph_file_layout_su(l) ((__s32)le32_to_cpu((l).fl_stripe_unit))
|
||||
#define ceph_file_layout_stripe_count(l) \
|
||||
((__s32)le32_to_cpu((l).fl_stripe_count))
|
||||
#define ceph_file_layout_object_size(l) ((__s32)le32_to_cpu((l).fl_object_size))
|
||||
#define ceph_file_layout_cas_hash(l) ((__s32)le32_to_cpu((l).fl_cas_hash))
|
||||
#define ceph_file_layout_object_su(l) \
|
||||
((__s32)le32_to_cpu((l).fl_object_stripe_unit))
|
||||
#define ceph_file_layout_pg_pool(l) \
|
||||
((__s32)le32_to_cpu((l).fl_pg_pool))
|
||||
|
||||
static inline unsigned ceph_file_layout_stripe_width(struct ceph_file_layout *l)
|
||||
{
|
||||
return le32_to_cpu(l->fl_stripe_unit) *
|
||||
le32_to_cpu(l->fl_stripe_count);
|
||||
}
|
||||
|
||||
/* "period" == bytes before i start on a new set of objects */
|
||||
static inline unsigned ceph_file_layout_period(struct ceph_file_layout *l)
|
||||
{
|
||||
return le32_to_cpu(l->fl_object_size) *
|
||||
le32_to_cpu(l->fl_stripe_count);
|
||||
}
|
||||
|
||||
#define CEPH_MIN_STRIPE_UNIT 65536
|
||||
|
||||
int ceph_file_layout_is_valid(const struct ceph_file_layout *layout);
|
||||
|
|
@ -282,6 +305,8 @@ enum {
|
|||
CEPH_SESSION_RENEWCAPS,
|
||||
CEPH_SESSION_STALE,
|
||||
CEPH_SESSION_RECALL_STATE,
|
||||
CEPH_SESSION_FLUSHMSG,
|
||||
CEPH_SESSION_FLUSHMSG_ACK,
|
||||
};
|
||||
|
||||
extern const char *ceph_session_op_name(int op);
|
||||
|
|
@ -457,7 +482,8 @@ struct ceph_mds_reply_cap {
|
|||
__u8 flags; /* CEPH_CAP_FLAG_* */
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#define CEPH_CAP_FLAG_AUTH 1 /* cap is issued by auth mds */
|
||||
#define CEPH_CAP_FLAG_AUTH (1 << 0) /* cap is issued by auth mds */
|
||||
#define CEPH_CAP_FLAG_RELEASE (1 << 1) /* release the cap */
|
||||
|
||||
/* inode record, for bundling with mds reply */
|
||||
struct ceph_mds_reply_inode {
|
||||
|
|
@ -658,6 +684,14 @@ struct ceph_mds_caps {
|
|||
__le32 time_warp_seq;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct ceph_mds_cap_peer {
|
||||
__le64 cap_id;
|
||||
__le32 seq;
|
||||
__le32 mseq;
|
||||
__le32 mds;
|
||||
__u8 flags;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* cap release msg head */
|
||||
struct ceph_mds_cap_release {
|
||||
__le32 num; /* number of cap_items that follow */
|
||||
|
|
|
|||
|
|
@ -8,23 +8,6 @@
|
|||
|
||||
#include <linux/ceph/types.h>
|
||||
|
||||
/* This seemed to be the easiest place to define these */
|
||||
|
||||
#define U8_MAX ((u8)(~0U))
|
||||
#define U16_MAX ((u16)(~0U))
|
||||
#define U32_MAX ((u32)(~0U))
|
||||
#define U64_MAX ((u64)(~0ULL))
|
||||
|
||||
#define S8_MAX ((s8)(U8_MAX >> 1))
|
||||
#define S16_MAX ((s16)(U16_MAX >> 1))
|
||||
#define S32_MAX ((s32)(U32_MAX >> 1))
|
||||
#define S64_MAX ((s64)(U64_MAX >> 1LL))
|
||||
|
||||
#define S8_MIN ((s8)(-S8_MAX - 1))
|
||||
#define S16_MIN ((s16)(-S16_MAX - 1))
|
||||
#define S32_MIN ((s32)(-S32_MAX - 1))
|
||||
#define S64_MIN ((s64)(-S64_MAX - 1LL))
|
||||
|
||||
/*
|
||||
* in all cases,
|
||||
* void **p pointer to position pointer
|
||||
|
|
|
|||
|
|
@ -122,8 +122,8 @@ struct ceph_client {
|
|||
|
||||
int (*extra_mon_dispatch)(struct ceph_client *, struct ceph_msg *);
|
||||
|
||||
u32 supported_features;
|
||||
u32 required_features;
|
||||
u64 supported_features;
|
||||
u64 required_features;
|
||||
|
||||
struct ceph_messenger msgr; /* messenger instance */
|
||||
struct ceph_mon_client monc;
|
||||
|
|
@ -173,15 +173,18 @@ static inline int calc_pages_for(u64 off, u64 len)
|
|||
(off >> PAGE_CACHE_SHIFT);
|
||||
}
|
||||
|
||||
extern struct kmem_cache *ceph_inode_cachep;
|
||||
extern struct kmem_cache *ceph_cap_cachep;
|
||||
extern struct kmem_cache *ceph_dentry_cachep;
|
||||
extern struct kmem_cache *ceph_file_cachep;
|
||||
|
||||
/* ceph_common.c */
|
||||
extern bool libceph_compatible(void *data);
|
||||
|
||||
extern const char *ceph_msg_type_name(int type);
|
||||
extern int ceph_check_fsid(struct ceph_client *client, struct ceph_fsid *fsid);
|
||||
extern struct kmem_cache *ceph_inode_cachep;
|
||||
extern struct kmem_cache *ceph_cap_cachep;
|
||||
extern struct kmem_cache *ceph_dentry_cachep;
|
||||
extern struct kmem_cache *ceph_file_cachep;
|
||||
extern void *ceph_kvmalloc(size_t size, gfp_t flags);
|
||||
extern void ceph_kvfree(const void *ptr);
|
||||
|
||||
extern struct ceph_options *ceph_parse_options(char *options,
|
||||
const char *dev_name, const char *dev_name_end,
|
||||
|
|
@ -192,8 +195,8 @@ extern int ceph_compare_options(struct ceph_options *new_opt,
|
|||
struct ceph_client *client);
|
||||
extern struct ceph_client *ceph_create_client(struct ceph_options *opt,
|
||||
void *private,
|
||||
unsigned supported_features,
|
||||
unsigned required_features);
|
||||
u64 supported_features,
|
||||
u64 required_features);
|
||||
extern u64 ceph_client_id(struct ceph_client *client);
|
||||
extern void ceph_destroy_client(struct ceph_client *client);
|
||||
extern int __ceph_open_session(struct ceph_client *client,
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
#ifndef __FS_CEPH_MESSENGER_H
|
||||
#define __FS_CEPH_MESSENGER_H
|
||||
|
||||
#include <linux/blk_types.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/net.h>
|
||||
|
|
@ -60,8 +61,8 @@ struct ceph_messenger {
|
|||
u32 global_seq;
|
||||
spinlock_t global_seq_lock;
|
||||
|
||||
u32 supported_features;
|
||||
u32 required_features;
|
||||
u64 supported_features;
|
||||
u64 required_features;
|
||||
};
|
||||
|
||||
enum ceph_msg_data_type {
|
||||
|
|
@ -119,8 +120,7 @@ struct ceph_msg_data_cursor {
|
|||
#ifdef CONFIG_BLOCK
|
||||
struct { /* bio */
|
||||
struct bio *bio; /* bio from list */
|
||||
unsigned int vector_index; /* vector from bio */
|
||||
unsigned int vector_offset; /* bytes from vector */
|
||||
struct bvec_iter bvec_iter;
|
||||
};
|
||||
#endif /* CONFIG_BLOCK */
|
||||
struct { /* pages */
|
||||
|
|
@ -154,10 +154,9 @@ struct ceph_msg {
|
|||
struct list_head list_head; /* links for connection lists */
|
||||
|
||||
struct kref kref;
|
||||
bool front_is_vmalloc;
|
||||
bool more_to_follow;
|
||||
bool needs_out_seq;
|
||||
int front_max;
|
||||
int front_alloc_len;
|
||||
unsigned long ack_stamp; /* tx: when we were acked */
|
||||
|
||||
struct ceph_msgpool *pool;
|
||||
|
|
@ -192,7 +191,7 @@ struct ceph_connection {
|
|||
|
||||
struct ceph_entity_name peer_name; /* peer name */
|
||||
|
||||
unsigned peer_features;
|
||||
u64 peer_features;
|
||||
u32 connect_seq; /* identify the most recent connection
|
||||
attempt for this connection, client */
|
||||
u32 peer_global_seq; /* peer's global seq for this connection */
|
||||
|
|
@ -256,8 +255,8 @@ extern void ceph_msgr_flush(void);
|
|||
|
||||
extern void ceph_messenger_init(struct ceph_messenger *msgr,
|
||||
struct ceph_entity_addr *myaddr,
|
||||
u32 supported_features,
|
||||
u32 required_features,
|
||||
u64 supported_features,
|
||||
u64 required_features,
|
||||
bool nocrc);
|
||||
|
||||
extern void ceph_con_init(struct ceph_connection *con, void *private,
|
||||
|
|
|
|||
|
|
@ -12,12 +12,6 @@
|
|||
#include <linux/ceph/auth.h>
|
||||
#include <linux/ceph/pagelist.h>
|
||||
|
||||
/*
|
||||
* Maximum object name size
|
||||
* (must be at least as big as RBD_MAX_MD_NAME_LEN -- currently 100)
|
||||
*/
|
||||
#define MAX_OBJ_NAME_SIZE 100
|
||||
|
||||
struct ceph_msg;
|
||||
struct ceph_snap_context;
|
||||
struct ceph_osd_request;
|
||||
|
|
@ -138,6 +132,7 @@ struct ceph_osd_request {
|
|||
__le64 *r_request_pool;
|
||||
void *r_request_pgid;
|
||||
__le32 *r_request_attempts;
|
||||
bool r_paused;
|
||||
struct ceph_eversion *r_request_reassert_version;
|
||||
|
||||
int r_result;
|
||||
|
|
@ -158,15 +153,21 @@ struct ceph_osd_request {
|
|||
struct inode *r_inode; /* for use by callbacks */
|
||||
void *r_priv; /* ditto */
|
||||
|
||||
char r_oid[MAX_OBJ_NAME_SIZE]; /* object name */
|
||||
int r_oid_len;
|
||||
struct ceph_object_locator r_base_oloc;
|
||||
struct ceph_object_id r_base_oid;
|
||||
struct ceph_object_locator r_target_oloc;
|
||||
struct ceph_object_id r_target_oid;
|
||||
|
||||
u64 r_snapid;
|
||||
unsigned long r_stamp; /* send OR check time */
|
||||
|
||||
struct ceph_file_layout r_file_layout;
|
||||
struct ceph_snap_context *r_snapc; /* snap context for writes */
|
||||
};
|
||||
|
||||
struct ceph_request_redirect {
|
||||
struct ceph_object_locator oloc;
|
||||
};
|
||||
|
||||
struct ceph_osd_event {
|
||||
u64 cookie;
|
||||
int one_shot;
|
||||
|
|
|
|||
|
|
@ -35,13 +35,26 @@ struct ceph_pg_pool_info {
|
|||
u8 object_hash;
|
||||
u32 pg_num, pgp_num;
|
||||
int pg_num_mask, pgp_num_mask;
|
||||
s64 read_tier;
|
||||
s64 write_tier; /* wins for read+write ops */
|
||||
u64 flags;
|
||||
char *name;
|
||||
};
|
||||
|
||||
struct ceph_object_locator {
|
||||
uint64_t pool;
|
||||
char *key;
|
||||
s64 pool;
|
||||
};
|
||||
|
||||
/*
|
||||
* Maximum supported by kernel client object name length
|
||||
*
|
||||
* (probably outdated: must be >= RBD_MAX_MD_NAME_LEN -- currently 100)
|
||||
*/
|
||||
#define CEPH_MAX_OID_NAME_LEN 100
|
||||
|
||||
struct ceph_object_id {
|
||||
char name[CEPH_MAX_OID_NAME_LEN];
|
||||
int name_len;
|
||||
};
|
||||
|
||||
struct ceph_pg_mapping {
|
||||
|
|
@ -73,33 +86,30 @@ struct ceph_osdmap {
|
|||
struct crush_map *crush;
|
||||
};
|
||||
|
||||
/*
|
||||
* file layout helpers
|
||||
*/
|
||||
#define ceph_file_layout_su(l) ((__s32)le32_to_cpu((l).fl_stripe_unit))
|
||||
#define ceph_file_layout_stripe_count(l) \
|
||||
((__s32)le32_to_cpu((l).fl_stripe_count))
|
||||
#define ceph_file_layout_object_size(l) ((__s32)le32_to_cpu((l).fl_object_size))
|
||||
#define ceph_file_layout_cas_hash(l) ((__s32)le32_to_cpu((l).fl_cas_hash))
|
||||
#define ceph_file_layout_object_su(l) \
|
||||
((__s32)le32_to_cpu((l).fl_object_stripe_unit))
|
||||
#define ceph_file_layout_pg_pool(l) \
|
||||
((__s32)le32_to_cpu((l).fl_pg_pool))
|
||||
|
||||
static inline unsigned ceph_file_layout_stripe_width(struct ceph_file_layout *l)
|
||||
static inline void ceph_oid_set_name(struct ceph_object_id *oid,
|
||||
const char *name)
|
||||
{
|
||||
return le32_to_cpu(l->fl_stripe_unit) *
|
||||
le32_to_cpu(l->fl_stripe_count);
|
||||
int len;
|
||||
|
||||
len = strlen(name);
|
||||
if (len > sizeof(oid->name)) {
|
||||
WARN(1, "ceph_oid_set_name '%s' len %d vs %zu, truncating\n",
|
||||
name, len, sizeof(oid->name));
|
||||
len = sizeof(oid->name);
|
||||
}
|
||||
|
||||
memcpy(oid->name, name, len);
|
||||
oid->name_len = len;
|
||||
}
|
||||
|
||||
/* "period" == bytes before i start on a new set of objects */
|
||||
static inline unsigned ceph_file_layout_period(struct ceph_file_layout *l)
|
||||
static inline void ceph_oid_copy(struct ceph_object_id *dest,
|
||||
struct ceph_object_id *src)
|
||||
{
|
||||
return le32_to_cpu(l->fl_object_size) *
|
||||
le32_to_cpu(l->fl_stripe_count);
|
||||
BUG_ON(src->name_len > sizeof(dest->name));
|
||||
memcpy(dest->name, src->name, src->name_len);
|
||||
dest->name_len = src->name_len;
|
||||
}
|
||||
|
||||
|
||||
static inline int ceph_osd_is_up(struct ceph_osdmap *map, int osd)
|
||||
{
|
||||
return (osd < map->max_osd) && (map->osd_state[osd] & CEPH_OSD_UP);
|
||||
|
|
@ -155,14 +165,20 @@ extern int ceph_calc_file_object_mapping(struct ceph_file_layout *layout,
|
|||
u64 *bno, u64 *oxoff, u64 *oxlen);
|
||||
|
||||
/* calculate mapping of object to a placement group */
|
||||
extern int ceph_calc_ceph_pg(struct ceph_pg *pg, const char *oid,
|
||||
struct ceph_osdmap *osdmap, uint64_t pool);
|
||||
extern int ceph_oloc_oid_to_pg(struct ceph_osdmap *osdmap,
|
||||
struct ceph_object_locator *oloc,
|
||||
struct ceph_object_id *oid,
|
||||
struct ceph_pg *pg_out);
|
||||
|
||||
extern int ceph_calc_pg_acting(struct ceph_osdmap *osdmap,
|
||||
struct ceph_pg pgid,
|
||||
int *acting);
|
||||
extern int ceph_calc_pg_primary(struct ceph_osdmap *osdmap,
|
||||
struct ceph_pg pgid);
|
||||
|
||||
extern struct ceph_pg_pool_info *ceph_pg_pool_by_id(struct ceph_osdmap *map,
|
||||
u64 id);
|
||||
|
||||
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);
|
||||
|
||||
|
|
|
|||
|
|
@ -344,6 +344,10 @@ enum {
|
|||
CEPH_OSD_FLAG_EXEC_PUBLIC = 0x1000, /* DEPRECATED op may exec (public) */
|
||||
CEPH_OSD_FLAG_LOCALIZE_READS = 0x2000, /* read from nearby replica, if any */
|
||||
CEPH_OSD_FLAG_RWORDERED = 0x4000, /* order wrt concurrent reads */
|
||||
CEPH_OSD_FLAG_IGNORE_CACHE = 0x8000, /* ignore cache logic */
|
||||
CEPH_OSD_FLAG_SKIPRWLOCKS = 0x10000, /* skip rw locks */
|
||||
CEPH_OSD_FLAG_IGNORE_OVERLAY = 0x20000, /* ignore pool overlay */
|
||||
CEPH_OSD_FLAG_FLUSH = 0x40000, /* this is part of flush */
|
||||
};
|
||||
|
||||
enum {
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@
|
|||
#include <linux/xattr.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/percpu-refcount.h>
|
||||
#include <linux/seq_file.h>
|
||||
|
||||
#ifdef CONFIG_CGROUPS
|
||||
|
||||
|
|
@ -28,8 +29,6 @@ struct cgroupfs_root;
|
|||
struct cgroup_subsys;
|
||||
struct inode;
|
||||
struct cgroup;
|
||||
struct css_id;
|
||||
struct eventfd_ctx;
|
||||
|
||||
extern int cgroup_init_early(void);
|
||||
extern int cgroup_init(void);
|
||||
|
|
@ -79,8 +78,6 @@ struct cgroup_subsys_state {
|
|||
struct cgroup_subsys_state *parent;
|
||||
|
||||
unsigned long flags;
|
||||
/* ID for this css, if possible */
|
||||
struct css_id __rcu *id;
|
||||
|
||||
/* percpu_ref killing and RCU release */
|
||||
struct rcu_head rcu_head;
|
||||
|
|
@ -239,10 +236,6 @@ struct cgroup {
|
|||
struct rcu_head rcu_head;
|
||||
struct work_struct destroy_work;
|
||||
|
||||
/* List of events which userspace want to receive */
|
||||
struct list_head event_list;
|
||||
spinlock_t event_list_lock;
|
||||
|
||||
/* directory xattrs */
|
||||
struct simple_xattrs xattrs;
|
||||
};
|
||||
|
|
@ -280,6 +273,9 @@ enum {
|
|||
* - "tasks" is removed. Everything should be at process
|
||||
* granularity. Use "cgroup.procs" instead.
|
||||
*
|
||||
* - "cgroup.procs" is not sorted. pids will be unique unless they
|
||||
* got recycled inbetween reads.
|
||||
*
|
||||
* - "release_agent" and "notify_on_release" are removed.
|
||||
* Replacement notification mechanism will be implemented.
|
||||
*
|
||||
|
|
@ -320,9 +316,6 @@ struct cgroupfs_root {
|
|||
/* Unique id for this hierarchy. */
|
||||
int hierarchy_id;
|
||||
|
||||
/* A list running through the attached subsystems */
|
||||
struct list_head subsys_list;
|
||||
|
||||
/* The root cgroup for this hierarchy */
|
||||
struct cgroup top_cgroup;
|
||||
|
||||
|
|
@ -388,16 +381,6 @@ struct css_set {
|
|||
struct rcu_head rcu_head;
|
||||
};
|
||||
|
||||
/*
|
||||
* cgroup_map_cb is an abstract callback API for reporting map-valued
|
||||
* control files
|
||||
*/
|
||||
|
||||
struct cgroup_map_cb {
|
||||
int (*fill)(struct cgroup_map_cb *cb, const char *key, u64 value);
|
||||
void *state;
|
||||
};
|
||||
|
||||
/*
|
||||
* struct cftype: handler definitions for cgroup control files
|
||||
*
|
||||
|
|
@ -445,10 +428,6 @@ struct cftype {
|
|||
*/
|
||||
struct cgroup_subsys *ss;
|
||||
|
||||
int (*open)(struct inode *inode, struct file *file);
|
||||
ssize_t (*read)(struct cgroup_subsys_state *css, struct cftype *cft,
|
||||
struct file *file,
|
||||
char __user *buf, size_t nbytes, loff_t *ppos);
|
||||
/*
|
||||
* read_u64() is a shortcut for the common case of returning a
|
||||
* single integer. Use it in place of read()
|
||||
|
|
@ -458,24 +437,14 @@ struct cftype {
|
|||
* read_s64() is a signed version of read_u64()
|
||||
*/
|
||||
s64 (*read_s64)(struct cgroup_subsys_state *css, struct cftype *cft);
|
||||
/*
|
||||
* read_map() is used for defining a map of key/value
|
||||
* pairs. It should call cb->fill(cb, key, value) for each
|
||||
* entry. The key/value pairs (and their ordering) should not
|
||||
* change between reboots.
|
||||
*/
|
||||
int (*read_map)(struct cgroup_subsys_state *css, struct cftype *cft,
|
||||
struct cgroup_map_cb *cb);
|
||||
/*
|
||||
* read_seq_string() is used for outputting a simple sequence
|
||||
* using seqfile.
|
||||
*/
|
||||
int (*read_seq_string)(struct cgroup_subsys_state *css,
|
||||
struct cftype *cft, struct seq_file *m);
|
||||
|
||||
ssize_t (*write)(struct cgroup_subsys_state *css, struct cftype *cft,
|
||||
struct file *file,
|
||||
const char __user *buf, size_t nbytes, loff_t *ppos);
|
||||
/* generic seq_file read interface */
|
||||
int (*seq_show)(struct seq_file *sf, void *v);
|
||||
|
||||
/* optional ops, implement all or none */
|
||||
void *(*seq_start)(struct seq_file *sf, loff_t *ppos);
|
||||
void *(*seq_next)(struct seq_file *sf, void *v, loff_t *ppos);
|
||||
void (*seq_stop)(struct seq_file *sf, void *v);
|
||||
|
||||
/*
|
||||
* write_u64() is a shortcut for the common case of accepting
|
||||
|
|
@ -504,27 +473,6 @@ struct cftype {
|
|||
* kick type for multiplexing.
|
||||
*/
|
||||
int (*trigger)(struct cgroup_subsys_state *css, unsigned int event);
|
||||
|
||||
int (*release)(struct inode *inode, struct file *file);
|
||||
|
||||
/*
|
||||
* register_event() callback will be used to add new userspace
|
||||
* waiter for changes related to the cftype. Implement it if
|
||||
* you want to provide this functionality. Use eventfd_signal()
|
||||
* on eventfd to send notification to userspace.
|
||||
*/
|
||||
int (*register_event)(struct cgroup_subsys_state *css,
|
||||
struct cftype *cft, struct eventfd_ctx *eventfd,
|
||||
const char *args);
|
||||
/*
|
||||
* unregister_event() callback will be called when userspace
|
||||
* closes the eventfd or on cgroup removing.
|
||||
* This callback must be implemented, if you want provide
|
||||
* notification functionality.
|
||||
*/
|
||||
void (*unregister_event)(struct cgroup_subsys_state *css,
|
||||
struct cftype *cft,
|
||||
struct eventfd_ctx *eventfd);
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -537,6 +485,26 @@ struct cftype_set {
|
|||
struct cftype *cfts;
|
||||
};
|
||||
|
||||
/*
|
||||
* cgroupfs file entry, pointed to from leaf dentry->d_fsdata. Don't
|
||||
* access directly.
|
||||
*/
|
||||
struct cfent {
|
||||
struct list_head node;
|
||||
struct dentry *dentry;
|
||||
struct cftype *type;
|
||||
struct cgroup_subsys_state *css;
|
||||
|
||||
/* file xattrs */
|
||||
struct simple_xattrs xattrs;
|
||||
};
|
||||
|
||||
/* seq_file->private points to the following, only ->priv is public */
|
||||
struct cgroup_open_file {
|
||||
struct cfent *cfe;
|
||||
void *priv;
|
||||
};
|
||||
|
||||
/*
|
||||
* See the comment above CGRP_ROOT_SANE_BEHAVIOR for details. This
|
||||
* function can be called as long as @cgrp is accessible.
|
||||
|
|
@ -552,6 +520,18 @@ static inline const char *cgroup_name(const struct cgroup *cgrp)
|
|||
return rcu_dereference(cgrp->name)->name;
|
||||
}
|
||||
|
||||
static inline struct cgroup_subsys_state *seq_css(struct seq_file *seq)
|
||||
{
|
||||
struct cgroup_open_file *of = seq->private;
|
||||
return of->cfe->css;
|
||||
}
|
||||
|
||||
static inline struct cftype *seq_cft(struct seq_file *seq)
|
||||
{
|
||||
struct cgroup_open_file *of = seq->private;
|
||||
return of->cfe->type;
|
||||
}
|
||||
|
||||
int cgroup_add_cftypes(struct cgroup_subsys *ss, struct cftype *cfts);
|
||||
int cgroup_rm_cftypes(struct cftype *cfts);
|
||||
|
||||
|
|
@ -631,12 +611,8 @@ struct cgroup_subsys {
|
|||
#define MAX_CGROUP_TYPE_NAMELEN 32
|
||||
const char *name;
|
||||
|
||||
/*
|
||||
* Link to parent, and list entry in parent's children.
|
||||
* Protected by cgroup_lock()
|
||||
*/
|
||||
/* link to parent, protected by cgroup_lock() */
|
||||
struct cgroupfs_root *root;
|
||||
struct list_head sibling;
|
||||
|
||||
/* list of cftype_sets */
|
||||
struct list_head cftsets;
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ SUBSYS(devices)
|
|||
SUBSYS(freezer)
|
||||
#endif
|
||||
|
||||
#if IS_SUBSYS_ENABLED(CONFIG_NET_CLS_CGROUP)
|
||||
#if IS_SUBSYS_ENABLED(CONFIG_CGROUP_NET_CLASSID)
|
||||
SUBSYS(net_cls)
|
||||
#endif
|
||||
|
||||
|
|
@ -43,7 +43,7 @@ SUBSYS(blkio)
|
|||
SUBSYS(perf)
|
||||
#endif
|
||||
|
||||
#if IS_SUBSYS_ENABLED(CONFIG_NETPRIO_CGROUP)
|
||||
#if IS_SUBSYS_ENABLED(CONFIG_CGROUP_NET_PRIO)
|
||||
SUBSYS(net_prio)
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@
|
|||
#define __LINUX_CLK_PRIVATE_H
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
|
||||
/*
|
||||
|
|
@ -25,10 +26,13 @@
|
|||
|
||||
#ifdef CONFIG_COMMON_CLK
|
||||
|
||||
struct module;
|
||||
|
||||
struct clk {
|
||||
const char *name;
|
||||
const struct clk_ops *ops;
|
||||
struct clk_hw *hw;
|
||||
struct module *owner;
|
||||
struct clk *parent;
|
||||
const char **parent_names;
|
||||
struct clk **parents;
|
||||
|
|
@ -41,12 +45,14 @@ struct clk {
|
|||
unsigned long flags;
|
||||
unsigned int enable_count;
|
||||
unsigned int prepare_count;
|
||||
unsigned long accuracy;
|
||||
struct hlist_head children;
|
||||
struct hlist_node child_node;
|
||||
unsigned int notifier_count;
|
||||
#ifdef CONFIG_COMMON_CLK_DEBUG
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
struct dentry *dentry;
|
||||
#endif
|
||||
struct kref ref;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@
|
|||
#define CLK_IS_BASIC BIT(5) /* Basic clk, can't do a to_clk_foo() */
|
||||
#define CLK_GET_RATE_NOCACHE BIT(6) /* do not use the cached clk rate */
|
||||
#define CLK_SET_RATE_NO_REPARENT BIT(7) /* don't re-parent on rate change */
|
||||
#define CLK_GET_ACCURACY_NOCACHE BIT(8) /* do not use the cached clk accuracy */
|
||||
|
||||
struct clk_hw;
|
||||
|
||||
|
|
@ -108,6 +109,25 @@ struct clk_hw;
|
|||
* which is likely helpful for most .set_rate implementation.
|
||||
* Returns 0 on success, -EERROR otherwise.
|
||||
*
|
||||
* @recalc_accuracy: Recalculate the accuracy of this clock. The clock accuracy
|
||||
* is expressed in ppb (parts per billion). The parent accuracy is
|
||||
* an input parameter.
|
||||
* Returns the calculated accuracy. Optional - if this op is not
|
||||
* set then clock accuracy will be initialized to parent accuracy
|
||||
* or 0 (perfect clock) if clock has no parent.
|
||||
*
|
||||
* @set_rate_and_parent: Change the rate and the parent of this clock. The
|
||||
* requested rate is specified by the second argument, which
|
||||
* should typically be the return of .round_rate call. The
|
||||
* third argument gives the parent rate which is likely helpful
|
||||
* for most .set_rate_and_parent implementation. The fourth
|
||||
* argument gives the parent index. This callback is optional (and
|
||||
* unnecessary) for clocks with 0 or 1 parents as well as
|
||||
* for clocks that can tolerate switching the rate and the parent
|
||||
* separately via calls to .set_parent and .set_rate.
|
||||
* Returns 0 on success, -EERROR otherwise.
|
||||
*
|
||||
*
|
||||
* The clk_enable/clk_disable and clk_prepare/clk_unprepare pairs allow
|
||||
* implementations to split any work between atomic (enable) and sleepable
|
||||
* (prepare) contexts. If enabling a clock requires code that might sleep,
|
||||
|
|
@ -139,6 +159,11 @@ struct clk_ops {
|
|||
u8 (*get_parent)(struct clk_hw *hw);
|
||||
int (*set_rate)(struct clk_hw *hw, unsigned long,
|
||||
unsigned long);
|
||||
int (*set_rate_and_parent)(struct clk_hw *hw,
|
||||
unsigned long rate,
|
||||
unsigned long parent_rate, u8 index);
|
||||
unsigned long (*recalc_accuracy)(struct clk_hw *hw,
|
||||
unsigned long parent_accuracy);
|
||||
void (*init)(struct clk_hw *hw);
|
||||
};
|
||||
|
||||
|
|
@ -194,6 +219,7 @@ struct clk_hw {
|
|||
struct clk_fixed_rate {
|
||||
struct clk_hw hw;
|
||||
unsigned long fixed_rate;
|
||||
unsigned long fixed_accuracy;
|
||||
u8 flags;
|
||||
};
|
||||
|
||||
|
|
@ -201,6 +227,9 @@ extern const struct clk_ops clk_fixed_rate_ops;
|
|||
struct clk *clk_register_fixed_rate(struct device *dev, const char *name,
|
||||
const char *parent_name, unsigned long flags,
|
||||
unsigned long fixed_rate);
|
||||
struct clk *clk_register_fixed_rate_with_accuracy(struct device *dev,
|
||||
const char *name, const char *parent_name, unsigned long flags,
|
||||
unsigned long fixed_rate, unsigned long fixed_accuracy);
|
||||
|
||||
void of_fixed_clk_setup(struct device_node *np);
|
||||
|
||||
|
|
@ -433,6 +462,7 @@ struct clk *clk_get_parent_by_index(struct clk *clk, u8 index);
|
|||
unsigned int __clk_get_enable_count(struct clk *clk);
|
||||
unsigned int __clk_get_prepare_count(struct clk *clk);
|
||||
unsigned long __clk_get_rate(struct clk *clk);
|
||||
unsigned long __clk_get_accuracy(struct clk *clk);
|
||||
unsigned long __clk_get_flags(struct clk *clk);
|
||||
bool __clk_is_prepared(struct clk *clk);
|
||||
bool __clk_is_enabled(struct clk *clk);
|
||||
|
|
@ -458,6 +488,8 @@ struct clk_onecell_data {
|
|||
unsigned int clk_num;
|
||||
};
|
||||
|
||||
extern struct of_device_id __clk_of_table;
|
||||
|
||||
#define CLK_OF_DECLARE(name, compat, fn) \
|
||||
static const struct of_device_id __clk_of_table_##name \
|
||||
__used __section(__clk_of_table) \
|
||||
|
|
@ -512,6 +544,20 @@ static inline const char *of_clk_get_parent_name(struct device_node *np,
|
|||
* for improved portability across platforms
|
||||
*/
|
||||
|
||||
#if IS_ENABLED(CONFIG_PPC)
|
||||
|
||||
static inline u32 clk_readl(u32 __iomem *reg)
|
||||
{
|
||||
return ioread32be(reg);
|
||||
}
|
||||
|
||||
static inline void clk_writel(u32 val, u32 __iomem *reg)
|
||||
{
|
||||
iowrite32be(val, reg);
|
||||
}
|
||||
|
||||
#else /* platform dependent I/O accessors */
|
||||
|
||||
static inline u32 clk_readl(u32 __iomem *reg)
|
||||
{
|
||||
return readl(reg);
|
||||
|
|
@ -522,5 +568,7 @@ static inline void clk_writel(u32 val, u32 __iomem *reg)
|
|||
writel(val, reg);
|
||||
}
|
||||
|
||||
#endif /* platform dependent I/O accessors */
|
||||
|
||||
#endif /* CONFIG_COMMON_CLK */
|
||||
#endif /* CLK_PROVIDER_H */
|
||||
|
|
|
|||
|
|
@ -82,6 +82,23 @@ int clk_notifier_register(struct clk *clk, struct notifier_block *nb);
|
|||
|
||||
int clk_notifier_unregister(struct clk *clk, struct notifier_block *nb);
|
||||
|
||||
/**
|
||||
* clk_get_accuracy - obtain the clock accuracy in ppb (parts per billion)
|
||||
* for a clock source.
|
||||
* @clk: clock source
|
||||
*
|
||||
* This gets the clock source accuracy expressed in ppb.
|
||||
* A perfect clock returns 0.
|
||||
*/
|
||||
long clk_get_accuracy(struct clk *clk);
|
||||
|
||||
#else
|
||||
|
||||
static inline long clk_get_accuracy(struct clk *clk)
|
||||
{
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
|
|
|||
192
include/linux/clk/at91_pmc.h
Normal file
192
include/linux/clk/at91_pmc.h
Normal file
|
|
@ -0,0 +1,192 @@
|
|||
/*
|
||||
* include/linux/clk/at91_pmc.h
|
||||
*
|
||||
* Copyright (C) 2005 Ivan Kokshaysky
|
||||
* Copyright (C) SAN People
|
||||
*
|
||||
* Power Management Controller (PMC) - System peripherals registers.
|
||||
* Based on AT91RM9200 datasheet revision E.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*/
|
||||
|
||||
#ifndef AT91_PMC_H
|
||||
#define AT91_PMC_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
extern void __iomem *at91_pmc_base;
|
||||
|
||||
#define at91_pmc_read(field) \
|
||||
__raw_readl(at91_pmc_base + field)
|
||||
|
||||
#define at91_pmc_write(field, value) \
|
||||
__raw_writel(value, at91_pmc_base + field)
|
||||
#else
|
||||
.extern at91_pmc_base
|
||||
#endif
|
||||
|
||||
#define AT91_PMC_SCER 0x00 /* System Clock Enable Register */
|
||||
#define AT91_PMC_SCDR 0x04 /* System Clock Disable Register */
|
||||
|
||||
#define AT91_PMC_SCSR 0x08 /* System Clock Status Register */
|
||||
#define AT91_PMC_PCK (1 << 0) /* Processor Clock */
|
||||
#define AT91RM9200_PMC_UDP (1 << 1) /* USB Devcice Port Clock [AT91RM9200 only] */
|
||||
#define AT91RM9200_PMC_MCKUDP (1 << 2) /* USB Device Port Master Clock Automatic Disable on Suspend [AT91RM9200 only] */
|
||||
#define AT91RM9200_PMC_UHP (1 << 4) /* USB Host Port Clock [AT91RM9200 only] */
|
||||
#define AT91SAM926x_PMC_UHP (1 << 6) /* USB Host Port Clock [AT91SAM926x only] */
|
||||
#define AT91SAM926x_PMC_UDP (1 << 7) /* USB Devcice Port Clock [AT91SAM926x only] */
|
||||
#define AT91_PMC_PCK0 (1 << 8) /* Programmable Clock 0 */
|
||||
#define AT91_PMC_PCK1 (1 << 9) /* Programmable Clock 1 */
|
||||
#define AT91_PMC_PCK2 (1 << 10) /* Programmable Clock 2 */
|
||||
#define AT91_PMC_PCK3 (1 << 11) /* Programmable Clock 3 */
|
||||
#define AT91_PMC_PCK4 (1 << 12) /* Programmable Clock 4 [AT572D940HF only] */
|
||||
#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_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_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_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 */
|
||||
#define AT91_PMC_MOSCRCEN (1 << 3) /* Main On-Chip RC Oscillator Enable [some SAM9] */
|
||||
#define AT91_PMC_OSCOUNT (0xff << 8) /* Main Oscillator Start-up Time */
|
||||
#define AT91_PMC_KEY (0x37 << 16) /* MOR Writing Key */
|
||||
#define AT91_PMC_MOSCSEL (1 << 24) /* Main Oscillator Selection [some SAM9] */
|
||||
#define AT91_PMC_CFDEN (1 << 25) /* Clock Failure Detector Enable [some SAM9] */
|
||||
|
||||
#define AT91_CKGR_MCFR 0x24 /* Main Clock Frequency Register */
|
||||
#define AT91_PMC_MAINF (0xffff << 0) /* Main Clock Frequency */
|
||||
#define AT91_PMC_MAINRDY (1 << 16) /* Main Clock Ready */
|
||||
|
||||
#define AT91_CKGR_PLLAR 0x28 /* PLL A Register */
|
||||
#define AT91_CKGR_PLLBR 0x2c /* PLL B Register */
|
||||
#define AT91_PMC_DIV (0xff << 0) /* Divider */
|
||||
#define AT91_PMC_PLLCOUNT (0x3f << 8) /* PLL Counter */
|
||||
#define AT91_PMC_OUT (3 << 14) /* PLL Clock Frequency Range */
|
||||
#define AT91_PMC_MUL (0x7ff << 16) /* PLL Multiplier */
|
||||
#define AT91_PMC_MUL_GET(n) ((n) >> 16 & 0x7ff)
|
||||
#define AT91_PMC3_MUL (0x7f << 18) /* PLL Multiplier [SAMA5 only] */
|
||||
#define AT91_PMC3_MUL_GET(n) ((n) >> 18 & 0x7f)
|
||||
#define AT91_PMC_USBDIV (3 << 28) /* USB Divisor (PLLB only) */
|
||||
#define AT91_PMC_USBDIV_1 (0 << 28)
|
||||
#define AT91_PMC_USBDIV_2 (1 << 28)
|
||||
#define AT91_PMC_USBDIV_4 (2 << 28)
|
||||
#define AT91_PMC_USB96M (1 << 28) /* Divider by 2 Enable (PLLB only) */
|
||||
|
||||
#define AT91_PMC_MCKR 0x30 /* Master Clock Register */
|
||||
#define AT91_PMC_CSS (3 << 0) /* Master Clock Selection */
|
||||
#define AT91_PMC_CSS_SLOW (0 << 0)
|
||||
#define AT91_PMC_CSS_MAIN (1 << 0)
|
||||
#define AT91_PMC_CSS_PLLA (2 << 0)
|
||||
#define AT91_PMC_CSS_PLLB (3 << 0)
|
||||
#define AT91_PMC_CSS_UPLL (3 << 0) /* [some SAM9 only] */
|
||||
#define PMC_PRES_OFFSET 2
|
||||
#define AT91_PMC_PRES (7 << PMC_PRES_OFFSET) /* Master Clock Prescaler */
|
||||
#define AT91_PMC_PRES_1 (0 << PMC_PRES_OFFSET)
|
||||
#define AT91_PMC_PRES_2 (1 << PMC_PRES_OFFSET)
|
||||
#define AT91_PMC_PRES_4 (2 << PMC_PRES_OFFSET)
|
||||
#define AT91_PMC_PRES_8 (3 << PMC_PRES_OFFSET)
|
||||
#define AT91_PMC_PRES_16 (4 << PMC_PRES_OFFSET)
|
||||
#define AT91_PMC_PRES_32 (5 << PMC_PRES_OFFSET)
|
||||
#define AT91_PMC_PRES_64 (6 << PMC_PRES_OFFSET)
|
||||
#define PMC_ALT_PRES_OFFSET 4
|
||||
#define AT91_PMC_ALT_PRES (7 << PMC_ALT_PRES_OFFSET) /* Master Clock Prescaler [alternate location] */
|
||||
#define AT91_PMC_ALT_PRES_1 (0 << PMC_ALT_PRES_OFFSET)
|
||||
#define AT91_PMC_ALT_PRES_2 (1 << PMC_ALT_PRES_OFFSET)
|
||||
#define AT91_PMC_ALT_PRES_4 (2 << PMC_ALT_PRES_OFFSET)
|
||||
#define AT91_PMC_ALT_PRES_8 (3 << PMC_ALT_PRES_OFFSET)
|
||||
#define AT91_PMC_ALT_PRES_16 (4 << PMC_ALT_PRES_OFFSET)
|
||||
#define AT91_PMC_ALT_PRES_32 (5 << PMC_ALT_PRES_OFFSET)
|
||||
#define AT91_PMC_ALT_PRES_64 (6 << PMC_ALT_PRES_OFFSET)
|
||||
#define AT91_PMC_MDIV (3 << 8) /* Master Clock Division */
|
||||
#define AT91RM9200_PMC_MDIV_1 (0 << 8) /* [AT91RM9200 only] */
|
||||
#define AT91RM9200_PMC_MDIV_2 (1 << 8)
|
||||
#define AT91RM9200_PMC_MDIV_3 (2 << 8)
|
||||
#define AT91RM9200_PMC_MDIV_4 (3 << 8)
|
||||
#define AT91SAM9_PMC_MDIV_1 (0 << 8) /* [SAM9 only] */
|
||||
#define AT91SAM9_PMC_MDIV_2 (1 << 8)
|
||||
#define AT91SAM9_PMC_MDIV_4 (2 << 8)
|
||||
#define AT91SAM9_PMC_MDIV_6 (3 << 8) /* [some SAM9 only] */
|
||||
#define AT91SAM9_PMC_MDIV_3 (3 << 8) /* [some SAM9 only] */
|
||||
#define AT91_PMC_PDIV (1 << 12) /* Processor Clock Division [some SAM9 only] */
|
||||
#define AT91_PMC_PDIV_1 (0 << 12)
|
||||
#define AT91_PMC_PDIV_2 (1 << 12)
|
||||
#define AT91_PMC_PLLADIV2 (1 << 12) /* PLLA divisor by 2 [some SAM9 only] */
|
||||
#define AT91_PMC_PLLADIV2_OFF (0 << 12)
|
||||
#define AT91_PMC_PLLADIV2_ON (1 << 12)
|
||||
|
||||
#define AT91_PMC_USB 0x38 /* USB Clock Register [some SAM9 only] */
|
||||
#define AT91_PMC_USBS (0x1 << 0) /* USB OHCI Input clock selection */
|
||||
#define AT91_PMC_USBS_PLLA (0 << 0)
|
||||
#define AT91_PMC_USBS_UPLL (1 << 0)
|
||||
#define AT91_PMC_USBS_PLLB (1 << 0) /* [AT91SAMN12 only] */
|
||||
#define AT91_PMC_OHCIUSBDIV (0xF << 8) /* Divider for USB OHCI Clock */
|
||||
#define AT91_PMC_OHCIUSBDIV_1 (0x0 << 8)
|
||||
#define AT91_PMC_OHCIUSBDIV_2 (0x1 << 8)
|
||||
|
||||
#define AT91_PMC_SMD 0x3c /* Soft Modem Clock Register [some SAM9 only] */
|
||||
#define AT91_PMC_SMDS (0x1 << 0) /* SMD input clock selection */
|
||||
#define AT91_PMC_SMD_DIV (0x1f << 8) /* SMD input clock divider */
|
||||
#define AT91_PMC_SMDDIV(n) (((n) << 8) & AT91_PMC_SMD_DIV)
|
||||
|
||||
#define AT91_PMC_PCKR(n) (0x40 + ((n) * 4)) /* Programmable Clock 0-N Registers */
|
||||
#define AT91_PMC_ALT_PCKR_CSS (0x7 << 0) /* Programmable Clock Source Selection [alternate length] */
|
||||
#define AT91_PMC_CSS_MASTER (4 << 0) /* [some SAM9 only] */
|
||||
#define AT91_PMC_CSSMCK (0x1 << 8) /* CSS or Master Clock Selection */
|
||||
#define AT91_PMC_CSSMCK_CSS (0 << 8)
|
||||
#define AT91_PMC_CSSMCK_MCK (1 << 8)
|
||||
|
||||
#define AT91_PMC_IER 0x60 /* Interrupt Enable Register */
|
||||
#define AT91_PMC_IDR 0x64 /* Interrupt Disable Register */
|
||||
#define AT91_PMC_SR 0x68 /* Status Register */
|
||||
#define AT91_PMC_MOSCS (1 << 0) /* MOSCS Flag */
|
||||
#define AT91_PMC_LOCKA (1 << 1) /* PLLA Lock */
|
||||
#define AT91_PMC_LOCKB (1 << 2) /* PLLB Lock */
|
||||
#define AT91_PMC_MCKRDY (1 << 3) /* Master Clock */
|
||||
#define AT91_PMC_LOCKU (1 << 6) /* UPLL Lock [some SAM9] */
|
||||
#define AT91_PMC_PCK0RDY (1 << 8) /* Programmable Clock 0 */
|
||||
#define AT91_PMC_PCK1RDY (1 << 9) /* Programmable Clock 1 */
|
||||
#define AT91_PMC_PCK2RDY (1 << 10) /* Programmable Clock 2 */
|
||||
#define AT91_PMC_PCK3RDY (1 << 11) /* Programmable Clock 3 */
|
||||
#define AT91_PMC_MOSCSELS (1 << 16) /* Main Oscillator Selection [some SAM9] */
|
||||
#define AT91_PMC_MOSCRCS (1 << 17) /* Main On-Chip RC [some SAM9] */
|
||||
#define AT91_PMC_CFDEV (1 << 18) /* Clock Failure Detector Event [some SAM9] */
|
||||
#define AT91_PMC_IMR 0x6c /* Interrupt Mask Register */
|
||||
|
||||
#define AT91_PMC_PLLICPR 0x80 /* PLL Charge Pump Current Register */
|
||||
|
||||
#define AT91_PMC_PROT 0xe4 /* Write Protect Mode Register [some SAM9] */
|
||||
#define AT91_PMC_WPEN (0x1 << 0) /* Write Protect Enable */
|
||||
#define AT91_PMC_WPKEY (0xffffff << 8) /* Write Protect Key */
|
||||
#define AT91_PMC_PROTKEY (0x504d43 << 8) /* Activation Code */
|
||||
|
||||
#define AT91_PMC_WPSR 0xe8 /* Write Protect Status Register [some SAM9] */
|
||||
#define AT91_PMC_WPVS (0x1 << 0) /* Write Protect Violation Status */
|
||||
#define AT91_PMC_WPVSRC (0xffff << 8) /* Write Protect Violation Source */
|
||||
|
||||
#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 */
|
||||
|
||||
#define AT91_PMC_PCR 0x10c /* Peripheral Control Register [some SAM9 and SAMA5] */
|
||||
#define AT91_PMC_PCR_PID (0x3f << 0) /* Peripheral ID */
|
||||
#define AT91_PMC_PCR_CMD (0x1 << 12) /* Command (read=0, write=1) */
|
||||
#define AT91_PMC_PCR_DIV(n) ((n) << 16) /* Divisor Value */
|
||||
#define AT91_PMC_PCR_DIV0 0x0 /* Peripheral clock is MCK */
|
||||
#define AT91_PMC_PCR_DIV2 0x1 /* Peripheral clock is MCK/2 */
|
||||
#define AT91_PMC_PCR_DIV4 0x2 /* Peripheral clock is MCK/4 */
|
||||
#define AT91_PMC_PCR_DIV8 0x3 /* Peripheral clock is MCK/8 */
|
||||
#define AT91_PMC_PCR_EN (0x1 << 28) /* Enable */
|
||||
|
||||
#endif
|
||||
19
include/linux/clk/shmobile.h
Normal file
19
include/linux/clk/shmobile.h
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
/*
|
||||
* Copyright 2013 Ideas On Board SPRL
|
||||
*
|
||||
* Contact: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_CLK_SHMOBILE_H_
|
||||
#define __LINUX_CLK_SHMOBILE_H_
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
void rcar_gen2_clocks_init(u32 mode);
|
||||
|
||||
#endif
|
||||
|
|
@ -120,13 +120,6 @@ static inline void tegra_cpu_clock_resume(void)
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ARCH_TEGRA
|
||||
void tegra_periph_reset_deassert(struct clk *c);
|
||||
void tegra_periph_reset_assert(struct clk *c);
|
||||
#else
|
||||
static inline void tegra_periph_reset_deassert(struct clk *c) {}
|
||||
static inline void tegra_periph_reset_assert(struct clk *c) {}
|
||||
#endif
|
||||
void tegra_clocks_apply_init_table(void);
|
||||
|
||||
#endif /* __LINUX_CLK_TEGRA_H_ */
|
||||
|
|
|
|||
298
include/linux/clk/ti.h
Normal file
298
include/linux/clk/ti.h
Normal file
|
|
@ -0,0 +1,298 @@
|
|||
/*
|
||||
* TI clock drivers support
|
||||
*
|
||||
* Copyright (C) 2013 Texas Instruments, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed "as is" WITHOUT ANY WARRANTY of any
|
||||
* kind, whether express or implied; without even the implied warranty
|
||||
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
#ifndef __LINUX_CLK_TI_H__
|
||||
#define __LINUX_CLK_TI_H__
|
||||
|
||||
#include <linux/clkdev.h>
|
||||
|
||||
/**
|
||||
* struct dpll_data - DPLL registers and integration data
|
||||
* @mult_div1_reg: register containing the DPLL M and N bitfields
|
||||
* @mult_mask: mask of the DPLL M bitfield in @mult_div1_reg
|
||||
* @div1_mask: mask of the DPLL N bitfield in @mult_div1_reg
|
||||
* @clk_bypass: struct clk pointer to the clock's bypass clock input
|
||||
* @clk_ref: struct clk pointer to the clock's reference clock input
|
||||
* @control_reg: register containing the DPLL mode bitfield
|
||||
* @enable_mask: mask of the DPLL mode bitfield in @control_reg
|
||||
* @last_rounded_rate: cache of the last rate result of omap2_dpll_round_rate()
|
||||
* @last_rounded_m: cache of the last M result of omap2_dpll_round_rate()
|
||||
* @last_rounded_m4xen: cache of the last M4X result of
|
||||
* omap4_dpll_regm4xen_round_rate()
|
||||
* @last_rounded_lpmode: cache of the last lpmode result of
|
||||
* omap4_dpll_lpmode_recalc()
|
||||
* @max_multiplier: maximum valid non-bypass multiplier value (actual)
|
||||
* @last_rounded_n: cache of the last N result of omap2_dpll_round_rate()
|
||||
* @min_divider: minimum valid non-bypass divider value (actual)
|
||||
* @max_divider: maximum valid non-bypass divider value (actual)
|
||||
* @modes: possible values of @enable_mask
|
||||
* @autoidle_reg: register containing the DPLL autoidle mode bitfield
|
||||
* @idlest_reg: register containing the DPLL idle status bitfield
|
||||
* @autoidle_mask: mask of the DPLL autoidle mode bitfield in @autoidle_reg
|
||||
* @freqsel_mask: mask of the DPLL jitter correction bitfield in @control_reg
|
||||
* @idlest_mask: mask of the DPLL idle status bitfield in @idlest_reg
|
||||
* @lpmode_mask: mask of the DPLL low-power mode bitfield in @control_reg
|
||||
* @m4xen_mask: mask of the DPLL M4X multiplier bitfield in @control_reg
|
||||
* @auto_recal_bit: bitshift of the driftguard enable bit in @control_reg
|
||||
* @recal_en_bit: bitshift of the PRM_IRQENABLE_* bit for recalibration IRQs
|
||||
* @recal_st_bit: bitshift of the PRM_IRQSTATUS_* bit for recalibration IRQs
|
||||
* @flags: DPLL type/features (see below)
|
||||
*
|
||||
* Possible values for @flags:
|
||||
* DPLL_J_TYPE: "J-type DPLL" (only some 36xx, 4xxx DPLLs)
|
||||
*
|
||||
* @freqsel_mask is only used on the OMAP34xx family and AM35xx.
|
||||
*
|
||||
* XXX Some DPLLs have multiple bypass inputs, so it's not technically
|
||||
* correct to only have one @clk_bypass pointer.
|
||||
*
|
||||
* XXX The runtime-variable fields (@last_rounded_rate, @last_rounded_m,
|
||||
* @last_rounded_n) should be separated from the runtime-fixed fields
|
||||
* and placed into a different structure, so that the runtime-fixed data
|
||||
* can be placed into read-only space.
|
||||
*/
|
||||
struct dpll_data {
|
||||
void __iomem *mult_div1_reg;
|
||||
u32 mult_mask;
|
||||
u32 div1_mask;
|
||||
struct clk *clk_bypass;
|
||||
struct clk *clk_ref;
|
||||
void __iomem *control_reg;
|
||||
u32 enable_mask;
|
||||
unsigned long last_rounded_rate;
|
||||
u16 last_rounded_m;
|
||||
u8 last_rounded_m4xen;
|
||||
u8 last_rounded_lpmode;
|
||||
u16 max_multiplier;
|
||||
u8 last_rounded_n;
|
||||
u8 min_divider;
|
||||
u16 max_divider;
|
||||
u8 modes;
|
||||
void __iomem *autoidle_reg;
|
||||
void __iomem *idlest_reg;
|
||||
u32 autoidle_mask;
|
||||
u32 freqsel_mask;
|
||||
u32 idlest_mask;
|
||||
u32 dco_mask;
|
||||
u32 sddiv_mask;
|
||||
u32 lpmode_mask;
|
||||
u32 m4xen_mask;
|
||||
u8 auto_recal_bit;
|
||||
u8 recal_en_bit;
|
||||
u8 recal_st_bit;
|
||||
u8 flags;
|
||||
};
|
||||
|
||||
struct clk_hw_omap_ops;
|
||||
|
||||
/**
|
||||
* struct clk_hw_omap - OMAP struct clk
|
||||
* @node: list_head connecting this clock into the full clock list
|
||||
* @enable_reg: register to write to enable the clock (see @enable_bit)
|
||||
* @enable_bit: bitshift to write to enable/disable the clock (see @enable_reg)
|
||||
* @flags: see "struct clk.flags possibilities" above
|
||||
* @clksel_reg: for clksel clks, register va containing src/divisor select
|
||||
* @clksel_mask: bitmask in @clksel_reg for the src/divisor selector
|
||||
* @clksel: for clksel clks, pointer to struct clksel for this clock
|
||||
* @dpll_data: for DPLLs, pointer to struct dpll_data for this clock
|
||||
* @clkdm_name: clockdomain name that this clock is contained in
|
||||
* @clkdm: pointer to struct clockdomain, resolved from @clkdm_name at runtime
|
||||
* @ops: clock ops for this clock
|
||||
*/
|
||||
struct clk_hw_omap {
|
||||
struct clk_hw hw;
|
||||
struct list_head node;
|
||||
unsigned long fixed_rate;
|
||||
u8 fixed_div;
|
||||
void __iomem *enable_reg;
|
||||
u8 enable_bit;
|
||||
u8 flags;
|
||||
void __iomem *clksel_reg;
|
||||
u32 clksel_mask;
|
||||
const struct clksel *clksel;
|
||||
struct dpll_data *dpll_data;
|
||||
const char *clkdm_name;
|
||||
struct clockdomain *clkdm;
|
||||
const struct clk_hw_omap_ops *ops;
|
||||
};
|
||||
|
||||
/*
|
||||
* struct clk_hw_omap.flags possibilities
|
||||
*
|
||||
* XXX document the rest of the clock flags here
|
||||
*
|
||||
* ENABLE_REG_32BIT: (OMAP1 only) clock control register must be accessed
|
||||
* with 32bit ops, by default OMAP1 uses 16bit ops.
|
||||
* CLOCK_IDLE_CONTROL: (OMAP1 only) clock has autoidle support.
|
||||
* CLOCK_NO_IDLE_PARENT: (OMAP1 only) when clock is enabled, its parent
|
||||
* clock is put to no-idle mode.
|
||||
* ENABLE_ON_INIT: Clock is enabled on init.
|
||||
* INVERT_ENABLE: By default, clock enable bit behavior is '1' enable, '0'
|
||||
* disable. This inverts the behavior making '0' enable and '1' disable.
|
||||
* CLOCK_CLKOUTX2: (OMAP4 only) DPLL CLKOUT and CLKOUTX2 GATE_CTRL
|
||||
* bits share the same register. This flag allows the
|
||||
* omap4_dpllmx*() code to determine which GATE_CTRL bit field
|
||||
* should be used. This is a temporary solution - a better approach
|
||||
* would be to associate clock type-specific data with the clock,
|
||||
* similar to the struct dpll_data approach.
|
||||
* MEMMAP_ADDRESSING: Use memmap addressing to access clock registers.
|
||||
*/
|
||||
#define ENABLE_REG_32BIT (1 << 0) /* Use 32-bit access */
|
||||
#define CLOCK_IDLE_CONTROL (1 << 1)
|
||||
#define CLOCK_NO_IDLE_PARENT (1 << 2)
|
||||
#define ENABLE_ON_INIT (1 << 3) /* Enable upon framework init */
|
||||
#define INVERT_ENABLE (1 << 4) /* 0 enables, 1 disables */
|
||||
#define CLOCK_CLKOUTX2 (1 << 5)
|
||||
#define MEMMAP_ADDRESSING (1 << 6)
|
||||
|
||||
/* CM_CLKEN_PLL*.EN* bit values - not all are available for every DPLL */
|
||||
#define DPLL_LOW_POWER_STOP 0x1
|
||||
#define DPLL_LOW_POWER_BYPASS 0x5
|
||||
#define DPLL_LOCKED 0x7
|
||||
|
||||
/* DPLL Type and DCO Selection Flags */
|
||||
#define DPLL_J_TYPE 0x1
|
||||
|
||||
/* Composite clock component types */
|
||||
enum {
|
||||
CLK_COMPONENT_TYPE_GATE = 0,
|
||||
CLK_COMPONENT_TYPE_DIVIDER,
|
||||
CLK_COMPONENT_TYPE_MUX,
|
||||
CLK_COMPONENT_TYPE_MAX,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ti_dt_clk - OMAP DT clock alias declarations
|
||||
* @lk: clock lookup definition
|
||||
* @node_name: clock DT node to map to
|
||||
*/
|
||||
struct ti_dt_clk {
|
||||
struct clk_lookup lk;
|
||||
char *node_name;
|
||||
};
|
||||
|
||||
#define DT_CLK(dev, con, name) \
|
||||
{ \
|
||||
.lk = { \
|
||||
.dev_id = dev, \
|
||||
.con_id = con, \
|
||||
}, \
|
||||
.node_name = name, \
|
||||
}
|
||||
|
||||
/* Maximum number of clock memmaps */
|
||||
#define CLK_MAX_MEMMAPS 4
|
||||
|
||||
typedef void (*ti_of_clk_init_cb_t)(struct clk_hw *, struct device_node *);
|
||||
|
||||
/**
|
||||
* struct clk_omap_reg - OMAP register declaration
|
||||
* @offset: offset from the master IP module base address
|
||||
* @index: index of the master IP module
|
||||
*/
|
||||
struct clk_omap_reg {
|
||||
u16 offset;
|
||||
u16 index;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ti_clk_ll_ops - low-level register access ops for a clock
|
||||
* @clk_readl: pointer to register read function
|
||||
* @clk_writel: pointer to register write function
|
||||
*
|
||||
* Low-level register access ops are generally used by the basic clock types
|
||||
* (clk-gate, clk-mux, clk-divider etc.) to provide support for various
|
||||
* low-level hardware interfaces (direct MMIO, regmap etc.), but can also be
|
||||
* used by other hardware-specific clock drivers if needed.
|
||||
*/
|
||||
struct ti_clk_ll_ops {
|
||||
u32 (*clk_readl)(void __iomem *reg);
|
||||
void (*clk_writel)(u32 val, void __iomem *reg);
|
||||
};
|
||||
|
||||
extern struct ti_clk_ll_ops *ti_clk_ll_ops;
|
||||
|
||||
extern const struct clk_ops ti_clk_divider_ops;
|
||||
extern const struct clk_ops ti_clk_mux_ops;
|
||||
|
||||
#define to_clk_hw_omap(_hw) container_of(_hw, struct clk_hw_omap, hw)
|
||||
|
||||
void omap2_init_clk_hw_omap_clocks(struct clk *clk);
|
||||
int omap3_noncore_dpll_enable(struct clk_hw *hw);
|
||||
void omap3_noncore_dpll_disable(struct clk_hw *hw);
|
||||
int omap3_noncore_dpll_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long parent_rate);
|
||||
unsigned long omap4_dpll_regm4xen_recalc(struct clk_hw *hw,
|
||||
unsigned long parent_rate);
|
||||
long omap4_dpll_regm4xen_round_rate(struct clk_hw *hw,
|
||||
unsigned long target_rate,
|
||||
unsigned long *parent_rate);
|
||||
u8 omap2_init_dpll_parent(struct clk_hw *hw);
|
||||
unsigned long omap3_dpll_recalc(struct clk_hw *hw, unsigned long parent_rate);
|
||||
long omap2_dpll_round_rate(struct clk_hw *hw, unsigned long target_rate,
|
||||
unsigned long *parent_rate);
|
||||
void omap2_init_clk_clkdm(struct clk_hw *clk);
|
||||
unsigned long omap3_clkoutx2_recalc(struct clk_hw *hw,
|
||||
unsigned long parent_rate);
|
||||
int omap2_clkops_enable_clkdm(struct clk_hw *hw);
|
||||
void omap2_clkops_disable_clkdm(struct clk_hw *hw);
|
||||
int omap2_clk_disable_autoidle_all(void);
|
||||
void omap2_clk_enable_init_clocks(const char **clk_names, u8 num_clocks);
|
||||
int omap3_dpll4_set_rate(struct clk_hw *clk, unsigned long rate,
|
||||
unsigned long parent_rate);
|
||||
int omap2_dflt_clk_enable(struct clk_hw *hw);
|
||||
void omap2_dflt_clk_disable(struct clk_hw *hw);
|
||||
int omap2_dflt_clk_is_enabled(struct clk_hw *hw);
|
||||
void omap3_clk_lock_dpll5(void);
|
||||
|
||||
void __iomem *ti_clk_get_reg_addr(struct device_node *node, int index);
|
||||
void ti_dt_clocks_register(struct ti_dt_clk *oclks);
|
||||
void ti_dt_clk_init_provider(struct device_node *np, int index);
|
||||
void ti_dt_clockdomains_setup(void);
|
||||
int ti_clk_retry_init(struct device_node *node, struct clk_hw *hw,
|
||||
ti_of_clk_init_cb_t func);
|
||||
int of_ti_clk_autoidle_setup(struct device_node *node);
|
||||
int ti_clk_add_component(struct device_node *node, struct clk_hw *hw, int type);
|
||||
|
||||
int omap3430_dt_clk_init(void);
|
||||
int omap3630_dt_clk_init(void);
|
||||
int am35xx_dt_clk_init(void);
|
||||
int ti81xx_dt_clk_init(void);
|
||||
int omap4xxx_dt_clk_init(void);
|
||||
int omap5xxx_dt_clk_init(void);
|
||||
int dra7xx_dt_clk_init(void);
|
||||
int am33xx_dt_clk_init(void);
|
||||
int am43xx_dt_clk_init(void);
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
void of_ti_clk_allow_autoidle_all(void);
|
||||
void of_ti_clk_deny_autoidle_all(void);
|
||||
#else
|
||||
static inline void of_ti_clk_allow_autoidle_all(void) { }
|
||||
static inline void of_ti_clk_deny_autoidle_all(void) { }
|
||||
#endif
|
||||
|
||||
extern const struct clk_hw_omap_ops clkhwops_omap3_dpll;
|
||||
extern const struct clk_hw_omap_ops clkhwops_omap4_dpllmx;
|
||||
extern const struct clk_hw_omap_ops clkhwops_wait;
|
||||
extern const struct clk_hw_omap_ops clkhwops_omap3430es2_dss_usbhost_wait;
|
||||
extern const struct clk_hw_omap_ops clkhwops_am35xx_ipss_module_wait;
|
||||
extern const struct clk_hw_omap_ops clkhwops_am35xx_ipss_wait;
|
||||
extern const struct clk_hw_omap_ops clkhwops_iclk;
|
||||
extern const struct clk_hw_omap_ops clkhwops_iclk_wait;
|
||||
extern const struct clk_hw_omap_ops clkhwops_omap3430es2_iclk_ssi_wait;
|
||||
extern const struct clk_hw_omap_ops clkhwops_omap3430es2_iclk_dss_usbhost_wait;
|
||||
extern const struct clk_hw_omap_ops clkhwops_omap3430es2_iclk_hsotgusb_wait;
|
||||
|
||||
#endif
|
||||
|
|
@ -43,4 +43,9 @@ int clk_add_alias(const char *, const char *, char *, struct device *);
|
|||
int clk_register_clkdev(struct clk *, const char *, const char *, ...);
|
||||
int clk_register_clkdevs(struct clk *, struct clk_lookup *, size_t);
|
||||
|
||||
#ifdef CONFIG_COMMON_CLK
|
||||
int __clk_get(struct clk *clk);
|
||||
void __clk_put(struct clk *clk);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -37,9 +37,9 @@ int cmdline_parts_parse(struct cmdline_parts **parts, const char *cmdline);
|
|||
struct cmdline_parts *cmdline_parts_find(struct cmdline_parts *parts,
|
||||
const char *bdev);
|
||||
|
||||
void cmdline_parts_set(struct cmdline_parts *parts, sector_t disk_size,
|
||||
int slot,
|
||||
int (*add_part)(int, struct cmdline_subpart *, void *),
|
||||
void *param);
|
||||
int cmdline_parts_set(struct cmdline_parts *parts, sector_t disk_size,
|
||||
int slot,
|
||||
int (*add_part)(int, struct cmdline_subpart *, void *),
|
||||
void *param);
|
||||
|
||||
#endif /* CMDLINEPARSEH */
|
||||
|
|
|
|||
|
|
@ -62,6 +62,22 @@ static inline bool compaction_deferred(struct zone *zone, int order)
|
|||
return zone->compact_considered < defer_limit;
|
||||
}
|
||||
|
||||
/*
|
||||
* Update defer tracking counters after successful compaction of given order,
|
||||
* which means an allocation either succeeded (alloc_success == true) or is
|
||||
* expected to succeed.
|
||||
*/
|
||||
static inline void compaction_defer_reset(struct zone *zone, int order,
|
||||
bool alloc_success)
|
||||
{
|
||||
if (alloc_success) {
|
||||
zone->compact_considered = 0;
|
||||
zone->compact_defer_shift = 0;
|
||||
}
|
||||
if (order >= zone->compact_order_failed)
|
||||
zone->compact_order_failed = order + 1;
|
||||
}
|
||||
|
||||
/* Returns true if restarting compaction after many failures */
|
||||
static inline bool compaction_restarting(struct zone *zone, int order)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -327,17 +327,17 @@ asmlinkage long compat_sys_keyctl(u32 option,
|
|||
u32 arg2, u32 arg3, u32 arg4, u32 arg5);
|
||||
asmlinkage long compat_sys_ustat(unsigned dev, struct compat_ustat __user *u32);
|
||||
|
||||
asmlinkage ssize_t compat_sys_readv(unsigned long fd,
|
||||
const struct compat_iovec __user *vec, unsigned long vlen);
|
||||
asmlinkage ssize_t compat_sys_writev(unsigned long fd,
|
||||
const struct compat_iovec __user *vec, unsigned long vlen);
|
||||
asmlinkage ssize_t compat_sys_preadv(unsigned long fd,
|
||||
asmlinkage ssize_t compat_sys_readv(compat_ulong_t fd,
|
||||
const struct compat_iovec __user *vec, compat_ulong_t vlen);
|
||||
asmlinkage ssize_t compat_sys_writev(compat_ulong_t fd,
|
||||
const struct compat_iovec __user *vec, compat_ulong_t vlen);
|
||||
asmlinkage ssize_t compat_sys_preadv(compat_ulong_t fd,
|
||||
const struct compat_iovec __user *vec,
|
||||
unsigned long vlen, u32 pos_low, u32 pos_high);
|
||||
asmlinkage ssize_t compat_sys_pwritev(unsigned long fd,
|
||||
compat_ulong_t vlen, u32 pos_low, u32 pos_high);
|
||||
asmlinkage ssize_t compat_sys_pwritev(compat_ulong_t fd,
|
||||
const struct compat_iovec __user *vec,
|
||||
unsigned long vlen, u32 pos_low, u32 pos_high);
|
||||
asmlinkage long comat_sys_lseek(unsigned int, compat_off_t, unsigned int);
|
||||
compat_ulong_t vlen, u32 pos_low, u32 pos_high);
|
||||
asmlinkage long compat_sys_lseek(unsigned int, compat_off_t, unsigned int);
|
||||
|
||||
asmlinkage long compat_sys_execve(const char __user *filename, const compat_uptr_t __user *argv,
|
||||
const compat_uptr_t __user *envp);
|
||||
|
|
@ -422,7 +422,7 @@ extern long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
|
|||
asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid,
|
||||
compat_long_t addr, compat_long_t data);
|
||||
|
||||
asmlinkage long compat_sys_lookup_dcookie(u32, u32, char __user *, size_t);
|
||||
asmlinkage long compat_sys_lookup_dcookie(u32, u32, char __user *, compat_size_t);
|
||||
/*
|
||||
* epoll (fs/eventpoll.c) compat bits follow ...
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -37,6 +37,9 @@
|
|||
__asm__ ("" : "=r"(__ptr) : "0"(ptr)); \
|
||||
(typeof(ptr)) (__ptr + (off)); })
|
||||
|
||||
/* Make the optimizer believe the variable can be manipulated arbitrarily. */
|
||||
#define OPTIMIZER_HIDE_VAR(var) __asm__ ("" : "=r" (var) : "0" (var))
|
||||
|
||||
#ifdef __CHECKER__
|
||||
#define __must_be_array(arr) 0
|
||||
#else
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@
|
|||
*/
|
||||
#undef barrier
|
||||
#undef RELOC_HIDE
|
||||
#undef OPTIMIZER_HIDE_VAR
|
||||
|
||||
#define barrier() __memory_barrier()
|
||||
|
||||
|
|
@ -23,6 +24,12 @@
|
|||
__ptr = (unsigned long) (ptr); \
|
||||
(typeof(ptr)) (__ptr + (off)); })
|
||||
|
||||
/* This should act as an optimization barrier on var.
|
||||
* Given that this compiler does not have inline assembly, a compiler barrier
|
||||
* is the best we can do.
|
||||
*/
|
||||
#define OPTIMIZER_HIDE_VAR(var) barrier()
|
||||
|
||||
/* Intel ECC compiler doesn't support __builtin_types_compatible_p() */
|
||||
#define __must_be_array(a) 0
|
||||
|
||||
|
|
|
|||
|
|
@ -170,6 +170,10 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
|
|||
(typeof(ptr)) (__ptr + (off)); })
|
||||
#endif
|
||||
|
||||
#ifndef OPTIMIZER_HIDE_VAR
|
||||
#define OPTIMIZER_HIDE_VAR(var) barrier()
|
||||
#endif
|
||||
|
||||
/* Not-quite-unique ID. */
|
||||
#ifndef __UNIQUE_ID
|
||||
# define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __LINE__)
|
||||
|
|
|
|||
32
include/linux/component.h
Normal file
32
include/linux/component.h
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
#ifndef COMPONENT_H
|
||||
#define COMPONENT_H
|
||||
|
||||
struct device;
|
||||
|
||||
struct component_ops {
|
||||
int (*bind)(struct device *, struct device *, void *);
|
||||
void (*unbind)(struct device *, struct device *, void *);
|
||||
};
|
||||
|
||||
int component_add(struct device *, const struct component_ops *);
|
||||
void component_del(struct device *, const struct component_ops *);
|
||||
|
||||
int component_bind_all(struct device *, void *);
|
||||
void component_unbind_all(struct device *, void *);
|
||||
|
||||
struct master;
|
||||
|
||||
struct component_master_ops {
|
||||
int (*add_components)(struct device *, struct master *);
|
||||
int (*bind)(struct device *);
|
||||
void (*unbind)(struct device *);
|
||||
};
|
||||
|
||||
int component_master_add(struct device *, const struct component_master_ops *);
|
||||
void component_master_del(struct device *,
|
||||
const struct component_master_ops *);
|
||||
|
||||
int component_master_add_child(struct master *master,
|
||||
int (*compare)(struct device *, void *), void *compare_data);
|
||||
|
||||
#endif
|
||||
25
include/linux/container.h
Normal file
25
include/linux/container.h
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
/*
|
||||
* Definitions for container bus type.
|
||||
*
|
||||
* Copyright (C) 2013, Intel Corporation
|
||||
* Author: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/device.h>
|
||||
|
||||
/* drivers/base/power/container.c */
|
||||
extern struct bus_type container_subsys;
|
||||
|
||||
struct container_dev {
|
||||
struct device dev;
|
||||
int (*offline)(struct container_dev *cdev);
|
||||
};
|
||||
|
||||
static inline struct container_dev *to_container_dev(struct device *dev)
|
||||
{
|
||||
return container_of(dev, struct container_dev, dev);
|
||||
}
|
||||
|
|
@ -24,6 +24,7 @@
|
|||
#ifndef __CPU_COOLING_H__
|
||||
#define __CPU_COOLING_H__
|
||||
|
||||
#include <linux/of.h>
|
||||
#include <linux/thermal.h>
|
||||
#include <linux/cpumask.h>
|
||||
|
||||
|
|
@ -35,6 +36,24 @@
|
|||
struct thermal_cooling_device *
|
||||
cpufreq_cooling_register(const struct cpumask *clip_cpus);
|
||||
|
||||
/**
|
||||
* of_cpufreq_cooling_register - create cpufreq cooling device based on DT.
|
||||
* @np: a valid struct device_node to the cooling device device tree node.
|
||||
* @clip_cpus: cpumask of cpus where the frequency constraints will happen
|
||||
*/
|
||||
#ifdef CONFIG_THERMAL_OF
|
||||
struct thermal_cooling_device *
|
||||
of_cpufreq_cooling_register(struct device_node *np,
|
||||
const struct cpumask *clip_cpus);
|
||||
#else
|
||||
static inline struct thermal_cooling_device *
|
||||
of_cpufreq_cooling_register(struct device_node *np,
|
||||
const struct cpumask *clip_cpus)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* cpufreq_cooling_unregister - function to remove cpufreq cooling device.
|
||||
* @cdev: thermal cooling device pointer.
|
||||
|
|
@ -48,6 +67,12 @@ cpufreq_cooling_register(const struct cpumask *clip_cpus)
|
|||
{
|
||||
return NULL;
|
||||
}
|
||||
static inline struct thermal_cooling_device *
|
||||
of_cpufreq_cooling_register(struct device_node *np,
|
||||
const struct cpumask *clip_cpus)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
static inline
|
||||
void cpufreq_cooling_unregister(struct thermal_cooling_device *cdev)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@
|
|||
#ifndef _LINUX_CPUFREQ_H
|
||||
#define _LINUX_CPUFREQ_H
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/cpumask.h>
|
||||
#include <linux/completion.h>
|
||||
#include <linux/kobject.h>
|
||||
|
|
@ -66,6 +67,7 @@ struct cpufreq_policy {
|
|||
unsigned int cpu; /* cpu nr of CPU managing this policy */
|
||||
unsigned int last_cpu; /* cpu nr of previous CPU that managed
|
||||
* this policy */
|
||||
struct clk *clk;
|
||||
struct cpufreq_cpuinfo cpuinfo;/* see above */
|
||||
|
||||
unsigned int min; /* in kHz */
|
||||
|
|
@ -225,6 +227,11 @@ struct cpufreq_driver {
|
|||
int (*suspend) (struct cpufreq_policy *policy);
|
||||
int (*resume) (struct cpufreq_policy *policy);
|
||||
struct freq_attr **attr;
|
||||
|
||||
/* platform specific boost support code */
|
||||
bool boost_supported;
|
||||
bool boost_enabled;
|
||||
int (*set_boost) (int state);
|
||||
};
|
||||
|
||||
/* flags */
|
||||
|
|
@ -252,6 +259,15 @@ struct cpufreq_driver {
|
|||
*/
|
||||
#define CPUFREQ_ASYNC_NOTIFICATION (1 << 4)
|
||||
|
||||
/*
|
||||
* Set by drivers which want cpufreq core to check if CPU is running at a
|
||||
* frequency present in freq-table exposed by the driver. For these drivers if
|
||||
* CPU is found running at an out of table freq, we will try to set it to a freq
|
||||
* from the table. And if that fails, we will stop further boot process by
|
||||
* issuing a BUG_ON().
|
||||
*/
|
||||
#define CPUFREQ_NEED_INITIAL_FREQ_CHECK (1 << 5)
|
||||
|
||||
int cpufreq_register_driver(struct cpufreq_driver *driver_data);
|
||||
int cpufreq_unregister_driver(struct cpufreq_driver *driver_data);
|
||||
|
||||
|
|
@ -299,6 +315,8 @@ cpufreq_verify_within_cpu_limits(struct cpufreq_policy *policy)
|
|||
#define CPUFREQ_NOTIFY (2)
|
||||
#define CPUFREQ_START (3)
|
||||
#define CPUFREQ_UPDATE_POLICY_CPU (4)
|
||||
#define CPUFREQ_CREATE_POLICY (5)
|
||||
#define CPUFREQ_REMOVE_POLICY (6)
|
||||
|
||||
#ifdef CONFIG_CPU_FREQ
|
||||
int cpufreq_register_notifier(struct notifier_block *nb, unsigned int list);
|
||||
|
|
@ -306,6 +324,8 @@ int cpufreq_unregister_notifier(struct notifier_block *nb, unsigned int list);
|
|||
|
||||
void cpufreq_notify_transition(struct cpufreq_policy *policy,
|
||||
struct cpufreq_freqs *freqs, unsigned int state);
|
||||
void cpufreq_notify_post_transition(struct cpufreq_policy *policy,
|
||||
struct cpufreq_freqs *freqs, int transition_failed);
|
||||
|
||||
#else /* CONFIG_CPU_FREQ */
|
||||
static inline int cpufreq_register_notifier(struct notifier_block *nb,
|
||||
|
|
@ -420,6 +440,7 @@ extern struct cpufreq_governor cpufreq_gov_conservative;
|
|||
|
||||
#define CPUFREQ_ENTRY_INVALID ~0
|
||||
#define CPUFREQ_TABLE_END ~1
|
||||
#define CPUFREQ_BOOST_FREQ ~2
|
||||
|
||||
struct cpufreq_frequency_table {
|
||||
unsigned int driver_data; /* driver specific data, not used by core */
|
||||
|
|
@ -439,10 +460,30 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
|
|||
unsigned int target_freq,
|
||||
unsigned int relation,
|
||||
unsigned int *index);
|
||||
int cpufreq_frequency_table_get_index(struct cpufreq_policy *policy,
|
||||
unsigned int freq);
|
||||
|
||||
void cpufreq_frequency_table_update_policy_cpu(struct cpufreq_policy *policy);
|
||||
ssize_t cpufreq_show_cpus(const struct cpumask *mask, char *buf);
|
||||
|
||||
#ifdef CONFIG_CPU_FREQ
|
||||
int cpufreq_boost_trigger_state(int state);
|
||||
int cpufreq_boost_supported(void);
|
||||
int cpufreq_boost_enabled(void);
|
||||
#else
|
||||
static inline int cpufreq_boost_trigger_state(int state)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int cpufreq_boost_supported(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int cpufreq_boost_enabled(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
/* the following funtion is for cpufreq core use only */
|
||||
struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu);
|
||||
|
||||
|
|
@ -455,6 +496,7 @@ void cpufreq_frequency_table_put_attr(unsigned int cpu);
|
|||
int cpufreq_table_validate_and_show(struct cpufreq_policy *policy,
|
||||
struct cpufreq_frequency_table *table);
|
||||
|
||||
unsigned int cpufreq_generic_get(unsigned int cpu);
|
||||
int cpufreq_generic_init(struct cpufreq_policy *policy,
|
||||
struct cpufreq_frequency_table *table,
|
||||
unsigned int transition_latency);
|
||||
|
|
|
|||
|
|
@ -1,10 +0,0 @@
|
|||
#ifndef __CRAMFS_H
|
||||
#define __CRAMFS_H
|
||||
|
||||
#include <uapi/linux/cramfs_fs.h>
|
||||
|
||||
/* Uncompression interfaces to the underlying zlib */
|
||||
int cramfs_uncompress_block(void *dst, int dstlen, void *src, int srclen);
|
||||
int cramfs_uncompress_init(void);
|
||||
void cramfs_uncompress_exit(void);
|
||||
#endif
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
#ifndef _CRAMFS_FS_SB
|
||||
#define _CRAMFS_FS_SB
|
||||
|
||||
/*
|
||||
* cramfs super-block data in memory
|
||||
*/
|
||||
struct cramfs_sb_info {
|
||||
unsigned long magic;
|
||||
unsigned long size;
|
||||
unsigned long blocks;
|
||||
unsigned long files;
|
||||
unsigned long flags;
|
||||
};
|
||||
|
||||
static inline struct cramfs_sb_info *CRAMFS_SB(struct super_block *sb)
|
||||
{
|
||||
return sb->s_fs_info;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -19,11 +19,12 @@
|
|||
|
||||
#define CRUSH_MAGIC 0x00010000ul /* for detecting algorithm revisions */
|
||||
|
||||
|
||||
#define CRUSH_MAX_DEPTH 10 /* max crush hierarchy depth */
|
||||
#define CRUSH_MAX_SET 10 /* max size of a mapping result */
|
||||
|
||||
|
||||
#define CRUSH_ITEM_UNDEF 0x7ffffffe /* undefined result (internal use only) */
|
||||
#define CRUSH_ITEM_NONE 0x7fffffff /* no result */
|
||||
|
||||
/*
|
||||
* CRUSH uses user-defined "rules" to describe how inputs should be
|
||||
* mapped to devices. A rule consists of sequence of steps to perform
|
||||
|
|
@ -43,8 +44,13 @@ enum {
|
|||
/* arg2 = type */
|
||||
CRUSH_RULE_CHOOSE_INDEP = 3, /* same */
|
||||
CRUSH_RULE_EMIT = 4, /* no args */
|
||||
CRUSH_RULE_CHOOSE_LEAF_FIRSTN = 6,
|
||||
CRUSH_RULE_CHOOSE_LEAF_INDEP = 7,
|
||||
CRUSH_RULE_CHOOSELEAF_FIRSTN = 6,
|
||||
CRUSH_RULE_CHOOSELEAF_INDEP = 7,
|
||||
|
||||
CRUSH_RULE_SET_CHOOSE_TRIES = 8, /* override choose_total_tries */
|
||||
CRUSH_RULE_SET_CHOOSELEAF_TRIES = 9, /* override chooseleaf_descend_once */
|
||||
CRUSH_RULE_SET_CHOOSE_LOCAL_TRIES = 10,
|
||||
CRUSH_RULE_SET_CHOOSE_LOCAL_FALLBACK_TRIES = 11,
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -162,7 +168,10 @@ struct crush_map {
|
|||
__u32 choose_local_fallback_tries;
|
||||
/* choose attempts before giving up */
|
||||
__u32 choose_total_tries;
|
||||
/* attempt chooseleaf inner descent once; on failure retry outer descent */
|
||||
/* attempt chooseleaf inner descent once for firstn mode; on
|
||||
* reject retry outer descent. Note that this does *not*
|
||||
* apply to a collision: in that case we will retry as we used
|
||||
* to. */
|
||||
__u32 chooseleaf_descend_once;
|
||||
};
|
||||
|
||||
|
|
@ -174,6 +183,7 @@ extern void crush_destroy_bucket_list(struct crush_bucket_list *b);
|
|||
extern void crush_destroy_bucket_tree(struct crush_bucket_tree *b);
|
||||
extern void crush_destroy_bucket_straw(struct crush_bucket_straw *b);
|
||||
extern void crush_destroy_bucket(struct crush_bucket *b);
|
||||
extern void crush_destroy_rule(struct crush_rule *r);
|
||||
extern void crush_destroy(struct crush_map *map);
|
||||
|
||||
static inline int crush_calc_tree_node(int i)
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ extern int crush_find_rule(const struct crush_map *map, int ruleset, int type, i
|
|||
extern int crush_do_rule(const struct crush_map *map,
|
||||
int ruleno,
|
||||
int x, int *result, int result_max,
|
||||
const __u32 *weights);
|
||||
const __u32 *weights, int weight_max,
|
||||
int *scratch);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ typedef void (*io_notify_fn)(unsigned long error, void *context);
|
|||
|
||||
enum dm_io_mem_type {
|
||||
DM_IO_PAGE_LIST,/* Page list */
|
||||
DM_IO_BVEC, /* Bio vector */
|
||||
DM_IO_BIO, /* Bio vector */
|
||||
DM_IO_VMA, /* Virtual memory area */
|
||||
DM_IO_KMEM, /* Kernel memory */
|
||||
};
|
||||
|
|
@ -41,7 +41,7 @@ struct dm_io_memory {
|
|||
|
||||
union {
|
||||
struct page_list *pl;
|
||||
struct bio_vec *bvec;
|
||||
struct bio *bio;
|
||||
void *vma;
|
||||
void *addr;
|
||||
} ptr;
|
||||
|
|
|
|||
|
|
@ -85,6 +85,8 @@ extern void debug_dma_sync_sg_for_device(struct device *dev,
|
|||
|
||||
extern void debug_dma_dump_mappings(struct device *dev);
|
||||
|
||||
extern void debug_dma_assert_idle(struct page *page);
|
||||
|
||||
#else /* CONFIG_DMA_API_DEBUG */
|
||||
|
||||
static inline void dma_debug_add_bus(struct bus_type *bus)
|
||||
|
|
@ -183,6 +185,10 @@ static inline void debug_dma_dump_mappings(struct device *dev)
|
|||
{
|
||||
}
|
||||
|
||||
static inline void debug_dma_assert_idle(struct page *page)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* CONFIG_DMA_API_DEBUG */
|
||||
|
||||
#endif /* __DMA_DEBUG_H */
|
||||
|
|
|
|||
|
|
@ -27,7 +27,6 @@ struct root_entry;
|
|||
|
||||
|
||||
#ifdef CONFIG_INTEL_IOMMU
|
||||
extern void free_dmar_iommu(struct intel_iommu *iommu);
|
||||
extern int iommu_calculate_agaw(struct intel_iommu *iommu);
|
||||
extern int iommu_calculate_max_sagaw(struct intel_iommu *iommu);
|
||||
extern int dmar_disabled;
|
||||
|
|
@ -41,9 +40,6 @@ static inline int iommu_calculate_max_sagaw(struct intel_iommu *iommu)
|
|||
{
|
||||
return 0;
|
||||
}
|
||||
static inline void free_dmar_iommu(struct intel_iommu *iommu)
|
||||
{
|
||||
}
|
||||
#define dmar_disabled (1)
|
||||
#define intel_iommu_enabled (0)
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@
|
|||
#define LINUX_DMAENGINE_H
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/uio.h>
|
||||
#include <linux/bug.h>
|
||||
#include <linux/scatterlist.h>
|
||||
|
|
@ -256,7 +257,7 @@ struct dma_chan_percpu {
|
|||
* @dev: class device for sysfs
|
||||
* @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
|
||||
* @client_count: how many clients are using this channel
|
||||
* @table_count: number of appearances in the mem-to-mem allocation table
|
||||
* @private: private data for certain client-channel associations
|
||||
*/
|
||||
|
|
@ -278,10 +279,10 @@ struct dma_chan {
|
|||
|
||||
/**
|
||||
* struct dma_chan_dev - relate sysfs device node to backing channel device
|
||||
* @chan - driver channel device
|
||||
* @device - sysfs device
|
||||
* @dev_id - parent dma_device dev_id
|
||||
* @idr_ref - reference count to gate release of dma_device dev_id
|
||||
* @chan: driver channel device
|
||||
* @device: sysfs device
|
||||
* @dev_id: parent dma_device dev_id
|
||||
* @idr_ref: reference count to gate release of dma_device dev_id
|
||||
*/
|
||||
struct dma_chan_dev {
|
||||
struct dma_chan *chan;
|
||||
|
|
@ -305,9 +306,8 @@ enum dma_slave_buswidth {
|
|||
/**
|
||||
* struct dma_slave_config - dma slave channel runtime config
|
||||
* @direction: whether the data shall go in or out on this slave
|
||||
* channel, right now. DMA_TO_DEVICE and DMA_FROM_DEVICE are
|
||||
* legal values, DMA_BIDIRECTIONAL is not acceptable since we
|
||||
* need to differentiate source and target addresses.
|
||||
* channel, right now. DMA_MEM_TO_DEV and DMA_DEV_TO_MEM are
|
||||
* legal values.
|
||||
* @src_addr: this is the physical address where DMA slave data
|
||||
* should be read (RX), if the source is memory this argument is
|
||||
* ignored.
|
||||
|
|
@ -363,6 +363,32 @@ struct dma_slave_config {
|
|||
unsigned int slave_id;
|
||||
};
|
||||
|
||||
/**
|
||||
* enum dma_residue_granularity - Granularity of the reported transfer residue
|
||||
* @DMA_RESIDUE_GRANULARITY_DESCRIPTOR: Residue reporting is not support. The
|
||||
* DMA channel is only able to tell whether a descriptor has been completed or
|
||||
* not, which means residue reporting is not supported by this channel. The
|
||||
* residue field of the dma_tx_state field will always be 0.
|
||||
* @DMA_RESIDUE_GRANULARITY_SEGMENT: Residue is updated after each successfully
|
||||
* completed segment of the transfer (For cyclic transfers this is after each
|
||||
* period). This is typically implemented by having the hardware generate an
|
||||
* interrupt after each transferred segment and then the drivers updates the
|
||||
* outstanding residue by the size of the segment. Another possibility is if
|
||||
* the hardware supports scatter-gather and the segment descriptor has a field
|
||||
* which gets set after the segment has been completed. The driver then counts
|
||||
* the number of segments without the flag set to compute the residue.
|
||||
* @DMA_RESIDUE_GRANULARITY_BURST: Residue is updated after each transferred
|
||||
* burst. This is typically only supported if the hardware has a progress
|
||||
* register of some sort (E.g. a register with the current read/write address
|
||||
* or a register with the amount of bursts/beats/bytes that have been
|
||||
* transferred or still need to be transferred).
|
||||
*/
|
||||
enum dma_residue_granularity {
|
||||
DMA_RESIDUE_GRANULARITY_DESCRIPTOR = 0,
|
||||
DMA_RESIDUE_GRANULARITY_SEGMENT = 1,
|
||||
DMA_RESIDUE_GRANULARITY_BURST = 2,
|
||||
};
|
||||
|
||||
/* struct dma_slave_caps - expose capabilities of a slave channel only
|
||||
*
|
||||
* @src_addr_widths: bit mask of src addr widths the channel supports
|
||||
|
|
@ -373,6 +399,7 @@ struct dma_slave_config {
|
|||
* should be checked by controller as well
|
||||
* @cmd_pause: true, if pause and thereby resume is supported
|
||||
* @cmd_terminate: true, if terminate cmd is supported
|
||||
* @residue_granularity: granularity of the reported transfer residue
|
||||
*/
|
||||
struct dma_slave_caps {
|
||||
u32 src_addr_widths;
|
||||
|
|
@ -380,6 +407,7 @@ struct dma_slave_caps {
|
|||
u32 directions;
|
||||
bool cmd_pause;
|
||||
bool cmd_terminate;
|
||||
enum dma_residue_granularity residue_granularity;
|
||||
};
|
||||
|
||||
static inline const char *dma_chan_name(struct dma_chan *chan)
|
||||
|
|
@ -1040,6 +1068,8 @@ enum dma_status dma_wait_for_async_tx(struct dma_async_tx_descriptor *tx);
|
|||
void dma_issue_pending_all(void);
|
||||
struct dma_chan *__dma_request_channel(const dma_cap_mask_t *mask,
|
||||
dma_filter_fn fn, void *fn_param);
|
||||
struct dma_chan *dma_request_slave_channel_reason(struct device *dev,
|
||||
const char *name);
|
||||
struct dma_chan *dma_request_slave_channel(struct device *dev, const char *name);
|
||||
void dma_release_channel(struct dma_chan *chan);
|
||||
#else
|
||||
|
|
@ -1063,6 +1093,11 @@ static inline struct dma_chan *__dma_request_channel(const dma_cap_mask_t *mask,
|
|||
{
|
||||
return NULL;
|
||||
}
|
||||
static inline struct dma_chan *dma_request_slave_channel_reason(
|
||||
struct device *dev, const char *name)
|
||||
{
|
||||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
static inline struct dma_chan *dma_request_slave_channel(struct device *dev,
|
||||
const char *name)
|
||||
{
|
||||
|
|
@ -1079,6 +1114,7 @@ int dma_async_device_register(struct dma_device *device);
|
|||
void dma_async_device_unregister(struct dma_device *device);
|
||||
void dma_run_dependencies(struct dma_async_tx_descriptor *tx);
|
||||
struct dma_chan *dma_get_slave_channel(struct dma_chan *chan);
|
||||
struct dma_chan *dma_get_any_slave_channel(struct dma_device *device);
|
||||
struct dma_chan *net_dma_find_channel(void);
|
||||
#define dma_request_channel(mask, x, y) __dma_request_channel(&(mask), x, y)
|
||||
#define dma_request_slave_channel_compat(mask, x, y, dev, name) \
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ struct acpi_dmar_header;
|
|||
#define DMAR_X2APIC_OPT_OUT 0x2
|
||||
|
||||
struct intel_iommu;
|
||||
|
||||
#ifdef CONFIG_DMAR_TABLE
|
||||
extern struct acpi_table_header *dmar_tbl;
|
||||
struct dmar_drhd_unit {
|
||||
|
|
@ -52,6 +53,10 @@ extern struct list_head dmar_drhd_units;
|
|||
#define for_each_drhd_unit(drhd) \
|
||||
list_for_each_entry(drhd, &dmar_drhd_units, list)
|
||||
|
||||
#define for_each_active_drhd_unit(drhd) \
|
||||
list_for_each_entry(drhd, &dmar_drhd_units, list) \
|
||||
if (drhd->ignored) {} else
|
||||
|
||||
#define for_each_active_iommu(i, drhd) \
|
||||
list_for_each_entry(drhd, &dmar_drhd_units, list) \
|
||||
if (i=drhd->iommu, drhd->ignored) {} else
|
||||
|
|
@ -62,13 +67,13 @@ extern struct list_head dmar_drhd_units;
|
|||
|
||||
extern int dmar_table_init(void);
|
||||
extern int dmar_dev_scope_init(void);
|
||||
extern int dmar_parse_dev_scope(void *start, void *end, int *cnt,
|
||||
struct pci_dev ***devices, u16 segment);
|
||||
extern void dmar_free_dev_scope(struct pci_dev ***devices, int *cnt);
|
||||
|
||||
/* Intel IOMMU detection */
|
||||
extern int detect_intel_iommu(void);
|
||||
extern int enable_drhd_fault_handling(void);
|
||||
|
||||
extern int parse_ioapics_under_ir(void);
|
||||
extern int alloc_iommu(struct dmar_drhd_unit *);
|
||||
#else
|
||||
static inline int detect_intel_iommu(void)
|
||||
{
|
||||
|
|
@ -157,8 +162,6 @@ struct dmar_atsr_unit {
|
|||
int dmar_parse_rmrr_atsr_dev(void);
|
||||
extern int dmar_parse_one_rmrr(struct acpi_dmar_header *header);
|
||||
extern int dmar_parse_one_atsr(struct acpi_dmar_header *header);
|
||||
extern int dmar_parse_dev_scope(void *start, void *end, int *cnt,
|
||||
struct pci_dev ***devices, u16 segment);
|
||||
extern int intel_iommu_init(void);
|
||||
#else /* !CONFIG_INTEL_IOMMU: */
|
||||
static inline int intel_iommu_init(void) { return -ENODEV; }
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@
|
|||
#include <linux/netdevice.h>
|
||||
#include <linux/random.h>
|
||||
#include <asm/unaligned.h>
|
||||
#include <asm/bitsperlong.h>
|
||||
|
||||
#ifdef __KERNEL__
|
||||
__be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev);
|
||||
|
|
@ -60,6 +61,8 @@ static const u8 eth_reserved_addr_base[ETH_ALEN] __aligned(2) =
|
|||
*
|
||||
* Return true if address is link local reserved addr (01:80:c2:00:00:0X) per
|
||||
* IEEE 802.1Q 8.6.3 Frame filtering.
|
||||
*
|
||||
* Please note: addr must be aligned to u16.
|
||||
*/
|
||||
static inline bool is_link_local_ether_addr(const u8 *addr)
|
||||
{
|
||||
|
|
@ -67,7 +70,12 @@ static inline bool is_link_local_ether_addr(const u8 *addr)
|
|||
static const __be16 *b = (const __be16 *)eth_reserved_addr_base;
|
||||
static const __be16 m = cpu_to_be16(0xfff0);
|
||||
|
||||
#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)
|
||||
return (((*(const u32 *)addr) ^ (*(const u32 *)b)) |
|
||||
((a[2] ^ b[2]) & m)) == 0;
|
||||
#else
|
||||
return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | ((a[2] ^ b[2]) & m)) == 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -75,10 +83,18 @@ static inline bool is_link_local_ether_addr(const u8 *addr)
|
|||
* @addr: Pointer to a six-byte array containing the Ethernet address
|
||||
*
|
||||
* Return true if the address is all zeroes.
|
||||
*
|
||||
* Please note: addr must be aligned to u16.
|
||||
*/
|
||||
static inline bool is_zero_ether_addr(const u8 *addr)
|
||||
{
|
||||
return !(addr[0] | addr[1] | addr[2] | addr[3] | addr[4] | addr[5]);
|
||||
#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)
|
||||
return ((*(const u32 *)addr) | (*(const u16 *)(addr + 4))) == 0;
|
||||
#else
|
||||
return (*(const u16 *)(addr + 0) |
|
||||
*(const u16 *)(addr + 2) |
|
||||
*(const u16 *)(addr + 4)) == 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -109,10 +125,14 @@ static inline bool is_local_ether_addr(const u8 *addr)
|
|||
* @addr: Pointer to a six-byte array containing the Ethernet address
|
||||
*
|
||||
* Return true if the address is the broadcast address.
|
||||
*
|
||||
* Please note: addr must be aligned to u16.
|
||||
*/
|
||||
static inline bool is_broadcast_ether_addr(const u8 *addr)
|
||||
{
|
||||
return (addr[0] & addr[1] & addr[2] & addr[3] & addr[4] & addr[5]) == 0xff;
|
||||
return (*(const u16 *)(addr + 0) &
|
||||
*(const u16 *)(addr + 2) &
|
||||
*(const u16 *)(addr + 4)) == 0xffff;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -134,6 +154,8 @@ static inline bool is_unicast_ether_addr(const u8 *addr)
|
|||
* a multicast address, and is not FF:FF:FF:FF:FF:FF.
|
||||
*
|
||||
* Return true if the address is valid.
|
||||
*
|
||||
* Please note: addr must be aligned to u16.
|
||||
*/
|
||||
static inline bool is_valid_ether_addr(const u8 *addr)
|
||||
{
|
||||
|
|
@ -195,6 +217,28 @@ static inline void eth_hw_addr_random(struct net_device *dev)
|
|||
eth_random_addr(dev->dev_addr);
|
||||
}
|
||||
|
||||
/**
|
||||
* ether_addr_copy - Copy an Ethernet address
|
||||
* @dst: Pointer to a six-byte array Ethernet address destination
|
||||
* @src: Pointer to a six-byte array Ethernet address source
|
||||
*
|
||||
* Please note: dst & src must both be aligned to u16.
|
||||
*/
|
||||
static inline void ether_addr_copy(u8 *dst, const u8 *src)
|
||||
{
|
||||
#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)
|
||||
*(u32 *)dst = *(const u32 *)src;
|
||||
*(u16 *)(dst + 4) = *(const u16 *)(src + 4);
|
||||
#else
|
||||
u16 *a = (u16 *)dst;
|
||||
const u16 *b = (const u16 *)src;
|
||||
|
||||
a[0] = b[0];
|
||||
a[1] = b[1];
|
||||
a[2] = b[2];
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* eth_hw_addr_inherit - Copy dev_addr from another net_device
|
||||
* @dst: pointer to net_device to copy dev_addr to
|
||||
|
|
@ -207,24 +251,7 @@ static inline void eth_hw_addr_inherit(struct net_device *dst,
|
|||
struct net_device *src)
|
||||
{
|
||||
dst->addr_assign_type = src->addr_assign_type;
|
||||
memcpy(dst->dev_addr, src->dev_addr, ETH_ALEN);
|
||||
}
|
||||
|
||||
/**
|
||||
* compare_ether_addr - Compare two Ethernet addresses
|
||||
* @addr1: Pointer to a six-byte array containing the Ethernet address
|
||||
* @addr2: Pointer other six-byte array containing the Ethernet address
|
||||
*
|
||||
* Compare two Ethernet addresses, returns 0 if equal, non-zero otherwise.
|
||||
* Unlike memcmp(), it doesn't return a value suitable for sorting.
|
||||
*/
|
||||
static inline unsigned compare_ether_addr(const u8 *addr1, const u8 *addr2)
|
||||
{
|
||||
const u16 *a = (const u16 *) addr1;
|
||||
const u16 *b = (const u16 *) addr2;
|
||||
|
||||
BUILD_BUG_ON(ETH_ALEN != 6);
|
||||
return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2])) != 0;
|
||||
ether_addr_copy(dst->dev_addr, src->dev_addr);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -233,18 +260,21 @@ static inline unsigned compare_ether_addr(const u8 *addr1, const u8 *addr2)
|
|||
* @addr2: Pointer other six-byte array containing the Ethernet address
|
||||
*
|
||||
* Compare two Ethernet addresses, returns true if equal
|
||||
*
|
||||
* Please note: addr1 & addr2 must both be aligned to u16.
|
||||
*/
|
||||
static inline bool ether_addr_equal(const u8 *addr1, const u8 *addr2)
|
||||
{
|
||||
return !compare_ether_addr(addr1, addr2);
|
||||
}
|
||||
#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)
|
||||
u32 fold = ((*(const u32 *)addr1) ^ (*(const u32 *)addr2)) |
|
||||
((*(const u16 *)(addr1 + 4)) ^ (*(const u16 *)(addr2 + 4)));
|
||||
|
||||
static inline unsigned long zap_last_2bytes(unsigned long value)
|
||||
{
|
||||
#ifdef __BIG_ENDIAN
|
||||
return value >> 16;
|
||||
return fold == 0;
|
||||
#else
|
||||
return value << 16;
|
||||
const u16 *a = (const u16 *)addr1;
|
||||
const u16 *b = (const u16 *)addr2;
|
||||
|
||||
return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2])) == 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
@ -265,21 +295,37 @@ static inline unsigned long zap_last_2bytes(unsigned long value)
|
|||
static inline bool ether_addr_equal_64bits(const u8 addr1[6+2],
|
||||
const u8 addr2[6+2])
|
||||
{
|
||||
#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
|
||||
unsigned long fold = ((*(unsigned long *)addr1) ^
|
||||
(*(unsigned long *)addr2));
|
||||
#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
|
||||
u64 fold = (*(const u64 *)addr1) ^ (*(const u64 *)addr2);
|
||||
|
||||
if (sizeof(fold) == 8)
|
||||
return zap_last_2bytes(fold) == 0;
|
||||
|
||||
fold |= zap_last_2bytes((*(unsigned long *)(addr1 + 4)) ^
|
||||
(*(unsigned long *)(addr2 + 4)));
|
||||
return fold == 0;
|
||||
#ifdef __BIG_ENDIAN
|
||||
return (fold >> 16) == 0;
|
||||
#else
|
||||
return (fold << 16) == 0;
|
||||
#endif
|
||||
#else
|
||||
return ether_addr_equal(addr1, addr2);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* ether_addr_equal_unaligned - Compare two not u16 aligned Ethernet addresses
|
||||
* @addr1: Pointer to a six-byte array containing the Ethernet address
|
||||
* @addr2: Pointer other six-byte array containing the Ethernet address
|
||||
*
|
||||
* Compare two Ethernet addresses, returns true if equal
|
||||
*
|
||||
* Please note: Use only when any Ethernet address may not be u16 aligned.
|
||||
*/
|
||||
static inline bool ether_addr_equal_unaligned(const u8 *addr1, const u8 *addr2)
|
||||
{
|
||||
#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)
|
||||
return ether_addr_equal(addr1, addr2);
|
||||
#else
|
||||
return memcmp(addr1, addr2, ETH_ALEN) == 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* is_etherdev_addr - Tell if given Ethernet address belongs to the device.
|
||||
* @dev: Pointer to a device structure
|
||||
|
|
|
|||
|
|
@ -59,6 +59,7 @@ extern struct module __this_module;
|
|||
static const char __kstrtab_##sym[] \
|
||||
__attribute__((section("__ksymtab_strings"), aligned(1))) \
|
||||
= VMLINUX_SYMBOL_STR(sym); \
|
||||
extern const struct kernel_symbol __ksymtab_##sym; \
|
||||
__visible const struct kernel_symbol __ksymtab_##sym \
|
||||
__used \
|
||||
__attribute__((section("___ksymtab" sec "+" #sym), unused)) \
|
||||
|
|
|
|||
|
|
@ -51,6 +51,7 @@ struct gpio_extcon_platform_data {
|
|||
/* if NULL, "0" or "1" will be printed */
|
||||
const char *state_on;
|
||||
const char *state_off;
|
||||
bool check_on_resume;
|
||||
};
|
||||
|
||||
#endif /* __EXTCON_GPIO_H__ */
|
||||
|
|
|
|||
|
|
@ -153,6 +153,13 @@ struct f2fs_extent {
|
|||
#define NODE_DIND_BLOCK (DEF_ADDRS_PER_INODE + 5)
|
||||
|
||||
#define F2FS_INLINE_XATTR 0x01 /* file inline xattr flag */
|
||||
#define F2FS_INLINE_DATA 0x02 /* file inline data flag */
|
||||
|
||||
#define MAX_INLINE_DATA (sizeof(__le32) * (DEF_ADDRS_PER_INODE - \
|
||||
F2FS_INLINE_XATTR_ADDRS - 1))
|
||||
|
||||
#define INLINE_DATA_OFFSET (PAGE_CACHE_SIZE - sizeof(struct node_footer) \
|
||||
- sizeof(__le32) * (DEF_ADDRS_PER_INODE + 5 - 1))
|
||||
|
||||
struct f2fs_inode {
|
||||
__le16 i_mode; /* file mode */
|
||||
|
|
|
|||
|
|
@ -613,8 +613,8 @@ extern ssize_t fb_sys_write(struct fb_info *info, const char __user *buf,
|
|||
extern int register_framebuffer(struct fb_info *fb_info);
|
||||
extern int unregister_framebuffer(struct fb_info *fb_info);
|
||||
extern int unlink_framebuffer(struct fb_info *fb_info);
|
||||
extern void remove_conflicting_framebuffers(struct apertures_struct *a,
|
||||
const char *name, bool primary);
|
||||
extern int remove_conflicting_framebuffers(struct apertures_struct *a,
|
||||
const char *name, bool primary);
|
||||
extern int fb_prepare_logo(struct fb_info *fb_info, int rotate);
|
||||
extern int fb_show_logo(struct fb_info *fb_info, int rotate);
|
||||
extern char* fb_get_buffer_offset(struct fb_info *info, struct fb_pixmap *buf, u32 size);
|
||||
|
|
|
|||
|
|
@ -59,29 +59,36 @@ struct files_struct {
|
|||
struct file __rcu * fd_array[NR_OPEN_DEFAULT];
|
||||
};
|
||||
|
||||
#define rcu_dereference_check_fdtable(files, fdtfd) \
|
||||
(rcu_dereference_check((fdtfd), \
|
||||
lockdep_is_held(&(files)->file_lock) || \
|
||||
atomic_read(&(files)->count) == 1 || \
|
||||
rcu_my_thread_group_empty()))
|
||||
|
||||
#define files_fdtable(files) \
|
||||
(rcu_dereference_check_fdtable((files), (files)->fdt))
|
||||
|
||||
struct file_operations;
|
||||
struct vfsmount;
|
||||
struct dentry;
|
||||
|
||||
extern void __init files_defer_init(void);
|
||||
|
||||
static inline struct file * fcheck_files(struct files_struct *files, unsigned int fd)
|
||||
#define rcu_dereference_check_fdtable(files, fdtfd) \
|
||||
rcu_dereference_check((fdtfd), lockdep_is_held(&(files)->file_lock))
|
||||
|
||||
#define files_fdtable(files) \
|
||||
rcu_dereference_check_fdtable((files), (files)->fdt)
|
||||
|
||||
/*
|
||||
* The caller must ensure that fd table isn't shared or hold rcu or file lock
|
||||
*/
|
||||
static inline struct file *__fcheck_files(struct files_struct *files, unsigned int fd)
|
||||
{
|
||||
struct file * file = NULL;
|
||||
struct fdtable *fdt = files_fdtable(files);
|
||||
struct fdtable *fdt = rcu_dereference_raw(files->fdt);
|
||||
|
||||
if (fd < fdt->max_fds)
|
||||
file = rcu_dereference_check_fdtable(files, fdt->fd[fd]);
|
||||
return file;
|
||||
return rcu_dereference_raw(fdt->fd[fd]);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline struct file *fcheck_files(struct files_struct *files, unsigned int fd)
|
||||
{
|
||||
rcu_lockdep_assert(rcu_read_lock_held() ||
|
||||
lockdep_is_held(&files->file_lock),
|
||||
"suspicious rcu_dereference_check() usage");
|
||||
return __fcheck_files(files, fd);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -83,6 +83,11 @@ static inline void bpf_jit_free(struct sk_filter *fp)
|
|||
#define SK_RUN_FILTER(FILTER, SKB) sk_run_filter(SKB, FILTER->insns)
|
||||
#endif
|
||||
|
||||
static inline int bpf_tell_extensions(void)
|
||||
{
|
||||
return SKF_AD_MAX;
|
||||
}
|
||||
|
||||
enum {
|
||||
BPF_S_RET_K = 1,
|
||||
BPF_S_RET_A,
|
||||
|
|
|
|||
|
|
@ -68,4 +68,11 @@ static inline void release_firmware(const struct firmware *fw)
|
|||
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_FW_LOADER_USER_HELPER
|
||||
int request_firmware_direct(const struct firmware **fw, const char *name,
|
||||
struct device *device);
|
||||
#else
|
||||
#define request_firmware_direct request_firmware
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
#define _FLEX_ARRAY_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/reciprocal_div.h>
|
||||
#include <asm/page.h>
|
||||
|
||||
#define FLEX_ARRAY_PART_SIZE PAGE_SIZE
|
||||
|
|
@ -22,7 +23,7 @@ struct flex_array {
|
|||
int element_size;
|
||||
int total_nr_elements;
|
||||
int elems_per_part;
|
||||
u32 reciprocal_elems;
|
||||
struct reciprocal_value reciprocal_elems;
|
||||
struct flex_array_part *parts[];
|
||||
};
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -1580,6 +1580,7 @@ struct inode_operations {
|
|||
struct file *, unsigned open_flag,
|
||||
umode_t create_mode, int *opened);
|
||||
int (*tmpfile) (struct inode *, struct dentry *, umode_t);
|
||||
int (*set_acl)(struct inode *, struct posix_acl *, int);
|
||||
} ____cacheline_aligned;
|
||||
|
||||
ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector,
|
||||
|
|
|
|||
|
|
@ -15,7 +15,6 @@
|
|||
#include <linux/path.h> /* struct path */
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#include <linux/atomic.h>
|
||||
|
||||
/*
|
||||
|
|
@ -79,6 +78,7 @@ struct fsnotify_group;
|
|||
struct fsnotify_event;
|
||||
struct fsnotify_mark;
|
||||
struct fsnotify_event_private_data;
|
||||
struct fsnotify_fname;
|
||||
|
||||
/*
|
||||
* Each group much define these ops. The fsnotify infrastructure will call
|
||||
|
|
@ -94,17 +94,27 @@ struct fsnotify_event_private_data;
|
|||
* userspace messages that marks have been removed.
|
||||
*/
|
||||
struct fsnotify_ops {
|
||||
bool (*should_send_event)(struct fsnotify_group *group, struct inode *inode,
|
||||
struct fsnotify_mark *inode_mark,
|
||||
struct fsnotify_mark *vfsmount_mark,
|
||||
__u32 mask, void *data, int data_type);
|
||||
int (*handle_event)(struct fsnotify_group *group,
|
||||
struct inode *inode,
|
||||
struct fsnotify_mark *inode_mark,
|
||||
struct fsnotify_mark *vfsmount_mark,
|
||||
struct fsnotify_event *event);
|
||||
u32 mask, void *data, int data_type,
|
||||
const unsigned char *file_name);
|
||||
void (*free_group_priv)(struct fsnotify_group *group);
|
||||
void (*freeing_mark)(struct fsnotify_mark *mark, struct fsnotify_group *group);
|
||||
void (*free_event_priv)(struct fsnotify_event_private_data *priv);
|
||||
void (*free_event)(struct fsnotify_event *event);
|
||||
};
|
||||
|
||||
/*
|
||||
* all of the information about the original object we want to now send to
|
||||
* a group. If you want to carry more info from the accessing task to the
|
||||
* listener this structure is where you need to be adding fields.
|
||||
*/
|
||||
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 */
|
||||
u32 mask; /* the type of access, bitwise OR for FS_* event types */
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -148,7 +158,11 @@ struct fsnotify_group {
|
|||
* a group */
|
||||
struct list_head marks_list; /* all inode marks for this group */
|
||||
|
||||
struct fasync_struct *fsn_fa; /* async notification */
|
||||
struct fasync_struct *fsn_fa; /* async notification */
|
||||
|
||||
struct fsnotify_event overflow_event; /* Event we queue when the
|
||||
* notification list is too
|
||||
* full */
|
||||
|
||||
/* groups can define private fields here or use the void *private */
|
||||
union {
|
||||
|
|
@ -177,76 +191,10 @@ struct fsnotify_group {
|
|||
};
|
||||
};
|
||||
|
||||
/*
|
||||
* A single event can be queued in multiple group->notification_lists.
|
||||
*
|
||||
* each group->notification_list will point to an event_holder which in turns points
|
||||
* to the actual event that needs to be sent to userspace.
|
||||
*
|
||||
* Seemed cheaper to create a refcnt'd event and a small holder for every group
|
||||
* than create a different event for every group
|
||||
*
|
||||
*/
|
||||
struct fsnotify_event_holder {
|
||||
struct fsnotify_event *event;
|
||||
struct list_head event_list;
|
||||
};
|
||||
|
||||
/*
|
||||
* Inotify needs to tack data onto an event. This struct lets us later find the
|
||||
* correct private data of the correct group.
|
||||
*/
|
||||
struct fsnotify_event_private_data {
|
||||
struct fsnotify_group *group;
|
||||
struct list_head event_list;
|
||||
};
|
||||
|
||||
/*
|
||||
* all of the information about the original object we want to now send to
|
||||
* a group. If you want to carry more info from the accessing task to the
|
||||
* listener this structure is where you need to be adding fields.
|
||||
*/
|
||||
struct fsnotify_event {
|
||||
/*
|
||||
* If we create an event we are also likely going to need a holder
|
||||
* to link to a group. So embed one holder in the event. Means only
|
||||
* one allocation for the common case where we only have one group
|
||||
*/
|
||||
struct fsnotify_event_holder holder;
|
||||
spinlock_t lock; /* protection for the associated event_holder and private_list */
|
||||
/* to_tell may ONLY be dereferenced during handle_event(). */
|
||||
struct inode *to_tell; /* either the inode the event happened to or its parent */
|
||||
/*
|
||||
* depending on the event type we should have either a path or inode
|
||||
* We hold a reference on path, but NOT on inode. Since we have the ref on
|
||||
* the path, it may be dereferenced at any point during this object's
|
||||
* lifetime. That reference is dropped when this object's refcnt hits
|
||||
* 0. If this event contains an inode instead of a path, the inode may
|
||||
* ONLY be used during handle_event().
|
||||
*/
|
||||
union {
|
||||
struct path path;
|
||||
struct inode *inode;
|
||||
};
|
||||
/* 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
|
||||
int data_type; /* which of the above union we have */
|
||||
atomic_t refcnt; /* how many groups still are using/need to send this event */
|
||||
__u32 mask; /* the type of access, bitwise OR for FS_* event types */
|
||||
|
||||
u32 sync_cookie; /* used to corrolate events, namely inotify mv events */
|
||||
const unsigned char *file_name;
|
||||
size_t name_len;
|
||||
struct pid *tgid;
|
||||
|
||||
#ifdef CONFIG_FANOTIFY_ACCESS_PERMISSIONS
|
||||
__u32 response; /* userspace answer to question */
|
||||
#endif /* CONFIG_FANOTIFY_ACCESS_PERMISSIONS */
|
||||
|
||||
struct list_head private_data_list; /* groups can store private data here */
|
||||
};
|
||||
|
||||
/*
|
||||
* Inode specific fields in an fsnotify_mark
|
||||
|
|
@ -370,19 +318,14 @@ extern void fsnotify_put_group(struct fsnotify_group *group);
|
|||
extern void fsnotify_destroy_group(struct fsnotify_group *group);
|
||||
/* fasync handler function */
|
||||
extern int fsnotify_fasync(int fd, struct file *file, int on);
|
||||
/* take a reference to an event */
|
||||
extern void fsnotify_get_event(struct fsnotify_event *event);
|
||||
extern void fsnotify_put_event(struct fsnotify_event *event);
|
||||
/* find private data previously attached to an event and unlink it */
|
||||
extern struct fsnotify_event_private_data *fsnotify_remove_priv_from_event(struct fsnotify_group *group,
|
||||
struct fsnotify_event *event);
|
||||
|
||||
/* Free event from memory */
|
||||
extern void fsnotify_destroy_event(struct fsnotify_group *group,
|
||||
struct fsnotify_event *event);
|
||||
/* attach the event to the group notification queue */
|
||||
extern struct fsnotify_event *fsnotify_add_notify_event(struct fsnotify_group *group,
|
||||
struct fsnotify_event *event,
|
||||
struct fsnotify_event_private_data *priv,
|
||||
struct fsnotify_event *(*merge)(struct list_head *,
|
||||
struct fsnotify_event *));
|
||||
extern int fsnotify_add_notify_event(struct fsnotify_group *group,
|
||||
struct fsnotify_event *event,
|
||||
int (*merge)(struct list_head *,
|
||||
struct fsnotify_event *));
|
||||
/* true if the group notification queue is empty */
|
||||
extern bool fsnotify_notify_queue_is_empty(struct fsnotify_group *group);
|
||||
/* return, but do not dequeue the first event on the notification queue */
|
||||
|
|
@ -430,15 +373,8 @@ extern void fsnotify_put_mark(struct fsnotify_mark *mark);
|
|||
extern void fsnotify_unmount_inodes(struct list_head *list);
|
||||
|
||||
/* put here because inotify does some weird stuff when destroying watches */
|
||||
extern struct fsnotify_event *fsnotify_create_event(struct inode *to_tell, __u32 mask,
|
||||
void *data, int data_is,
|
||||
const unsigned char *name,
|
||||
u32 cookie, gfp_t gfp);
|
||||
|
||||
/* fanotify likes to change events after they are on lists... */
|
||||
extern struct fsnotify_event *fsnotify_clone_event(struct fsnotify_event *old_event);
|
||||
extern int fsnotify_replace_event(struct fsnotify_event_holder *old_holder,
|
||||
struct fsnotify_event *new_event);
|
||||
extern void fsnotify_init_event(struct fsnotify_event *event,
|
||||
struct inode *to_tell, u32 mask);
|
||||
|
||||
#else
|
||||
|
||||
|
|
|
|||
|
|
@ -570,8 +570,6 @@ static inline int
|
|||
ftrace_regex_release(struct inode *inode, struct file *file) { return -ENODEV; }
|
||||
#endif /* CONFIG_DYNAMIC_FTRACE */
|
||||
|
||||
loff_t ftrace_filter_lseek(struct file *file, loff_t offset, int whence);
|
||||
|
||||
/* totally disable ftrace - can not re-enable after this */
|
||||
void ftrace_kill(void);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
|
||||
#ifndef _LINUX_FTRACE_EVENT_H
|
||||
#define _LINUX_FTRACE_EVENT_H
|
||||
|
||||
|
|
@ -264,6 +265,8 @@ enum {
|
|||
FTRACE_EVENT_FL_NO_SET_FILTER_BIT,
|
||||
FTRACE_EVENT_FL_SOFT_MODE_BIT,
|
||||
FTRACE_EVENT_FL_SOFT_DISABLED_BIT,
|
||||
FTRACE_EVENT_FL_TRIGGER_MODE_BIT,
|
||||
FTRACE_EVENT_FL_TRIGGER_COND_BIT,
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -275,6 +278,8 @@ enum {
|
|||
* SOFT_MODE - The event is enabled/disabled by SOFT_DISABLED
|
||||
* SOFT_DISABLED - When set, do not trace the event (even though its
|
||||
* tracepoint may be enabled)
|
||||
* TRIGGER_MODE - When set, invoke the triggers associated with the event
|
||||
* TRIGGER_COND - When set, one or more triggers has an associated filter
|
||||
*/
|
||||
enum {
|
||||
FTRACE_EVENT_FL_ENABLED = (1 << FTRACE_EVENT_FL_ENABLED_BIT),
|
||||
|
|
@ -283,6 +288,8 @@ enum {
|
|||
FTRACE_EVENT_FL_NO_SET_FILTER = (1 << FTRACE_EVENT_FL_NO_SET_FILTER_BIT),
|
||||
FTRACE_EVENT_FL_SOFT_MODE = (1 << FTRACE_EVENT_FL_SOFT_MODE_BIT),
|
||||
FTRACE_EVENT_FL_SOFT_DISABLED = (1 << FTRACE_EVENT_FL_SOFT_DISABLED_BIT),
|
||||
FTRACE_EVENT_FL_TRIGGER_MODE = (1 << FTRACE_EVENT_FL_TRIGGER_MODE_BIT),
|
||||
FTRACE_EVENT_FL_TRIGGER_COND = (1 << FTRACE_EVENT_FL_TRIGGER_COND_BIT),
|
||||
};
|
||||
|
||||
struct ftrace_event_file {
|
||||
|
|
@ -292,6 +299,7 @@ struct ftrace_event_file {
|
|||
struct dentry *dir;
|
||||
struct trace_array *tr;
|
||||
struct ftrace_subsystem_dir *system;
|
||||
struct list_head triggers;
|
||||
|
||||
/*
|
||||
* 32 bit flags:
|
||||
|
|
@ -299,6 +307,7 @@ struct ftrace_event_file {
|
|||
* bit 1: enabled cmd record
|
||||
* bit 2: enable/disable with the soft disable bit
|
||||
* bit 3: soft disabled
|
||||
* bit 4: trigger enabled
|
||||
*
|
||||
* Note: The bits must be set atomically to prevent races
|
||||
* from other writers. Reads of flags do not need to be in
|
||||
|
|
@ -310,6 +319,7 @@ struct ftrace_event_file {
|
|||
*/
|
||||
unsigned long flags;
|
||||
atomic_t sm_ref; /* soft-mode reference counter */
|
||||
atomic_t tm_ref; /* trigger-mode reference counter */
|
||||
};
|
||||
|
||||
#define __TRACE_EVENT_FLAGS(name, value) \
|
||||
|
|
@ -337,6 +347,14 @@ struct ftrace_event_file {
|
|||
|
||||
#define MAX_FILTER_STR_VAL 256 /* Should handle KSYM_SYMBOL_LEN */
|
||||
|
||||
enum event_trigger_type {
|
||||
ETT_NONE = (0),
|
||||
ETT_TRACE_ONOFF = (1 << 0),
|
||||
ETT_SNAPSHOT = (1 << 1),
|
||||
ETT_STACKTRACE = (1 << 2),
|
||||
ETT_EVENT_ENABLE = (1 << 3),
|
||||
};
|
||||
|
||||
extern void destroy_preds(struct ftrace_event_file *file);
|
||||
extern void destroy_call_preds(struct ftrace_event_call *call);
|
||||
extern int filter_match_preds(struct event_filter *filter, void *rec);
|
||||
|
|
@ -347,6 +365,127 @@ extern int filter_check_discard(struct ftrace_event_file *file, void *rec,
|
|||
extern int call_filter_check_discard(struct ftrace_event_call *call, void *rec,
|
||||
struct ring_buffer *buffer,
|
||||
struct ring_buffer_event *event);
|
||||
extern enum event_trigger_type event_triggers_call(struct ftrace_event_file *file,
|
||||
void *rec);
|
||||
extern void event_triggers_post_call(struct ftrace_event_file *file,
|
||||
enum event_trigger_type tt);
|
||||
|
||||
/**
|
||||
* ftrace_trigger_soft_disabled - do triggers and test if soft disabled
|
||||
* @file: The file pointer of the event to test
|
||||
*
|
||||
* If any triggers without filters are attached to this event, they
|
||||
* will be called here. If the event is soft disabled and has no
|
||||
* triggers that require testing the fields, it will return true,
|
||||
* otherwise false.
|
||||
*/
|
||||
static inline bool
|
||||
ftrace_trigger_soft_disabled(struct ftrace_event_file *file)
|
||||
{
|
||||
unsigned long eflags = file->flags;
|
||||
|
||||
if (!(eflags & FTRACE_EVENT_FL_TRIGGER_COND)) {
|
||||
if (eflags & FTRACE_EVENT_FL_TRIGGER_MODE)
|
||||
event_triggers_call(file, NULL);
|
||||
if (eflags & FTRACE_EVENT_FL_SOFT_DISABLED)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Helper function for event_trigger_unlock_commit{_regs}().
|
||||
* If there are event triggers attached to this event that requires
|
||||
* filtering against its fields, then they wil be called as the
|
||||
* entry already holds the field information of the current event.
|
||||
*
|
||||
* It also checks if the event should be discarded or not.
|
||||
* It is to be discarded if the event is soft disabled and the
|
||||
* event was only recorded to process triggers, or if the event
|
||||
* filter is active and this event did not match the filters.
|
||||
*
|
||||
* Returns true if the event is discarded, false otherwise.
|
||||
*/
|
||||
static inline bool
|
||||
__event_trigger_test_discard(struct ftrace_event_file *file,
|
||||
struct ring_buffer *buffer,
|
||||
struct ring_buffer_event *event,
|
||||
void *entry,
|
||||
enum event_trigger_type *tt)
|
||||
{
|
||||
unsigned long eflags = file->flags;
|
||||
|
||||
if (eflags & FTRACE_EVENT_FL_TRIGGER_COND)
|
||||
*tt = event_triggers_call(file, entry);
|
||||
|
||||
if (test_bit(FTRACE_EVENT_FL_SOFT_DISABLED_BIT, &file->flags))
|
||||
ring_buffer_discard_commit(buffer, event);
|
||||
else if (!filter_check_discard(file, entry, buffer, event))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* event_trigger_unlock_commit - handle triggers and finish event commit
|
||||
* @file: The file pointer assoctiated to the event
|
||||
* @buffer: The ring buffer that the event is being written to
|
||||
* @event: The event meta data in the ring buffer
|
||||
* @entry: The event itself
|
||||
* @irq_flags: The state of the interrupts at the start of the event
|
||||
* @pc: The state of the preempt count at the start of the event.
|
||||
*
|
||||
* This is a helper function to handle triggers that require data
|
||||
* from the event itself. It also tests the event against filters and
|
||||
* if the event is soft disabled and should be discarded.
|
||||
*/
|
||||
static inline void
|
||||
event_trigger_unlock_commit(struct ftrace_event_file *file,
|
||||
struct ring_buffer *buffer,
|
||||
struct ring_buffer_event *event,
|
||||
void *entry, unsigned long irq_flags, int pc)
|
||||
{
|
||||
enum event_trigger_type tt = ETT_NONE;
|
||||
|
||||
if (!__event_trigger_test_discard(file, buffer, event, entry, &tt))
|
||||
trace_buffer_unlock_commit(buffer, event, irq_flags, pc);
|
||||
|
||||
if (tt)
|
||||
event_triggers_post_call(file, tt);
|
||||
}
|
||||
|
||||
/**
|
||||
* event_trigger_unlock_commit_regs - handle triggers and finish event commit
|
||||
* @file: The file pointer assoctiated to the event
|
||||
* @buffer: The ring buffer that the event is being written to
|
||||
* @event: The event meta data in the ring buffer
|
||||
* @entry: The event itself
|
||||
* @irq_flags: The state of the interrupts at the start of the event
|
||||
* @pc: The state of the preempt count at the start of the event.
|
||||
*
|
||||
* This is a helper function to handle triggers that require data
|
||||
* from the event itself. It also tests the event against filters and
|
||||
* if the event is soft disabled and should be discarded.
|
||||
*
|
||||
* Same as event_trigger_unlock_commit() but calls
|
||||
* trace_buffer_unlock_commit_regs() instead of trace_buffer_unlock_commit().
|
||||
*/
|
||||
static inline void
|
||||
event_trigger_unlock_commit_regs(struct ftrace_event_file *file,
|
||||
struct ring_buffer *buffer,
|
||||
struct ring_buffer_event *event,
|
||||
void *entry, unsigned long irq_flags, int pc,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
enum event_trigger_type tt = ETT_NONE;
|
||||
|
||||
if (!__event_trigger_test_discard(file, buffer, event, entry, &tt))
|
||||
trace_buffer_unlock_commit_regs(buffer, event,
|
||||
irq_flags, pc, regs);
|
||||
|
||||
if (tt)
|
||||
event_triggers_post_call(file, tt);
|
||||
}
|
||||
|
||||
enum {
|
||||
FILTER_OTHER = 0,
|
||||
|
|
|
|||
|
|
@ -30,6 +30,8 @@
|
|||
#ifndef __GENALLOC_H__
|
||||
#define __GENALLOC_H__
|
||||
|
||||
#include <linux/spinlock_types.h>
|
||||
|
||||
struct device;
|
||||
struct device_node;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,14 +0,0 @@
|
|||
#ifndef LINUX_GENERIC_ACL_H
|
||||
#define LINUX_GENERIC_ACL_H
|
||||
|
||||
#include <linux/xattr.h>
|
||||
|
||||
struct inode;
|
||||
|
||||
extern const struct xattr_handler generic_acl_access_handler;
|
||||
extern const struct xattr_handler generic_acl_default_handler;
|
||||
|
||||
int generic_acl_init(struct inode *, struct inode *);
|
||||
int generic_acl_chmod(struct inode *);
|
||||
|
||||
#endif /* LINUX_GENERIC_ACL_H */
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
#ifndef __LINUX_GFP_H
|
||||
#define __LINUX_GFP_H
|
||||
|
||||
#include <linux/mmdebug.h>
|
||||
#include <linux/mmzone.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/linkage.h>
|
||||
|
|
|
|||
|
|
@ -90,7 +90,6 @@ void devm_gpio_free(struct device *dev, unsigned int gpio);
|
|||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/bug.h>
|
||||
#include <linux/pinctrl/pinctrl.h>
|
||||
|
||||
|
|
|
|||
|
|
@ -39,14 +39,15 @@ struct seq_file;
|
|||
* @ngpio: the number of GPIOs handled by this controller; the last GPIO
|
||||
* handled is (base + ngpio - 1).
|
||||
* @desc: array of ngpio descriptors. Private.
|
||||
* @can_sleep: flag must be set iff get()/set() methods sleep, as they
|
||||
* must while accessing GPIO expander chips over I2C or SPI
|
||||
* @names: if set, must be an array of strings to use as alternative
|
||||
* names for the GPIOs in this chip. Any entry in the array
|
||||
* may be NULL if there is no alias for the GPIO, however the
|
||||
* array must be @ngpio entries long. A name can include a single printk
|
||||
* format specifier for an unsigned int. It is substituted by the actual
|
||||
* number of the gpio.
|
||||
* @can_sleep: flag must be set iff get()/set() methods sleep, as they
|
||||
* must while accessing GPIO expander chips over I2C or SPI
|
||||
* @exported: flags if the gpiochip is exported for use from sysfs. Private.
|
||||
*
|
||||
* A gpio_chip can help platforms abstract various sources of GPIOs so
|
||||
* they can all be accessed through a common programing interface.
|
||||
|
|
@ -91,8 +92,8 @@ struct gpio_chip {
|
|||
u16 ngpio;
|
||||
struct gpio_desc *desc;
|
||||
const char *const *names;
|
||||
unsigned can_sleep:1;
|
||||
unsigned exported:1;
|
||||
bool can_sleep;
|
||||
bool exported;
|
||||
|
||||
#if defined(CONFIG_OF_GPIO)
|
||||
/*
|
||||
|
|
@ -136,59 +137,50 @@ enum gpio_lookup_flags {
|
|||
};
|
||||
|
||||
/**
|
||||
* Lookup table for associating GPIOs to specific devices and functions using
|
||||
* platform data.
|
||||
* struct gpiod_lookup - lookup table
|
||||
* @chip_label: name of the chip the GPIO belongs to
|
||||
* @chip_hwnum: hardware number (i.e. relative to the chip) of the GPIO
|
||||
* @con_id: name of the GPIO from the device's point of view
|
||||
* @idx: index of the GPIO in case several GPIOs share the same name
|
||||
* @flags: mask of GPIO_* values
|
||||
*
|
||||
* gpiod_lookup is a lookup table for associating GPIOs to specific devices and
|
||||
* functions using platform data.
|
||||
*/
|
||||
struct gpiod_lookup {
|
||||
struct list_head list;
|
||||
/*
|
||||
* name of the chip the GPIO belongs to
|
||||
*/
|
||||
const char *chip_label;
|
||||
/*
|
||||
* hardware number (i.e. relative to the chip) of the GPIO
|
||||
*/
|
||||
u16 chip_hwnum;
|
||||
/*
|
||||
* name of device that can claim this GPIO
|
||||
*/
|
||||
const char *dev_id;
|
||||
/*
|
||||
* name of the GPIO from the device's point of view
|
||||
*/
|
||||
const char *con_id;
|
||||
/*
|
||||
* index of the GPIO in case several GPIOs share the same name
|
||||
*/
|
||||
unsigned int idx;
|
||||
/*
|
||||
* mask of GPIO_* values
|
||||
*/
|
||||
enum gpio_lookup_flags flags;
|
||||
};
|
||||
|
||||
struct gpiod_lookup_table {
|
||||
struct list_head list;
|
||||
const char *dev_id;
|
||||
struct gpiod_lookup table[];
|
||||
};
|
||||
|
||||
/*
|
||||
* Simple definition of a single GPIO under a con_id
|
||||
*/
|
||||
#define GPIO_LOOKUP(_chip_label, _chip_hwnum, _dev_id, _con_id, _flags) \
|
||||
GPIO_LOOKUP_IDX(_chip_label, _chip_hwnum, _dev_id, _con_id, 0, _flags)
|
||||
#define GPIO_LOOKUP(_chip_label, _chip_hwnum, _con_id, _flags) \
|
||||
GPIO_LOOKUP_IDX(_chip_label, _chip_hwnum, _con_id, 0, _flags)
|
||||
|
||||
/*
|
||||
* Use this macro if you need to have several GPIOs under the same con_id.
|
||||
* Each GPIO needs to use a different index and can be accessed using
|
||||
* gpiod_get_index()
|
||||
*/
|
||||
#define GPIO_LOOKUP_IDX(_chip_label, _chip_hwnum, _dev_id, _con_id, _idx, \
|
||||
_flags) \
|
||||
#define GPIO_LOOKUP_IDX(_chip_label, _chip_hwnum, _con_id, _idx, _flags) \
|
||||
{ \
|
||||
.chip_label = _chip_label, \
|
||||
.chip_hwnum = _chip_hwnum, \
|
||||
.dev_id = _dev_id, \
|
||||
.con_id = _con_id, \
|
||||
.idx = _idx, \
|
||||
.flags = _flags, \
|
||||
}
|
||||
|
||||
void gpiod_add_table(struct gpiod_lookup *table, size_t size);
|
||||
void gpiod_add_lookup_table(struct gpiod_lookup_table *table);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@
|
|||
*/
|
||||
|
||||
#include <asm/types.h>
|
||||
#include <asm/hash.h>
|
||||
#include <linux/compiler.h>
|
||||
|
||||
/* 2^31 + 2^29 - 2^25 + 2^22 - 2^19 - 2^16 + 1 */
|
||||
|
|
@ -78,4 +79,39 @@ static inline u32 hash32_ptr(const void *ptr)
|
|||
#endif
|
||||
return (u32)val;
|
||||
}
|
||||
|
||||
struct fast_hash_ops {
|
||||
u32 (*hash)(const void *data, u32 len, u32 seed);
|
||||
u32 (*hash2)(const u32 *data, u32 len, u32 seed);
|
||||
};
|
||||
|
||||
/**
|
||||
* arch_fast_hash - Caclulates a hash over a given buffer that can have
|
||||
* arbitrary size. This function will eventually use an
|
||||
* architecture-optimized hashing implementation if
|
||||
* available, and trades off distribution for speed.
|
||||
*
|
||||
* @data: buffer to hash
|
||||
* @len: length of buffer in bytes
|
||||
* @seed: start seed
|
||||
*
|
||||
* Returns 32bit hash.
|
||||
*/
|
||||
extern u32 arch_fast_hash(const void *data, u32 len, u32 seed);
|
||||
|
||||
/**
|
||||
* arch_fast_hash2 - Caclulates a hash over a given buffer that has a
|
||||
* size that is of a multiple of 32bit words. This
|
||||
* function will eventually use an architecture-
|
||||
* optimized hashing implementation if available,
|
||||
* and trades off distribution for speed.
|
||||
*
|
||||
* @data: buffer to hash (must be 32bit padded)
|
||||
* @len: number of 32bit words
|
||||
* @seed: start seed
|
||||
*
|
||||
* Returns 32bit hash.
|
||||
*/
|
||||
extern u32 arch_fast_hash2(const u32 *data, u32 len, u32 seed);
|
||||
|
||||
#endif /* _LINUX_HASH_H */
|
||||
|
|
|
|||
|
|
@ -23,22 +23,26 @@
|
|||
|
||||
/* Accel 3D (200073) */
|
||||
#define HID_USAGE_SENSOR_ACCEL_3D 0x200073
|
||||
#define HID_USAGE_SENSOR_DATA_ACCELERATION 0x200452
|
||||
#define HID_USAGE_SENSOR_ACCEL_X_AXIS 0x200453
|
||||
#define HID_USAGE_SENSOR_ACCEL_Y_AXIS 0x200454
|
||||
#define HID_USAGE_SENSOR_ACCEL_Z_AXIS 0x200455
|
||||
|
||||
/* ALS (200041) */
|
||||
#define HID_USAGE_SENSOR_ALS 0x200041
|
||||
#define HID_USAGE_SENSOR_DATA_LIGHT 0x2004d0
|
||||
#define HID_USAGE_SENSOR_LIGHT_ILLUM 0x2004d1
|
||||
|
||||
/* Gyro 3D: (200076) */
|
||||
#define HID_USAGE_SENSOR_GYRO_3D 0x200076
|
||||
#define HID_USAGE_SENSOR_DATA_ANGL_VELOCITY 0x200456
|
||||
#define HID_USAGE_SENSOR_ANGL_VELOCITY_X_AXIS 0x200457
|
||||
#define HID_USAGE_SENSOR_ANGL_VELOCITY_Y_AXIS 0x200458
|
||||
#define HID_USAGE_SENSOR_ANGL_VELOCITY_Z_AXIS 0x200459
|
||||
|
||||
/* ORIENTATION: Compass 3D: (200083) */
|
||||
#define HID_USAGE_SENSOR_COMPASS_3D 0x200083
|
||||
#define HID_USAGE_SENSOR_DATA_ORIENTATION 0x200470
|
||||
#define HID_USAGE_SENSOR_ORIENT_MAGN_HEADING 0x200471
|
||||
#define HID_USAGE_SENSOR_ORIENT_MAGN_HEADING_X 0x200472
|
||||
#define HID_USAGE_SENSOR_ORIENT_MAGN_HEADING_Y 0x200473
|
||||
|
|
@ -54,10 +58,14 @@
|
|||
#define HID_USAGE_SENSOR_ORIENT_DISTANCE_Y 0x20047B
|
||||
#define HID_USAGE_SENSOR_ORIENT_DISTANCE_Z 0x20047C
|
||||
#define HID_USAGE_SENSOR_ORIENT_DISTANCE_OUT_OF_RANGE 0x20047D
|
||||
|
||||
/* ORIENTATION: Inclinometer 3D: (200086) */
|
||||
#define HID_USAGE_SENSOR_INCLINOMETER_3D 0x200086
|
||||
#define HID_USAGE_SENSOR_ORIENT_TILT 0x20047E
|
||||
#define HID_USAGE_SENSOR_ORIENT_TILT_X 0x20047F
|
||||
#define HID_USAGE_SENSOR_ORIENT_TILT_Y 0x200480
|
||||
#define HID_USAGE_SENSOR_ORIENT_TILT_Z 0x200481
|
||||
|
||||
#define HID_USAGE_SENSOR_ORIENT_ROTATION_MATRIX 0x200482
|
||||
#define HID_USAGE_SENSOR_ORIENT_QUATERNION 0x200483
|
||||
#define HID_USAGE_SENSOR_ORIENT_MAGN_FLUX 0x200484
|
||||
|
|
@ -117,6 +125,10 @@
|
|||
#define HID_USAGE_SENSOR_PROP_REPORT_STATE 0x200316
|
||||
#define HID_USAGE_SENSOR_PROY_POWER_STATE 0x200319
|
||||
|
||||
/* Per data field properties */
|
||||
#define HID_USAGE_SENSOR_DATA_MOD_NONE 0x00
|
||||
#define HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS 0x1000
|
||||
|
||||
/* Power state enumerations */
|
||||
#define HID_USAGE_SENSOR_PROP_POWER_STATE_UNDEFINED_ENUM 0x00
|
||||
#define HID_USAGE_SENSOR_PROP_POWER_STATE_D0_FULL_POWER_ENUM 0x01
|
||||
|
|
|
|||
|
|
@ -281,4 +281,10 @@ int host1x_device_exit(struct host1x_device *device);
|
|||
int host1x_client_register(struct host1x_client *client);
|
||||
int host1x_client_unregister(struct host1x_client *client);
|
||||
|
||||
struct tegra_mipi_device;
|
||||
|
||||
struct tegra_mipi_device *tegra_mipi_request(struct device *device);
|
||||
void tegra_mipi_free(struct tegra_mipi_device *device);
|
||||
int tegra_mipi_calibrate(struct tegra_mipi_device *device);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -157,6 +157,26 @@ static inline int hpage_nr_pages(struct page *page)
|
|||
return HPAGE_PMD_NR;
|
||||
return 1;
|
||||
}
|
||||
/*
|
||||
* compound_trans_head() should be used instead of compound_head(),
|
||||
* whenever the "page" passed as parameter could be the tail of a
|
||||
* transparent hugepage that could be undergoing a
|
||||
* __split_huge_page_refcount(). The page structure layout often
|
||||
* changes across releases and it makes extensive use of unions. So if
|
||||
* the page structure layout will change in a way that
|
||||
* page->first_page gets clobbered by __split_huge_page_refcount, the
|
||||
* implementation making use of smp_rmb() will be required.
|
||||
*
|
||||
* Currently we define compound_trans_head as compound_head, because
|
||||
* page->private is in the same union with page->first_page, and
|
||||
* page->private isn't clobbered. However this also means we're
|
||||
* currently leaving dirt into the page->private field of anonymous
|
||||
* pages resulting from a THP split, instead of setting page->private
|
||||
* to zero like for every other page that has PG_private not set. But
|
||||
* anonymous pages don't use page->private so this is not a problem.
|
||||
*/
|
||||
#if 0
|
||||
/* This will be needed if page->private will be clobbered in split_huge_page */
|
||||
static inline struct page *compound_trans_head(struct page *page)
|
||||
{
|
||||
if (PageTail(page)) {
|
||||
|
|
@ -174,6 +194,9 @@ static inline struct page *compound_trans_head(struct page *page)
|
|||
}
|
||||
return page;
|
||||
}
|
||||
#else
|
||||
#define compound_trans_head(page) compound_head(page)
|
||||
#endif
|
||||
|
||||
extern int do_huge_pmd_numa_page(struct mm_struct *mm, struct vm_area_struct *vma,
|
||||
unsigned long addr, pmd_t pmd, pmd_t *pmdp);
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
#define _LINUX_HUGETLB_H
|
||||
|
||||
#include <linux/mm_types.h>
|
||||
#include <linux/mmdebug.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/hugetlb_inline.h>
|
||||
#include <linux/cgroup.h>
|
||||
|
|
@ -31,7 +32,6 @@ struct hugepage_subpool *hugepage_new_subpool(long nr_blocks);
|
|||
void hugepage_put_subpool(struct hugepage_subpool *spool);
|
||||
|
||||
int PageHuge(struct page *page);
|
||||
int PageHeadHuge(struct page *page_head);
|
||||
|
||||
void reset_vma_resv_huge_pages(struct vm_area_struct *vma);
|
||||
int hugetlb_sysctl_handler(struct ctl_table *, int, void __user *, size_t *, loff_t *);
|
||||
|
|
@ -104,11 +104,6 @@ static inline int PageHuge(struct page *page)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline int PageHeadHuge(struct page *page_head)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void reset_vma_resv_huge_pages(struct vm_area_struct *vma)
|
||||
{
|
||||
}
|
||||
|
|
@ -360,6 +355,7 @@ static inline pte_t arch_make_huge_pte(pte_t entry, struct vm_area_struct *vma,
|
|||
|
||||
static inline struct hstate *page_hstate(struct page *page)
|
||||
{
|
||||
VM_BUG_ON_PAGE(!PageHuge(page), page);
|
||||
return size_to_hstate(PAGE_SIZE << compound_order(page));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@
|
|||
#ifndef _LINUX_HUGETLB_CGROUP_H
|
||||
#define _LINUX_HUGETLB_CGROUP_H
|
||||
|
||||
#include <linux/mmdebug.h>
|
||||
#include <linux/res_counter.h>
|
||||
|
||||
struct hugetlb_cgroup;
|
||||
|
|
@ -28,7 +29,7 @@ struct hugetlb_cgroup;
|
|||
|
||||
static inline struct hugetlb_cgroup *hugetlb_cgroup_from_page(struct page *page)
|
||||
{
|
||||
VM_BUG_ON(!PageHuge(page));
|
||||
VM_BUG_ON_PAGE(!PageHuge(page), page);
|
||||
|
||||
if (compound_order(page) < HUGETLB_CGROUP_MIN_ORDER)
|
||||
return NULL;
|
||||
|
|
@ -38,7 +39,7 @@ static inline struct hugetlb_cgroup *hugetlb_cgroup_from_page(struct page *page)
|
|||
static inline
|
||||
int set_hugetlb_cgroup(struct page *page, struct hugetlb_cgroup *h_cg)
|
||||
{
|
||||
VM_BUG_ON(!PageHuge(page));
|
||||
VM_BUG_ON_PAGE(!PageHuge(page), page);
|
||||
|
||||
if (compound_order(page) < HUGETLB_CGROUP_MIN_ORDER)
|
||||
return -1;
|
||||
|
|
|
|||
|
|
@ -31,7 +31,6 @@ struct i2c_pnx_algo_data {
|
|||
int last;
|
||||
struct clk *clk;
|
||||
struct i2c_adapter adapter;
|
||||
phys_addr_t base;
|
||||
int irq;
|
||||
u32 timeout;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* i2c-smbus.h - SMBus extensions to the I2C protocol
|
||||
*
|
||||
* Copyright (C) 2010 Jean Delvare <khali@linux-fr.org>
|
||||
* Copyright (C) 2010 Jean Delvare <jdelvare@suse.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
|
|||
|
|
@ -342,11 +342,25 @@ i2c_register_board_info(int busnum, struct i2c_board_info const *info,
|
|||
}
|
||||
#endif /* I2C_BOARDINFO */
|
||||
|
||||
/*
|
||||
/**
|
||||
* struct i2c_algorithm - represent I2C transfer method
|
||||
* @master_xfer: Issue a set of i2c transactions to the given I2C adapter
|
||||
* defined by the msgs array, with num messages available to transfer via
|
||||
* the adapter specified by adap.
|
||||
* @smbus_xfer: Issue smbus transactions to the given I2C adapter. If this
|
||||
* is not present, then the bus layer will try and convert the SMBus calls
|
||||
* into I2C transfers instead.
|
||||
* @functionality: Return the flags that this algorithm/adapter pair supports
|
||||
* from the I2C_FUNC_* flags.
|
||||
*
|
||||
* The following structs are for those who like to implement new bus drivers:
|
||||
* i2c_algorithm is the interface to a class of hardware solutions which can
|
||||
* 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 field should indicate the type of
|
||||
* error code that occured during the transfer, as documented in the kernel
|
||||
* Documentation file Documentation/i2c/fault-codes.
|
||||
*/
|
||||
struct i2c_algorithm {
|
||||
/* If an adapter algorithm can't do I2C-level access, set master_xfer
|
||||
|
|
|
|||
|
|
@ -7,16 +7,14 @@ struct tsc2007_platform_data {
|
|||
u16 model; /* 2007. */
|
||||
u16 x_plate_ohms; /* must be non-zero value */
|
||||
u16 max_rt; /* max. resistance above which samples are ignored */
|
||||
unsigned long poll_delay; /* delay (in ms) after pen-down event
|
||||
before polling starts */
|
||||
unsigned long poll_period; /* time (in ms) between samples */
|
||||
int fuzzx; /* fuzz factor for X, Y and pressure axes */
|
||||
int fuzzy;
|
||||
int fuzzz;
|
||||
|
||||
int (*get_pendown_state)(void);
|
||||
void (*clear_penirq)(void); /* If needed, clear 2nd level
|
||||
interrupt source */
|
||||
int (*get_pendown_state)(struct device *);
|
||||
/* If needed, clear 2nd level interrupt source */
|
||||
void (*clear_penirq)(void);
|
||||
int (*init_platform_hw)(void);
|
||||
void (*exit_platform_hw)(void);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -175,6 +175,9 @@ static inline int twl_class_is_ ##class(void) \
|
|||
TWL_CLASS_IS(4030, TWL4030_CLASS_ID)
|
||||
TWL_CLASS_IS(6030, TWL6030_CLASS_ID)
|
||||
|
||||
/* Set the regcache bypass for the regmap associated with the nodule */
|
||||
int twl_set_regcache_bypass(u8 mod_no, bool enable);
|
||||
|
||||
/*
|
||||
* Read and write several 8-bit registers at once.
|
||||
*/
|
||||
|
|
@ -667,8 +670,6 @@ struct twl4030_codec_data {
|
|||
unsigned int digimic_delay; /* in ms */
|
||||
unsigned int ramp_delay_value;
|
||||
unsigned int offset_cncl_path;
|
||||
unsigned int check_defaults:1;
|
||||
unsigned int reset_registers:1;
|
||||
unsigned int hs_extmute:1;
|
||||
int hs_extmute_gpio;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -18,14 +18,10 @@
|
|||
#include <linux/completion.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/mutex.h>
|
||||
#ifdef CONFIG_BLK_DEV_IDEACPI
|
||||
#include <acpi/acpi.h>
|
||||
#endif
|
||||
#include <asm/byteorder.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
/* for request_sense */
|
||||
#include <linux/cdrom.h>
|
||||
#include <asm/byteorder.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
#if defined(CONFIG_CRIS) || defined(CONFIG_FRV) || defined(CONFIG_MN10300)
|
||||
# define SUPPORT_VLB_SYNC 0
|
||||
|
|
|
|||
|
|
@ -1411,8 +1411,12 @@ struct ieee80211_vht_operation {
|
|||
#define IEEE80211_VHT_CAP_RXSTBC_MASK 0x00000700
|
||||
#define IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE 0x00000800
|
||||
#define IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE 0x00001000
|
||||
#define IEEE80211_VHT_CAP_BEAMFORMEE_STS_MAX 0x0000e000
|
||||
#define IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MAX 0x00070000
|
||||
#define IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT 13
|
||||
#define IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK \
|
||||
(7 << IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT)
|
||||
#define IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT 16
|
||||
#define IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK \
|
||||
(7 << IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT)
|
||||
#define IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE 0x00080000
|
||||
#define IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE 0x00100000
|
||||
#define IEEE80211_VHT_CAP_VHT_TXOP_PS 0x00200000
|
||||
|
|
@ -1853,6 +1857,7 @@ enum ieee80211_key_len {
|
|||
WLAN_KEY_LEN_CCMP = 16,
|
||||
WLAN_KEY_LEN_TKIP = 32,
|
||||
WLAN_KEY_LEN_AES_CMAC = 16,
|
||||
WLAN_KEY_LEN_SMS4 = 32,
|
||||
};
|
||||
|
||||
#define IEEE80211_WEP_IV_LEN 4
|
||||
|
|
@ -1898,6 +1903,7 @@ enum ieee80211_tdls_actioncode {
|
|||
#define WLAN_EXT_CAPA5_TDLS_PROHIBITED BIT(6)
|
||||
|
||||
#define WLAN_EXT_CAPA8_OPMODE_NOTIF BIT(6)
|
||||
#define WLAN_EXT_CAPA8_TDLS_WIDE_BW_ENABLED BIT(7)
|
||||
|
||||
/* TDLS specific payload type in the LLC/SNAP header */
|
||||
#define WLAN_TDLS_SNAP_RFTYPE 0x2
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
#define _LINUX_IF_MACVLAN_H
|
||||
|
||||
#include <linux/if_link.h>
|
||||
#include <linux/if_vlan.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/netlink.h>
|
||||
|
|
@ -24,28 +25,6 @@ static inline struct socket *macvtap_get_socket(struct file *f)
|
|||
struct macvlan_port;
|
||||
struct macvtap_queue;
|
||||
|
||||
/**
|
||||
* struct macvlan_pcpu_stats - MACVLAN percpu stats
|
||||
* @rx_packets: number of received packets
|
||||
* @rx_bytes: number of received bytes
|
||||
* @rx_multicast: number of received multicast packets
|
||||
* @tx_packets: number of transmitted packets
|
||||
* @tx_bytes: number of transmitted bytes
|
||||
* @syncp: synchronization point for 64bit counters
|
||||
* @rx_errors: number of rx errors
|
||||
* @tx_dropped: number of tx dropped packets
|
||||
*/
|
||||
struct macvlan_pcpu_stats {
|
||||
u64 rx_packets;
|
||||
u64 rx_bytes;
|
||||
u64 rx_multicast;
|
||||
u64 tx_packets;
|
||||
u64 tx_bytes;
|
||||
struct u64_stats_sync syncp;
|
||||
u32 rx_errors;
|
||||
u32 tx_dropped;
|
||||
};
|
||||
|
||||
/*
|
||||
* Maximum times a macvtap device can be opened. This can be used to
|
||||
* configure the number of receive queue, e.g. for multiqueue virtio.
|
||||
|
|
@ -62,15 +41,13 @@ struct macvlan_dev {
|
|||
struct macvlan_port *port;
|
||||
struct net_device *lowerdev;
|
||||
void *fwd_priv;
|
||||
struct macvlan_pcpu_stats __percpu *pcpu_stats;
|
||||
struct vlan_pcpu_stats __percpu *pcpu_stats;
|
||||
|
||||
DECLARE_BITMAP(mc_filter, MACVLAN_MC_FILTER_SZ);
|
||||
|
||||
netdev_features_t set_features;
|
||||
enum macvlan_mode mode;
|
||||
u16 flags;
|
||||
int (*receive)(struct sk_buff *skb);
|
||||
int (*forward)(struct net_device *dev, struct sk_buff *skb);
|
||||
/* This array tracks active taps. */
|
||||
struct macvtap_queue __rcu *taps[MAX_MACVTAP_QUEUES];
|
||||
/* This list tracks all taps (both enabled and disabled) */
|
||||
|
|
@ -86,7 +63,7 @@ static inline void macvlan_count_rx(const struct macvlan_dev *vlan,
|
|||
bool multicast)
|
||||
{
|
||||
if (likely(success)) {
|
||||
struct macvlan_pcpu_stats *pcpu_stats;
|
||||
struct vlan_pcpu_stats *pcpu_stats;
|
||||
|
||||
pcpu_stats = this_cpu_ptr(vlan->pcpu_stats);
|
||||
u64_stats_update_begin(&pcpu_stats->syncp);
|
||||
|
|
@ -103,10 +80,7 @@ static inline void macvlan_count_rx(const struct macvlan_dev *vlan,
|
|||
extern void macvlan_common_setup(struct net_device *dev);
|
||||
|
||||
extern int macvlan_common_newlink(struct net *src_net, struct net_device *dev,
|
||||
struct nlattr *tb[], struct nlattr *data[],
|
||||
int (*receive)(struct sk_buff *skb),
|
||||
int (*forward)(struct net_device *dev,
|
||||
struct sk_buff *skb));
|
||||
struct nlattr *tb[], struct nlattr *data[]);
|
||||
|
||||
extern void macvlan_count_rx(const struct macvlan_dev *vlan,
|
||||
unsigned int len, bool success,
|
||||
|
|
@ -116,9 +90,6 @@ extern void macvlan_dellink(struct net_device *dev, struct list_head *head);
|
|||
|
||||
extern int macvlan_link_register(struct rtnl_link_ops *ops);
|
||||
|
||||
extern netdev_tx_t macvlan_start_xmit(struct sk_buff *skb,
|
||||
struct net_device *dev);
|
||||
|
||||
#if IS_ENABLED(CONFIG_MACVLAN)
|
||||
static inline struct net_device *
|
||||
macvlan_dev_real_dev(const struct net_device *dev)
|
||||
|
|
|
|||
|
|
@ -13,13 +13,4 @@
|
|||
#define for_each_ip_tunnel_rcu(pos, start) \
|
||||
for (pos = rcu_dereference(start); pos; pos = rcu_dereference(pos->next))
|
||||
|
||||
/* often modified stats are per cpu, other are shared (netdev->stats) */
|
||||
struct pcpu_tstats {
|
||||
u64 rx_packets;
|
||||
u64 rx_bytes;
|
||||
u64 tx_packets;
|
||||
u64 tx_bytes;
|
||||
struct u64_stats_sync syncp;
|
||||
};
|
||||
|
||||
#endif /* _IF_TUNNEL_H_ */
|
||||
|
|
|
|||
|
|
@ -82,25 +82,6 @@ static inline int is_vlan_dev(struct net_device *dev)
|
|||
#define vlan_tx_tag_get(__skb) ((__skb)->vlan_tci & ~VLAN_TAG_PRESENT)
|
||||
#define vlan_tx_tag_get_id(__skb) ((__skb)->vlan_tci & VLAN_VID_MASK)
|
||||
|
||||
#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
|
||||
|
||||
extern struct net_device *__vlan_find_dev_deep(struct net_device *real_dev,
|
||||
__be16 vlan_proto, u16 vlan_id);
|
||||
extern struct net_device *vlan_dev_real_dev(const struct net_device *dev);
|
||||
extern u16 vlan_dev_vlan_id(const struct net_device *dev);
|
||||
|
||||
/**
|
||||
* struct vlan_priority_tci_mapping - vlan egress priority mappings
|
||||
* @priority: skb priority
|
||||
* @vlan_qos: vlan priority: (skb->priority << 13) & 0xE000
|
||||
* @next: pointer to next struct
|
||||
*/
|
||||
struct vlan_priority_tci_mapping {
|
||||
u32 priority;
|
||||
u16 vlan_qos;
|
||||
struct vlan_priority_tci_mapping *next;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct vlan_pcpu_stats - VLAN percpu rx/tx stats
|
||||
* @rx_packets: number of received packets
|
||||
|
|
@ -123,6 +104,25 @@ struct vlan_pcpu_stats {
|
|||
u32 tx_dropped;
|
||||
};
|
||||
|
||||
#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
|
||||
|
||||
extern struct net_device *__vlan_find_dev_deep(struct net_device *real_dev,
|
||||
__be16 vlan_proto, u16 vlan_id);
|
||||
extern struct net_device *vlan_dev_real_dev(const struct net_device *dev);
|
||||
extern u16 vlan_dev_vlan_id(const struct net_device *dev);
|
||||
|
||||
/**
|
||||
* struct vlan_priority_tci_mapping - vlan egress priority mappings
|
||||
* @priority: skb priority
|
||||
* @vlan_qos: vlan priority: (skb->priority << 13) & 0xE000
|
||||
* @next: pointer to next struct
|
||||
*/
|
||||
struct vlan_priority_tci_mapping {
|
||||
u32 priority;
|
||||
u16 vlan_qos;
|
||||
struct vlan_priority_tci_mapping *next;
|
||||
};
|
||||
|
||||
struct proc_dir_entry;
|
||||
struct netpoll;
|
||||
|
||||
|
|
|
|||
|
|
@ -21,6 +21,8 @@ struct iio_buffer;
|
|||
* struct iio_buffer_access_funcs - access functions for buffers.
|
||||
* @store_to: actually store stuff to the buffer
|
||||
* @read_first_n: try to get a specified number of bytes (must exist)
|
||||
* @data_available: indicates whether data for reading from the buffer is
|
||||
* available.
|
||||
* @request_update: if a parameter change has been marked, update underlying
|
||||
* storage.
|
||||
* @get_bytes_per_datum:get current bytes per datum
|
||||
|
|
@ -43,6 +45,7 @@ struct iio_buffer_access_funcs {
|
|||
int (*read_first_n)(struct iio_buffer *buffer,
|
||||
size_t n,
|
||||
char __user *buf);
|
||||
bool (*data_available)(struct iio_buffer *buffer);
|
||||
|
||||
int (*request_update)(struct iio_buffer *buffer);
|
||||
|
||||
|
|
|
|||
|
|
@ -46,10 +46,6 @@ struct iio_event_data {
|
|||
((u16)chan))
|
||||
|
||||
|
||||
#define IIO_EV_DIR_MAX 4
|
||||
#define IIO_EV_BIT(type, direction) \
|
||||
(1 << (type*IIO_EV_DIR_MAX + direction))
|
||||
|
||||
/**
|
||||
* IIO_MOD_EVENT_CODE() - create event identifier for modified channels
|
||||
* @chan_type: Type of the channel. Should be one of enum iio_chan_type.
|
||||
|
|
|
|||
|
|
@ -185,7 +185,6 @@ struct iio_event_spec {
|
|||
* by all channels of the same direction.
|
||||
* @info_mask_shared_by_all: What information is to be exported that is shared
|
||||
* by all channels.
|
||||
* @event_mask: What events can this channel produce.
|
||||
* @event_spec: Array of events which should be registered for this
|
||||
* channel.
|
||||
* @num_event_specs: Size of the event_spec array.
|
||||
|
|
@ -226,7 +225,6 @@ struct iio_chan_spec {
|
|||
long info_mask_shared_by_type;
|
||||
long info_mask_shared_by_dir;
|
||||
long info_mask_shared_by_all;
|
||||
long event_mask;
|
||||
const struct iio_event_spec *event_spec;
|
||||
unsigned int num_event_specs;
|
||||
const struct iio_chan_spec_ext_info *ext_info;
|
||||
|
|
@ -307,16 +305,8 @@ struct iio_dev;
|
|||
* returns IIO_VAL_INT_PLUS_MICRO.
|
||||
* @read_event_config: find out if the event is enabled.
|
||||
* @write_event_config: set if the event is enabled.
|
||||
* @read_event_value: read a value associated with the event. Meaning
|
||||
* is event dependant. event_code specifies which event.
|
||||
* @write_event_value: write the value associated with the event.
|
||||
* Meaning is event dependent.
|
||||
* @read_event_config_new: find out if the event is enabled. New style interface.
|
||||
* @write_event_config_new: set if the event is enabled. New style interface.
|
||||
* @read_event_value_new: read a configuration value associated with the event.
|
||||
* New style interface.
|
||||
* @write_event_value_new: write a configuration value for the event. New style
|
||||
* interface.
|
||||
* @read_event_value: read a configuration value associated with the event.
|
||||
* @write_event_value: write a configuration value for the event.
|
||||
* @validate_trigger: function to validate the trigger when the
|
||||
* current trigger gets changed.
|
||||
* @update_scan_mode: function to configure device and scan buffer when
|
||||
|
|
@ -345,37 +335,23 @@ struct iio_info {
|
|||
long mask);
|
||||
|
||||
int (*read_event_config)(struct iio_dev *indio_dev,
|
||||
u64 event_code);
|
||||
|
||||
int (*write_event_config)(struct iio_dev *indio_dev,
|
||||
u64 event_code,
|
||||
int state);
|
||||
|
||||
int (*read_event_value)(struct iio_dev *indio_dev,
|
||||
u64 event_code,
|
||||
int *val);
|
||||
int (*write_event_value)(struct iio_dev *indio_dev,
|
||||
u64 event_code,
|
||||
int val);
|
||||
|
||||
int (*read_event_config_new)(struct iio_dev *indio_dev,
|
||||
const struct iio_chan_spec *chan,
|
||||
enum iio_event_type type,
|
||||
enum iio_event_direction dir);
|
||||
|
||||
int (*write_event_config_new)(struct iio_dev *indio_dev,
|
||||
int (*write_event_config)(struct iio_dev *indio_dev,
|
||||
const struct iio_chan_spec *chan,
|
||||
enum iio_event_type type,
|
||||
enum iio_event_direction dir,
|
||||
int state);
|
||||
|
||||
int (*read_event_value_new)(struct iio_dev *indio_dev,
|
||||
int (*read_event_value)(struct iio_dev *indio_dev,
|
||||
const struct iio_chan_spec *chan,
|
||||
enum iio_event_type type,
|
||||
enum iio_event_direction dir,
|
||||
enum iio_event_info info, int *val, int *val2);
|
||||
|
||||
int (*write_event_value_new)(struct iio_dev *indio_dev,
|
||||
int (*write_event_value)(struct iio_dev *indio_dev,
|
||||
const struct iio_chan_spec *chan,
|
||||
enum iio_event_type type,
|
||||
enum iio_event_direction dir,
|
||||
|
|
@ -490,32 +466,12 @@ struct iio_dev {
|
|||
#endif
|
||||
};
|
||||
|
||||
/**
|
||||
* iio_find_channel_from_si() - get channel from its scan index
|
||||
* @indio_dev: device
|
||||
* @si: scan index to match
|
||||
*/
|
||||
const struct iio_chan_spec
|
||||
*iio_find_channel_from_si(struct iio_dev *indio_dev, int si);
|
||||
|
||||
/**
|
||||
* iio_device_register() - register a device with the IIO subsystem
|
||||
* @indio_dev: Device structure filled by the device driver
|
||||
**/
|
||||
int iio_device_register(struct iio_dev *indio_dev);
|
||||
|
||||
/**
|
||||
* iio_device_unregister() - unregister a device from the IIO subsystem
|
||||
* @indio_dev: Device structure representing the device.
|
||||
**/
|
||||
void iio_device_unregister(struct iio_dev *indio_dev);
|
||||
|
||||
/**
|
||||
* iio_push_event() - try to add event to the list for userspace reading
|
||||
* @indio_dev: IIO device structure
|
||||
* @ev_code: What event
|
||||
* @timestamp: When the event occurred
|
||||
**/
|
||||
int devm_iio_device_register(struct device *dev, struct iio_dev *indio_dev);
|
||||
void devm_iio_device_unregister(struct device *dev, struct iio_dev *indio_dev);
|
||||
int iio_push_event(struct iio_dev *indio_dev, u64 ev_code, s64 timestamp);
|
||||
|
||||
extern struct bus_type iio_bus_type;
|
||||
|
|
@ -579,10 +535,6 @@ static inline void *iio_device_get_drvdata(struct iio_dev *indio_dev)
|
|||
|
||||
/* Can we make this smaller? */
|
||||
#define IIO_ALIGN L1_CACHE_BYTES
|
||||
/**
|
||||
* iio_device_alloc() - allocate an iio_dev from a driver
|
||||
* @sizeof_priv: Space to allocate for private structure.
|
||||
**/
|
||||
struct iio_dev *iio_device_alloc(int sizeof_priv);
|
||||
|
||||
static inline void *iio_priv(const struct iio_dev *indio_dev)
|
||||
|
|
@ -596,64 +548,11 @@ static inline struct iio_dev *iio_priv_to_dev(void *priv)
|
|||
ALIGN(sizeof(struct iio_dev), IIO_ALIGN));
|
||||
}
|
||||
|
||||
/**
|
||||
* iio_device_free() - free an iio_dev from a driver
|
||||
* @indio_dev: the iio_dev associated with the device
|
||||
**/
|
||||
void iio_device_free(struct iio_dev *indio_dev);
|
||||
|
||||
/**
|
||||
* devm_iio_device_alloc - Resource-managed iio_device_alloc()
|
||||
* @dev: Device to allocate iio_dev for
|
||||
* @sizeof_priv: Space to allocate for private structure.
|
||||
*
|
||||
* Managed iio_device_alloc. iio_dev allocated with this function is
|
||||
* automatically freed on driver detach.
|
||||
*
|
||||
* If an iio_dev allocated with this function needs to be freed separately,
|
||||
* devm_iio_device_free() must be used.
|
||||
*
|
||||
* RETURNS:
|
||||
* Pointer to allocated iio_dev on success, NULL on failure.
|
||||
*/
|
||||
struct iio_dev *devm_iio_device_alloc(struct device *dev, int sizeof_priv);
|
||||
|
||||
/**
|
||||
* devm_iio_device_free - Resource-managed iio_device_free()
|
||||
* @dev: Device this iio_dev belongs to
|
||||
* @indio_dev: the iio_dev associated with the device
|
||||
*
|
||||
* Free iio_dev allocated with devm_iio_device_alloc().
|
||||
*/
|
||||
void devm_iio_device_free(struct device *dev, struct iio_dev *indio_dev);
|
||||
|
||||
/**
|
||||
* devm_iio_trigger_alloc - Resource-managed iio_trigger_alloc()
|
||||
* @dev: Device to allocate iio_trigger for
|
||||
* @fmt: trigger name format. If it includes format
|
||||
* specifiers, the additional arguments following
|
||||
* format are formatted and inserted in the resulting
|
||||
* string replacing their respective specifiers.
|
||||
*
|
||||
* Managed iio_trigger_alloc. iio_trigger allocated with this function is
|
||||
* automatically freed on driver detach.
|
||||
*
|
||||
* If an iio_trigger allocated with this function needs to be freed separately,
|
||||
* devm_iio_trigger_free() must be used.
|
||||
*
|
||||
* RETURNS:
|
||||
* Pointer to allocated iio_trigger on success, NULL on failure.
|
||||
*/
|
||||
struct iio_trigger *devm_iio_trigger_alloc(struct device *dev,
|
||||
const char *fmt, ...);
|
||||
|
||||
/**
|
||||
* devm_iio_trigger_free - Resource-managed iio_trigger_free()
|
||||
* @dev: Device this iio_dev belongs to
|
||||
* @iio_trig: the iio_trigger associated with the device
|
||||
*
|
||||
* Free iio_trigger allocated with devm_iio_trigger_alloc().
|
||||
*/
|
||||
void devm_iio_trigger_free(struct device *dev, struct iio_trigger *iio_trig);
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@ enum iio_chan_type {
|
|||
IIO_ALTVOLTAGE,
|
||||
IIO_CCT,
|
||||
IIO_PRESSURE,
|
||||
IIO_HUMIDITYRELATIVE,
|
||||
};
|
||||
|
||||
enum iio_modifier {
|
||||
|
|
|
|||
|
|
@ -133,33 +133,10 @@ struct net_lro_mgr {
|
|||
void lro_receive_skb(struct net_lro_mgr *lro_mgr,
|
||||
struct sk_buff *skb,
|
||||
void *priv);
|
||||
|
||||
/*
|
||||
* Processes a fragment list
|
||||
*
|
||||
* This functions aggregate fragments and generate SKBs do pass
|
||||
* the packets to the stack.
|
||||
*
|
||||
* @lro_mgr: LRO manager to use
|
||||
* @frags: Fragment to be processed. Must contain entire header in first
|
||||
* element.
|
||||
* @len: Length of received data
|
||||
* @true_size: Actual size of memory the fragment is consuming
|
||||
* @priv: Private data that may be used by driver functions
|
||||
* (for example get_tcp_ip_hdr)
|
||||
*/
|
||||
|
||||
void lro_receive_frags(struct net_lro_mgr *lro_mgr,
|
||||
struct skb_frag_struct *frags,
|
||||
int len, int true_size, void *priv, __wsum sum);
|
||||
|
||||
/*
|
||||
* Forward all aggregated SKBs held by lro_mgr to network stack
|
||||
*/
|
||||
|
||||
void lro_flush_all(struct net_lro_mgr *lro_mgr);
|
||||
|
||||
void lro_flush_pkt(struct net_lro_mgr *lro_mgr,
|
||||
struct iphdr *iph, struct tcphdr *tcph);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -136,8 +136,8 @@ struct in_ifaddr {
|
|||
__be32 ifa_mask;
|
||||
__be32 ifa_broadcast;
|
||||
unsigned char ifa_scope;
|
||||
unsigned char ifa_flags;
|
||||
unsigned char ifa_prefixlen;
|
||||
__u32 ifa_flags;
|
||||
char ifa_label[IFNAMSIZ];
|
||||
|
||||
/* In seconds, relative to tstamp. Expiry is at tstamp + HZ * lft. */
|
||||
|
|
@ -164,11 +164,10 @@ int devinet_ioctl(struct net *net, unsigned int cmd, void __user *);
|
|||
void devinet_init(void);
|
||||
struct in_device *inetdev_by_index(struct net *, int);
|
||||
__be32 inet_select_addr(const struct net_device *dev, __be32 dst, int scope);
|
||||
__be32 inet_confirm_addr(struct in_device *in_dev, __be32 dst, __be32 local,
|
||||
int scope);
|
||||
__be32 inet_confirm_addr(struct net *net, struct in_device *in_dev, __be32 dst,
|
||||
__be32 local, int scope);
|
||||
struct in_ifaddr *inet_ifa_byprefix(struct in_device *in_dev, __be32 prefix,
|
||||
__be32 mask);
|
||||
|
||||
static __inline__ int inet_ifa_match(__be32 addr, struct in_ifaddr *ifa)
|
||||
{
|
||||
return !((addr^ifa->ifa_address)&ifa->ifa_mask);
|
||||
|
|
@ -220,6 +219,13 @@ static inline struct in_device *__in_dev_get_rtnl(const struct net_device *dev)
|
|||
return rtnl_dereference(dev->ip_ptr);
|
||||
}
|
||||
|
||||
static inline struct neigh_parms *__in_dev_arp_parms_get_rcu(const struct net_device *dev)
|
||||
{
|
||||
struct in_device *in_dev = __in_dev_get_rcu(dev);
|
||||
|
||||
return in_dev ? in_dev->arp_parms : NULL;
|
||||
}
|
||||
|
||||
void in_dev_finish_destroy(struct in_device *idev);
|
||||
|
||||
static inline void in_dev_put(struct in_device *idev)
|
||||
|
|
|
|||
|
|
@ -286,9 +286,11 @@ void __init parse_early_options(char *cmdline);
|
|||
#define arch_initcall(fn) module_init(fn)
|
||||
#define subsys_initcall(fn) module_init(fn)
|
||||
#define fs_initcall(fn) module_init(fn)
|
||||
#define rootfs_initcall(fn) module_init(fn)
|
||||
#define device_initcall(fn) module_init(fn)
|
||||
#define late_initcall(fn) module_init(fn)
|
||||
|
||||
#define console_initcall(fn) module_init(fn)
|
||||
#define security_initcall(fn) module_init(fn)
|
||||
|
||||
/* Each module must use one module_init(). */
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ extern struct fs_struct init_fs;
|
|||
|
||||
#define INIT_SIGNALS(sig) { \
|
||||
.nr_threads = 1, \
|
||||
.thread_head = LIST_HEAD_INIT(init_task.thread_node), \
|
||||
.wait_chldexit = __WAIT_QUEUE_HEAD_INITIALIZER(sig.wait_chldexit),\
|
||||
.shared_pending = { \
|
||||
.list = LIST_HEAD_INIT(sig.shared_pending.list), \
|
||||
|
|
@ -96,7 +97,7 @@ extern struct group_info init_groups;
|
|||
#ifdef CONFIG_AUDITSYSCALL
|
||||
#define INIT_IDS \
|
||||
.loginuid = INVALID_UID, \
|
||||
.sessionid = -1,
|
||||
.sessionid = (unsigned int)-1,
|
||||
#else
|
||||
#define INIT_IDS
|
||||
#endif
|
||||
|
|
@ -222,6 +223,7 @@ extern struct task_group root_task_group;
|
|||
[PIDTYPE_SID] = INIT_PID_LINK(PIDTYPE_SID), \
|
||||
}, \
|
||||
.thread_group = LIST_HEAD_INIT(tsk.thread_group), \
|
||||
.thread_node = LIST_HEAD_INIT(init_signals.thread_head), \
|
||||
INIT_IDS \
|
||||
INIT_PERF_EVENTS(tsk) \
|
||||
INIT_TRACE_IRQFLAGS \
|
||||
|
|
|
|||
|
|
@ -288,6 +288,7 @@ struct q_inval {
|
|||
|
||||
struct ir_table {
|
||||
struct irte *base;
|
||||
unsigned long *bitmap;
|
||||
};
|
||||
#endif
|
||||
|
||||
|
|
@ -347,8 +348,6 @@ static inline void __iommu_flush_cache(
|
|||
extern struct dmar_drhd_unit * dmar_find_matched_drhd_unit(struct pci_dev *dev);
|
||||
extern int dmar_find_matched_atsr_unit(struct pci_dev *dev);
|
||||
|
||||
extern int alloc_iommu(struct dmar_drhd_unit *drhd);
|
||||
extern void free_iommu(struct intel_iommu *iommu);
|
||||
extern int dmar_enable_qi(struct intel_iommu *iommu);
|
||||
extern void dmar_disable_qi(struct intel_iommu *iommu);
|
||||
extern int dmar_reenable_qi(struct intel_iommu *iommu);
|
||||
|
|
|
|||
|
|
@ -360,7 +360,7 @@ enum
|
|||
/* map softirq index to softirq name. update 'softirq_to_name' in
|
||||
* kernel/softirq.c when adding a new softirq.
|
||||
*/
|
||||
extern char *softirq_to_name[NR_SOFTIRQS];
|
||||
extern const char * const softirq_to_name[NR_SOFTIRQS];
|
||||
|
||||
/* softirq mask and active fields moved to irq_cpustat_t in
|
||||
* asm/hardirq.h to get better cache usage. KAO
|
||||
|
|
|
|||
|
|
@ -24,9 +24,10 @@
|
|||
#include <linux/types.h>
|
||||
#include <trace/events/iommu.h>
|
||||
|
||||
#define IOMMU_READ (1)
|
||||
#define IOMMU_WRITE (2)
|
||||
#define IOMMU_CACHE (4) /* DMA cache coherency */
|
||||
#define IOMMU_READ (1 << 0)
|
||||
#define IOMMU_WRITE (1 << 1)
|
||||
#define IOMMU_CACHE (1 << 2) /* DMA cache coherency */
|
||||
#define IOMMU_EXEC (1 << 3)
|
||||
|
||||
struct iommu_ops;
|
||||
struct iommu_group;
|
||||
|
|
@ -247,6 +248,11 @@ static inline struct iommu_domain *iommu_domain_alloc(struct bus_type *bus)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static inline struct iommu_group *iommu_group_get_by_id(int id)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline void iommu_domain_free(struct iommu_domain *domain)
|
||||
{
|
||||
}
|
||||
|
|
@ -291,8 +297,8 @@ static inline phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, dma_ad
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline int domain_has_cap(struct iommu_domain *domain,
|
||||
unsigned long cap)
|
||||
static inline int iommu_domain_has_cap(struct iommu_domain *domain,
|
||||
unsigned long cap)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
struct kern_ipc_perm
|
||||
{
|
||||
spinlock_t lock;
|
||||
int deleted;
|
||||
bool deleted;
|
||||
int id;
|
||||
key_t key;
|
||||
kuid_t uid;
|
||||
|
|
|
|||
|
|
@ -21,7 +21,6 @@ struct user_namespace;
|
|||
struct ipc_ids {
|
||||
int in_use;
|
||||
unsigned short seq;
|
||||
unsigned short seq_max;
|
||||
struct rw_semaphore rwsem;
|
||||
struct idr ipcs_idr;
|
||||
int next_id;
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue