mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-25 22:23:14 -04:00
Merge commit 'origin' into master
Manual merge of: arch/powerpc/Kconfig arch/powerpc/include/asm/page.h
This commit is contained in:
commit
a02efb906d
2652 changed files with 278337 additions and 43509 deletions
|
|
@ -107,6 +107,7 @@ header-y += keyctl.h
|
|||
header-y += limits.h
|
||||
header-y += magic.h
|
||||
header-y += major.h
|
||||
header-y += map_to_7segment.h
|
||||
header-y += matroxfb.h
|
||||
header-y += meye.h
|
||||
header-y += minix_fs.h
|
||||
|
|
@ -182,6 +183,7 @@ unifdef-y += auto_fs.h
|
|||
unifdef-y += auxvec.h
|
||||
unifdef-y += binfmts.h
|
||||
unifdef-y += blktrace_api.h
|
||||
unifdef-y += byteorder.h
|
||||
unifdef-y += capability.h
|
||||
unifdef-y += capi.h
|
||||
unifdef-y += cciss_ioctl.h
|
||||
|
|
@ -339,6 +341,7 @@ unifdef-y += soundcard.h
|
|||
unifdef-y += stat.h
|
||||
unifdef-y += stddef.h
|
||||
unifdef-y += string.h
|
||||
unifdef-y += swab.h
|
||||
unifdef-y += synclink.h
|
||||
unifdef-y += sysctl.h
|
||||
unifdef-y += tcp.h
|
||||
|
|
|
|||
|
|
@ -10,7 +10,6 @@
|
|||
#if defined(CONFIG_PCIEAER)
|
||||
/* pci-e port driver needs this function to enable aer */
|
||||
extern int pci_enable_pcie_error_reporting(struct pci_dev *dev);
|
||||
extern int pci_find_aer_capability(struct pci_dev *dev);
|
||||
extern int pci_disable_pcie_error_reporting(struct pci_dev *dev);
|
||||
extern int pci_cleanup_aer_uncorrect_error_status(struct pci_dev *dev);
|
||||
#else
|
||||
|
|
@ -18,10 +17,6 @@ static inline int pci_enable_pcie_error_reporting(struct pci_dev *dev)
|
|||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
static inline int pci_find_aer_capability(struct pci_dev *dev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int pci_disable_pcie_error_reporting(struct pci_dev *dev)
|
||||
{
|
||||
return -EINVAL;
|
||||
|
|
|
|||
|
|
@ -204,12 +204,21 @@ struct kioctx {
|
|||
/* prototypes */
|
||||
extern unsigned aio_max_size;
|
||||
|
||||
#ifdef CONFIG_AIO
|
||||
extern ssize_t wait_on_sync_kiocb(struct kiocb *iocb);
|
||||
extern int aio_put_req(struct kiocb *iocb);
|
||||
extern void kick_iocb(struct kiocb *iocb);
|
||||
extern int aio_complete(struct kiocb *iocb, long res, long res2);
|
||||
struct mm_struct;
|
||||
extern void exit_aio(struct mm_struct *mm);
|
||||
#else
|
||||
static inline ssize_t wait_on_sync_kiocb(struct kiocb *iocb) { return 0; }
|
||||
static inline int aio_put_req(struct kiocb *iocb) { return 0; }
|
||||
static inline void kick_iocb(struct kiocb *iocb) { }
|
||||
static inline int aio_complete(struct kiocb *iocb, long res, long res2) { return 0; }
|
||||
struct mm_struct;
|
||||
static inline void exit_aio(struct mm_struct *mm) { }
|
||||
#endif /* CONFIG_AIO */
|
||||
|
||||
#define io_wait_to_kiocb(wait) container_of(wait, struct kiocb, ki_wait)
|
||||
|
||||
|
|
|
|||
157
include/linux/auto_dev-ioctl.h
Normal file
157
include/linux/auto_dev-ioctl.h
Normal file
|
|
@ -0,0 +1,157 @@
|
|||
/*
|
||||
* Copyright 2008 Red Hat, Inc. All rights reserved.
|
||||
* Copyright 2008 Ian Kent <raven@themaw.net>
|
||||
*
|
||||
* This file is part of the Linux kernel and is made available under
|
||||
* the terms of the GNU General Public License, version 2, or at your
|
||||
* option, any later version, incorporated herein by reference.
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_AUTO_DEV_IOCTL_H
|
||||
#define _LINUX_AUTO_DEV_IOCTL_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#define AUTOFS_DEVICE_NAME "autofs"
|
||||
|
||||
#define AUTOFS_DEV_IOCTL_VERSION_MAJOR 1
|
||||
#define AUTOFS_DEV_IOCTL_VERSION_MINOR 0
|
||||
|
||||
#define AUTOFS_DEVID_LEN 16
|
||||
|
||||
#define AUTOFS_DEV_IOCTL_SIZE sizeof(struct autofs_dev_ioctl)
|
||||
|
||||
/*
|
||||
* An ioctl interface for autofs mount point control.
|
||||
*/
|
||||
|
||||
/*
|
||||
* All the ioctls use this structure.
|
||||
* When sending a path size must account for the total length
|
||||
* of the chunk of memory otherwise is is the size of the
|
||||
* structure.
|
||||
*/
|
||||
|
||||
struct autofs_dev_ioctl {
|
||||
__u32 ver_major;
|
||||
__u32 ver_minor;
|
||||
__u32 size; /* total size of data passed in
|
||||
* including this struct */
|
||||
__s32 ioctlfd; /* automount command fd */
|
||||
|
||||
__u32 arg1; /* Command parameters */
|
||||
__u32 arg2;
|
||||
|
||||
char path[0];
|
||||
};
|
||||
|
||||
static inline void init_autofs_dev_ioctl(struct autofs_dev_ioctl *in)
|
||||
{
|
||||
in->ver_major = AUTOFS_DEV_IOCTL_VERSION_MAJOR;
|
||||
in->ver_minor = AUTOFS_DEV_IOCTL_VERSION_MINOR;
|
||||
in->size = sizeof(struct autofs_dev_ioctl);
|
||||
in->ioctlfd = -1;
|
||||
in->arg1 = 0;
|
||||
in->arg2 = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* If you change this make sure you make the corresponding change
|
||||
* to autofs-dev-ioctl.c:lookup_ioctl()
|
||||
*/
|
||||
enum {
|
||||
/* Get various version info */
|
||||
AUTOFS_DEV_IOCTL_VERSION_CMD = 0x71,
|
||||
AUTOFS_DEV_IOCTL_PROTOVER_CMD,
|
||||
AUTOFS_DEV_IOCTL_PROTOSUBVER_CMD,
|
||||
|
||||
/* Open mount ioctl fd */
|
||||
AUTOFS_DEV_IOCTL_OPENMOUNT_CMD,
|
||||
|
||||
/* Close mount ioctl fd */
|
||||
AUTOFS_DEV_IOCTL_CLOSEMOUNT_CMD,
|
||||
|
||||
/* Mount/expire status returns */
|
||||
AUTOFS_DEV_IOCTL_READY_CMD,
|
||||
AUTOFS_DEV_IOCTL_FAIL_CMD,
|
||||
|
||||
/* Activate/deactivate autofs mount */
|
||||
AUTOFS_DEV_IOCTL_SETPIPEFD_CMD,
|
||||
AUTOFS_DEV_IOCTL_CATATONIC_CMD,
|
||||
|
||||
/* Expiry timeout */
|
||||
AUTOFS_DEV_IOCTL_TIMEOUT_CMD,
|
||||
|
||||
/* Get mount last requesting uid and gid */
|
||||
AUTOFS_DEV_IOCTL_REQUESTER_CMD,
|
||||
|
||||
/* Check for eligible expire candidates */
|
||||
AUTOFS_DEV_IOCTL_EXPIRE_CMD,
|
||||
|
||||
/* Request busy status */
|
||||
AUTOFS_DEV_IOCTL_ASKUMOUNT_CMD,
|
||||
|
||||
/* Check if path is a mountpoint */
|
||||
AUTOFS_DEV_IOCTL_ISMOUNTPOINT_CMD,
|
||||
};
|
||||
|
||||
#define AUTOFS_IOCTL 0x93
|
||||
|
||||
#define AUTOFS_DEV_IOCTL_VERSION \
|
||||
_IOWR(AUTOFS_IOCTL, \
|
||||
AUTOFS_DEV_IOCTL_VERSION_CMD, struct autofs_dev_ioctl)
|
||||
|
||||
#define AUTOFS_DEV_IOCTL_PROTOVER \
|
||||
_IOWR(AUTOFS_IOCTL, \
|
||||
AUTOFS_DEV_IOCTL_PROTOVER_CMD, struct autofs_dev_ioctl)
|
||||
|
||||
#define AUTOFS_DEV_IOCTL_PROTOSUBVER \
|
||||
_IOWR(AUTOFS_IOCTL, \
|
||||
AUTOFS_DEV_IOCTL_PROTOSUBVER_CMD, struct autofs_dev_ioctl)
|
||||
|
||||
#define AUTOFS_DEV_IOCTL_OPENMOUNT \
|
||||
_IOWR(AUTOFS_IOCTL, \
|
||||
AUTOFS_DEV_IOCTL_OPENMOUNT_CMD, struct autofs_dev_ioctl)
|
||||
|
||||
#define AUTOFS_DEV_IOCTL_CLOSEMOUNT \
|
||||
_IOWR(AUTOFS_IOCTL, \
|
||||
AUTOFS_DEV_IOCTL_CLOSEMOUNT_CMD, struct autofs_dev_ioctl)
|
||||
|
||||
#define AUTOFS_DEV_IOCTL_READY \
|
||||
_IOWR(AUTOFS_IOCTL, \
|
||||
AUTOFS_DEV_IOCTL_READY_CMD, struct autofs_dev_ioctl)
|
||||
|
||||
#define AUTOFS_DEV_IOCTL_FAIL \
|
||||
_IOWR(AUTOFS_IOCTL, \
|
||||
AUTOFS_DEV_IOCTL_FAIL_CMD, struct autofs_dev_ioctl)
|
||||
|
||||
#define AUTOFS_DEV_IOCTL_SETPIPEFD \
|
||||
_IOWR(AUTOFS_IOCTL, \
|
||||
AUTOFS_DEV_IOCTL_SETPIPEFD_CMD, struct autofs_dev_ioctl)
|
||||
|
||||
#define AUTOFS_DEV_IOCTL_CATATONIC \
|
||||
_IOWR(AUTOFS_IOCTL, \
|
||||
AUTOFS_DEV_IOCTL_CATATONIC_CMD, struct autofs_dev_ioctl)
|
||||
|
||||
#define AUTOFS_DEV_IOCTL_TIMEOUT \
|
||||
_IOWR(AUTOFS_IOCTL, \
|
||||
AUTOFS_DEV_IOCTL_TIMEOUT_CMD, struct autofs_dev_ioctl)
|
||||
|
||||
#define AUTOFS_DEV_IOCTL_REQUESTER \
|
||||
_IOWR(AUTOFS_IOCTL, \
|
||||
AUTOFS_DEV_IOCTL_REQUESTER_CMD, struct autofs_dev_ioctl)
|
||||
|
||||
#define AUTOFS_DEV_IOCTL_EXPIRE \
|
||||
_IOWR(AUTOFS_IOCTL, \
|
||||
AUTOFS_DEV_IOCTL_EXPIRE_CMD, struct autofs_dev_ioctl)
|
||||
|
||||
#define AUTOFS_DEV_IOCTL_ASKUMOUNT \
|
||||
_IOWR(AUTOFS_IOCTL, \
|
||||
AUTOFS_DEV_IOCTL_ASKUMOUNT_CMD, struct autofs_dev_ioctl)
|
||||
|
||||
#define AUTOFS_DEV_IOCTL_ISMOUNTPOINT \
|
||||
_IOWR(AUTOFS_IOCTL, \
|
||||
AUTOFS_DEV_IOCTL_ISMOUNTPOINT_CMD, struct autofs_dev_ioctl)
|
||||
|
||||
#endif /* _LINUX_AUTO_DEV_IOCTL_H */
|
||||
|
|
@ -23,12 +23,17 @@
|
|||
#define AUTOFS_MIN_PROTO_VERSION 3
|
||||
#define AUTOFS_MAX_PROTO_VERSION 5
|
||||
|
||||
#define AUTOFS_PROTO_SUBVERSION 0
|
||||
#define AUTOFS_PROTO_SUBVERSION 1
|
||||
|
||||
/* Mask for expire behaviour */
|
||||
#define AUTOFS_EXP_IMMEDIATE 1
|
||||
#define AUTOFS_EXP_LEAVES 2
|
||||
|
||||
#define AUTOFS_TYPE_ANY 0x0000
|
||||
#define AUTOFS_TYPE_INDIRECT 0x0001
|
||||
#define AUTOFS_TYPE_DIRECT 0x0002
|
||||
#define AUTOFS_TYPE_OFFSET 0x0004
|
||||
|
||||
/* Daemon notification packet types */
|
||||
enum autofs_notify {
|
||||
NFY_NONE,
|
||||
|
|
|
|||
|
|
@ -175,6 +175,8 @@ int bdi_set_max_ratio(struct backing_dev_info *bdi, unsigned int max_ratio);
|
|||
* BDI_CAP_READ_MAP: Can be mapped for reading
|
||||
* BDI_CAP_WRITE_MAP: Can be mapped for writing
|
||||
* BDI_CAP_EXEC_MAP: Can be mapped for execution
|
||||
*
|
||||
* BDI_CAP_SWAP_BACKED: Count shmem/tmpfs objects as swap-backed.
|
||||
*/
|
||||
#define BDI_CAP_NO_ACCT_DIRTY 0x00000001
|
||||
#define BDI_CAP_NO_WRITEBACK 0x00000002
|
||||
|
|
@ -184,6 +186,7 @@ int bdi_set_max_ratio(struct backing_dev_info *bdi, unsigned int max_ratio);
|
|||
#define BDI_CAP_WRITE_MAP 0x00000020
|
||||
#define BDI_CAP_EXEC_MAP 0x00000040
|
||||
#define BDI_CAP_NO_ACCT_WB 0x00000080
|
||||
#define BDI_CAP_SWAP_BACKED 0x00000100
|
||||
|
||||
#define BDI_CAP_VMFLAGS \
|
||||
(BDI_CAP_READ_MAP | BDI_CAP_WRITE_MAP | BDI_CAP_EXEC_MAP)
|
||||
|
|
@ -248,6 +251,11 @@ static inline bool bdi_cap_account_writeback(struct backing_dev_info *bdi)
|
|||
BDI_CAP_NO_WRITEBACK));
|
||||
}
|
||||
|
||||
static inline bool bdi_cap_swap_backed(struct backing_dev_info *bdi)
|
||||
{
|
||||
return bdi->capabilities & BDI_CAP_SWAP_BACKED;
|
||||
}
|
||||
|
||||
static inline bool mapping_cap_writeback_dirty(struct address_space *mapping)
|
||||
{
|
||||
return bdi_cap_writeback_dirty(mapping->backing_dev_info);
|
||||
|
|
@ -258,4 +266,9 @@ static inline bool mapping_cap_account_dirty(struct address_space *mapping)
|
|||
return bdi_cap_account_dirty(mapping->backing_dev_info);
|
||||
}
|
||||
|
||||
static inline bool mapping_cap_swap_backed(struct address_space *mapping)
|
||||
{
|
||||
return bdi_cap_swap_backed(mapping->backing_dev_info);
|
||||
}
|
||||
|
||||
#endif /* _LINUX_BACKING_DEV_H */
|
||||
|
|
|
|||
|
|
@ -1,12 +1,3 @@
|
|||
/* Permission is hereby granted to copy, modify and redistribute this code
|
||||
* in terms of the GNU Library General Public License, Version 2 or later,
|
||||
* at your option.
|
||||
*/
|
||||
|
||||
/* macros to translate to/from binary and binary-coded decimal (frequently
|
||||
* found in RTC chips).
|
||||
*/
|
||||
|
||||
#ifndef _BCD_H
|
||||
#define _BCD_H
|
||||
|
||||
|
|
@ -15,11 +6,4 @@
|
|||
unsigned bcd2bin(unsigned char val) __attribute_const__;
|
||||
unsigned char bin2bcd(unsigned val) __attribute_const__;
|
||||
|
||||
#define BCD2BIN(val) bcd2bin(val)
|
||||
#define BIN2BCD(val) bin2bcd(val)
|
||||
|
||||
/* backwards compat */
|
||||
#define BCD_TO_BIN(val) ((val)=BCD2BIN(val))
|
||||
#define BIN_TO_BCD(val) ((val)=BIN2BCD(val))
|
||||
|
||||
#endif /* _BCD_H */
|
||||
|
|
|
|||
|
|
@ -36,6 +36,10 @@ struct linux_binprm{
|
|||
unsigned long p; /* current top of mem */
|
||||
unsigned int sh_bang:1,
|
||||
misc_bang:1;
|
||||
#ifdef __alpha__
|
||||
unsigned int taso:1;
|
||||
#endif
|
||||
unsigned int recursion_depth;
|
||||
struct file * file;
|
||||
int e_uid, e_gid;
|
||||
kernel_cap_t cap_post_exec_permitted;
|
||||
|
|
@ -58,6 +62,7 @@ struct linux_binprm{
|
|||
#define BINPRM_FLAGS_EXECFD_BIT 1
|
||||
#define BINPRM_FLAGS_EXECFD (1 << BINPRM_FLAGS_EXECFD_BIT)
|
||||
|
||||
#define BINPRM_MAX_RECURSION 4
|
||||
|
||||
/*
|
||||
* This structure defines the functions that are used to load the binary formats that
|
||||
|
|
|
|||
|
|
@ -79,6 +79,13 @@ struct bio {
|
|||
|
||||
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.
|
||||
*/
|
||||
unsigned int bi_seg_front_size;
|
||||
unsigned int bi_seg_back_size;
|
||||
|
||||
unsigned int bi_max_vecs; /* max bvl_vecs we can hold */
|
||||
|
||||
unsigned int bi_comp_cpu; /* completion CPU */
|
||||
|
|
@ -129,25 +136,30 @@ struct bio {
|
|||
* bit 2 -- barrier
|
||||
* Insert a serialization point in the IO queue, forcing previously
|
||||
* submitted IO to be completed before this oen is issued.
|
||||
* bit 3 -- fail fast, don't want low level driver retries
|
||||
* bit 4 -- synchronous I/O hint: the block layer will unplug immediately
|
||||
* bit 3 -- synchronous I/O hint: the block layer will unplug immediately
|
||||
* Note that this does NOT indicate that the IO itself is sync, just
|
||||
* that the block layer will not postpone issue of this IO by plugging.
|
||||
* bit 5 -- metadata request
|
||||
* bit 4 -- metadata request
|
||||
* Used for tracing to differentiate metadata and data IO. May also
|
||||
* get some preferential treatment in the IO scheduler
|
||||
* bit 6 -- discard sectors
|
||||
* bit 5 -- discard sectors
|
||||
* Informs the lower level device that this range of sectors is no longer
|
||||
* used by the file system and may thus be freed by the device. Used
|
||||
* for flash based storage.
|
||||
* bit 6 -- fail fast device errors
|
||||
* bit 7 -- fail fast transport errors
|
||||
* bit 8 -- fail fast driver errors
|
||||
* Don't want driver retries for any fast fail whatever the reason.
|
||||
*/
|
||||
#define BIO_RW 0 /* Must match RW in req flags (blkdev.h) */
|
||||
#define BIO_RW_AHEAD 1 /* Must match FAILFAST in req flags */
|
||||
#define BIO_RW_BARRIER 2
|
||||
#define BIO_RW_FAILFAST 3
|
||||
#define BIO_RW_SYNC 4
|
||||
#define BIO_RW_META 5
|
||||
#define BIO_RW_DISCARD 6
|
||||
#define BIO_RW_SYNC 3
|
||||
#define BIO_RW_META 4
|
||||
#define BIO_RW_DISCARD 5
|
||||
#define BIO_RW_FAILFAST_DEV 6
|
||||
#define BIO_RW_FAILFAST_TRANSPORT 7
|
||||
#define BIO_RW_FAILFAST_DRIVER 8
|
||||
|
||||
/*
|
||||
* upper 16 bits of bi_rw define the io priority of this bio
|
||||
|
|
@ -174,7 +186,10 @@ struct bio {
|
|||
#define bio_sectors(bio) ((bio)->bi_size >> 9)
|
||||
#define bio_barrier(bio) ((bio)->bi_rw & (1 << BIO_RW_BARRIER))
|
||||
#define bio_sync(bio) ((bio)->bi_rw & (1 << BIO_RW_SYNC))
|
||||
#define bio_failfast(bio) ((bio)->bi_rw & (1 << BIO_RW_FAILFAST))
|
||||
#define bio_failfast_dev(bio) ((bio)->bi_rw & (1 << BIO_RW_FAILFAST_DEV))
|
||||
#define bio_failfast_transport(bio) \
|
||||
((bio)->bi_rw & (1 << BIO_RW_FAILFAST_TRANSPORT))
|
||||
#define bio_failfast_driver(bio) ((bio)->bi_rw & (1 << BIO_RW_FAILFAST_DRIVER))
|
||||
#define bio_rw_ahead(bio) ((bio)->bi_rw & (1 << BIO_RW_AHEAD))
|
||||
#define bio_rw_meta(bio) ((bio)->bi_rw & (1 << BIO_RW_META))
|
||||
#define bio_discard(bio) ((bio)->bi_rw & (1 << BIO_RW_DISCARD))
|
||||
|
|
|
|||
|
|
@ -110,7 +110,6 @@ extern int __bitmap_weight(const unsigned long *bitmap, int bits);
|
|||
|
||||
extern int bitmap_scnprintf(char *buf, unsigned int len,
|
||||
const unsigned long *src, int nbits);
|
||||
extern int bitmap_scnprintf_len(unsigned int nr_bits);
|
||||
extern int __bitmap_parse(const char *buf, unsigned int buflen, int is_user,
|
||||
unsigned long *dst, int nbits);
|
||||
extern int bitmap_parse_user(const char __user *ubuf, unsigned int ulen,
|
||||
|
|
|
|||
|
|
@ -87,7 +87,9 @@ enum {
|
|||
*/
|
||||
enum rq_flag_bits {
|
||||
__REQ_RW, /* not set, read. set, write */
|
||||
__REQ_FAILFAST, /* no low level driver retries */
|
||||
__REQ_FAILFAST_DEV, /* no driver retries of device errors */
|
||||
__REQ_FAILFAST_TRANSPORT, /* no driver retries of transport errors */
|
||||
__REQ_FAILFAST_DRIVER, /* no driver retries of driver errors */
|
||||
__REQ_DISCARD, /* request to discard sectors */
|
||||
__REQ_SORTED, /* elevator knows about this request */
|
||||
__REQ_SOFTBARRIER, /* may not be passed by ioscheduler */
|
||||
|
|
@ -111,8 +113,10 @@ enum rq_flag_bits {
|
|||
};
|
||||
|
||||
#define REQ_RW (1 << __REQ_RW)
|
||||
#define REQ_FAILFAST_DEV (1 << __REQ_FAILFAST_DEV)
|
||||
#define REQ_FAILFAST_TRANSPORT (1 << __REQ_FAILFAST_TRANSPORT)
|
||||
#define REQ_FAILFAST_DRIVER (1 << __REQ_FAILFAST_DRIVER)
|
||||
#define REQ_DISCARD (1 << __REQ_DISCARD)
|
||||
#define REQ_FAILFAST (1 << __REQ_FAILFAST)
|
||||
#define REQ_SORTED (1 << __REQ_SORTED)
|
||||
#define REQ_SOFTBARRIER (1 << __REQ_SOFTBARRIER)
|
||||
#define REQ_HARDBARRIER (1 << __REQ_HARDBARRIER)
|
||||
|
|
@ -560,7 +564,12 @@ enum {
|
|||
#define blk_special_request(rq) ((rq)->cmd_type == REQ_TYPE_SPECIAL)
|
||||
#define blk_sense_request(rq) ((rq)->cmd_type == REQ_TYPE_SENSE)
|
||||
|
||||
#define blk_noretry_request(rq) ((rq)->cmd_flags & REQ_FAILFAST)
|
||||
#define blk_failfast_dev(rq) ((rq)->cmd_flags & REQ_FAILFAST_DEV)
|
||||
#define blk_failfast_transport(rq) ((rq)->cmd_flags & REQ_FAILFAST_TRANSPORT)
|
||||
#define blk_failfast_driver(rq) ((rq)->cmd_flags & REQ_FAILFAST_DRIVER)
|
||||
#define blk_noretry_request(rq) (blk_failfast_dev(rq) || \
|
||||
blk_failfast_transport(rq) || \
|
||||
blk_failfast_driver(rq))
|
||||
#define blk_rq_started(rq) ((rq)->cmd_flags & REQ_STARTED)
|
||||
|
||||
#define blk_account_rq(rq) (blk_rq_started(rq) && (blk_fs_request(rq) || blk_discard_rq(rq)))
|
||||
|
|
@ -856,7 +865,6 @@ extern void blk_ordered_complete_seq(struct request_queue *, unsigned, int);
|
|||
extern int blk_rq_map_sg(struct request_queue *, struct request *, struct scatterlist *);
|
||||
extern void blk_dump_rq_flags(struct request *, char *);
|
||||
extern void generic_unplug_device(struct request_queue *);
|
||||
extern void __generic_unplug_device(struct request_queue *);
|
||||
extern long nr_blockdev_pages(void);
|
||||
|
||||
int blk_get_queue(struct request_queue *);
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@ enum blktrace_cat {
|
|||
BLK_TC_AHEAD = 1 << 11, /* readahead */
|
||||
BLK_TC_META = 1 << 12, /* metadata */
|
||||
BLK_TC_DISCARD = 1 << 13, /* discard requests */
|
||||
BLK_TC_DRV_DATA = 1 << 14, /* binary per-driver data */
|
||||
|
||||
BLK_TC_END = 1 << 15, /* only 16-bits, reminder */
|
||||
};
|
||||
|
|
@ -51,6 +52,7 @@ enum blktrace_act {
|
|||
__BLK_TA_BOUNCE, /* bio was bounced */
|
||||
__BLK_TA_REMAP, /* bio was remapped */
|
||||
__BLK_TA_ABORT, /* request aborted */
|
||||
__BLK_TA_DRV_DATA, /* driver-specific binary data */
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -82,6 +84,7 @@ enum blktrace_notify {
|
|||
#define BLK_TA_BOUNCE (__BLK_TA_BOUNCE)
|
||||
#define BLK_TA_REMAP (__BLK_TA_REMAP | BLK_TC_ACT(BLK_TC_QUEUE))
|
||||
#define BLK_TA_ABORT (__BLK_TA_ABORT | BLK_TC_ACT(BLK_TC_QUEUE))
|
||||
#define BLK_TA_DRV_DATA (__BLK_TA_DRV_DATA | BLK_TC_ACT(BLK_TC_DRV_DATA))
|
||||
|
||||
#define BLK_TN_PROCESS (__BLK_TN_PROCESS | BLK_TC_ACT(BLK_TC_NOTIFY))
|
||||
#define BLK_TN_TIMESTAMP (__BLK_TN_TIMESTAMP | BLK_TC_ACT(BLK_TC_NOTIFY))
|
||||
|
|
@ -317,6 +320,34 @@ static inline void blk_add_trace_remap(struct request_queue *q, struct bio *bio,
|
|||
__blk_add_trace(bt, from, bio->bi_size, bio->bi_rw, BLK_TA_REMAP, !bio_flagged(bio, BIO_UPTODATE), sizeof(r), &r);
|
||||
}
|
||||
|
||||
/**
|
||||
* blk_add_driver_data - Add binary message with driver-specific data
|
||||
* @q: queue the io is for
|
||||
* @rq: io request
|
||||
* @data: driver-specific data
|
||||
* @len: length of driver-specific data
|
||||
*
|
||||
* Description:
|
||||
* Some drivers might want to write driver-specific data per request.
|
||||
*
|
||||
**/
|
||||
static inline void blk_add_driver_data(struct request_queue *q,
|
||||
struct request *rq,
|
||||
void *data, size_t len)
|
||||
{
|
||||
struct blk_trace *bt = q->blk_trace;
|
||||
|
||||
if (likely(!bt))
|
||||
return;
|
||||
|
||||
if (blk_pc_request(rq))
|
||||
__blk_add_trace(bt, 0, rq->data_len, 0, BLK_TA_DRV_DATA,
|
||||
rq->errors, len, data);
|
||||
else
|
||||
__blk_add_trace(bt, rq->hard_sector, rq->hard_nr_sectors << 9,
|
||||
0, BLK_TA_DRV_DATA, rq->errors, len, data);
|
||||
}
|
||||
|
||||
extern int blk_trace_setup(struct request_queue *q, char *name, dev_t dev,
|
||||
char __user *arg);
|
||||
extern int blk_trace_startstop(struct request_queue *q, int start);
|
||||
|
|
@ -330,6 +361,7 @@ extern int blk_trace_remove(struct request_queue *q);
|
|||
#define blk_add_trace_generic(q, rq, rw, what) do { } while (0)
|
||||
#define blk_add_trace_pdu_int(q, what, bio, pdu) do { } while (0)
|
||||
#define blk_add_trace_remap(q, bio, dev, f, t) do {} while (0)
|
||||
#define blk_add_driver_data(q, rq, data, len) do {} while (0)
|
||||
#define do_blk_trace_setup(q, name, dev, buts) (-ENOTTY)
|
||||
#define blk_trace_setup(q, name, dev, arg) (-ENOTTY)
|
||||
#define blk_trace_startstop(q, start) (-ENOTTY)
|
||||
|
|
|
|||
|
|
@ -322,7 +322,7 @@ static inline void wait_on_buffer(struct buffer_head *bh)
|
|||
|
||||
static inline int trylock_buffer(struct buffer_head *bh)
|
||||
{
|
||||
return likely(!test_and_set_bit(BH_Lock, &bh->b_state));
|
||||
return likely(!test_and_set_bit_lock(BH_Lock, &bh->b_state));
|
||||
}
|
||||
|
||||
static inline void lock_buffer(struct buffer_head *bh)
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
unifdef-y += big_endian.h
|
||||
unifdef-y += little_endian.h
|
||||
unifdef-y += swab.h
|
||||
unifdef-y += swabb.h
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@
|
|||
|
||||
#include <linux/types.h>
|
||||
#include <linux/byteorder/swab.h>
|
||||
#include <linux/byteorder/swabb.h>
|
||||
|
||||
#define __constant_htonl(x) ((__force __be32)(__u32)(x))
|
||||
#define __constant_ntohl(x) ((__force __u32)(__be32)(x))
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@
|
|||
|
||||
#include <linux/types.h>
|
||||
#include <linux/byteorder/swab.h>
|
||||
#include <linux/byteorder/swabb.h>
|
||||
|
||||
#define __constant_htonl(x) ((__force __be32)___constant_swab32((x)))
|
||||
#define __constant_ntohl(x) ___constant_swab32((__force __be32)(x))
|
||||
|
|
|
|||
|
|
@ -9,12 +9,12 @@
|
|||
*/
|
||||
|
||||
#include <linux/sched.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/cpumask.h>
|
||||
#include <linux/nodemask.h>
|
||||
#include <linux/rcupdate.h>
|
||||
#include <linux/cgroupstats.h>
|
||||
#include <linux/prio_heap.h>
|
||||
#include <linux/rwsem.h>
|
||||
|
||||
#ifdef CONFIG_CGROUPS
|
||||
|
||||
|
|
@ -137,6 +137,15 @@ struct cgroup {
|
|||
* release_list_lock
|
||||
*/
|
||||
struct list_head release_list;
|
||||
|
||||
/* pids_mutex protects the fields below */
|
||||
struct rw_semaphore pids_mutex;
|
||||
/* Array of process ids in the cgroup */
|
||||
pid_t *tasks_pids;
|
||||
/* How many files are using the current tasks_pids array */
|
||||
int pids_use_count;
|
||||
/* Length of the current tasks_pids array */
|
||||
int pids_length;
|
||||
};
|
||||
|
||||
/* A css_set is a structure holding pointers to a set of
|
||||
|
|
@ -149,7 +158,7 @@ struct cgroup {
|
|||
struct css_set {
|
||||
|
||||
/* Reference count */
|
||||
struct kref ref;
|
||||
atomic_t refcount;
|
||||
|
||||
/*
|
||||
* List running through all cgroup groups in the same hash
|
||||
|
|
@ -326,7 +335,8 @@ struct cgroup_subsys {
|
|||
*/
|
||||
void (*mm_owner_changed)(struct cgroup_subsys *ss,
|
||||
struct cgroup *old,
|
||||
struct cgroup *new);
|
||||
struct cgroup *new,
|
||||
struct task_struct *p);
|
||||
int subsys_id;
|
||||
int active;
|
||||
int disabled;
|
||||
|
|
@ -393,6 +403,9 @@ void cgroup_iter_end(struct cgroup *cgrp, struct cgroup_iter *it);
|
|||
int cgroup_scan_tasks(struct cgroup_scanner *scan);
|
||||
int cgroup_attach_task(struct cgroup *, struct task_struct *);
|
||||
|
||||
void cgroup_mm_owner_callbacks(struct task_struct *old,
|
||||
struct task_struct *new);
|
||||
|
||||
#else /* !CONFIG_CGROUPS */
|
||||
|
||||
static inline int cgroup_init_early(void) { return 0; }
|
||||
|
|
@ -411,15 +424,9 @@ static inline int cgroupstats_build(struct cgroupstats *stats,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline void cgroup_mm_owner_callbacks(struct task_struct *old,
|
||||
struct task_struct *new) {}
|
||||
|
||||
#endif /* !CONFIG_CGROUPS */
|
||||
|
||||
#ifdef CONFIG_MM_OWNER
|
||||
extern void
|
||||
cgroup_mm_owner_callbacks(struct task_struct *old, struct task_struct *new);
|
||||
#else /* !CONFIG_MM_OWNER */
|
||||
static inline void
|
||||
cgroup_mm_owner_callbacks(struct task_struct *old, struct task_struct *new)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_MM_OWNER */
|
||||
#endif /* _LINUX_CGROUP_H */
|
||||
|
|
|
|||
|
|
@ -48,3 +48,9 @@ SUBSYS(devices)
|
|||
#endif
|
||||
|
||||
/* */
|
||||
|
||||
#ifdef CONFIG_CGROUP_FREEZER
|
||||
SUBSYS(freezer)
|
||||
#endif
|
||||
|
||||
/* */
|
||||
|
|
|
|||
|
|
@ -35,6 +35,8 @@ struct clk;
|
|||
* clk_get may return different clock producers depending on @dev.)
|
||||
*
|
||||
* Drivers must assume that the clock source is not enabled.
|
||||
*
|
||||
* clk_get should not be called from within interrupt context.
|
||||
*/
|
||||
struct clk *clk_get(struct device *dev, const char *id);
|
||||
|
||||
|
|
@ -76,6 +78,8 @@ unsigned long clk_get_rate(struct clk *clk);
|
|||
* Note: drivers must ensure that all clk_enable calls made on this
|
||||
* clock source are balanced by clk_disable calls prior to calling
|
||||
* this function.
|
||||
*
|
||||
* clk_put should not be called from within interrupt context.
|
||||
*/
|
||||
void clk_put(struct clk *clk);
|
||||
|
||||
|
|
|
|||
|
|
@ -45,7 +45,8 @@ struct clocksource;
|
|||
* @read: returns a cycle value
|
||||
* @mask: bitmask for two's complement
|
||||
* subtraction of non 64 bit counters
|
||||
* @mult: cycle to nanosecond multiplier
|
||||
* @mult: cycle to nanosecond multiplier (adjusted by NTP)
|
||||
* @mult_orig: cycle to nanosecond multiplier (unadjusted by NTP)
|
||||
* @shift: cycle to nanosecond divisor (power of two)
|
||||
* @flags: flags describing special properties
|
||||
* @vread: vsyscall based read
|
||||
|
|
@ -63,6 +64,7 @@ struct clocksource {
|
|||
cycle_t (*read)(void);
|
||||
cycle_t mask;
|
||||
u32 mult;
|
||||
u32 mult_orig;
|
||||
u32 shift;
|
||||
unsigned long flags;
|
||||
cycle_t (*vread)(void);
|
||||
|
|
@ -77,6 +79,7 @@ struct clocksource {
|
|||
/* timekeeping specific data, ignore */
|
||||
cycle_t cycle_interval;
|
||||
u64 xtime_interval;
|
||||
u32 raw_interval;
|
||||
/*
|
||||
* Second part is written at each timer interrupt
|
||||
* Keep it in a different cache line to dirty no
|
||||
|
|
@ -85,6 +88,7 @@ struct clocksource {
|
|||
cycle_t cycle_last ____cacheline_aligned_in_smp;
|
||||
u64 xtime_nsec;
|
||||
s64 error;
|
||||
struct timespec raw_time;
|
||||
|
||||
#ifdef CONFIG_CLOCKSOURCE_WATCHDOG
|
||||
/* Watchdog related data, used by the framework */
|
||||
|
|
@ -201,17 +205,19 @@ static inline void clocksource_calculate_interval(struct clocksource *c,
|
|||
{
|
||||
u64 tmp;
|
||||
|
||||
/* XXX - All of this could use a whole lot of optimization */
|
||||
/* Do the ns -> cycle conversion first, using original mult */
|
||||
tmp = length_nsec;
|
||||
tmp <<= c->shift;
|
||||
tmp += c->mult/2;
|
||||
do_div(tmp, c->mult);
|
||||
tmp += c->mult_orig/2;
|
||||
do_div(tmp, c->mult_orig);
|
||||
|
||||
c->cycle_interval = (cycle_t)tmp;
|
||||
if (c->cycle_interval == 0)
|
||||
c->cycle_interval = 1;
|
||||
|
||||
/* Go back from cycles -> shifted ns, this time use ntp adjused mult */
|
||||
c->xtime_interval = (u64)c->cycle_interval * c->mult;
|
||||
c->raw_interval = ((u64)c->cycle_interval * c->mult_orig) >> c->shift;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -78,7 +78,6 @@ typedef struct {
|
|||
compat_sigset_word sig[_COMPAT_NSIG_WORDS];
|
||||
} compat_sigset_t;
|
||||
|
||||
extern int cp_compat_stat(struct kstat *, struct compat_stat __user *);
|
||||
extern int get_compat_timespec(struct timespec *, const struct compat_timespec __user *);
|
||||
extern int put_compat_timespec(const struct timespec *, struct compat_timespec __user *);
|
||||
|
||||
|
|
@ -235,6 +234,11 @@ extern int get_compat_itimerspec(struct itimerspec *dst,
|
|||
extern int put_compat_itimerspec(struct compat_itimerspec __user *dst,
|
||||
const struct itimerspec *src);
|
||||
|
||||
asmlinkage long compat_sys_gettimeofday(struct compat_timeval __user *tv,
|
||||
struct timezone __user *tz);
|
||||
asmlinkage long compat_sys_settimeofday(struct compat_timeval __user *tv,
|
||||
struct timezone __user *tz);
|
||||
|
||||
asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp);
|
||||
|
||||
extern int compat_printk(const char *fmt, ...);
|
||||
|
|
|
|||
|
|
@ -44,6 +44,8 @@ extern void __chk_io_ptr(const volatile void __iomem *);
|
|||
# error Sorry, your compiler is too old/not recognized.
|
||||
#endif
|
||||
|
||||
#define notrace __attribute__((no_instrument_function))
|
||||
|
||||
/* Intel compiler defines __GNUC__. So we will overwrite implementations
|
||||
* coming from above header files here
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -8,12 +8,9 @@
|
|||
#include <linux/proc_fs.h>
|
||||
|
||||
#define ELFCORE_ADDR_MAX (-1ULL)
|
||||
#define ELFCORE_ADDR_ERR (-2ULL)
|
||||
|
||||
#ifdef CONFIG_PROC_VMCORE
|
||||
extern unsigned long long elfcorehdr_addr;
|
||||
#else
|
||||
static const unsigned long long elfcorehdr_addr = ELFCORE_ADDR_MAX;
|
||||
#endif
|
||||
|
||||
extern ssize_t copy_oldmem_page(unsigned long, char *, size_t,
|
||||
unsigned long, int);
|
||||
|
|
@ -28,10 +25,43 @@ extern struct proc_dir_entry *proc_vmcore;
|
|||
|
||||
#define vmcore_elf_check_arch(x) (elf_check_arch(x) || vmcore_elf_check_arch_cross(x))
|
||||
|
||||
/*
|
||||
* is_kdump_kernel() checks whether this kernel is booting after a panic of
|
||||
* previous kernel or not. This is determined by checking if previous kernel
|
||||
* has passed the elf core header address on command line.
|
||||
*
|
||||
* This is not just a test if CONFIG_CRASH_DUMP is enabled or not. It will
|
||||
* return 1 if CONFIG_CRASH_DUMP=y and if kernel is booting after a panic of
|
||||
* previous kernel.
|
||||
*/
|
||||
|
||||
static inline int is_kdump_kernel(void)
|
||||
{
|
||||
return (elfcorehdr_addr != ELFCORE_ADDR_MAX) ? 1 : 0;
|
||||
}
|
||||
|
||||
/* is_vmcore_usable() checks if the kernel is booting after a panic and
|
||||
* the vmcore region is usable.
|
||||
*
|
||||
* This makes use of the fact that due to alignment -2ULL is not
|
||||
* a valid pointer, much in the vain of IS_ERR(), except
|
||||
* dealing directly with an unsigned long long rather than a pointer.
|
||||
*/
|
||||
|
||||
static inline int is_vmcore_usable(void)
|
||||
{
|
||||
return is_kdump_kernel() && elfcorehdr_addr != ELFCORE_ADDR_ERR ? 1 : 0;
|
||||
}
|
||||
|
||||
/* vmcore_unusable() marks the vmcore as unusable,
|
||||
* without disturbing the logic of is_kdump_kernel()
|
||||
*/
|
||||
|
||||
static inline void vmcore_unusable(void)
|
||||
{
|
||||
if (is_kdump_kernel())
|
||||
elfcorehdr_addr = ELFCORE_ADDR_ERR;
|
||||
}
|
||||
#else /* !CONFIG_CRASH_DUMP */
|
||||
static inline int is_kdump_kernel(void) { return 0; }
|
||||
#endif /* CONFIG_CRASH_DUMP */
|
||||
|
|
|
|||
|
|
@ -90,6 +90,9 @@ int __must_check bus_for_each_drv(struct bus_type *bus,
|
|||
struct device_driver *start, void *data,
|
||||
int (*fn)(struct device_driver *, void *));
|
||||
|
||||
void bus_sort_breadthfirst(struct bus_type *bus,
|
||||
int (*compare)(const struct device *a,
|
||||
const struct device *b));
|
||||
/*
|
||||
* Bus notifiers: Get notified of addition/removal of devices
|
||||
* and binding/unbinding of drivers to devices.
|
||||
|
|
@ -502,7 +505,6 @@ extern struct device *device_create(struct class *cls, struct device *parent,
|
|||
dev_t devt, void *drvdata,
|
||||
const char *fmt, ...)
|
||||
__attribute__((format(printf, 5, 6)));
|
||||
#define device_create_drvdata device_create
|
||||
extern void device_destroy(struct class *cls, dev_t devt);
|
||||
|
||||
/*
|
||||
|
|
@ -551,7 +553,11 @@ extern const char *dev_driver_string(const struct device *dev);
|
|||
#define dev_info(dev, format, arg...) \
|
||||
dev_printk(KERN_INFO , dev , format , ## arg)
|
||||
|
||||
#ifdef DEBUG
|
||||
#if defined(CONFIG_DYNAMIC_PRINTK_DEBUG)
|
||||
#define dev_dbg(dev, format, ...) do { \
|
||||
dynamic_dev_dbg(dev, format, ##__VA_ARGS__); \
|
||||
} while (0)
|
||||
#elif defined(DEBUG)
|
||||
#define dev_dbg(dev, format, arg...) \
|
||||
dev_printk(KERN_DEBUG , dev , format , ## arg)
|
||||
#else
|
||||
|
|
@ -567,6 +573,14 @@ extern const char *dev_driver_string(const struct device *dev);
|
|||
({ if (0) dev_printk(KERN_DEBUG, dev, format, ##arg); 0; })
|
||||
#endif
|
||||
|
||||
/*
|
||||
* dev_WARN() acts like dev_printk(), but with the key difference
|
||||
* of using a WARN/WARN_ON to get the message out, including the
|
||||
* file/line information and a backtrace.
|
||||
*/
|
||||
#define dev_WARN(dev, format, arg...) \
|
||||
WARN(1, "Device: %s\n" format, dev_driver_string(dev), ## arg);
|
||||
|
||||
/* Create alias, so I can be autoloaded. */
|
||||
#define MODULE_ALIAS_CHARDEV(major,minor) \
|
||||
MODULE_ALIAS("char-major-" __stringify(major) "-" __stringify(minor))
|
||||
|
|
|
|||
157
include/linux/dma_remapping.h
Normal file
157
include/linux/dma_remapping.h
Normal file
|
|
@ -0,0 +1,157 @@
|
|||
#ifndef _DMA_REMAPPING_H
|
||||
#define _DMA_REMAPPING_H
|
||||
|
||||
/*
|
||||
* We need a fixed PAGE_SIZE of 4K irrespective of
|
||||
* arch PAGE_SIZE for IOMMU page tables.
|
||||
*/
|
||||
#define PAGE_SHIFT_4K (12)
|
||||
#define PAGE_SIZE_4K (1UL << PAGE_SHIFT_4K)
|
||||
#define PAGE_MASK_4K (((u64)-1) << PAGE_SHIFT_4K)
|
||||
#define PAGE_ALIGN_4K(addr) (((addr) + PAGE_SIZE_4K - 1) & PAGE_MASK_4K)
|
||||
|
||||
#define IOVA_PFN(addr) ((addr) >> PAGE_SHIFT_4K)
|
||||
#define DMA_32BIT_PFN IOVA_PFN(DMA_32BIT_MASK)
|
||||
#define DMA_64BIT_PFN IOVA_PFN(DMA_64BIT_MASK)
|
||||
|
||||
|
||||
/*
|
||||
* 0: Present
|
||||
* 1-11: Reserved
|
||||
* 12-63: Context Ptr (12 - (haw-1))
|
||||
* 64-127: Reserved
|
||||
*/
|
||||
struct root_entry {
|
||||
u64 val;
|
||||
u64 rsvd1;
|
||||
};
|
||||
#define ROOT_ENTRY_NR (PAGE_SIZE_4K/sizeof(struct root_entry))
|
||||
static inline bool root_present(struct root_entry *root)
|
||||
{
|
||||
return (root->val & 1);
|
||||
}
|
||||
static inline void set_root_present(struct root_entry *root)
|
||||
{
|
||||
root->val |= 1;
|
||||
}
|
||||
static inline void set_root_value(struct root_entry *root, unsigned long value)
|
||||
{
|
||||
root->val |= value & PAGE_MASK_4K;
|
||||
}
|
||||
|
||||
struct context_entry;
|
||||
static inline struct context_entry *
|
||||
get_context_addr_from_root(struct root_entry *root)
|
||||
{
|
||||
return (struct context_entry *)
|
||||
(root_present(root)?phys_to_virt(
|
||||
root->val & PAGE_MASK_4K):
|
||||
NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* low 64 bits:
|
||||
* 0: present
|
||||
* 1: fault processing disable
|
||||
* 2-3: translation type
|
||||
* 12-63: address space root
|
||||
* high 64 bits:
|
||||
* 0-2: address width
|
||||
* 3-6: aval
|
||||
* 8-23: domain id
|
||||
*/
|
||||
struct context_entry {
|
||||
u64 lo;
|
||||
u64 hi;
|
||||
};
|
||||
#define context_present(c) ((c).lo & 1)
|
||||
#define context_fault_disable(c) (((c).lo >> 1) & 1)
|
||||
#define context_translation_type(c) (((c).lo >> 2) & 3)
|
||||
#define context_address_root(c) ((c).lo & PAGE_MASK_4K)
|
||||
#define context_address_width(c) ((c).hi & 7)
|
||||
#define context_domain_id(c) (((c).hi >> 8) & ((1 << 16) - 1))
|
||||
|
||||
#define context_set_present(c) do {(c).lo |= 1;} while (0)
|
||||
#define context_set_fault_enable(c) \
|
||||
do {(c).lo &= (((u64)-1) << 2) | 1;} while (0)
|
||||
#define context_set_translation_type(c, val) \
|
||||
do { \
|
||||
(c).lo &= (((u64)-1) << 4) | 3; \
|
||||
(c).lo |= ((val) & 3) << 2; \
|
||||
} while (0)
|
||||
#define CONTEXT_TT_MULTI_LEVEL 0
|
||||
#define context_set_address_root(c, val) \
|
||||
do {(c).lo |= (val) & PAGE_MASK_4K;} while (0)
|
||||
#define context_set_address_width(c, val) do {(c).hi |= (val) & 7;} while (0)
|
||||
#define context_set_domain_id(c, val) \
|
||||
do {(c).hi |= ((val) & ((1 << 16) - 1)) << 8;} while (0)
|
||||
#define context_clear_entry(c) do {(c).lo = 0; (c).hi = 0;} while (0)
|
||||
|
||||
/*
|
||||
* 0: readable
|
||||
* 1: writable
|
||||
* 2-6: reserved
|
||||
* 7: super page
|
||||
* 8-11: available
|
||||
* 12-63: Host physcial address
|
||||
*/
|
||||
struct dma_pte {
|
||||
u64 val;
|
||||
};
|
||||
#define dma_clear_pte(p) do {(p).val = 0;} while (0)
|
||||
|
||||
#define DMA_PTE_READ (1)
|
||||
#define DMA_PTE_WRITE (2)
|
||||
|
||||
#define dma_set_pte_readable(p) do {(p).val |= DMA_PTE_READ;} while (0)
|
||||
#define dma_set_pte_writable(p) do {(p).val |= DMA_PTE_WRITE;} while (0)
|
||||
#define dma_set_pte_prot(p, prot) \
|
||||
do {(p).val = ((p).val & ~3) | ((prot) & 3); } while (0)
|
||||
#define dma_pte_addr(p) ((p).val & PAGE_MASK_4K)
|
||||
#define dma_set_pte_addr(p, addr) do {\
|
||||
(p).val |= ((addr) & PAGE_MASK_4K); } while (0)
|
||||
#define dma_pte_present(p) (((p).val & 3) != 0)
|
||||
|
||||
struct intel_iommu;
|
||||
|
||||
struct dmar_domain {
|
||||
int id; /* domain id */
|
||||
struct intel_iommu *iommu; /* back pointer to owning iommu */
|
||||
|
||||
struct list_head devices; /* all devices' list */
|
||||
struct iova_domain iovad; /* iova's that belong to this domain */
|
||||
|
||||
struct dma_pte *pgd; /* virtual address */
|
||||
spinlock_t mapping_lock; /* page table lock */
|
||||
int gaw; /* max guest address width */
|
||||
|
||||
/* adjusted guest address width, 0 is level 2 30-bit */
|
||||
int agaw;
|
||||
|
||||
#define DOMAIN_FLAG_MULTIPLE_DEVICES 1
|
||||
int flags;
|
||||
};
|
||||
|
||||
/* PCI domain-device relationship */
|
||||
struct device_domain_info {
|
||||
struct list_head link; /* link to domain siblings */
|
||||
struct list_head global; /* link to global list */
|
||||
u8 bus; /* PCI bus numer */
|
||||
u8 devfn; /* PCI devfn number */
|
||||
struct pci_dev *dev; /* it's NULL for PCIE-to-PCI bridge */
|
||||
struct dmar_domain *domain; /* pointer to domain */
|
||||
};
|
||||
|
||||
extern int init_dmars(void);
|
||||
extern void free_dmar_iommu(struct intel_iommu *iommu);
|
||||
|
||||
extern int dmar_disabled;
|
||||
|
||||
#ifndef CONFIG_DMAR_GFX_WA
|
||||
static inline void iommu_prepare_gfx_mapping(void)
|
||||
{
|
||||
return;
|
||||
}
|
||||
#endif /* !CONFIG_DMAR_GFX_WA */
|
||||
|
||||
#endif
|
||||
|
|
@ -45,7 +45,6 @@ extern struct list_head dmar_drhd_units;
|
|||
list_for_each_entry(drhd, &dmar_drhd_units, list)
|
||||
|
||||
extern int dmar_table_init(void);
|
||||
extern int early_dmar_detect(void);
|
||||
extern int dmar_dev_scope_init(void);
|
||||
|
||||
/* Intel IOMMU detection */
|
||||
|
|
|
|||
|
|
@ -166,6 +166,7 @@ typedef enum fe_modulation {
|
|||
VSB_16,
|
||||
PSK_8,
|
||||
APSK_16,
|
||||
APSK_32,
|
||||
DQPSK,
|
||||
} fe_modulation_t;
|
||||
|
||||
|
|
@ -295,6 +296,7 @@ typedef enum fe_delivery_system {
|
|||
SYS_DVBC_ANNEX_AC,
|
||||
SYS_DVBC_ANNEX_B,
|
||||
SYS_DVBT,
|
||||
SYS_DSS,
|
||||
SYS_DVBS,
|
||||
SYS_DVBS2,
|
||||
SYS_DVBH,
|
||||
|
|
|
|||
93
include/linux/dynamic_printk.h
Normal file
93
include/linux/dynamic_printk.h
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
#ifndef _DYNAMIC_PRINTK_H
|
||||
#define _DYNAMIC_PRINTK_H
|
||||
|
||||
#define DYNAMIC_DEBUG_HASH_BITS 6
|
||||
#define DEBUG_HASH_TABLE_SIZE (1 << DYNAMIC_DEBUG_HASH_BITS)
|
||||
|
||||
#define TYPE_BOOLEAN 1
|
||||
|
||||
#define DYNAMIC_ENABLED_ALL 0
|
||||
#define DYNAMIC_ENABLED_NONE 1
|
||||
#define DYNAMIC_ENABLED_SOME 2
|
||||
|
||||
extern int dynamic_enabled;
|
||||
|
||||
/* dynamic_printk_enabled, and dynamic_printk_enabled2 are bitmasks in which
|
||||
* bit n is set to 1 if any modname hashes into the bucket n, 0 otherwise. They
|
||||
* use independent hash functions, to reduce the chance of false positives.
|
||||
*/
|
||||
extern long long dynamic_printk_enabled;
|
||||
extern long long dynamic_printk_enabled2;
|
||||
|
||||
struct mod_debug {
|
||||
char *modname;
|
||||
char *logical_modname;
|
||||
char *flag_names;
|
||||
int type;
|
||||
int hash;
|
||||
int hash2;
|
||||
} __attribute__((aligned(8)));
|
||||
|
||||
int register_dynamic_debug_module(char *mod_name, int type, char *share_name,
|
||||
char *flags, int hash, int hash2);
|
||||
|
||||
#if defined(CONFIG_DYNAMIC_PRINTK_DEBUG)
|
||||
extern int unregister_dynamic_debug_module(char *mod_name);
|
||||
extern int __dynamic_dbg_enabled_helper(char *modname, int type,
|
||||
int value, int hash);
|
||||
|
||||
#define __dynamic_dbg_enabled(module, type, value, level, hash) ({ \
|
||||
int __ret = 0; \
|
||||
if (unlikely((dynamic_printk_enabled & (1LL << DEBUG_HASH)) && \
|
||||
(dynamic_printk_enabled2 & (1LL << DEBUG_HASH2)))) \
|
||||
__ret = __dynamic_dbg_enabled_helper(module, type, \
|
||||
value, hash);\
|
||||
__ret; })
|
||||
|
||||
#define dynamic_pr_debug(fmt, ...) do { \
|
||||
static char mod_name[] \
|
||||
__attribute__((section("__verbose_strings"))) \
|
||||
= KBUILD_MODNAME; \
|
||||
static struct mod_debug descriptor \
|
||||
__used \
|
||||
__attribute__((section("__verbose"), aligned(8))) = \
|
||||
{ mod_name, mod_name, NULL, TYPE_BOOLEAN, DEBUG_HASH, DEBUG_HASH2 };\
|
||||
if (__dynamic_dbg_enabled(KBUILD_MODNAME, TYPE_BOOLEAN, \
|
||||
0, 0, DEBUG_HASH)) \
|
||||
printk(KERN_DEBUG KBUILD_MODNAME ":" fmt, \
|
||||
##__VA_ARGS__); \
|
||||
} while (0)
|
||||
|
||||
#define dynamic_dev_dbg(dev, format, ...) do { \
|
||||
static char mod_name[] \
|
||||
__attribute__((section("__verbose_strings"))) \
|
||||
= KBUILD_MODNAME; \
|
||||
static struct mod_debug descriptor \
|
||||
__used \
|
||||
__attribute__((section("__verbose"), aligned(8))) = \
|
||||
{ mod_name, mod_name, NULL, TYPE_BOOLEAN, DEBUG_HASH, DEBUG_HASH2 };\
|
||||
if (__dynamic_dbg_enabled(KBUILD_MODNAME, TYPE_BOOLEAN, \
|
||||
0, 0, DEBUG_HASH)) \
|
||||
dev_printk(KERN_DEBUG, dev, \
|
||||
KBUILD_MODNAME ": " format, \
|
||||
##__VA_ARGS__); \
|
||||
} while (0)
|
||||
|
||||
#else
|
||||
|
||||
static inline int unregister_dynamic_debug_module(const char *mod_name)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int __dynamic_dbg_enabled_helper(char *modname, int type,
|
||||
int value, int hash)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define __dynamic_dbg_enabled(module, type, value, level, hash) ({ 0; })
|
||||
#define dynamic_pr_debug(fmt, ...) do { } while (0)
|
||||
#define dynamic_dev_dbg(dev, format, ...) do { } while (0)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
@ -208,6 +208,9 @@ typedef efi_status_t efi_set_virtual_address_map_t (unsigned long memory_map_siz
|
|||
#define EFI_GLOBAL_VARIABLE_GUID \
|
||||
EFI_GUID( 0x8be4df61, 0x93ca, 0x11d2, 0xaa, 0x0d, 0x00, 0xe0, 0x98, 0x03, 0x2b, 0x8c )
|
||||
|
||||
#define UV_SYSTEM_TABLE_GUID \
|
||||
EFI_GUID( 0x3b13a7d4, 0x633e, 0x11dd, 0x93, 0xec, 0xda, 0x25, 0x56, 0xd8, 0x95, 0x93 )
|
||||
|
||||
typedef struct {
|
||||
efi_guid_t guid;
|
||||
unsigned long table;
|
||||
|
|
@ -255,6 +258,7 @@ extern struct efi {
|
|||
unsigned long boot_info; /* boot info table */
|
||||
unsigned long hcdp; /* HCDP table */
|
||||
unsigned long uga; /* UGA table */
|
||||
unsigned long uv_systab; /* UV system table */
|
||||
efi_get_time_t *get_time;
|
||||
efi_set_time_t *set_time;
|
||||
efi_get_wakeup_time_t *get_wakeup_time;
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@
|
|||
#ifdef EXT2FS_DEBUG
|
||||
# define ext2_debug(f, a...) { \
|
||||
printk ("EXT2-fs DEBUG (%s, %d): %s:", \
|
||||
__FILE__, __LINE__, __FUNCTION__); \
|
||||
__FILE__, __LINE__, __func__); \
|
||||
printk (f, ## a); \
|
||||
}
|
||||
#else
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@
|
|||
#define ext3_debug(f, a...) \
|
||||
do { \
|
||||
printk (KERN_DEBUG "EXT3-fs DEBUG (%s, %d): %s:", \
|
||||
__FILE__, __LINE__, __FUNCTION__); \
|
||||
__FILE__, __LINE__, __func__); \
|
||||
printk (KERN_DEBUG f, ## a); \
|
||||
} while (0)
|
||||
#else
|
||||
|
|
@ -380,6 +380,8 @@ struct ext3_inode {
|
|||
#define EXT3_MOUNT_QUOTA 0x80000 /* Some quota option set */
|
||||
#define EXT3_MOUNT_USRQUOTA 0x100000 /* "old" user quota */
|
||||
#define EXT3_MOUNT_GRPQUOTA 0x200000 /* "old" group quota */
|
||||
#define EXT3_MOUNT_DATA_ERR_ABORT 0x400000 /* Abort on file data write
|
||||
* error in ordered mode */
|
||||
|
||||
/* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */
|
||||
#ifndef _LINUX_EXT2_FS_H
|
||||
|
|
@ -871,7 +873,7 @@ extern void ext3_update_dynamic_rev (struct super_block *sb);
|
|||
#define ext3_std_error(sb, errno) \
|
||||
do { \
|
||||
if ((errno)) \
|
||||
__ext3_std_error((sb), __FUNCTION__, (errno)); \
|
||||
__ext3_std_error((sb), __func__, (errno)); \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -137,17 +137,17 @@ int __ext3_journal_dirty_metadata(const char *where,
|
|||
handle_t *handle, struct buffer_head *bh);
|
||||
|
||||
#define ext3_journal_get_undo_access(handle, bh) \
|
||||
__ext3_journal_get_undo_access(__FUNCTION__, (handle), (bh))
|
||||
__ext3_journal_get_undo_access(__func__, (handle), (bh))
|
||||
#define ext3_journal_get_write_access(handle, bh) \
|
||||
__ext3_journal_get_write_access(__FUNCTION__, (handle), (bh))
|
||||
__ext3_journal_get_write_access(__func__, (handle), (bh))
|
||||
#define ext3_journal_revoke(handle, blocknr, bh) \
|
||||
__ext3_journal_revoke(__FUNCTION__, (handle), (blocknr), (bh))
|
||||
__ext3_journal_revoke(__func__, (handle), (blocknr), (bh))
|
||||
#define ext3_journal_get_create_access(handle, bh) \
|
||||
__ext3_journal_get_create_access(__FUNCTION__, (handle), (bh))
|
||||
__ext3_journal_get_create_access(__func__, (handle), (bh))
|
||||
#define ext3_journal_dirty_metadata(handle, bh) \
|
||||
__ext3_journal_dirty_metadata(__FUNCTION__, (handle), (bh))
|
||||
__ext3_journal_dirty_metadata(__func__, (handle), (bh))
|
||||
#define ext3_journal_forget(handle, bh) \
|
||||
__ext3_journal_forget(__FUNCTION__, (handle), (bh))
|
||||
__ext3_journal_forget(__func__, (handle), (bh))
|
||||
|
||||
int ext3_journal_dirty_data(handle_t *handle, struct buffer_head *bh);
|
||||
|
||||
|
|
@ -160,7 +160,7 @@ static inline handle_t *ext3_journal_start(struct inode *inode, int nblocks)
|
|||
}
|
||||
|
||||
#define ext3_journal_stop(handle) \
|
||||
__ext3_journal_stop(__FUNCTION__, (handle))
|
||||
__ext3_journal_stop(__func__, (handle))
|
||||
|
||||
static inline handle_t *ext3_journal_current_handle(void)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -808,6 +808,7 @@ struct fb_tile_ops {
|
|||
struct fb_info {
|
||||
int node;
|
||||
int flags;
|
||||
struct mutex lock; /* Lock for open/release/ioctl funcs */
|
||||
struct fb_var_screeninfo var; /* Current var */
|
||||
struct fb_fix_screeninfo fix; /* Current fix */
|
||||
struct fb_monspecs monspecs; /* Current Monitor specs */
|
||||
|
|
|
|||
|
|
@ -154,8 +154,13 @@ struct fw_cdev_event_iso_interrupt {
|
|||
* @request: Valid if @common.type == %FW_CDEV_EVENT_REQUEST
|
||||
* @iso_interrupt: Valid if @common.type == %FW_CDEV_EVENT_ISO_INTERRUPT
|
||||
*
|
||||
* Convenience union for userspace use. Events could be read(2) into a char
|
||||
* buffer and then cast to this union for further processing.
|
||||
* Convenience union for userspace use. Events could be read(2) into an
|
||||
* appropriately aligned char buffer and then cast to this union for further
|
||||
* processing. Note that for a request, response or iso_interrupt event,
|
||||
* the data[] or header[] may make the size of the full event larger than
|
||||
* sizeof(union fw_cdev_event). Also note that if you attempt to read(2)
|
||||
* an event into a buffer that is not large enough for it, the data that does
|
||||
* not fit will be discarded so that the next read(2) will return a new event.
|
||||
*/
|
||||
union fw_cdev_event {
|
||||
struct fw_cdev_event_common common;
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
#include <linux/sched.h>
|
||||
#include <linux/wait.h>
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
#ifdef CONFIG_FREEZER
|
||||
/*
|
||||
* Check if a process has been frozen
|
||||
*/
|
||||
|
|
@ -39,28 +39,18 @@ static inline void clear_freeze_flag(struct task_struct *p)
|
|||
clear_tsk_thread_flag(p, TIF_FREEZE);
|
||||
}
|
||||
|
||||
static inline bool should_send_signal(struct task_struct *p)
|
||||
{
|
||||
return !(p->flags & PF_FREEZER_NOSIG);
|
||||
}
|
||||
|
||||
/*
|
||||
* Wake up a frozen process
|
||||
*
|
||||
* task_lock() is taken to prevent the race with refrigerator() which may
|
||||
* occur if the freezing of tasks fails. Namely, without the lock, if the
|
||||
* freezing of tasks failed, thaw_tasks() might have run before a task in
|
||||
* refrigerator() could call frozen_process(), in which case the task would be
|
||||
* frozen and no one would thaw it.
|
||||
*/
|
||||
static inline int thaw_process(struct task_struct *p)
|
||||
{
|
||||
task_lock(p);
|
||||
if (frozen(p)) {
|
||||
p->flags &= ~PF_FROZEN;
|
||||
task_unlock(p);
|
||||
wake_up_process(p);
|
||||
return 1;
|
||||
}
|
||||
clear_freeze_flag(p);
|
||||
task_unlock(p);
|
||||
return 0;
|
||||
}
|
||||
extern int __thaw_process(struct task_struct *p);
|
||||
|
||||
/* Takes and releases task alloc lock using task_lock() */
|
||||
extern int thaw_process(struct task_struct *p);
|
||||
|
||||
extern void refrigerator(void);
|
||||
extern int freeze_processes(void);
|
||||
|
|
@ -75,6 +65,15 @@ static inline int try_to_freeze(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
extern bool freeze_task(struct task_struct *p, bool sig_only);
|
||||
extern void cancel_freezing(struct task_struct *p);
|
||||
|
||||
#ifdef CONFIG_CGROUP_FREEZER
|
||||
extern int cgroup_frozen(struct task_struct *task);
|
||||
#else /* !CONFIG_CGROUP_FREEZER */
|
||||
static inline int cgroup_frozen(struct task_struct *task) { return 0; }
|
||||
#endif /* !CONFIG_CGROUP_FREEZER */
|
||||
|
||||
/*
|
||||
* The PF_FREEZER_SKIP flag should be set by a vfork parent right before it
|
||||
* calls wait_for_completion(&vfork) and reset right after it returns from this
|
||||
|
|
@ -166,7 +165,7 @@ static inline void set_freezable_with_signal(void)
|
|||
} while (try_to_freeze()); \
|
||||
__retval; \
|
||||
})
|
||||
#else /* !CONFIG_PM_SLEEP */
|
||||
#else /* !CONFIG_FREEZER */
|
||||
static inline int frozen(struct task_struct *p) { return 0; }
|
||||
static inline int freezing(struct task_struct *p) { return 0; }
|
||||
static inline void set_freeze_flag(struct task_struct *p) {}
|
||||
|
|
@ -191,6 +190,6 @@ static inline void set_freezable_with_signal(void) {}
|
|||
#define wait_event_freezable_timeout(wq, condition, timeout) \
|
||||
wait_event_interruptible_timeout(wq, condition, timeout)
|
||||
|
||||
#endif /* !CONFIG_PM_SLEEP */
|
||||
#endif /* !CONFIG_FREEZER */
|
||||
|
||||
#endif /* FREEZER_H_INCLUDED */
|
||||
|
|
|
|||
|
|
@ -1,10 +1,14 @@
|
|||
#ifndef _LINUX_FTRACE_H
|
||||
#define _LINUX_FTRACE_H
|
||||
|
||||
#ifdef CONFIG_FTRACE
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/ktime.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/kallsyms.h>
|
||||
|
||||
#ifdef CONFIG_FTRACE
|
||||
|
||||
extern int ftrace_enabled;
|
||||
extern int
|
||||
|
|
@ -36,6 +40,7 @@ extern void ftrace_stub(unsigned long a0, unsigned long a1);
|
|||
# define register_ftrace_function(ops) do { } while (0)
|
||||
# define unregister_ftrace_function(ops) do { } while (0)
|
||||
# define clear_ftrace_function(ops) do { } while (0)
|
||||
static inline void ftrace_kill_atomic(void) { }
|
||||
#endif /* CONFIG_FTRACE */
|
||||
|
||||
#ifdef CONFIG_DYNAMIC_FTRACE
|
||||
|
|
@ -76,8 +81,10 @@ extern void mcount_call(void);
|
|||
|
||||
extern int skip_trace(unsigned long ip);
|
||||
|
||||
void ftrace_disable_daemon(void);
|
||||
void ftrace_enable_daemon(void);
|
||||
extern void ftrace_release(void *start, unsigned long size);
|
||||
|
||||
extern void ftrace_disable_daemon(void);
|
||||
extern void ftrace_enable_daemon(void);
|
||||
|
||||
#else
|
||||
# define skip_trace(ip) ({ 0; })
|
||||
|
|
@ -85,6 +92,7 @@ void ftrace_enable_daemon(void);
|
|||
# define ftrace_set_filter(buf, len, reset) do { } while (0)
|
||||
# define ftrace_disable_daemon() do { } while (0)
|
||||
# define ftrace_enable_daemon() do { } while (0)
|
||||
static inline void ftrace_release(void *start, unsigned long size) { }
|
||||
#endif /* CONFIG_DYNAMIC_FTRACE */
|
||||
|
||||
/* totally disable ftrace - can not re-enable after this */
|
||||
|
|
@ -98,9 +106,11 @@ static inline void tracer_disable(void)
|
|||
#endif
|
||||
}
|
||||
|
||||
/* Ftrace disable/restore without lock. Some synchronization mechanism
|
||||
/*
|
||||
* Ftrace disable/restore without lock. Some synchronization mechanism
|
||||
* must be used to prevent ftrace_enabled to be changed between
|
||||
* disable/restore. */
|
||||
* disable/restore.
|
||||
*/
|
||||
static inline int __ftrace_enabled_save(void)
|
||||
{
|
||||
#ifdef CONFIG_FTRACE
|
||||
|
|
@ -157,9 +167,71 @@ static inline void __ftrace_enabled_restore(int enabled)
|
|||
#ifdef CONFIG_TRACING
|
||||
extern void
|
||||
ftrace_special(unsigned long arg1, unsigned long arg2, unsigned long arg3);
|
||||
|
||||
/**
|
||||
* ftrace_printk - printf formatting in the ftrace buffer
|
||||
* @fmt: the printf format for printing
|
||||
*
|
||||
* Note: __ftrace_printk is an internal function for ftrace_printk and
|
||||
* the @ip is passed in via the ftrace_printk macro.
|
||||
*
|
||||
* This function allows a kernel developer to debug fast path sections
|
||||
* that printk is not appropriate for. By scattering in various
|
||||
* printk like tracing in the code, a developer can quickly see
|
||||
* where problems are occurring.
|
||||
*
|
||||
* This is intended as a debugging tool for the developer only.
|
||||
* Please refrain from leaving ftrace_printks scattered around in
|
||||
* your code.
|
||||
*/
|
||||
# define ftrace_printk(fmt...) __ftrace_printk(_THIS_IP_, fmt)
|
||||
extern int
|
||||
__ftrace_printk(unsigned long ip, const char *fmt, ...)
|
||||
__attribute__ ((format (printf, 2, 3)));
|
||||
extern void ftrace_dump(void);
|
||||
#else
|
||||
static inline void
|
||||
ftrace_special(unsigned long arg1, unsigned long arg2, unsigned long arg3) { }
|
||||
static inline int
|
||||
ftrace_printk(const char *fmt, ...) __attribute__ ((format (printf, 1, 0)));
|
||||
|
||||
static inline int
|
||||
ftrace_printk(const char *fmt, ...)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline void ftrace_dump(void) { }
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_FTRACE_MCOUNT_RECORD
|
||||
extern void ftrace_init(void);
|
||||
extern void ftrace_init_module(unsigned long *start, unsigned long *end);
|
||||
#else
|
||||
static inline void ftrace_init(void) { }
|
||||
static inline void
|
||||
ftrace_init_module(unsigned long *start, unsigned long *end) { }
|
||||
#endif
|
||||
|
||||
|
||||
struct boot_trace {
|
||||
pid_t caller;
|
||||
char func[KSYM_NAME_LEN];
|
||||
int result;
|
||||
unsigned long long duration; /* usecs */
|
||||
ktime_t calltime;
|
||||
ktime_t rettime;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_BOOT_TRACER
|
||||
extern void trace_boot(struct boot_trace *it, initcall_t fn);
|
||||
extern void start_boot_trace(void);
|
||||
extern void stop_boot_trace(void);
|
||||
#else
|
||||
static inline void trace_boot(struct boot_trace *it, initcall_t fn) { }
|
||||
static inline void start_boot_trace(void) { }
|
||||
static inline void stop_boot_trace(void) { }
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#endif /* _LINUX_FTRACE_H */
|
||||
|
|
|
|||
|
|
@ -17,8 +17,14 @@
|
|||
* - add lock_owner field to fuse_setattr_in, fuse_read_in and fuse_write_in
|
||||
* - add blksize field to fuse_attr
|
||||
* - add file flags field to fuse_read_in and fuse_write_in
|
||||
*
|
||||
* 7.10
|
||||
* - add nonseekable open flag
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_FUSE_H
|
||||
#define _LINUX_FUSE_H
|
||||
|
||||
#include <asm/types.h>
|
||||
#include <linux/major.h>
|
||||
|
||||
|
|
@ -26,7 +32,7 @@
|
|||
#define FUSE_KERNEL_VERSION 7
|
||||
|
||||
/** Minor version number of this interface */
|
||||
#define FUSE_KERNEL_MINOR_VERSION 9
|
||||
#define FUSE_KERNEL_MINOR_VERSION 10
|
||||
|
||||
/** The node ID of the root inode */
|
||||
#define FUSE_ROOT_ID 1
|
||||
|
|
@ -98,9 +104,11 @@ struct fuse_file_lock {
|
|||
*
|
||||
* FOPEN_DIRECT_IO: bypass page cache for this open file
|
||||
* FOPEN_KEEP_CACHE: don't invalidate the data cache on open
|
||||
* FOPEN_NONSEEKABLE: the file is not seekable
|
||||
*/
|
||||
#define FOPEN_DIRECT_IO (1 << 0)
|
||||
#define FOPEN_KEEP_CACHE (1 << 1)
|
||||
#define FOPEN_NONSEEKABLE (1 << 2)
|
||||
|
||||
/**
|
||||
* INIT request/reply flags
|
||||
|
|
@ -409,3 +417,5 @@ struct fuse_dirent {
|
|||
#define FUSE_DIRENT_ALIGN(x) (((x) + sizeof(__u64) - 1) & ~(sizeof(__u64) - 1))
|
||||
#define FUSE_DIRENT_SIZE(d) \
|
||||
FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen)
|
||||
|
||||
#endif /* _LINUX_FUSE_H */
|
||||
|
|
|
|||
|
|
@ -146,10 +146,11 @@ static inline void gameport_unpin_driver(struct gameport *gameport)
|
|||
mutex_unlock(&gameport->drv_mutex);
|
||||
}
|
||||
|
||||
void __gameport_register_driver(struct gameport_driver *drv, struct module *owner);
|
||||
static inline void gameport_register_driver(struct gameport_driver *drv)
|
||||
int __gameport_register_driver(struct gameport_driver *drv,
|
||||
struct module *owner, const char *mod_name);
|
||||
static inline int __must_check gameport_register_driver(struct gameport_driver *drv)
|
||||
{
|
||||
__gameport_register_driver(drv, THIS_MODULE);
|
||||
return __gameport_register_driver(drv, THIS_MODULE, KBUILD_MODNAME);
|
||||
}
|
||||
|
||||
void gameport_unregister_driver(struct gameport_driver *drv);
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@
|
|||
|
||||
#else
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/errno.h>
|
||||
|
||||
|
|
@ -32,6 +33,8 @@ static inline int gpio_request(unsigned gpio, const char *label)
|
|||
|
||||
static inline void gpio_free(unsigned gpio)
|
||||
{
|
||||
might_sleep();
|
||||
|
||||
/* GPIO can never have been requested */
|
||||
WARN_ON(1);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -125,12 +125,12 @@ struct hrtimer {
|
|||
enum hrtimer_restart (*function)(struct hrtimer *);
|
||||
struct hrtimer_clock_base *base;
|
||||
unsigned long state;
|
||||
enum hrtimer_cb_mode cb_mode;
|
||||
struct list_head cb_entry;
|
||||
enum hrtimer_cb_mode cb_mode;
|
||||
#ifdef CONFIG_TIMER_STATS
|
||||
int start_pid;
|
||||
void *start_site;
|
||||
char start_comm[16];
|
||||
int start_pid;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
|
@ -155,10 +155,8 @@ struct hrtimer_sleeper {
|
|||
* @first: pointer to the timer node which expires first
|
||||
* @resolution: the resolution of the clock, in nanoseconds
|
||||
* @get_time: function to retrieve the current time of the clock
|
||||
* @get_softirq_time: function to retrieve the current time from the softirq
|
||||
* @softirq_time: the time when running the hrtimer queue in the softirq
|
||||
* @offset: offset of this clock to the monotonic base
|
||||
* @reprogram: function to reprogram the timer event
|
||||
*/
|
||||
struct hrtimer_clock_base {
|
||||
struct hrtimer_cpu_base *cpu_base;
|
||||
|
|
@ -167,13 +165,9 @@ struct hrtimer_clock_base {
|
|||
struct rb_node *first;
|
||||
ktime_t resolution;
|
||||
ktime_t (*get_time)(void);
|
||||
ktime_t (*get_softirq_time)(void);
|
||||
ktime_t softirq_time;
|
||||
#ifdef CONFIG_HIGH_RES_TIMERS
|
||||
ktime_t offset;
|
||||
int (*reprogram)(struct hrtimer *t,
|
||||
struct hrtimer_clock_base *b,
|
||||
ktime_t n);
|
||||
#endif
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@
|
|||
#define I2C_DRIVERID_WM8775 69 /* wm8775 audio processor */
|
||||
#define I2C_DRIVERID_CS53L32A 70 /* cs53l32a audio processor */
|
||||
#define I2C_DRIVERID_CX25840 71 /* cx2584x video encoder */
|
||||
#define I2C_DRIVERID_SAA7127 72 /* saa7124 video encoder */
|
||||
#define I2C_DRIVERID_SAA7127 72 /* saa7127 video encoder */
|
||||
#define I2C_DRIVERID_SAA711X 73 /* saa711x video encoders */
|
||||
#define I2C_DRIVERID_AKITAIOEXP 74 /* IO Expander on Sharp SL-C1000 */
|
||||
#define I2C_DRIVERID_INFRARED 75 /* I2C InfraRed on Video boards */
|
||||
|
|
|
|||
339
include/linux/i2c/twl4030.h
Normal file
339
include/linux/i2c/twl4030.h
Normal file
|
|
@ -0,0 +1,339 @@
|
|||
/*
|
||||
* twl4030.h - header for TWL4030 PM and audio CODEC device
|
||||
*
|
||||
* Copyright (C) 2005-2006 Texas Instruments, Inc.
|
||||
*
|
||||
* Based on tlv320aic23.c:
|
||||
* Copyright (c) by Kai Svahn <kai.svahn@nokia.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.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __TWL4030_H_
|
||||
#define __TWL4030_H_
|
||||
|
||||
/*
|
||||
* Using the twl4030 core we address registers using a pair
|
||||
* { module id, relative register offset }
|
||||
* which that core then maps to the relevant
|
||||
* { i2c slave, absolute register address }
|
||||
*
|
||||
* The module IDs are meaningful only to the twl4030 core code,
|
||||
* which uses them as array indices to look up the first register
|
||||
* address each module uses within a given i2c slave.
|
||||
*/
|
||||
|
||||
/* Slave 0 (i2c address 0x48) */
|
||||
#define TWL4030_MODULE_USB 0x00
|
||||
|
||||
/* Slave 1 (i2c address 0x49) */
|
||||
#define TWL4030_MODULE_AUDIO_VOICE 0x01
|
||||
#define TWL4030_MODULE_GPIO 0x02
|
||||
#define TWL4030_MODULE_INTBR 0x03
|
||||
#define TWL4030_MODULE_PIH 0x04
|
||||
#define TWL4030_MODULE_TEST 0x05
|
||||
|
||||
/* Slave 2 (i2c address 0x4a) */
|
||||
#define TWL4030_MODULE_KEYPAD 0x06
|
||||
#define TWL4030_MODULE_MADC 0x07
|
||||
#define TWL4030_MODULE_INTERRUPTS 0x08
|
||||
#define TWL4030_MODULE_LED 0x09
|
||||
#define TWL4030_MODULE_MAIN_CHARGE 0x0A
|
||||
#define TWL4030_MODULE_PRECHARGE 0x0B
|
||||
#define TWL4030_MODULE_PWM0 0x0C
|
||||
#define TWL4030_MODULE_PWM1 0x0D
|
||||
#define TWL4030_MODULE_PWMA 0x0E
|
||||
#define TWL4030_MODULE_PWMB 0x0F
|
||||
|
||||
/* Slave 3 (i2c address 0x4b) */
|
||||
#define TWL4030_MODULE_BACKUP 0x10
|
||||
#define TWL4030_MODULE_INT 0x11
|
||||
#define TWL4030_MODULE_PM_MASTER 0x12
|
||||
#define TWL4030_MODULE_PM_RECEIVER 0x13
|
||||
#define TWL4030_MODULE_RTC 0x14
|
||||
#define TWL4030_MODULE_SECURED_REG 0x15
|
||||
|
||||
/*
|
||||
* Read and write single 8-bit registers
|
||||
*/
|
||||
int twl4030_i2c_write_u8(u8 mod_no, u8 val, u8 reg);
|
||||
int twl4030_i2c_read_u8(u8 mod_no, u8 *val, u8 reg);
|
||||
|
||||
/*
|
||||
* Read and write several 8-bit registers at once.
|
||||
*
|
||||
* IMPORTANT: For twl4030_i2c_write(), allocate num_bytes + 1
|
||||
* for the value, and populate your data starting at offset 1.
|
||||
*/
|
||||
int twl4030_i2c_write(u8 mod_no, u8 *value, u8 reg, u8 num_bytes);
|
||||
int twl4030_i2c_read(u8 mod_no, u8 *value, u8 reg, u8 num_bytes);
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* NOTE: at up to 1024 registers, this is a big chip.
|
||||
*
|
||||
* Avoid putting register declarations in this file, instead of into
|
||||
* a driver-private file, unless some of the registers in a block
|
||||
* need to be shared with other drivers. One example is blocks that
|
||||
* have Secondary IRQ Handler (SIH) registers.
|
||||
*/
|
||||
|
||||
#define TWL4030_SIH_CTRL_EXCLEN_MASK BIT(0)
|
||||
#define TWL4030_SIH_CTRL_PENDDIS_MASK BIT(1)
|
||||
#define TWL4030_SIH_CTRL_COR_MASK BIT(2)
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* GPIO Block Register offsets (use TWL4030_MODULE_GPIO)
|
||||
*/
|
||||
|
||||
#define REG_GPIODATAIN1 0x0
|
||||
#define REG_GPIODATAIN2 0x1
|
||||
#define REG_GPIODATAIN3 0x2
|
||||
#define REG_GPIODATADIR1 0x3
|
||||
#define REG_GPIODATADIR2 0x4
|
||||
#define REG_GPIODATADIR3 0x5
|
||||
#define REG_GPIODATAOUT1 0x6
|
||||
#define REG_GPIODATAOUT2 0x7
|
||||
#define REG_GPIODATAOUT3 0x8
|
||||
#define REG_CLEARGPIODATAOUT1 0x9
|
||||
#define REG_CLEARGPIODATAOUT2 0xA
|
||||
#define REG_CLEARGPIODATAOUT3 0xB
|
||||
#define REG_SETGPIODATAOUT1 0xC
|
||||
#define REG_SETGPIODATAOUT2 0xD
|
||||
#define REG_SETGPIODATAOUT3 0xE
|
||||
#define REG_GPIO_DEBEN1 0xF
|
||||
#define REG_GPIO_DEBEN2 0x10
|
||||
#define REG_GPIO_DEBEN3 0x11
|
||||
#define REG_GPIO_CTRL 0x12
|
||||
#define REG_GPIOPUPDCTR1 0x13
|
||||
#define REG_GPIOPUPDCTR2 0x14
|
||||
#define REG_GPIOPUPDCTR3 0x15
|
||||
#define REG_GPIOPUPDCTR4 0x16
|
||||
#define REG_GPIOPUPDCTR5 0x17
|
||||
#define REG_GPIO_ISR1A 0x19
|
||||
#define REG_GPIO_ISR2A 0x1A
|
||||
#define REG_GPIO_ISR3A 0x1B
|
||||
#define REG_GPIO_IMR1A 0x1C
|
||||
#define REG_GPIO_IMR2A 0x1D
|
||||
#define REG_GPIO_IMR3A 0x1E
|
||||
#define REG_GPIO_ISR1B 0x1F
|
||||
#define REG_GPIO_ISR2B 0x20
|
||||
#define REG_GPIO_ISR3B 0x21
|
||||
#define REG_GPIO_IMR1B 0x22
|
||||
#define REG_GPIO_IMR2B 0x23
|
||||
#define REG_GPIO_IMR3B 0x24
|
||||
#define REG_GPIO_EDR1 0x28
|
||||
#define REG_GPIO_EDR2 0x29
|
||||
#define REG_GPIO_EDR3 0x2A
|
||||
#define REG_GPIO_EDR4 0x2B
|
||||
#define REG_GPIO_EDR5 0x2C
|
||||
#define REG_GPIO_SIH_CTRL 0x2D
|
||||
|
||||
/* Up to 18 signals are available as GPIOs, when their
|
||||
* pins are not assigned to another use (such as ULPI/USB).
|
||||
*/
|
||||
#define TWL4030_GPIO_MAX 18
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* Keypad register offsets (use TWL4030_MODULE_KEYPAD)
|
||||
* ... SIH/interrupt only
|
||||
*/
|
||||
|
||||
#define TWL4030_KEYPAD_KEYP_ISR1 0x11
|
||||
#define TWL4030_KEYPAD_KEYP_IMR1 0x12
|
||||
#define TWL4030_KEYPAD_KEYP_ISR2 0x13
|
||||
#define TWL4030_KEYPAD_KEYP_IMR2 0x14
|
||||
#define TWL4030_KEYPAD_KEYP_SIR 0x15 /* test register */
|
||||
#define TWL4030_KEYPAD_KEYP_EDR 0x16
|
||||
#define TWL4030_KEYPAD_KEYP_SIH_CTRL 0x17
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* Multichannel ADC register offsets (use TWL4030_MODULE_MADC)
|
||||
* ... SIH/interrupt only
|
||||
*/
|
||||
|
||||
#define TWL4030_MADC_ISR1 0x61
|
||||
#define TWL4030_MADC_IMR1 0x62
|
||||
#define TWL4030_MADC_ISR2 0x63
|
||||
#define TWL4030_MADC_IMR2 0x64
|
||||
#define TWL4030_MADC_SIR 0x65 /* test register */
|
||||
#define TWL4030_MADC_EDR 0x66
|
||||
#define TWL4030_MADC_SIH_CTRL 0x67
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* Battery charger register offsets (use TWL4030_MODULE_INTERRUPTS)
|
||||
*/
|
||||
|
||||
#define TWL4030_INTERRUPTS_BCIISR1A 0x0
|
||||
#define TWL4030_INTERRUPTS_BCIISR2A 0x1
|
||||
#define TWL4030_INTERRUPTS_BCIIMR1A 0x2
|
||||
#define TWL4030_INTERRUPTS_BCIIMR2A 0x3
|
||||
#define TWL4030_INTERRUPTS_BCIISR1B 0x4
|
||||
#define TWL4030_INTERRUPTS_BCIISR2B 0x5
|
||||
#define TWL4030_INTERRUPTS_BCIIMR1B 0x6
|
||||
#define TWL4030_INTERRUPTS_BCIIMR2B 0x7
|
||||
#define TWL4030_INTERRUPTS_BCISIR1 0x8 /* test register */
|
||||
#define TWL4030_INTERRUPTS_BCISIR2 0x9 /* test register */
|
||||
#define TWL4030_INTERRUPTS_BCIEDR1 0xa
|
||||
#define TWL4030_INTERRUPTS_BCIEDR2 0xb
|
||||
#define TWL4030_INTERRUPTS_BCIEDR3 0xc
|
||||
#define TWL4030_INTERRUPTS_BCISIHCTRL 0xd
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* Power Interrupt block register offsets (use TWL4030_MODULE_INT)
|
||||
*/
|
||||
|
||||
#define TWL4030_INT_PWR_ISR1 0x0
|
||||
#define TWL4030_INT_PWR_IMR1 0x1
|
||||
#define TWL4030_INT_PWR_ISR2 0x2
|
||||
#define TWL4030_INT_PWR_IMR2 0x3
|
||||
#define TWL4030_INT_PWR_SIR 0x4 /* test register */
|
||||
#define TWL4030_INT_PWR_EDR1 0x5
|
||||
#define TWL4030_INT_PWR_EDR2 0x6
|
||||
#define TWL4030_INT_PWR_SIH_CTRL 0x7
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
struct twl4030_bci_platform_data {
|
||||
int *battery_tmp_tbl;
|
||||
unsigned int tblsize;
|
||||
};
|
||||
|
||||
/* TWL4030_GPIO_MAX (18) GPIOs, with interrupts */
|
||||
struct twl4030_gpio_platform_data {
|
||||
int gpio_base;
|
||||
unsigned irq_base, irq_end;
|
||||
|
||||
/* For gpio-N, bit (1 << N) in "pullups" is set if that pullup
|
||||
* should be enabled. Else, if that bit is set in "pulldowns",
|
||||
* that pulldown is enabled. Don't waste power by letting any
|
||||
* digital inputs float...
|
||||
*/
|
||||
u32 pullups;
|
||||
u32 pulldowns;
|
||||
|
||||
int (*setup)(struct device *dev,
|
||||
unsigned gpio, unsigned ngpio);
|
||||
int (*teardown)(struct device *dev,
|
||||
unsigned gpio, unsigned ngpio);
|
||||
};
|
||||
|
||||
struct twl4030_madc_platform_data {
|
||||
int irq_line;
|
||||
};
|
||||
|
||||
struct twl4030_keypad_data {
|
||||
int rows;
|
||||
int cols;
|
||||
int *keymap;
|
||||
int irq;
|
||||
unsigned int keymapsize;
|
||||
unsigned int rep:1;
|
||||
};
|
||||
|
||||
enum twl4030_usb_mode {
|
||||
T2_USB_MODE_ULPI = 1,
|
||||
T2_USB_MODE_CEA2011_3PIN = 2,
|
||||
};
|
||||
|
||||
struct twl4030_usb_data {
|
||||
enum twl4030_usb_mode usb_mode;
|
||||
};
|
||||
|
||||
struct twl4030_platform_data {
|
||||
unsigned irq_base, irq_end;
|
||||
struct twl4030_bci_platform_data *bci;
|
||||
struct twl4030_gpio_platform_data *gpio;
|
||||
struct twl4030_madc_platform_data *madc;
|
||||
struct twl4030_keypad_data *keypad;
|
||||
struct twl4030_usb_data *usb;
|
||||
|
||||
/* REVISIT more to come ... _nothing_ should be hard-wired */
|
||||
};
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* FIXME completely stop using TWL4030_IRQ_BASE ... instead, pass the
|
||||
* IRQ data to subsidiary devices using platform device resources.
|
||||
*/
|
||||
|
||||
/* IRQ information-need base */
|
||||
#include <mach/irqs.h>
|
||||
/* TWL4030 interrupts */
|
||||
|
||||
/* #define TWL4030_MODIRQ_GPIO (TWL4030_IRQ_BASE + 0) */
|
||||
#define TWL4030_MODIRQ_KEYPAD (TWL4030_IRQ_BASE + 1)
|
||||
#define TWL4030_MODIRQ_BCI (TWL4030_IRQ_BASE + 2)
|
||||
#define TWL4030_MODIRQ_MADC (TWL4030_IRQ_BASE + 3)
|
||||
/* #define TWL4030_MODIRQ_USB (TWL4030_IRQ_BASE + 4) */
|
||||
#define TWL4030_MODIRQ_PWR (TWL4030_IRQ_BASE + 5)
|
||||
|
||||
#define TWL4030_PWRIRQ_PWRBTN (TWL4030_PWR_IRQ_BASE + 0)
|
||||
#define TWL4030_PWRIRQ_CHG_PRES (TWL4030_PWR_IRQ_BASE + 1)
|
||||
#define TWL4030_PWRIRQ_USB_PRES (TWL4030_PWR_IRQ_BASE + 2)
|
||||
#define TWL4030_PWRIRQ_RTC (TWL4030_PWR_IRQ_BASE + 3)
|
||||
#define TWL4030_PWRIRQ_HOT_DIE (TWL4030_PWR_IRQ_BASE + 4)
|
||||
#define TWL4030_PWRIRQ_PWROK_TIMEOUT (TWL4030_PWR_IRQ_BASE + 5)
|
||||
#define TWL4030_PWRIRQ_MBCHG (TWL4030_PWR_IRQ_BASE + 6)
|
||||
#define TWL4030_PWRIRQ_SC_DETECT (TWL4030_PWR_IRQ_BASE + 7)
|
||||
|
||||
/* Rest are unsued currently*/
|
||||
|
||||
/* Offsets to Power Registers */
|
||||
#define TWL4030_VDAC_DEV_GRP 0x3B
|
||||
#define TWL4030_VDAC_DEDICATED 0x3E
|
||||
#define TWL4030_VAUX1_DEV_GRP 0x17
|
||||
#define TWL4030_VAUX1_DEDICATED 0x1A
|
||||
#define TWL4030_VAUX2_DEV_GRP 0x1B
|
||||
#define TWL4030_VAUX2_DEDICATED 0x1E
|
||||
#define TWL4030_VAUX3_DEV_GRP 0x1F
|
||||
#define TWL4030_VAUX3_DEDICATED 0x22
|
||||
|
||||
/* TWL4030 GPIO interrupt definitions */
|
||||
|
||||
#define TWL4030_GPIO_IRQ_NO(n) (TWL4030_GPIO_IRQ_BASE + (n))
|
||||
#define TWL4030_GPIO_IS_ENABLE 1
|
||||
|
||||
/*
|
||||
* Exported TWL4030 GPIO APIs
|
||||
*
|
||||
* WARNING -- use standard GPIO and IRQ calls instead; these will vanish.
|
||||
*/
|
||||
int twl4030_get_gpio_datain(int gpio);
|
||||
int twl4030_request_gpio(int gpio);
|
||||
int twl4030_set_gpio_debounce(int gpio, int enable);
|
||||
int twl4030_free_gpio(int gpio);
|
||||
|
||||
#if defined(CONFIG_TWL4030_BCI_BATTERY) || \
|
||||
defined(CONFIG_TWL4030_BCI_BATTERY_MODULE)
|
||||
extern int twl4030charger_usb_en(int enable);
|
||||
#else
|
||||
static inline int twl4030charger_usb_en(int enable) { return 0; }
|
||||
#endif
|
||||
|
||||
#endif /* End of __TWL4030_H */
|
||||
|
|
@ -570,7 +570,6 @@ struct i2o_controller {
|
|||
#endif
|
||||
spinlock_t lock; /* lock for controller
|
||||
configuration */
|
||||
|
||||
void *driver_data[I2O_MAX_DRIVERS]; /* storage for drivers */
|
||||
};
|
||||
|
||||
|
|
@ -691,289 +690,22 @@ static inline u32 i2o_dma_high(dma_addr_t dma_addr)
|
|||
};
|
||||
#endif
|
||||
|
||||
/**
|
||||
* i2o_sg_tablesize - Calculate the maximum number of elements in a SGL
|
||||
* @c: I2O controller for which the calculation should be done
|
||||
* @body_size: maximum body size used for message in 32-bit words.
|
||||
*
|
||||
* Return the maximum number of SG elements in a SG list.
|
||||
*/
|
||||
static inline u16 i2o_sg_tablesize(struct i2o_controller *c, u16 body_size)
|
||||
{
|
||||
i2o_status_block *sb = c->status_block.virt;
|
||||
u16 sg_count =
|
||||
(sb->inbound_frame_size - sizeof(struct i2o_message) / 4) -
|
||||
body_size;
|
||||
|
||||
if (c->pae_support) {
|
||||
/*
|
||||
* for 64-bit a SG attribute element must be added and each
|
||||
* SG element needs 12 bytes instead of 8.
|
||||
*/
|
||||
sg_count -= 2;
|
||||
sg_count /= 3;
|
||||
} else
|
||||
sg_count /= 2;
|
||||
|
||||
if (c->short_req && (sg_count > 8))
|
||||
sg_count = 8;
|
||||
|
||||
return sg_count;
|
||||
};
|
||||
|
||||
/**
|
||||
* i2o_dma_map_single - Map pointer to controller and fill in I2O message.
|
||||
* @c: I2O controller
|
||||
* @ptr: pointer to the data which should be mapped
|
||||
* @size: size of data in bytes
|
||||
* @direction: DMA_TO_DEVICE / DMA_FROM_DEVICE
|
||||
* @sg_ptr: pointer to the SG list inside the I2O message
|
||||
*
|
||||
* This function does all necessary DMA handling and also writes the I2O
|
||||
* SGL elements into the I2O message. For details on DMA handling see also
|
||||
* dma_map_single(). The pointer sg_ptr will only be set to the end of the
|
||||
* SG list if the allocation was successful.
|
||||
*
|
||||
* Returns DMA address which must be checked for failures using
|
||||
* dma_mapping_error().
|
||||
*/
|
||||
static inline dma_addr_t i2o_dma_map_single(struct i2o_controller *c, void *ptr,
|
||||
extern u16 i2o_sg_tablesize(struct i2o_controller *c, u16 body_size);
|
||||
extern dma_addr_t i2o_dma_map_single(struct i2o_controller *c, void *ptr,
|
||||
size_t size,
|
||||
enum dma_data_direction direction,
|
||||
u32 ** sg_ptr)
|
||||
{
|
||||
u32 sg_flags;
|
||||
u32 *mptr = *sg_ptr;
|
||||
dma_addr_t dma_addr;
|
||||
|
||||
switch (direction) {
|
||||
case DMA_TO_DEVICE:
|
||||
sg_flags = 0xd4000000;
|
||||
break;
|
||||
case DMA_FROM_DEVICE:
|
||||
sg_flags = 0xd0000000;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
dma_addr = dma_map_single(&c->pdev->dev, ptr, size, direction);
|
||||
if (!dma_mapping_error(&c->pdev->dev, dma_addr)) {
|
||||
#ifdef CONFIG_I2O_EXT_ADAPTEC_DMA64
|
||||
if ((sizeof(dma_addr_t) > 4) && c->pae_support) {
|
||||
*mptr++ = cpu_to_le32(0x7C020002);
|
||||
*mptr++ = cpu_to_le32(PAGE_SIZE);
|
||||
}
|
||||
#endif
|
||||
|
||||
*mptr++ = cpu_to_le32(sg_flags | size);
|
||||
*mptr++ = cpu_to_le32(i2o_dma_low(dma_addr));
|
||||
#ifdef CONFIG_I2O_EXT_ADAPTEC_DMA64
|
||||
if ((sizeof(dma_addr_t) > 4) && c->pae_support)
|
||||
*mptr++ = cpu_to_le32(i2o_dma_high(dma_addr));
|
||||
#endif
|
||||
*sg_ptr = mptr;
|
||||
}
|
||||
return dma_addr;
|
||||
};
|
||||
|
||||
/**
|
||||
* i2o_dma_map_sg - Map a SG List to controller and fill in I2O message.
|
||||
* @c: I2O controller
|
||||
* @sg: SG list to be mapped
|
||||
* @sg_count: number of elements in the SG list
|
||||
* @direction: DMA_TO_DEVICE / DMA_FROM_DEVICE
|
||||
* @sg_ptr: pointer to the SG list inside the I2O message
|
||||
*
|
||||
* This function does all necessary DMA handling and also writes the I2O
|
||||
* SGL elements into the I2O message. For details on DMA handling see also
|
||||
* dma_map_sg(). The pointer sg_ptr will only be set to the end of the SG
|
||||
* list if the allocation was successful.
|
||||
*
|
||||
* Returns 0 on failure or 1 on success.
|
||||
*/
|
||||
static inline int i2o_dma_map_sg(struct i2o_controller *c,
|
||||
u32 ** sg_ptr);
|
||||
extern int i2o_dma_map_sg(struct i2o_controller *c,
|
||||
struct scatterlist *sg, int sg_count,
|
||||
enum dma_data_direction direction,
|
||||
u32 ** sg_ptr)
|
||||
{
|
||||
u32 sg_flags;
|
||||
u32 *mptr = *sg_ptr;
|
||||
|
||||
switch (direction) {
|
||||
case DMA_TO_DEVICE:
|
||||
sg_flags = 0x14000000;
|
||||
break;
|
||||
case DMA_FROM_DEVICE:
|
||||
sg_flags = 0x10000000;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
sg_count = dma_map_sg(&c->pdev->dev, sg, sg_count, direction);
|
||||
if (!sg_count)
|
||||
return 0;
|
||||
|
||||
#ifdef CONFIG_I2O_EXT_ADAPTEC_DMA64
|
||||
if ((sizeof(dma_addr_t) > 4) && c->pae_support) {
|
||||
*mptr++ = cpu_to_le32(0x7C020002);
|
||||
*mptr++ = cpu_to_le32(PAGE_SIZE);
|
||||
}
|
||||
#endif
|
||||
|
||||
while (sg_count-- > 0) {
|
||||
if (!sg_count)
|
||||
sg_flags |= 0xC0000000;
|
||||
*mptr++ = cpu_to_le32(sg_flags | sg_dma_len(sg));
|
||||
*mptr++ = cpu_to_le32(i2o_dma_low(sg_dma_address(sg)));
|
||||
#ifdef CONFIG_I2O_EXT_ADAPTEC_DMA64
|
||||
if ((sizeof(dma_addr_t) > 4) && c->pae_support)
|
||||
*mptr++ = cpu_to_le32(i2o_dma_high(sg_dma_address(sg)));
|
||||
#endif
|
||||
sg = sg_next(sg);
|
||||
}
|
||||
*sg_ptr = mptr;
|
||||
|
||||
return 1;
|
||||
};
|
||||
|
||||
/**
|
||||
* i2o_dma_alloc - Allocate DMA memory
|
||||
* @dev: struct device pointer to the PCI device of the I2O controller
|
||||
* @addr: i2o_dma struct which should get the DMA buffer
|
||||
* @len: length of the new DMA memory
|
||||
* @gfp_mask: GFP mask
|
||||
*
|
||||
* Allocate a coherent DMA memory and write the pointers into addr.
|
||||
*
|
||||
* Returns 0 on success or -ENOMEM on failure.
|
||||
*/
|
||||
static inline int i2o_dma_alloc(struct device *dev, struct i2o_dma *addr,
|
||||
size_t len, gfp_t gfp_mask)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(dev);
|
||||
int dma_64 = 0;
|
||||
|
||||
if ((sizeof(dma_addr_t) > 4) && (pdev->dma_mask == DMA_64BIT_MASK)) {
|
||||
dma_64 = 1;
|
||||
if (pci_set_dma_mask(pdev, DMA_32BIT_MASK))
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
addr->virt = dma_alloc_coherent(dev, len, &addr->phys, gfp_mask);
|
||||
|
||||
if ((sizeof(dma_addr_t) > 4) && dma_64)
|
||||
if (pci_set_dma_mask(pdev, DMA_64BIT_MASK))
|
||||
printk(KERN_WARNING "i2o: unable to set 64-bit DMA");
|
||||
|
||||
if (!addr->virt)
|
||||
return -ENOMEM;
|
||||
|
||||
memset(addr->virt, 0, len);
|
||||
addr->len = len;
|
||||
|
||||
return 0;
|
||||
};
|
||||
|
||||
/**
|
||||
* i2o_dma_free - Free DMA memory
|
||||
* @dev: struct device pointer to the PCI device of the I2O controller
|
||||
* @addr: i2o_dma struct which contains the DMA buffer
|
||||
*
|
||||
* Free a coherent DMA memory and set virtual address of addr to NULL.
|
||||
*/
|
||||
static inline void i2o_dma_free(struct device *dev, struct i2o_dma *addr)
|
||||
{
|
||||
if (addr->virt) {
|
||||
if (addr->phys)
|
||||
dma_free_coherent(dev, addr->len, addr->virt,
|
||||
addr->phys);
|
||||
else
|
||||
kfree(addr->virt);
|
||||
addr->virt = NULL;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* i2o_dma_realloc - Realloc DMA memory
|
||||
* @dev: struct device pointer to the PCI device of the I2O controller
|
||||
* @addr: pointer to a i2o_dma struct DMA buffer
|
||||
* @len: new length of memory
|
||||
* @gfp_mask: GFP mask
|
||||
*
|
||||
* If there was something allocated in the addr, free it first. If len > 0
|
||||
* than try to allocate it and write the addresses back to the addr
|
||||
* structure. If len == 0 set the virtual address to NULL.
|
||||
*
|
||||
* Returns the 0 on success or negative error code on failure.
|
||||
*/
|
||||
static inline int i2o_dma_realloc(struct device *dev, struct i2o_dma *addr,
|
||||
size_t len, gfp_t gfp_mask)
|
||||
{
|
||||
i2o_dma_free(dev, addr);
|
||||
|
||||
if (len)
|
||||
return i2o_dma_alloc(dev, addr, len, gfp_mask);
|
||||
|
||||
return 0;
|
||||
};
|
||||
|
||||
/*
|
||||
* i2o_pool_alloc - Allocate an slab cache and mempool
|
||||
* @mempool: pointer to struct i2o_pool to write data into.
|
||||
* @name: name which is used to identify cache
|
||||
* @size: size of each object
|
||||
* @min_nr: minimum number of objects
|
||||
*
|
||||
* First allocates a slab cache with name and size. Then allocates a
|
||||
* mempool which uses the slab cache for allocation and freeing.
|
||||
*
|
||||
* Returns 0 on success or negative error code on failure.
|
||||
*/
|
||||
static inline int i2o_pool_alloc(struct i2o_pool *pool, const char *name,
|
||||
size_t size, int min_nr)
|
||||
{
|
||||
pool->name = kmalloc(strlen(name) + 1, GFP_KERNEL);
|
||||
if (!pool->name)
|
||||
goto exit;
|
||||
strcpy(pool->name, name);
|
||||
|
||||
pool->slab =
|
||||
kmem_cache_create(pool->name, size, 0, SLAB_HWCACHE_ALIGN, NULL);
|
||||
if (!pool->slab)
|
||||
goto free_name;
|
||||
|
||||
pool->mempool = mempool_create_slab_pool(min_nr, pool->slab);
|
||||
if (!pool->mempool)
|
||||
goto free_slab;
|
||||
|
||||
return 0;
|
||||
|
||||
free_slab:
|
||||
kmem_cache_destroy(pool->slab);
|
||||
|
||||
free_name:
|
||||
kfree(pool->name);
|
||||
|
||||
exit:
|
||||
return -ENOMEM;
|
||||
};
|
||||
|
||||
/*
|
||||
* i2o_pool_free - Free slab cache and mempool again
|
||||
* @mempool: pointer to struct i2o_pool which should be freed
|
||||
*
|
||||
* Note that you have to return all objects to the mempool again before
|
||||
* calling i2o_pool_free().
|
||||
*/
|
||||
static inline void i2o_pool_free(struct i2o_pool *pool)
|
||||
{
|
||||
mempool_destroy(pool->mempool);
|
||||
kmem_cache_destroy(pool->slab);
|
||||
kfree(pool->name);
|
||||
};
|
||||
|
||||
u32 ** sg_ptr);
|
||||
extern int i2o_dma_alloc(struct device *dev, struct i2o_dma *addr, size_t len);
|
||||
extern void i2o_dma_free(struct device *dev, struct i2o_dma *addr);
|
||||
extern int i2o_dma_realloc(struct device *dev, struct i2o_dma *addr,
|
||||
size_t len);
|
||||
extern int i2o_pool_alloc(struct i2o_pool *pool, const char *name,
|
||||
size_t size, int min_nr);
|
||||
extern void i2o_pool_free(struct i2o_pool *pool);
|
||||
/* I2O driver (OSM) functions */
|
||||
extern int i2o_driver_register(struct i2o_driver *);
|
||||
extern void i2o_driver_unregister(struct i2o_driver *);
|
||||
|
|
|
|||
|
|
@ -40,16 +40,18 @@ struct icmp6hdr {
|
|||
struct icmpv6_nd_ra {
|
||||
__u8 hop_limit;
|
||||
#if defined(__LITTLE_ENDIAN_BITFIELD)
|
||||
__u8 reserved:4,
|
||||
__u8 reserved:3,
|
||||
router_pref:2,
|
||||
home_agent:1,
|
||||
other:1,
|
||||
managed:1;
|
||||
|
||||
#elif defined(__BIG_ENDIAN_BITFIELD)
|
||||
__u8 managed:1,
|
||||
other:1,
|
||||
home_agent:1,
|
||||
router_pref:2,
|
||||
reserved:4;
|
||||
reserved:3;
|
||||
#else
|
||||
#error "Please fix <asm/byteorder.h>"
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -461,12 +461,26 @@ struct ide_acpi_drive_link;
|
|||
struct ide_acpi_hwif_link;
|
||||
#endif
|
||||
|
||||
struct ide_drive_s;
|
||||
|
||||
struct ide_disk_ops {
|
||||
int (*check)(struct ide_drive_s *, const char *);
|
||||
int (*get_capacity)(struct ide_drive_s *);
|
||||
void (*setup)(struct ide_drive_s *);
|
||||
void (*flush)(struct ide_drive_s *);
|
||||
int (*init_media)(struct ide_drive_s *, struct gendisk *);
|
||||
int (*set_doorlock)(struct ide_drive_s *, struct gendisk *,
|
||||
int);
|
||||
ide_startstop_t (*do_request)(struct ide_drive_s *, struct request *,
|
||||
sector_t);
|
||||
int (*end_request)(struct ide_drive_s *, int, int);
|
||||
int (*ioctl)(struct ide_drive_s *, struct inode *,
|
||||
struct file *, unsigned int, unsigned long);
|
||||
};
|
||||
|
||||
/* ATAPI device flags */
|
||||
enum {
|
||||
IDE_AFLAG_DRQ_INTERRUPT = (1 << 0),
|
||||
IDE_AFLAG_MEDIA_CHANGED = (1 << 1),
|
||||
/* Drive cannot lock the door. */
|
||||
IDE_AFLAG_NO_DOORLOCK = (1 << 2),
|
||||
|
||||
/* ide-cd */
|
||||
/* Drive cannot eject the disc. */
|
||||
|
|
@ -498,14 +512,10 @@ enum {
|
|||
IDE_AFLAG_LE_SPEED_FIELDS = (1 << 17),
|
||||
|
||||
/* ide-floppy */
|
||||
/* Format in progress */
|
||||
IDE_AFLAG_FORMAT_IN_PROGRESS = (1 << 18),
|
||||
/* Avoid commands not supported in Clik drive */
|
||||
IDE_AFLAG_CLIK_DRIVE = (1 << 19),
|
||||
/* Requires BH algorithm for packets */
|
||||
IDE_AFLAG_ZIP_DRIVE = (1 << 20),
|
||||
/* Write protect */
|
||||
IDE_AFLAG_WP = (1 << 21),
|
||||
/* Supports format progress report */
|
||||
IDE_AFLAG_SRFP = (1 << 22),
|
||||
|
||||
|
|
@ -578,7 +588,11 @@ enum {
|
|||
/* don't unload heads */
|
||||
IDE_DFLAG_NO_UNLOAD = (1 << 27),
|
||||
/* heads unloaded, please don't reset port */
|
||||
IDE_DFLAG_PARKED = (1 << 28)
|
||||
IDE_DFLAG_PARKED = (1 << 28),
|
||||
IDE_DFLAG_MEDIA_CHANGED = (1 << 29),
|
||||
/* write protect */
|
||||
IDE_DFLAG_WP = (1 << 30),
|
||||
IDE_DFLAG_FORMAT_IN_PROGRESS = (1 << 31),
|
||||
};
|
||||
|
||||
struct ide_drive_s {
|
||||
|
|
@ -597,6 +611,8 @@ struct ide_drive_s {
|
|||
#endif
|
||||
struct hwif_s *hwif; /* actually (ide_hwif_t *) */
|
||||
|
||||
const struct ide_disk_ops *disk_ops;
|
||||
|
||||
unsigned long dev_flags;
|
||||
|
||||
unsigned long sleep; /* sleep until this time */
|
||||
|
|
@ -1123,8 +1139,8 @@ struct ide_driver_s {
|
|||
void (*resume)(ide_drive_t *);
|
||||
void (*shutdown)(ide_drive_t *);
|
||||
#ifdef CONFIG_IDE_PROC_FS
|
||||
ide_proc_entry_t *proc;
|
||||
const struct ide_proc_devset *settings;
|
||||
ide_proc_entry_t * (*proc_entries)(ide_drive_t *);
|
||||
const struct ide_proc_devset * (*proc_devsets)(ide_drive_t *);
|
||||
#endif
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@
|
|||
|
||||
/* These are for everybody (although not all archs will actually
|
||||
discard it in modules) */
|
||||
#define __init __section(.init.text) __cold
|
||||
#define __init __section(.init.text) __cold notrace
|
||||
#define __initdata __section(.init.data)
|
||||
#define __initconst __section(.init.rodata)
|
||||
#define __exitdata __section(.exit.data)
|
||||
|
|
@ -233,9 +233,6 @@ struct obs_kernel_param {
|
|||
__attribute__((aligned((sizeof(long))))) \
|
||||
= { __setup_str_##unique_id, fn, early }
|
||||
|
||||
#define __setup_null_param(str, unique_id) \
|
||||
__setup_param(str, unique_id, NULL, 0)
|
||||
|
||||
#define __setup(str, fn) \
|
||||
__setup_param(str, fn, fn, 0)
|
||||
|
||||
|
|
@ -296,7 +293,6 @@ void __init parse_early_param(void);
|
|||
void cleanup_module(void) __attribute__((alias(#exitfn)));
|
||||
|
||||
#define __setup_param(str, unique_id, fn) /* nothing */
|
||||
#define __setup_null_param(str, unique_id) /* nothing */
|
||||
#define __setup(str, func) /* nothing */
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -577,9 +577,22 @@ struct input_absinfo {
|
|||
#define KEY_BRL_DOT9 0x1f9
|
||||
#define KEY_BRL_DOT10 0x1fa
|
||||
|
||||
#define KEY_NUMERIC_0 0x200 /* used by phones, remote controls, */
|
||||
#define KEY_NUMERIC_1 0x201 /* and other keypads */
|
||||
#define KEY_NUMERIC_2 0x202
|
||||
#define KEY_NUMERIC_3 0x203
|
||||
#define KEY_NUMERIC_4 0x204
|
||||
#define KEY_NUMERIC_5 0x205
|
||||
#define KEY_NUMERIC_6 0x206
|
||||
#define KEY_NUMERIC_7 0x207
|
||||
#define KEY_NUMERIC_8 0x208
|
||||
#define KEY_NUMERIC_9 0x209
|
||||
#define KEY_NUMERIC_STAR 0x20a
|
||||
#define KEY_NUMERIC_POUND 0x20b
|
||||
|
||||
/* We avoid low common keys in module aliases so they don't get huge. */
|
||||
#define KEY_MIN_INTERESTING KEY_MUTE
|
||||
#define KEY_MAX 0x1ff
|
||||
#define KEY_MAX 0x2ff
|
||||
#define KEY_CNT (KEY_MAX+1)
|
||||
|
||||
/*
|
||||
|
|
|
|||
327
include/linux/intel-iommu.h
Normal file
327
include/linux/intel-iommu.h
Normal file
|
|
@ -0,0 +1,327 @@
|
|||
/*
|
||||
* Copyright (c) 2006, Intel Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
||||
* Place - Suite 330, Boston, MA 02111-1307 USA.
|
||||
*
|
||||
* Copyright (C) 2006-2008 Intel Corporation
|
||||
* Author: Ashok Raj <ashok.raj@intel.com>
|
||||
* Author: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
|
||||
*/
|
||||
|
||||
#ifndef _INTEL_IOMMU_H_
|
||||
#define _INTEL_IOMMU_H_
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/msi.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/iova.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/dma_remapping.h>
|
||||
#include <asm/cacheflush.h>
|
||||
|
||||
/*
|
||||
* Intel IOMMU register specification per version 1.0 public spec.
|
||||
*/
|
||||
|
||||
#define DMAR_VER_REG 0x0 /* Arch version supported by this IOMMU */
|
||||
#define DMAR_CAP_REG 0x8 /* Hardware supported capabilities */
|
||||
#define DMAR_ECAP_REG 0x10 /* Extended capabilities supported */
|
||||
#define DMAR_GCMD_REG 0x18 /* Global command register */
|
||||
#define DMAR_GSTS_REG 0x1c /* Global status register */
|
||||
#define DMAR_RTADDR_REG 0x20 /* Root entry table */
|
||||
#define DMAR_CCMD_REG 0x28 /* Context command reg */
|
||||
#define DMAR_FSTS_REG 0x34 /* Fault Status register */
|
||||
#define DMAR_FECTL_REG 0x38 /* Fault control register */
|
||||
#define DMAR_FEDATA_REG 0x3c /* Fault event interrupt data register */
|
||||
#define DMAR_FEADDR_REG 0x40 /* Fault event interrupt addr register */
|
||||
#define DMAR_FEUADDR_REG 0x44 /* Upper address register */
|
||||
#define DMAR_AFLOG_REG 0x58 /* Advanced Fault control */
|
||||
#define DMAR_PMEN_REG 0x64 /* Enable Protected Memory Region */
|
||||
#define DMAR_PLMBASE_REG 0x68 /* PMRR Low addr */
|
||||
#define DMAR_PLMLIMIT_REG 0x6c /* PMRR low limit */
|
||||
#define DMAR_PHMBASE_REG 0x70 /* pmrr high base addr */
|
||||
#define DMAR_PHMLIMIT_REG 0x78 /* pmrr high limit */
|
||||
#define DMAR_IQH_REG 0x80 /* Invalidation queue head register */
|
||||
#define DMAR_IQT_REG 0x88 /* Invalidation queue tail register */
|
||||
#define DMAR_IQA_REG 0x90 /* Invalidation queue addr register */
|
||||
#define DMAR_ICS_REG 0x98 /* Invalidation complete status register */
|
||||
#define DMAR_IRTA_REG 0xb8 /* Interrupt remapping table addr register */
|
||||
|
||||
#define OFFSET_STRIDE (9)
|
||||
/*
|
||||
#define dmar_readl(dmar, reg) readl(dmar + reg)
|
||||
#define dmar_readq(dmar, reg) ({ \
|
||||
u32 lo, hi; \
|
||||
lo = readl(dmar + reg); \
|
||||
hi = readl(dmar + reg + 4); \
|
||||
(((u64) hi) << 32) + lo; })
|
||||
*/
|
||||
static inline u64 dmar_readq(void __iomem *addr)
|
||||
{
|
||||
u32 lo, hi;
|
||||
lo = readl(addr);
|
||||
hi = readl(addr + 4);
|
||||
return (((u64) hi) << 32) + lo;
|
||||
}
|
||||
|
||||
static inline void dmar_writeq(void __iomem *addr, u64 val)
|
||||
{
|
||||
writel((u32)val, addr);
|
||||
writel((u32)(val >> 32), addr + 4);
|
||||
}
|
||||
|
||||
#define DMAR_VER_MAJOR(v) (((v) & 0xf0) >> 4)
|
||||
#define DMAR_VER_MINOR(v) ((v) & 0x0f)
|
||||
|
||||
/*
|
||||
* Decoding Capability Register
|
||||
*/
|
||||
#define cap_read_drain(c) (((c) >> 55) & 1)
|
||||
#define cap_write_drain(c) (((c) >> 54) & 1)
|
||||
#define cap_max_amask_val(c) (((c) >> 48) & 0x3f)
|
||||
#define cap_num_fault_regs(c) ((((c) >> 40) & 0xff) + 1)
|
||||
#define cap_pgsel_inv(c) (((c) >> 39) & 1)
|
||||
|
||||
#define cap_super_page_val(c) (((c) >> 34) & 0xf)
|
||||
#define cap_super_offset(c) (((find_first_bit(&cap_super_page_val(c), 4)) \
|
||||
* OFFSET_STRIDE) + 21)
|
||||
|
||||
#define cap_fault_reg_offset(c) ((((c) >> 24) & 0x3ff) * 16)
|
||||
#define cap_max_fault_reg_offset(c) \
|
||||
(cap_fault_reg_offset(c) + cap_num_fault_regs(c) * 16)
|
||||
|
||||
#define cap_zlr(c) (((c) >> 22) & 1)
|
||||
#define cap_isoch(c) (((c) >> 23) & 1)
|
||||
#define cap_mgaw(c) ((((c) >> 16) & 0x3f) + 1)
|
||||
#define cap_sagaw(c) (((c) >> 8) & 0x1f)
|
||||
#define cap_caching_mode(c) (((c) >> 7) & 1)
|
||||
#define cap_phmr(c) (((c) >> 6) & 1)
|
||||
#define cap_plmr(c) (((c) >> 5) & 1)
|
||||
#define cap_rwbf(c) (((c) >> 4) & 1)
|
||||
#define cap_afl(c) (((c) >> 3) & 1)
|
||||
#define cap_ndoms(c) (((unsigned long)1) << (4 + 2 * ((c) & 0x7)))
|
||||
/*
|
||||
* Extended Capability Register
|
||||
*/
|
||||
|
||||
#define ecap_niotlb_iunits(e) ((((e) >> 24) & 0xff) + 1)
|
||||
#define ecap_iotlb_offset(e) ((((e) >> 8) & 0x3ff) * 16)
|
||||
#define ecap_max_iotlb_offset(e) \
|
||||
(ecap_iotlb_offset(e) + ecap_niotlb_iunits(e) * 16)
|
||||
#define ecap_coherent(e) ((e) & 0x1)
|
||||
#define ecap_qis(e) ((e) & 0x2)
|
||||
#define ecap_eim_support(e) ((e >> 4) & 0x1)
|
||||
#define ecap_ir_support(e) ((e >> 3) & 0x1)
|
||||
#define ecap_max_handle_mask(e) ((e >> 20) & 0xf)
|
||||
|
||||
|
||||
/* IOTLB_REG */
|
||||
#define DMA_TLB_GLOBAL_FLUSH (((u64)1) << 60)
|
||||
#define DMA_TLB_DSI_FLUSH (((u64)2) << 60)
|
||||
#define DMA_TLB_PSI_FLUSH (((u64)3) << 60)
|
||||
#define DMA_TLB_IIRG(type) ((type >> 60) & 7)
|
||||
#define DMA_TLB_IAIG(val) (((val) >> 57) & 7)
|
||||
#define DMA_TLB_READ_DRAIN (((u64)1) << 49)
|
||||
#define DMA_TLB_WRITE_DRAIN (((u64)1) << 48)
|
||||
#define DMA_TLB_DID(id) (((u64)((id) & 0xffff)) << 32)
|
||||
#define DMA_TLB_IVT (((u64)1) << 63)
|
||||
#define DMA_TLB_IH_NONLEAF (((u64)1) << 6)
|
||||
#define DMA_TLB_MAX_SIZE (0x3f)
|
||||
|
||||
/* INVALID_DESC */
|
||||
#define DMA_ID_TLB_GLOBAL_FLUSH (((u64)1) << 3)
|
||||
#define DMA_ID_TLB_DSI_FLUSH (((u64)2) << 3)
|
||||
#define DMA_ID_TLB_PSI_FLUSH (((u64)3) << 3)
|
||||
#define DMA_ID_TLB_READ_DRAIN (((u64)1) << 7)
|
||||
#define DMA_ID_TLB_WRITE_DRAIN (((u64)1) << 6)
|
||||
#define DMA_ID_TLB_DID(id) (((u64)((id & 0xffff) << 16)))
|
||||
#define DMA_ID_TLB_IH_NONLEAF (((u64)1) << 6)
|
||||
#define DMA_ID_TLB_ADDR(addr) (addr)
|
||||
#define DMA_ID_TLB_ADDR_MASK(mask) (mask)
|
||||
|
||||
/* PMEN_REG */
|
||||
#define DMA_PMEN_EPM (((u32)1)<<31)
|
||||
#define DMA_PMEN_PRS (((u32)1)<<0)
|
||||
|
||||
/* GCMD_REG */
|
||||
#define DMA_GCMD_TE (((u32)1) << 31)
|
||||
#define DMA_GCMD_SRTP (((u32)1) << 30)
|
||||
#define DMA_GCMD_SFL (((u32)1) << 29)
|
||||
#define DMA_GCMD_EAFL (((u32)1) << 28)
|
||||
#define DMA_GCMD_WBF (((u32)1) << 27)
|
||||
#define DMA_GCMD_QIE (((u32)1) << 26)
|
||||
#define DMA_GCMD_SIRTP (((u32)1) << 24)
|
||||
#define DMA_GCMD_IRE (((u32) 1) << 25)
|
||||
|
||||
/* GSTS_REG */
|
||||
#define DMA_GSTS_TES (((u32)1) << 31)
|
||||
#define DMA_GSTS_RTPS (((u32)1) << 30)
|
||||
#define DMA_GSTS_FLS (((u32)1) << 29)
|
||||
#define DMA_GSTS_AFLS (((u32)1) << 28)
|
||||
#define DMA_GSTS_WBFS (((u32)1) << 27)
|
||||
#define DMA_GSTS_QIES (((u32)1) << 26)
|
||||
#define DMA_GSTS_IRTPS (((u32)1) << 24)
|
||||
#define DMA_GSTS_IRES (((u32)1) << 25)
|
||||
|
||||
/* CCMD_REG */
|
||||
#define DMA_CCMD_ICC (((u64)1) << 63)
|
||||
#define DMA_CCMD_GLOBAL_INVL (((u64)1) << 61)
|
||||
#define DMA_CCMD_DOMAIN_INVL (((u64)2) << 61)
|
||||
#define DMA_CCMD_DEVICE_INVL (((u64)3) << 61)
|
||||
#define DMA_CCMD_FM(m) (((u64)((m) & 0x3)) << 32)
|
||||
#define DMA_CCMD_MASK_NOBIT 0
|
||||
#define DMA_CCMD_MASK_1BIT 1
|
||||
#define DMA_CCMD_MASK_2BIT 2
|
||||
#define DMA_CCMD_MASK_3BIT 3
|
||||
#define DMA_CCMD_SID(s) (((u64)((s) & 0xffff)) << 16)
|
||||
#define DMA_CCMD_DID(d) ((u64)((d) & 0xffff))
|
||||
|
||||
/* FECTL_REG */
|
||||
#define DMA_FECTL_IM (((u32)1) << 31)
|
||||
|
||||
/* FSTS_REG */
|
||||
#define DMA_FSTS_PPF ((u32)2)
|
||||
#define DMA_FSTS_PFO ((u32)1)
|
||||
#define dma_fsts_fault_record_index(s) (((s) >> 8) & 0xff)
|
||||
|
||||
/* FRCD_REG, 32 bits access */
|
||||
#define DMA_FRCD_F (((u32)1) << 31)
|
||||
#define dma_frcd_type(d) ((d >> 30) & 1)
|
||||
#define dma_frcd_fault_reason(c) (c & 0xff)
|
||||
#define dma_frcd_source_id(c) (c & 0xffff)
|
||||
#define dma_frcd_page_addr(d) (d & (((u64)-1) << 12)) /* low 64 bit */
|
||||
|
||||
#define DMAR_OPERATION_TIMEOUT ((cycles_t) tsc_khz*10*1000) /* 10sec */
|
||||
|
||||
#define IOMMU_WAIT_OP(iommu, offset, op, cond, sts) \
|
||||
{\
|
||||
cycles_t start_time = get_cycles();\
|
||||
while (1) {\
|
||||
sts = op (iommu->reg + offset);\
|
||||
if (cond)\
|
||||
break;\
|
||||
if (DMAR_OPERATION_TIMEOUT < (get_cycles() - start_time))\
|
||||
panic("DMAR hardware is malfunctioning\n");\
|
||||
cpu_relax();\
|
||||
}\
|
||||
}
|
||||
|
||||
#define QI_LENGTH 256 /* queue length */
|
||||
|
||||
enum {
|
||||
QI_FREE,
|
||||
QI_IN_USE,
|
||||
QI_DONE
|
||||
};
|
||||
|
||||
#define QI_CC_TYPE 0x1
|
||||
#define QI_IOTLB_TYPE 0x2
|
||||
#define QI_DIOTLB_TYPE 0x3
|
||||
#define QI_IEC_TYPE 0x4
|
||||
#define QI_IWD_TYPE 0x5
|
||||
|
||||
#define QI_IEC_SELECTIVE (((u64)1) << 4)
|
||||
#define QI_IEC_IIDEX(idx) (((u64)(idx & 0xffff) << 32))
|
||||
#define QI_IEC_IM(m) (((u64)(m & 0x1f) << 27))
|
||||
|
||||
#define QI_IWD_STATUS_DATA(d) (((u64)d) << 32)
|
||||
#define QI_IWD_STATUS_WRITE (((u64)1) << 5)
|
||||
|
||||
struct qi_desc {
|
||||
u64 low, high;
|
||||
};
|
||||
|
||||
struct q_inval {
|
||||
spinlock_t q_lock;
|
||||
struct qi_desc *desc; /* invalidation queue */
|
||||
int *desc_status; /* desc status */
|
||||
int free_head; /* first free entry */
|
||||
int free_tail; /* last free entry */
|
||||
int free_cnt;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_INTR_REMAP
|
||||
/* 1MB - maximum possible interrupt remapping table size */
|
||||
#define INTR_REMAP_PAGE_ORDER 8
|
||||
#define INTR_REMAP_TABLE_REG_SIZE 0xf
|
||||
|
||||
#define INTR_REMAP_TABLE_ENTRIES 65536
|
||||
|
||||
struct ir_table {
|
||||
struct irte *base;
|
||||
};
|
||||
#endif
|
||||
|
||||
struct intel_iommu {
|
||||
void __iomem *reg; /* Pointer to hardware regs, virtual addr */
|
||||
u64 cap;
|
||||
u64 ecap;
|
||||
int seg;
|
||||
u32 gcmd; /* Holds TE, EAFL. Don't need SRTP, SFL, WBF */
|
||||
spinlock_t register_lock; /* protect register handling */
|
||||
int seq_id; /* sequence id of the iommu */
|
||||
|
||||
#ifdef CONFIG_DMAR
|
||||
unsigned long *domain_ids; /* bitmap of domains */
|
||||
struct dmar_domain **domains; /* ptr to domains */
|
||||
spinlock_t lock; /* protect context, domain ids */
|
||||
struct root_entry *root_entry; /* virtual address */
|
||||
|
||||
unsigned int irq;
|
||||
unsigned char name[7]; /* Device Name */
|
||||
struct msi_msg saved_msg;
|
||||
struct sys_device sysdev;
|
||||
#endif
|
||||
struct q_inval *qi; /* Queued invalidation info */
|
||||
#ifdef CONFIG_INTR_REMAP
|
||||
struct ir_table *ir_table; /* Interrupt remapping info */
|
||||
#endif
|
||||
};
|
||||
|
||||
static inline void __iommu_flush_cache(
|
||||
struct intel_iommu *iommu, void *addr, int size)
|
||||
{
|
||||
if (!ecap_coherent(iommu->ecap))
|
||||
clflush_cache_range(addr, size);
|
||||
}
|
||||
|
||||
extern struct dmar_drhd_unit * dmar_find_matched_drhd_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 qi_global_iec(struct intel_iommu *iommu);
|
||||
|
||||
extern void qi_submit_sync(struct qi_desc *desc, struct intel_iommu *iommu);
|
||||
|
||||
void intel_iommu_domain_exit(struct dmar_domain *domain);
|
||||
struct dmar_domain *intel_iommu_domain_alloc(struct pci_dev *pdev);
|
||||
int intel_iommu_context_mapping(struct dmar_domain *domain,
|
||||
struct pci_dev *pdev);
|
||||
int intel_iommu_page_mapping(struct dmar_domain *domain, dma_addr_t iova,
|
||||
u64 hpa, size_t size, int prot);
|
||||
void intel_iommu_detach_dev(struct dmar_domain *domain, u8 bus, u8 devfn);
|
||||
struct dmar_domain *intel_iommu_find_domain(struct pci_dev *pdev);
|
||||
u64 intel_iommu_iova_to_pfn(struct dmar_domain *domain, u64 iova);
|
||||
|
||||
#ifdef CONFIG_DMAR
|
||||
int intel_iommu_found(void);
|
||||
#else /* CONFIG_DMAR */
|
||||
static inline int intel_iommu_found(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_DMAR */
|
||||
|
||||
#endif
|
||||
|
|
@ -8,9 +8,12 @@
|
|||
#include <linux/preempt.h>
|
||||
#include <linux/cpumask.h>
|
||||
#include <linux/irqreturn.h>
|
||||
#include <linux/irqnr.h>
|
||||
#include <linux/hardirq.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/irqflags.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/percpu.h>
|
||||
#include <asm/atomic.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/system.h>
|
||||
|
|
@ -252,6 +255,8 @@ enum
|
|||
HRTIMER_SOFTIRQ,
|
||||
#endif
|
||||
RCU_SOFTIRQ, /* Preferable RCU should always be the last softirq */
|
||||
|
||||
NR_SOFTIRQS
|
||||
};
|
||||
|
||||
/* softirq mask and active fields moved to irq_cpustat_t in
|
||||
|
|
@ -271,6 +276,25 @@ extern void softirq_init(void);
|
|||
extern void raise_softirq_irqoff(unsigned int nr);
|
||||
extern void raise_softirq(unsigned int nr);
|
||||
|
||||
/* This is the worklist that queues up per-cpu softirq work.
|
||||
*
|
||||
* send_remote_sendirq() adds work to these lists, and
|
||||
* the softirq handler itself dequeues from them. The queues
|
||||
* are protected by disabling local cpu interrupts and they must
|
||||
* only be accessed by the local cpu that they are for.
|
||||
*/
|
||||
DECLARE_PER_CPU(struct list_head [NR_SOFTIRQS], softirq_work_list);
|
||||
|
||||
/* Try to send a softirq to a remote cpu. If this cannot be done, the
|
||||
* work will be queued to the local cpu.
|
||||
*/
|
||||
extern void send_remote_softirq(struct call_single_data *cp, int cpu, int softirq);
|
||||
|
||||
/* Like send_remote_softirq(), but the caller must disable local cpu interrupts
|
||||
* and compute the current cpu, passed in as 'this_cpu'.
|
||||
*/
|
||||
extern void __send_remote_softirq(struct call_single_data *cp, int cpu,
|
||||
int this_cpu, int softirq);
|
||||
|
||||
/* Tasklets --- multithreaded analogue of BHs.
|
||||
|
||||
|
|
|
|||
|
|
@ -23,4 +23,7 @@ extern unsigned long iommu_area_alloc(unsigned long *map, unsigned long size,
|
|||
extern void iommu_area_free(unsigned long *map, unsigned long start,
|
||||
unsigned int nr);
|
||||
|
||||
extern unsigned long iommu_num_pages(unsigned long addr, unsigned long len,
|
||||
unsigned long io_page_size);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -34,7 +34,8 @@ struct resource_list {
|
|||
*/
|
||||
#define IORESOURCE_BITS 0x000000ff /* Bus-specific bits */
|
||||
|
||||
#define IORESOURCE_IO 0x00000100 /* Resource type */
|
||||
#define IORESOURCE_TYPE_BITS 0x00000f00 /* Resource type */
|
||||
#define IORESOURCE_IO 0x00000100
|
||||
#define IORESOURCE_MEM 0x00000200
|
||||
#define IORESOURCE_IRQ 0x00000400
|
||||
#define IORESOURCE_DMA 0x00000800
|
||||
|
|
@ -126,6 +127,10 @@ static inline resource_size_t resource_size(struct resource *res)
|
|||
{
|
||||
return res->end - res->start + 1;
|
||||
}
|
||||
static inline unsigned long resource_type(struct resource *res)
|
||||
{
|
||||
return res->flags & IORESOURCE_TYPE_BITS;
|
||||
}
|
||||
|
||||
/* Convenience shorthand with allocation */
|
||||
#define request_region(start,n,name) __request_region(&ioport_resource, (start), (n), (name))
|
||||
|
|
@ -169,6 +174,7 @@ extern struct resource * __devm_request_region(struct device *dev,
|
|||
|
||||
extern void __devm_release_region(struct device *dev, struct resource *parent,
|
||||
resource_size_t start, resource_size_t n);
|
||||
extern int iomem_map_sanity_check(resource_size_t addr, unsigned long size);
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* _LINUX_IOPORT_H */
|
||||
|
|
|
|||
52
include/linux/iova.h
Normal file
52
include/linux/iova.h
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
* Copyright (c) 2006, Intel Corporation.
|
||||
*
|
||||
* This file is released under the GPLv2.
|
||||
*
|
||||
* Copyright (C) 2006-2008 Intel Corporation
|
||||
* Author: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _IOVA_H_
|
||||
#define _IOVA_H_
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/rbtree.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
|
||||
/* IO virtual address start page frame number */
|
||||
#define IOVA_START_PFN (1)
|
||||
|
||||
/* iova structure */
|
||||
struct iova {
|
||||
struct rb_node node;
|
||||
unsigned long pfn_hi; /* IOMMU dish out addr hi */
|
||||
unsigned long pfn_lo; /* IOMMU dish out addr lo */
|
||||
};
|
||||
|
||||
/* holds all the iova translations for a domain */
|
||||
struct iova_domain {
|
||||
spinlock_t iova_alloc_lock;/* Lock to protect iova allocation */
|
||||
spinlock_t iova_rbtree_lock; /* Lock to protect update of rbtree */
|
||||
struct rb_root rbroot; /* iova domain rbtree root */
|
||||
struct rb_node *cached32_node; /* Save last alloced node */
|
||||
unsigned long dma_32bit_pfn;
|
||||
};
|
||||
|
||||
struct iova *alloc_iova_mem(void);
|
||||
void free_iova_mem(struct iova *iova);
|
||||
void free_iova(struct iova_domain *iovad, unsigned long pfn);
|
||||
void __free_iova(struct iova_domain *iovad, struct iova *iova);
|
||||
struct iova *alloc_iova(struct iova_domain *iovad, unsigned long size,
|
||||
unsigned long limit_pfn,
|
||||
bool size_aligned);
|
||||
struct iova *reserve_iova(struct iova_domain *iovad, unsigned long pfn_lo,
|
||||
unsigned long pfn_hi);
|
||||
void copy_reserved_iova(struct iova_domain *from, struct iova_domain *to);
|
||||
void init_iova_domain(struct iova_domain *iovad, unsigned long pfn_32bit);
|
||||
struct iova *find_iova(struct iova_domain *iovad, unsigned long pfn);
|
||||
void put_iova_domain(struct iova_domain *iovad);
|
||||
|
||||
#endif
|
||||
|
|
@ -18,6 +18,7 @@
|
|||
#include <linux/spinlock.h>
|
||||
#include <linux/cpumask.h>
|
||||
#include <linux/irqreturn.h>
|
||||
#include <linux/irqnr.h>
|
||||
#include <linux/errno.h>
|
||||
|
||||
#include <asm/irq.h>
|
||||
|
|
@ -152,6 +153,7 @@ struct irq_chip {
|
|||
* @name: flow handler name for /proc/interrupts output
|
||||
*/
|
||||
struct irq_desc {
|
||||
unsigned int irq;
|
||||
irq_flow_handler_t handle_irq;
|
||||
struct irq_chip *chip;
|
||||
struct msi_desc *msi_desc;
|
||||
|
|
@ -170,7 +172,7 @@ struct irq_desc {
|
|||
cpumask_t affinity;
|
||||
unsigned int cpu;
|
||||
#endif
|
||||
#if defined(CONFIG_GENERIC_PENDING_IRQ) || defined(CONFIG_IRQBALANCE)
|
||||
#ifdef CONFIG_GENERIC_PENDING_IRQ
|
||||
cpumask_t pending_mask;
|
||||
#endif
|
||||
#ifdef CONFIG_PROC_FS
|
||||
|
|
@ -179,8 +181,14 @@ struct irq_desc {
|
|||
const char *name;
|
||||
} ____cacheline_internodealigned_in_smp;
|
||||
|
||||
|
||||
extern struct irq_desc irq_desc[NR_IRQS];
|
||||
|
||||
static inline struct irq_desc *irq_to_desc(unsigned int irq)
|
||||
{
|
||||
return (irq < nr_irqs) ? irq_desc + irq : NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Migration helpers for obsolete names, they will go away:
|
||||
*/
|
||||
|
|
@ -198,19 +206,15 @@ extern int setup_irq(unsigned int irq, struct irqaction *new);
|
|||
|
||||
#ifdef CONFIG_GENERIC_HARDIRQS
|
||||
|
||||
#ifndef handle_dynamic_tick
|
||||
# define handle_dynamic_tick(a) do { } while (0)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
|
||||
#if defined(CONFIG_GENERIC_PENDING_IRQ) || defined(CONFIG_IRQBALANCE)
|
||||
#ifdef CONFIG_GENERIC_PENDING_IRQ
|
||||
|
||||
void set_pending_irq(unsigned int irq, cpumask_t mask);
|
||||
void move_native_irq(int irq);
|
||||
void move_masked_irq(int irq);
|
||||
|
||||
#else /* CONFIG_GENERIC_PENDING_IRQ || CONFIG_IRQBALANCE */
|
||||
#else /* CONFIG_GENERIC_PENDING_IRQ */
|
||||
|
||||
static inline void move_irq(int irq)
|
||||
{
|
||||
|
|
@ -237,19 +241,14 @@ static inline void set_pending_irq(unsigned int irq, cpumask_t mask)
|
|||
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
#ifdef CONFIG_IRQBALANCE
|
||||
extern void set_balance_irq_affinity(unsigned int irq, cpumask_t mask);
|
||||
#else
|
||||
static inline void set_balance_irq_affinity(unsigned int irq, cpumask_t mask)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
extern int no_irq_affinity;
|
||||
|
||||
static inline int irq_balancing_disabled(unsigned int irq)
|
||||
{
|
||||
return irq_desc[irq].status & IRQ_NO_BALANCING_MASK;
|
||||
struct irq_desc *desc;
|
||||
|
||||
desc = irq_to_desc(irq);
|
||||
return desc->status & IRQ_NO_BALANCING_MASK;
|
||||
}
|
||||
|
||||
/* Handle irq action chains: */
|
||||
|
|
@ -279,10 +278,8 @@ extern unsigned int __do_IRQ(unsigned int irq);
|
|||
* irqchip-style controller then we call the ->handle_irq() handler,
|
||||
* and it calls __do_IRQ() if it's attached to an irqtype-style controller.
|
||||
*/
|
||||
static inline void generic_handle_irq(unsigned int irq)
|
||||
static inline void generic_handle_irq_desc(unsigned int irq, struct irq_desc *desc)
|
||||
{
|
||||
struct irq_desc *desc = irq_desc + irq;
|
||||
|
||||
#ifdef CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ
|
||||
desc->handle_irq(irq, desc);
|
||||
#else
|
||||
|
|
@ -293,6 +290,11 @@ static inline void generic_handle_irq(unsigned int irq)
|
|||
#endif
|
||||
}
|
||||
|
||||
static inline void generic_handle_irq(unsigned int irq)
|
||||
{
|
||||
generic_handle_irq_desc(irq, irq_to_desc(irq));
|
||||
}
|
||||
|
||||
/* Handling of unhandled and spurious interrupts: */
|
||||
extern void note_interrupt(unsigned int irq, struct irq_desc *desc,
|
||||
int action_ret);
|
||||
|
|
@ -325,7 +327,10 @@ __set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained,
|
|||
static inline void __set_irq_handler_unlocked(int irq,
|
||||
irq_flow_handler_t handler)
|
||||
{
|
||||
irq_desc[irq].handle_irq = handler;
|
||||
struct irq_desc *desc;
|
||||
|
||||
desc = irq_to_desc(irq);
|
||||
desc->handle_irq = handler;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -353,13 +358,14 @@ extern void set_irq_noprobe(unsigned int irq);
|
|||
extern void set_irq_probe(unsigned int irq);
|
||||
|
||||
/* Handle dynamic irq creation and destruction */
|
||||
extern unsigned int create_irq_nr(unsigned int irq_want);
|
||||
extern int create_irq(void);
|
||||
extern void destroy_irq(unsigned int irq);
|
||||
|
||||
/* Test to see if a driver has successfully requested an irq */
|
||||
static inline int irq_has_action(unsigned int irq)
|
||||
{
|
||||
struct irq_desc *desc = irq_desc + irq;
|
||||
struct irq_desc *desc = irq_to_desc(irq);
|
||||
return desc->action != NULL;
|
||||
}
|
||||
|
||||
|
|
@ -374,10 +380,10 @@ extern int set_irq_chip_data(unsigned int irq, void *data);
|
|||
extern int set_irq_type(unsigned int irq, unsigned int type);
|
||||
extern int set_irq_msi(unsigned int irq, struct msi_desc *entry);
|
||||
|
||||
#define get_irq_chip(irq) (irq_desc[irq].chip)
|
||||
#define get_irq_chip_data(irq) (irq_desc[irq].chip_data)
|
||||
#define get_irq_data(irq) (irq_desc[irq].handler_data)
|
||||
#define get_irq_msi(irq) (irq_desc[irq].msi_desc)
|
||||
#define get_irq_chip(irq) (irq_to_desc(irq)->chip)
|
||||
#define get_irq_chip_data(irq) (irq_to_desc(irq)->chip_data)
|
||||
#define get_irq_data(irq) (irq_to_desc(irq)->handler_data)
|
||||
#define get_irq_msi(irq) (irq_to_desc(irq)->msi_desc)
|
||||
|
||||
#endif /* CONFIG_GENERIC_HARDIRQS */
|
||||
|
||||
|
|
|
|||
24
include/linux/irqnr.h
Normal file
24
include/linux/irqnr.h
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
#ifndef _LINUX_IRQNR_H
|
||||
#define _LINUX_IRQNR_H
|
||||
|
||||
#ifndef CONFIG_GENERIC_HARDIRQS
|
||||
#include <asm/irq.h>
|
||||
# define nr_irqs NR_IRQS
|
||||
|
||||
# define for_each_irq_desc(irq, desc) \
|
||||
for (irq = 0; irq < nr_irqs; irq++)
|
||||
#else
|
||||
extern int nr_irqs;
|
||||
|
||||
# define for_each_irq_desc(irq, desc) \
|
||||
for (irq = 0, desc = irq_desc; irq < nr_irqs; irq++, desc++)
|
||||
|
||||
# define for_each_irq_desc_reverse(irq, desc) \
|
||||
for (irq = nr_irqs -1, desc = irq_desc + (nr_irqs -1 ); \
|
||||
irq > 0; irq--, desc--)
|
||||
#endif
|
||||
|
||||
#define for_each_irq_nr(irq) \
|
||||
for (irq = 0; irq < nr_irqs; irq++)
|
||||
|
||||
#endif
|
||||
|
|
@ -61,7 +61,7 @@ extern u8 journal_enable_debug;
|
|||
do { \
|
||||
if ((n) <= journal_enable_debug) { \
|
||||
printk (KERN_DEBUG "(%s, %d): %s: ", \
|
||||
__FILE__, __LINE__, __FUNCTION__); \
|
||||
__FILE__, __LINE__, __func__); \
|
||||
printk (f, ## a); \
|
||||
} \
|
||||
} while (0)
|
||||
|
|
@ -816,6 +816,9 @@ struct journal_s
|
|||
#define JFS_FLUSHED 0x008 /* The journal superblock has been flushed */
|
||||
#define JFS_LOADED 0x010 /* The journal superblock has been loaded */
|
||||
#define JFS_BARRIER 0x020 /* Use IDE barriers */
|
||||
#define JFS_ABORT_ON_SYNCDATA_ERR 0x040 /* Abort the journal on file
|
||||
* data write error in ordered
|
||||
* mode */
|
||||
|
||||
/*
|
||||
* Function declarations for the journaling transaction and buffer
|
||||
|
|
@ -984,7 +987,7 @@ extern int cleanup_journal_tail(journal_t *);
|
|||
|
||||
#define jbd_ENOSYS() \
|
||||
do { \
|
||||
printk (KERN_ERR "JBD unimplemented function %s\n", __FUNCTION__); \
|
||||
printk (KERN_ERR "JBD unimplemented function %s\n", __func__); \
|
||||
current->state = TASK_UNINTERRUPTIBLE; \
|
||||
schedule(); \
|
||||
} while (1)
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ extern u8 jbd2_journal_enable_debug;
|
|||
do { \
|
||||
if ((n) <= jbd2_journal_enable_debug) { \
|
||||
printk (KERN_DEBUG "(%s, %d): %s: ", \
|
||||
__FILE__, __LINE__, __FUNCTION__); \
|
||||
__FILE__, __LINE__, __func__); \
|
||||
printk (f, ## a); \
|
||||
} \
|
||||
} while (0)
|
||||
|
|
@ -641,6 +641,11 @@ struct transaction_s
|
|||
*/
|
||||
int t_handle_count;
|
||||
|
||||
/*
|
||||
* For use by the filesystem to store fs-specific data
|
||||
* structures associated with the transaction
|
||||
*/
|
||||
struct list_head t_private_list;
|
||||
};
|
||||
|
||||
struct transaction_run_stats_s {
|
||||
|
|
@ -935,6 +940,10 @@ struct journal_s
|
|||
|
||||
pid_t j_last_sync_writer;
|
||||
|
||||
/* This function is called when a transaction is closed */
|
||||
void (*j_commit_callback)(journal_t *,
|
||||
transaction_t *);
|
||||
|
||||
/*
|
||||
* Journal statistics
|
||||
*/
|
||||
|
|
@ -1143,7 +1152,7 @@ extern int jbd2_cleanup_journal_tail(journal_t *);
|
|||
|
||||
#define jbd_ENOSYS() \
|
||||
do { \
|
||||
printk (KERN_ERR "JBD unimplemented function %s\n", __FUNCTION__); \
|
||||
printk (KERN_ERR "JBD unimplemented function %s\n", __func__); \
|
||||
current->state = TASK_UNINTERRUPTIBLE; \
|
||||
schedule(); \
|
||||
} while (1)
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* buffer_head fields for JBD
|
||||
*
|
||||
* 27 May 2001 Andrew Morton <akpm@digeo.com>
|
||||
* 27 May 2001 Andrew Morton
|
||||
* Created - pulled out of fs.h
|
||||
*/
|
||||
|
||||
|
|
|
|||
|
|
@ -93,12 +93,10 @@ static inline void print_symbol(const char *fmt, unsigned long addr)
|
|||
}
|
||||
|
||||
/*
|
||||
* Pretty-print a function pointer.
|
||||
*
|
||||
* ia64 and ppc64 function pointers are really function descriptors,
|
||||
* which contain a pointer the real address.
|
||||
* Pretty-print a function pointer. This function is deprecated.
|
||||
* Please use the "%pF" vsprintf format instead.
|
||||
*/
|
||||
static inline void print_fn_descriptor_symbol(const char *fmt, void *addr)
|
||||
static inline void __deprecated print_fn_descriptor_symbol(const char *fmt, void *addr)
|
||||
{
|
||||
#if defined(CONFIG_IA64) || defined(CONFIG_PPC64)
|
||||
addr = *(void **)addr;
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@
|
|||
#include <linux/log2.h>
|
||||
#include <linux/typecheck.h>
|
||||
#include <linux/ratelimit.h>
|
||||
#include <linux/dynamic_printk.h>
|
||||
#include <asm/byteorder.h>
|
||||
#include <asm/bug.h>
|
||||
|
||||
|
|
@ -213,6 +214,9 @@ static inline bool printk_timed_ratelimit(unsigned long *caller_jiffies, \
|
|||
{ return false; }
|
||||
#endif
|
||||
|
||||
extern int printk_needs_cpu(int cpu);
|
||||
extern void printk_tick(void);
|
||||
|
||||
extern void asmlinkage __attribute__((format(printf, 1, 2)))
|
||||
early_printk(const char *fmt, ...);
|
||||
|
||||
|
|
@ -235,9 +239,10 @@ extern int oops_in_progress; /* If set, an oops, panic(), BUG() or die() is in
|
|||
extern int panic_timeout;
|
||||
extern int panic_on_oops;
|
||||
extern int panic_on_unrecovered_nmi;
|
||||
extern int tainted;
|
||||
extern const char *print_tainted(void);
|
||||
extern void add_taint(unsigned);
|
||||
extern void add_taint(unsigned flag);
|
||||
extern int test_taint(unsigned flag);
|
||||
extern unsigned long get_taint(void);
|
||||
extern int root_mountflags;
|
||||
|
||||
/* Values used for system_state */
|
||||
|
|
@ -250,16 +255,17 @@ extern enum system_states {
|
|||
SYSTEM_SUSPEND_DISK,
|
||||
} system_state;
|
||||
|
||||
#define TAINT_PROPRIETARY_MODULE (1<<0)
|
||||
#define TAINT_FORCED_MODULE (1<<1)
|
||||
#define TAINT_UNSAFE_SMP (1<<2)
|
||||
#define TAINT_FORCED_RMMOD (1<<3)
|
||||
#define TAINT_MACHINE_CHECK (1<<4)
|
||||
#define TAINT_BAD_PAGE (1<<5)
|
||||
#define TAINT_USER (1<<6)
|
||||
#define TAINT_DIE (1<<7)
|
||||
#define TAINT_OVERRIDDEN_ACPI_TABLE (1<<8)
|
||||
#define TAINT_WARN (1<<9)
|
||||
#define TAINT_PROPRIETARY_MODULE 0
|
||||
#define TAINT_FORCED_MODULE 1
|
||||
#define TAINT_UNSAFE_SMP 2
|
||||
#define TAINT_FORCED_RMMOD 3
|
||||
#define TAINT_MACHINE_CHECK 4
|
||||
#define TAINT_BAD_PAGE 5
|
||||
#define TAINT_USER 6
|
||||
#define TAINT_DIE 7
|
||||
#define TAINT_OVERRIDDEN_ACPI_TABLE 8
|
||||
#define TAINT_WARN 9
|
||||
#define TAINT_CRAP 10
|
||||
|
||||
extern void dump_stack(void) __cold;
|
||||
|
||||
|
|
@ -303,8 +309,12 @@ static inline char *pack_hex_byte(char *buf, u8 byte)
|
|||
#define pr_info(fmt, arg...) \
|
||||
printk(KERN_INFO fmt, ##arg)
|
||||
|
||||
#ifdef DEBUG
|
||||
/* If you are writing a driver, please use dev_dbg instead */
|
||||
#if defined(CONFIG_DYNAMIC_PRINTK_DEBUG)
|
||||
#define pr_debug(fmt, ...) do { \
|
||||
dynamic_pr_debug(fmt, ##__VA_ARGS__); \
|
||||
} while (0)
|
||||
#elif defined(DEBUG)
|
||||
#define pr_debug(fmt, arg...) \
|
||||
printk(KERN_DEBUG fmt, ##arg)
|
||||
#else
|
||||
|
|
@ -486,4 +496,9 @@ struct sysinfo {
|
|||
#define NUMA_BUILD 0
|
||||
#endif
|
||||
|
||||
/* Rebuild everything on CONFIG_FTRACE_MCOUNT_RECORD */
|
||||
#ifdef CONFIG_FTRACE_MCOUNT_RECORD
|
||||
# define REBUILD_DUE_TO_FTRACE_MCOUNT_RECORD
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -39,19 +39,34 @@ DECLARE_PER_CPU(struct kernel_stat, kstat);
|
|||
|
||||
extern unsigned long long nr_context_switches(void);
|
||||
|
||||
struct irq_desc;
|
||||
|
||||
static inline void kstat_incr_irqs_this_cpu(unsigned int irq,
|
||||
struct irq_desc *desc)
|
||||
{
|
||||
kstat_this_cpu.irqs[irq]++;
|
||||
}
|
||||
|
||||
static inline unsigned int kstat_irqs_cpu(unsigned int irq, int cpu)
|
||||
{
|
||||
return kstat_cpu(cpu).irqs[irq];
|
||||
}
|
||||
|
||||
/*
|
||||
* Number of interrupts per specific IRQ source, since bootup
|
||||
*/
|
||||
static inline int kstat_irqs(int irq)
|
||||
static inline unsigned int kstat_irqs(unsigned int irq)
|
||||
{
|
||||
int cpu, sum = 0;
|
||||
unsigned int sum = 0;
|
||||
int cpu;
|
||||
|
||||
for_each_possible_cpu(cpu)
|
||||
sum += kstat_cpu(cpu).irqs[irq];
|
||||
sum += kstat_irqs_cpu(irq, cpu);
|
||||
|
||||
return sum;
|
||||
}
|
||||
|
||||
extern unsigned long long task_delta_exec(struct task_struct *);
|
||||
extern void account_user_time(struct task_struct *, cputime_t);
|
||||
extern void account_user_time_scaled(struct task_struct *, cputime_t);
|
||||
extern void account_system_time(struct task_struct *, int, cputime_t);
|
||||
|
|
|
|||
|
|
@ -99,4 +99,7 @@ struct file;
|
|||
extern int call_usermodehelper_pipe(char *path, char *argv[], char *envp[],
|
||||
struct file **filp);
|
||||
|
||||
extern int usermodehelper_disable(void);
|
||||
extern void usermodehelper_enable(void);
|
||||
|
||||
#endif /* __LINUX_KMOD_H__ */
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@
|
|||
* <jkenisto@us.ibm.com> and Prasanna S Panchamukhi
|
||||
* <prasanna@in.ibm.com> added function-return probes.
|
||||
*/
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/smp.h>
|
||||
|
|
@ -47,7 +48,7 @@
|
|||
#define KPROBE_HIT_SSDONE 0x00000008
|
||||
|
||||
/* Attach to insert probes on any functions which should be ignored*/
|
||||
#define __kprobes __attribute__((__section__(".kprobes.text")))
|
||||
#define __kprobes __attribute__((__section__(".kprobes.text"))) notrace
|
||||
|
||||
struct kprobe;
|
||||
struct pt_regs;
|
||||
|
|
@ -256,7 +257,7 @@ void recycle_rp_inst(struct kretprobe_instance *ri, struct hlist_head *head);
|
|||
|
||||
#else /* CONFIG_KPROBES */
|
||||
|
||||
#define __kprobes /**/
|
||||
#define __kprobes notrace
|
||||
struct jprobe;
|
||||
struct kretprobe;
|
||||
|
||||
|
|
|
|||
|
|
@ -311,22 +311,33 @@ struct kvm_s390_interrupt {
|
|||
|
||||
/* This structure represents a single trace buffer record. */
|
||||
struct kvm_trace_rec {
|
||||
__u32 event:28;
|
||||
__u32 extra_u32:3;
|
||||
__u32 cycle_in:1;
|
||||
/* variable rec_val
|
||||
* is split into:
|
||||
* bits 0 - 27 -> event id
|
||||
* bits 28 -30 -> number of extra data args of size u32
|
||||
* bits 31 -> binary indicator for if tsc is in record
|
||||
*/
|
||||
__u32 rec_val;
|
||||
__u32 pid;
|
||||
__u32 vcpu_id;
|
||||
union {
|
||||
struct {
|
||||
__u64 cycle_u64;
|
||||
__u64 timestamp;
|
||||
__u32 extra_u32[KVM_TRC_EXTRA_MAX];
|
||||
} __attribute__((packed)) cycle;
|
||||
} __attribute__((packed)) timestamp;
|
||||
struct {
|
||||
__u32 extra_u32[KVM_TRC_EXTRA_MAX];
|
||||
} nocycle;
|
||||
} notimestamp;
|
||||
} u;
|
||||
};
|
||||
|
||||
#define TRACE_REC_EVENT_ID(val) \
|
||||
(0x0fffffff & (val))
|
||||
#define TRACE_REC_NUM_DATA_ARGS(val) \
|
||||
(0x70000000 & ((val) << 28))
|
||||
#define TRACE_REC_TCS(val) \
|
||||
(0x80000000 & ((val) << 31))
|
||||
|
||||
#define KVMIO 0xAE
|
||||
|
||||
/*
|
||||
|
|
@ -372,6 +383,10 @@ struct kvm_trace_rec {
|
|||
#define KVM_CAP_MP_STATE 14
|
||||
#define KVM_CAP_COALESCED_MMIO 15
|
||||
#define KVM_CAP_SYNC_MMU 16 /* Changes to host mmap are reflected in guest */
|
||||
#if defined(CONFIG_X86)||defined(CONFIG_IA64)
|
||||
#define KVM_CAP_DEVICE_ASSIGNMENT 17
|
||||
#endif
|
||||
#define KVM_CAP_IOMMU 18
|
||||
|
||||
/*
|
||||
* ioctls for VM fds
|
||||
|
|
@ -401,6 +416,10 @@ struct kvm_trace_rec {
|
|||
_IOW(KVMIO, 0x67, struct kvm_coalesced_mmio_zone)
|
||||
#define KVM_UNREGISTER_COALESCED_MMIO \
|
||||
_IOW(KVMIO, 0x68, struct kvm_coalesced_mmio_zone)
|
||||
#define KVM_ASSIGN_PCI_DEVICE _IOR(KVMIO, 0x69, \
|
||||
struct kvm_assigned_pci_dev)
|
||||
#define KVM_ASSIGN_IRQ _IOR(KVMIO, 0x70, \
|
||||
struct kvm_assigned_irq)
|
||||
|
||||
/*
|
||||
* ioctls for vcpu fds
|
||||
|
|
@ -440,4 +459,45 @@ struct kvm_trace_rec {
|
|||
#define KVM_GET_MP_STATE _IOR(KVMIO, 0x98, struct kvm_mp_state)
|
||||
#define KVM_SET_MP_STATE _IOW(KVMIO, 0x99, struct kvm_mp_state)
|
||||
|
||||
#define KVM_TRC_INJ_VIRQ (KVM_TRC_HANDLER + 0x02)
|
||||
#define KVM_TRC_REDELIVER_EVT (KVM_TRC_HANDLER + 0x03)
|
||||
#define KVM_TRC_PEND_INTR (KVM_TRC_HANDLER + 0x04)
|
||||
#define KVM_TRC_IO_READ (KVM_TRC_HANDLER + 0x05)
|
||||
#define KVM_TRC_IO_WRITE (KVM_TRC_HANDLER + 0x06)
|
||||
#define KVM_TRC_CR_READ (KVM_TRC_HANDLER + 0x07)
|
||||
#define KVM_TRC_CR_WRITE (KVM_TRC_HANDLER + 0x08)
|
||||
#define KVM_TRC_DR_READ (KVM_TRC_HANDLER + 0x09)
|
||||
#define KVM_TRC_DR_WRITE (KVM_TRC_HANDLER + 0x0A)
|
||||
#define KVM_TRC_MSR_READ (KVM_TRC_HANDLER + 0x0B)
|
||||
#define KVM_TRC_MSR_WRITE (KVM_TRC_HANDLER + 0x0C)
|
||||
#define KVM_TRC_CPUID (KVM_TRC_HANDLER + 0x0D)
|
||||
#define KVM_TRC_INTR (KVM_TRC_HANDLER + 0x0E)
|
||||
#define KVM_TRC_NMI (KVM_TRC_HANDLER + 0x0F)
|
||||
#define KVM_TRC_VMMCALL (KVM_TRC_HANDLER + 0x10)
|
||||
#define KVM_TRC_HLT (KVM_TRC_HANDLER + 0x11)
|
||||
#define KVM_TRC_CLTS (KVM_TRC_HANDLER + 0x12)
|
||||
#define KVM_TRC_LMSW (KVM_TRC_HANDLER + 0x13)
|
||||
#define KVM_TRC_APIC_ACCESS (KVM_TRC_HANDLER + 0x14)
|
||||
#define KVM_TRC_TDP_FAULT (KVM_TRC_HANDLER + 0x15)
|
||||
#define KVM_TRC_GTLB_WRITE (KVM_TRC_HANDLER + 0x16)
|
||||
#define KVM_TRC_STLB_WRITE (KVM_TRC_HANDLER + 0x17)
|
||||
#define KVM_TRC_STLB_INVAL (KVM_TRC_HANDLER + 0x18)
|
||||
#define KVM_TRC_PPC_INSTR (KVM_TRC_HANDLER + 0x19)
|
||||
|
||||
struct kvm_assigned_pci_dev {
|
||||
__u32 assigned_dev_id;
|
||||
__u32 busnr;
|
||||
__u32 devfn;
|
||||
__u32 flags;
|
||||
};
|
||||
|
||||
struct kvm_assigned_irq {
|
||||
__u32 assigned_dev_id;
|
||||
__u32 host_irq;
|
||||
__u32 guest_irq;
|
||||
__u32 flags;
|
||||
};
|
||||
|
||||
#define KVM_DEV_ASSIGN_ENABLE_IOMMU (1 << 0)
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -34,6 +34,8 @@
|
|||
#define KVM_REQ_MMU_RELOAD 3
|
||||
#define KVM_REQ_TRIPLE_FAULT 4
|
||||
#define KVM_REQ_PENDING_TIMER 5
|
||||
#define KVM_REQ_UNHALT 6
|
||||
#define KVM_REQ_MMU_SYNC 7
|
||||
|
||||
struct kvm_vcpu;
|
||||
extern struct kmem_cache *kvm_vcpu_cache;
|
||||
|
|
@ -279,12 +281,68 @@ void kvm_free_physmem(struct kvm *kvm);
|
|||
|
||||
struct kvm *kvm_arch_create_vm(void);
|
||||
void kvm_arch_destroy_vm(struct kvm *kvm);
|
||||
void kvm_free_all_assigned_devices(struct kvm *kvm);
|
||||
|
||||
int kvm_cpu_get_interrupt(struct kvm_vcpu *v);
|
||||
int kvm_cpu_has_interrupt(struct kvm_vcpu *v);
|
||||
int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu);
|
||||
void kvm_vcpu_kick(struct kvm_vcpu *vcpu);
|
||||
|
||||
int kvm_is_mmio_pfn(pfn_t pfn);
|
||||
|
||||
struct kvm_irq_ack_notifier {
|
||||
struct hlist_node link;
|
||||
unsigned gsi;
|
||||
void (*irq_acked)(struct kvm_irq_ack_notifier *kian);
|
||||
};
|
||||
|
||||
struct kvm_assigned_dev_kernel {
|
||||
struct kvm_irq_ack_notifier ack_notifier;
|
||||
struct work_struct interrupt_work;
|
||||
struct list_head list;
|
||||
int assigned_dev_id;
|
||||
int host_busnr;
|
||||
int host_devfn;
|
||||
int host_irq;
|
||||
int guest_irq;
|
||||
int irq_requested;
|
||||
struct pci_dev *dev;
|
||||
struct kvm *kvm;
|
||||
};
|
||||
void kvm_set_irq(struct kvm *kvm, int irq, int level);
|
||||
void kvm_notify_acked_irq(struct kvm *kvm, unsigned gsi);
|
||||
void kvm_register_irq_ack_notifier(struct kvm *kvm,
|
||||
struct kvm_irq_ack_notifier *kian);
|
||||
void kvm_unregister_irq_ack_notifier(struct kvm *kvm,
|
||||
struct kvm_irq_ack_notifier *kian);
|
||||
|
||||
#ifdef CONFIG_DMAR
|
||||
int kvm_iommu_map_pages(struct kvm *kvm, gfn_t base_gfn,
|
||||
unsigned long npages);
|
||||
int kvm_iommu_map_guest(struct kvm *kvm,
|
||||
struct kvm_assigned_dev_kernel *assigned_dev);
|
||||
int kvm_iommu_unmap_guest(struct kvm *kvm);
|
||||
#else /* CONFIG_DMAR */
|
||||
static inline int kvm_iommu_map_pages(struct kvm *kvm,
|
||||
gfn_t base_gfn,
|
||||
unsigned long npages)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int kvm_iommu_map_guest(struct kvm *kvm,
|
||||
struct kvm_assigned_dev_kernel
|
||||
*assigned_dev)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int kvm_iommu_unmap_guest(struct kvm *kvm)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_DMAR */
|
||||
|
||||
static inline void kvm_guest_enter(void)
|
||||
{
|
||||
account_system_vtime(current);
|
||||
|
|
@ -307,6 +365,11 @@ static inline gpa_t gfn_to_gpa(gfn_t gfn)
|
|||
return (gpa_t)gfn << PAGE_SHIFT;
|
||||
}
|
||||
|
||||
static inline hpa_t pfn_to_hpa(pfn_t pfn)
|
||||
{
|
||||
return (hpa_t)pfn << PAGE_SHIFT;
|
||||
}
|
||||
|
||||
static inline void kvm_migrate_timers(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
set_bit(KVM_REQ_MIGRATE_TIMER, &vcpu->requests);
|
||||
|
|
@ -326,6 +389,25 @@ struct kvm_stats_debugfs_item {
|
|||
extern struct kvm_stats_debugfs_item debugfs_entries[];
|
||||
extern struct dentry *kvm_debugfs_dir;
|
||||
|
||||
#define KVMTRACE_5D(evt, vcpu, d1, d2, d3, d4, d5, name) \
|
||||
trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \
|
||||
vcpu, 5, d1, d2, d3, d4, d5)
|
||||
#define KVMTRACE_4D(evt, vcpu, d1, d2, d3, d4, name) \
|
||||
trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \
|
||||
vcpu, 4, d1, d2, d3, d4, 0)
|
||||
#define KVMTRACE_3D(evt, vcpu, d1, d2, d3, name) \
|
||||
trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \
|
||||
vcpu, 3, d1, d2, d3, 0, 0)
|
||||
#define KVMTRACE_2D(evt, vcpu, d1, d2, name) \
|
||||
trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \
|
||||
vcpu, 2, d1, d2, 0, 0, 0)
|
||||
#define KVMTRACE_1D(evt, vcpu, d1, name) \
|
||||
trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \
|
||||
vcpu, 1, d1, 0, 0, 0, 0)
|
||||
#define KVMTRACE_0D(evt, vcpu, name) \
|
||||
trace_mark(kvm_trace_##name, "%u %p %u %u %u %u %u %u", KVM_TRC_##evt, \
|
||||
vcpu, 0, 0, 0, 0, 0, 0)
|
||||
|
||||
#ifdef CONFIG_KVM_TRACE
|
||||
int kvm_trace_ioctl(unsigned int ioctl, unsigned long arg);
|
||||
void kvm_trace_cleanup(void);
|
||||
|
|
|
|||
|
|
@ -4,8 +4,6 @@
|
|||
#include <linux/compiler.h>
|
||||
#include <asm/linkage.h>
|
||||
|
||||
#define notrace __attribute__((no_instrument_function))
|
||||
|
||||
#ifdef __cplusplus
|
||||
#define CPP_ASMLINKAGE extern "C"
|
||||
#else
|
||||
|
|
|
|||
187
include/linux/map_to_7segment.h
Normal file
187
include/linux/map_to_7segment.h
Normal file
|
|
@ -0,0 +1,187 @@
|
|||
/*
|
||||
* Copyright (c) 2005 Henk Vergonet <Henk.Vergonet@gmail.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.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef MAP_TO_7SEGMENT_H
|
||||
#define MAP_TO_7SEGMENT_H
|
||||
|
||||
/* This file provides translation primitives and tables for the conversion
|
||||
* of (ASCII) characters to a 7-segments notation.
|
||||
*
|
||||
* The 7 segment's wikipedia notation below is used as standard.
|
||||
* See: http://en.wikipedia.org/wiki/Seven_segment_display
|
||||
*
|
||||
* Notation: +-a-+
|
||||
* f b
|
||||
* +-g-+
|
||||
* e c
|
||||
* +-d-+
|
||||
*
|
||||
* Usage:
|
||||
*
|
||||
* Register a map variable, and fill it with a character set:
|
||||
* static SEG7_DEFAULT_MAP(map_seg7);
|
||||
*
|
||||
*
|
||||
* Then use for conversion:
|
||||
* seg7 = map_to_seg7(&map_seg7, some_char);
|
||||
* ...
|
||||
*
|
||||
* In device drivers it is recommended, if required, to make the char map
|
||||
* accessible via the sysfs interface using the following scheme:
|
||||
*
|
||||
* static ssize_t show_map(struct device *dev, char *buf) {
|
||||
* memcpy(buf, &map_seg7, sizeof(map_seg7));
|
||||
* return sizeof(map_seg7);
|
||||
* }
|
||||
* static ssize_t store_map(struct device *dev, const char *buf, size_t cnt) {
|
||||
* if(cnt != sizeof(map_seg7))
|
||||
* return -EINVAL;
|
||||
* memcpy(&map_seg7, buf, cnt);
|
||||
* return cnt;
|
||||
* }
|
||||
* static DEVICE_ATTR(map_seg7, PERMS_RW, show_map, store_map);
|
||||
*
|
||||
* History:
|
||||
* 2005-05-31 RFC linux-kernel@vger.kernel.org
|
||||
*/
|
||||
#include <linux/errno.h>
|
||||
|
||||
|
||||
#define BIT_SEG7_A 0
|
||||
#define BIT_SEG7_B 1
|
||||
#define BIT_SEG7_C 2
|
||||
#define BIT_SEG7_D 3
|
||||
#define BIT_SEG7_E 4
|
||||
#define BIT_SEG7_F 5
|
||||
#define BIT_SEG7_G 6
|
||||
#define BIT_SEG7_RESERVED 7
|
||||
|
||||
struct seg7_conversion_map {
|
||||
unsigned char table[128];
|
||||
};
|
||||
|
||||
static inline int map_to_seg7(struct seg7_conversion_map *map, int c)
|
||||
{
|
||||
return c >= 0 && c < sizeof(map->table) ? map->table[c] : -EINVAL;
|
||||
}
|
||||
|
||||
#define SEG7_CONVERSION_MAP(_name, _map) \
|
||||
struct seg7_conversion_map _name = { .table = { _map } }
|
||||
|
||||
/*
|
||||
* It is recommended to use a facility that allows user space to redefine
|
||||
* custom character sets for LCD devices. Please use a sysfs interface
|
||||
* as described above.
|
||||
*/
|
||||
#define MAP_TO_SEG7_SYSFS_FILE "map_seg7"
|
||||
|
||||
/*******************************************************************************
|
||||
* ASCII conversion table
|
||||
******************************************************************************/
|
||||
|
||||
#define _SEG7(l,a,b,c,d,e,f,g) \
|
||||
( a<<BIT_SEG7_A | b<<BIT_SEG7_B | c<<BIT_SEG7_C | d<<BIT_SEG7_D | \
|
||||
e<<BIT_SEG7_E | f<<BIT_SEG7_F | g<<BIT_SEG7_G )
|
||||
|
||||
#define _MAP_0_32_ASCII_SEG7_NON_PRINTABLE \
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
|
||||
#define _MAP_33_47_ASCII_SEG7_SYMBOL \
|
||||
_SEG7('!',0,0,0,0,1,1,0), _SEG7('"',0,1,0,0,0,1,0), _SEG7('#',0,1,1,0,1,1,0),\
|
||||
_SEG7('$',1,0,1,1,0,1,1), _SEG7('%',0,0,1,0,0,1,0), _SEG7('&',1,0,1,1,1,1,1),\
|
||||
_SEG7('\'',0,0,0,0,0,1,0),_SEG7('(',1,0,0,1,1,1,0), _SEG7(')',1,1,1,1,0,0,0),\
|
||||
_SEG7('*',0,1,1,0,1,1,1), _SEG7('+',0,1,1,0,0,0,1), _SEG7(',',0,0,0,0,1,0,0),\
|
||||
_SEG7('-',0,0,0,0,0,0,1), _SEG7('.',0,0,0,0,1,0,0), _SEG7('/',0,1,0,0,1,0,1),
|
||||
|
||||
#define _MAP_48_57_ASCII_SEG7_NUMERIC \
|
||||
_SEG7('0',1,1,1,1,1,1,0), _SEG7('1',0,1,1,0,0,0,0), _SEG7('2',1,1,0,1,1,0,1),\
|
||||
_SEG7('3',1,1,1,1,0,0,1), _SEG7('4',0,1,1,0,0,1,1), _SEG7('5',1,0,1,1,0,1,1),\
|
||||
_SEG7('6',1,0,1,1,1,1,1), _SEG7('7',1,1,1,0,0,0,0), _SEG7('8',1,1,1,1,1,1,1),\
|
||||
_SEG7('9',1,1,1,1,0,1,1),
|
||||
|
||||
#define _MAP_58_64_ASCII_SEG7_SYMBOL \
|
||||
_SEG7(':',0,0,0,1,0,0,1), _SEG7(';',0,0,0,1,0,0,1), _SEG7('<',1,0,0,0,0,1,1),\
|
||||
_SEG7('=',0,0,0,1,0,0,1), _SEG7('>',1,1,0,0,0,0,1), _SEG7('?',1,1,1,0,0,1,0),\
|
||||
_SEG7('@',1,1,0,1,1,1,1),
|
||||
|
||||
#define _MAP_65_90_ASCII_SEG7_ALPHA_UPPR \
|
||||
_SEG7('A',1,1,1,0,1,1,1), _SEG7('B',1,1,1,1,1,1,1), _SEG7('C',1,0,0,1,1,1,0),\
|
||||
_SEG7('D',1,1,1,1,1,1,0), _SEG7('E',1,0,0,1,1,1,1), _SEG7('F',1,0,0,0,1,1,1),\
|
||||
_SEG7('G',1,1,1,1,0,1,1), _SEG7('H',0,1,1,0,1,1,1), _SEG7('I',0,1,1,0,0,0,0),\
|
||||
_SEG7('J',0,1,1,1,0,0,0), _SEG7('K',0,1,1,0,1,1,1), _SEG7('L',0,0,0,1,1,1,0),\
|
||||
_SEG7('M',1,1,1,0,1,1,0), _SEG7('N',1,1,1,0,1,1,0), _SEG7('O',1,1,1,1,1,1,0),\
|
||||
_SEG7('P',1,1,0,0,1,1,1), _SEG7('Q',1,1,1,1,1,1,0), _SEG7('R',1,1,1,0,1,1,1),\
|
||||
_SEG7('S',1,0,1,1,0,1,1), _SEG7('T',0,0,0,1,1,1,1), _SEG7('U',0,1,1,1,1,1,0),\
|
||||
_SEG7('V',0,1,1,1,1,1,0), _SEG7('W',0,1,1,1,1,1,1), _SEG7('X',0,1,1,0,1,1,1),\
|
||||
_SEG7('Y',0,1,1,0,0,1,1), _SEG7('Z',1,1,0,1,1,0,1),
|
||||
|
||||
#define _MAP_91_96_ASCII_SEG7_SYMBOL \
|
||||
_SEG7('[',1,0,0,1,1,1,0), _SEG7('\\',0,0,1,0,0,1,1),_SEG7(']',1,1,1,1,0,0,0),\
|
||||
_SEG7('^',1,1,0,0,0,1,0), _SEG7('_',0,0,0,1,0,0,0), _SEG7('`',0,1,0,0,0,0,0),
|
||||
|
||||
#define _MAP_97_122_ASCII_SEG7_ALPHA_LOWER \
|
||||
_SEG7('A',1,1,1,0,1,1,1), _SEG7('b',0,0,1,1,1,1,1), _SEG7('c',0,0,0,1,1,0,1),\
|
||||
_SEG7('d',0,1,1,1,1,0,1), _SEG7('E',1,0,0,1,1,1,1), _SEG7('F',1,0,0,0,1,1,1),\
|
||||
_SEG7('G',1,1,1,1,0,1,1), _SEG7('h',0,0,1,0,1,1,1), _SEG7('i',0,0,1,0,0,0,0),\
|
||||
_SEG7('j',0,0,1,1,0,0,0), _SEG7('k',0,0,1,0,1,1,1), _SEG7('L',0,0,0,1,1,1,0),\
|
||||
_SEG7('M',1,1,1,0,1,1,0), _SEG7('n',0,0,1,0,1,0,1), _SEG7('o',0,0,1,1,1,0,1),\
|
||||
_SEG7('P',1,1,0,0,1,1,1), _SEG7('q',1,1,1,0,0,1,1), _SEG7('r',0,0,0,0,1,0,1),\
|
||||
_SEG7('S',1,0,1,1,0,1,1), _SEG7('T',0,0,0,1,1,1,1), _SEG7('u',0,0,1,1,1,0,0),\
|
||||
_SEG7('v',0,0,1,1,1,0,0), _SEG7('W',0,1,1,1,1,1,1), _SEG7('X',0,1,1,0,1,1,1),\
|
||||
_SEG7('y',0,1,1,1,0,1,1), _SEG7('Z',1,1,0,1,1,0,1),
|
||||
|
||||
#define _MAP_123_126_ASCII_SEG7_SYMBOL \
|
||||
_SEG7('{',1,0,0,1,1,1,0), _SEG7('|',0,0,0,0,1,1,0), _SEG7('}',1,1,1,1,0,0,0),\
|
||||
_SEG7('~',1,0,0,0,0,0,0),
|
||||
|
||||
/* Maps */
|
||||
|
||||
/* This set tries to map as close as possible to the visible characteristics
|
||||
* of the ASCII symbol, lowercase and uppercase letters may differ in
|
||||
* presentation on the display.
|
||||
*/
|
||||
#define MAP_ASCII7SEG_ALPHANUM \
|
||||
_MAP_0_32_ASCII_SEG7_NON_PRINTABLE \
|
||||
_MAP_33_47_ASCII_SEG7_SYMBOL \
|
||||
_MAP_48_57_ASCII_SEG7_NUMERIC \
|
||||
_MAP_58_64_ASCII_SEG7_SYMBOL \
|
||||
_MAP_65_90_ASCII_SEG7_ALPHA_UPPR \
|
||||
_MAP_91_96_ASCII_SEG7_SYMBOL \
|
||||
_MAP_97_122_ASCII_SEG7_ALPHA_LOWER \
|
||||
_MAP_123_126_ASCII_SEG7_SYMBOL
|
||||
|
||||
/* This set tries to map as close as possible to the symbolic characteristics
|
||||
* of the ASCII character for maximum discrimination.
|
||||
* For now this means all alpha chars are in lower case representations.
|
||||
* (This for example facilitates the use of hex numbers with uppercase input.)
|
||||
*/
|
||||
#define MAP_ASCII7SEG_ALPHANUM_LC \
|
||||
_MAP_0_32_ASCII_SEG7_NON_PRINTABLE \
|
||||
_MAP_33_47_ASCII_SEG7_SYMBOL \
|
||||
_MAP_48_57_ASCII_SEG7_NUMERIC \
|
||||
_MAP_58_64_ASCII_SEG7_SYMBOL \
|
||||
_MAP_97_122_ASCII_SEG7_ALPHA_LOWER \
|
||||
_MAP_91_96_ASCII_SEG7_SYMBOL \
|
||||
_MAP_97_122_ASCII_SEG7_ALPHA_LOWER \
|
||||
_MAP_123_126_ASCII_SEG7_SYMBOL
|
||||
|
||||
#define SEG7_DEFAULT_MAP(_name) \
|
||||
SEG7_CONVERSION_MAP(_name,MAP_ASCII7SEG_ALPHANUM)
|
||||
|
||||
#endif /* MAP_TO_7SEGMENT_H */
|
||||
|
||||
|
|
@ -160,4 +160,11 @@ extern int marker_probe_unregister_private_data(marker_probe_func *probe,
|
|||
extern void *marker_get_private_data(const char *name, marker_probe_func *probe,
|
||||
int num);
|
||||
|
||||
/*
|
||||
* marker_synchronize_unregister must be called between the last marker probe
|
||||
* unregistration and the end of module exit to make sure there is no caller
|
||||
* executing a probe when it is freed.
|
||||
*/
|
||||
#define marker_synchronize_unregister() synchronize_sched()
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -27,16 +27,13 @@ struct mm_struct;
|
|||
|
||||
#ifdef CONFIG_CGROUP_MEM_RES_CTLR
|
||||
|
||||
#define page_reset_bad_cgroup(page) ((page)->page_cgroup = 0)
|
||||
|
||||
extern struct page_cgroup *page_get_page_cgroup(struct page *page);
|
||||
extern int mem_cgroup_charge(struct page *page, struct mm_struct *mm,
|
||||
gfp_t gfp_mask);
|
||||
extern int mem_cgroup_cache_charge(struct page *page, struct mm_struct *mm,
|
||||
gfp_t gfp_mask);
|
||||
extern void mem_cgroup_move_lists(struct page *page, enum lru_list lru);
|
||||
extern void mem_cgroup_uncharge_page(struct page *page);
|
||||
extern void mem_cgroup_uncharge_cache_page(struct page *page);
|
||||
extern void mem_cgroup_move_lists(struct page *page, bool active);
|
||||
extern int mem_cgroup_shrink_usage(struct mm_struct *mm, gfp_t gfp_mask);
|
||||
|
||||
extern unsigned long mem_cgroup_isolate_pages(unsigned long nr_to_scan,
|
||||
|
|
@ -44,7 +41,7 @@ extern unsigned long mem_cgroup_isolate_pages(unsigned long nr_to_scan,
|
|||
unsigned long *scanned, int order,
|
||||
int mode, struct zone *z,
|
||||
struct mem_cgroup *mem_cont,
|
||||
int active);
|
||||
int active, int file);
|
||||
extern void mem_cgroup_out_of_memory(struct mem_cgroup *mem, gfp_t gfp_mask);
|
||||
int task_in_mem_cgroup(struct task_struct *task, const struct mem_cgroup *mem);
|
||||
|
||||
|
|
@ -69,21 +66,11 @@ extern void mem_cgroup_note_reclaim_priority(struct mem_cgroup *mem,
|
|||
extern void mem_cgroup_record_reclaim_priority(struct mem_cgroup *mem,
|
||||
int priority);
|
||||
|
||||
extern long mem_cgroup_calc_reclaim_active(struct mem_cgroup *mem,
|
||||
struct zone *zone, int priority);
|
||||
extern long mem_cgroup_calc_reclaim_inactive(struct mem_cgroup *mem,
|
||||
struct zone *zone, int priority);
|
||||
extern long mem_cgroup_calc_reclaim(struct mem_cgroup *mem, struct zone *zone,
|
||||
int priority, enum lru_list lru);
|
||||
|
||||
|
||||
#else /* CONFIG_CGROUP_MEM_RES_CTLR */
|
||||
static inline void page_reset_bad_cgroup(struct page *page)
|
||||
{
|
||||
}
|
||||
|
||||
static inline struct page_cgroup *page_get_page_cgroup(struct page *page)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline int mem_cgroup_charge(struct page *page,
|
||||
struct mm_struct *mm, gfp_t gfp_mask)
|
||||
{
|
||||
|
|
@ -159,14 +146,9 @@ static inline void mem_cgroup_record_reclaim_priority(struct mem_cgroup *mem,
|
|||
{
|
||||
}
|
||||
|
||||
static inline long mem_cgroup_calc_reclaim_active(struct mem_cgroup *mem,
|
||||
struct zone *zone, int priority)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline long mem_cgroup_calc_reclaim_inactive(struct mem_cgroup *mem,
|
||||
struct zone *zone, int priority)
|
||||
static inline long mem_cgroup_calc_reclaim(struct mem_cgroup *mem,
|
||||
struct zone *zone, int priority,
|
||||
enum lru_list lru)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
201
include/linux/mfd/da903x.h
Normal file
201
include/linux/mfd/da903x.h
Normal file
|
|
@ -0,0 +1,201 @@
|
|||
#ifndef __LINUX_PMIC_DA903X_H
|
||||
#define __LINUX_PMIC_DA903X_H
|
||||
|
||||
/* Unified sub device IDs for DA9030/DA9034 */
|
||||
enum {
|
||||
DA9030_ID_LED_1,
|
||||
DA9030_ID_LED_2,
|
||||
DA9030_ID_LED_3,
|
||||
DA9030_ID_LED_4,
|
||||
DA9030_ID_LED_PC,
|
||||
DA9030_ID_VIBRA,
|
||||
DA9030_ID_WLED,
|
||||
DA9030_ID_BUCK1,
|
||||
DA9030_ID_BUCK2,
|
||||
DA9030_ID_LDO1,
|
||||
DA9030_ID_LDO2,
|
||||
DA9030_ID_LDO3,
|
||||
DA9030_ID_LDO4,
|
||||
DA9030_ID_LDO5,
|
||||
DA9030_ID_LDO6,
|
||||
DA9030_ID_LDO7,
|
||||
DA9030_ID_LDO8,
|
||||
DA9030_ID_LDO9,
|
||||
DA9030_ID_LDO10,
|
||||
DA9030_ID_LDO11,
|
||||
DA9030_ID_LDO12,
|
||||
DA9030_ID_LDO13,
|
||||
DA9030_ID_LDO14,
|
||||
DA9030_ID_LDO15,
|
||||
DA9030_ID_LDO16,
|
||||
DA9030_ID_LDO17,
|
||||
DA9030_ID_LDO18,
|
||||
DA9030_ID_LDO19,
|
||||
DA9030_ID_LDO_INT, /* LDO Internal */
|
||||
|
||||
DA9034_ID_LED_1,
|
||||
DA9034_ID_LED_2,
|
||||
DA9034_ID_VIBRA,
|
||||
DA9034_ID_WLED,
|
||||
DA9034_ID_TOUCH,
|
||||
|
||||
DA9034_ID_BUCK1,
|
||||
DA9034_ID_BUCK2,
|
||||
DA9034_ID_LDO1,
|
||||
DA9034_ID_LDO2,
|
||||
DA9034_ID_LDO3,
|
||||
DA9034_ID_LDO4,
|
||||
DA9034_ID_LDO5,
|
||||
DA9034_ID_LDO6,
|
||||
DA9034_ID_LDO7,
|
||||
DA9034_ID_LDO8,
|
||||
DA9034_ID_LDO9,
|
||||
DA9034_ID_LDO10,
|
||||
DA9034_ID_LDO11,
|
||||
DA9034_ID_LDO12,
|
||||
DA9034_ID_LDO13,
|
||||
DA9034_ID_LDO14,
|
||||
DA9034_ID_LDO15,
|
||||
};
|
||||
|
||||
/*
|
||||
* DA9030/DA9034 LEDs sub-devices uses generic "struct led_info"
|
||||
* as the platform_data
|
||||
*/
|
||||
|
||||
/* DA9030 flags for "struct led_info"
|
||||
*/
|
||||
#define DA9030_LED_RATE_ON (0 << 5)
|
||||
#define DA9030_LED_RATE_052S (1 << 5)
|
||||
#define DA9030_LED_DUTY_1_16 (0 << 3)
|
||||
#define DA9030_LED_DUTY_1_8 (1 << 3)
|
||||
#define DA9030_LED_DUTY_1_4 (2 << 3)
|
||||
#define DA9030_LED_DUTY_1_2 (3 << 3)
|
||||
|
||||
#define DA9030_VIBRA_MODE_1P3V (0 << 1)
|
||||
#define DA9030_VIBRA_MODE_2P7V (1 << 1)
|
||||
#define DA9030_VIBRA_FREQ_1HZ (0 << 2)
|
||||
#define DA9030_VIBRA_FREQ_2HZ (1 << 2)
|
||||
#define DA9030_VIBRA_FREQ_4HZ (2 << 2)
|
||||
#define DA9030_VIBRA_FREQ_8HZ (3 << 2)
|
||||
#define DA9030_VIBRA_DUTY_ON (0 << 4)
|
||||
#define DA9030_VIBRA_DUTY_75P (1 << 4)
|
||||
#define DA9030_VIBRA_DUTY_50P (2 << 4)
|
||||
#define DA9030_VIBRA_DUTY_25P (3 << 4)
|
||||
|
||||
/* DA9034 flags for "struct led_info" */
|
||||
#define DA9034_LED_RAMP (1 << 7)
|
||||
|
||||
/* DA9034 touch screen platform data */
|
||||
struct da9034_touch_pdata {
|
||||
int interval_ms; /* sampling interval while pen down */
|
||||
int x_inverted;
|
||||
int y_inverted;
|
||||
};
|
||||
|
||||
struct da903x_subdev_info {
|
||||
int id;
|
||||
const char *name;
|
||||
void *platform_data;
|
||||
};
|
||||
|
||||
struct da903x_platform_data {
|
||||
int num_subdevs;
|
||||
struct da903x_subdev_info *subdevs;
|
||||
};
|
||||
|
||||
/* bit definitions for DA9030 events */
|
||||
#define DA9030_EVENT_ONKEY (1 << 0)
|
||||
#define DA9030_EVENT_PWREN (1 << 1)
|
||||
#define DA9030_EVENT_EXTON (1 << 2)
|
||||
#define DA9030_EVENT_CHDET (1 << 3)
|
||||
#define DA9030_EVENT_TBAT (1 << 4)
|
||||
#define DA9030_EVENT_VBATMON (1 << 5)
|
||||
#define DA9030_EVENT_VBATMON_TXON (1 << 6)
|
||||
#define DA9030_EVENT_CHIOVER (1 << 7)
|
||||
#define DA9030_EVENT_TCTO (1 << 8)
|
||||
#define DA9030_EVENT_CCTO (1 << 9)
|
||||
#define DA9030_EVENT_ADC_READY (1 << 10)
|
||||
#define DA9030_EVENT_VBUS_4P4 (1 << 11)
|
||||
#define DA9030_EVENT_VBUS_4P0 (1 << 12)
|
||||
#define DA9030_EVENT_SESS_VALID (1 << 13)
|
||||
#define DA9030_EVENT_SRP_DETECT (1 << 14)
|
||||
#define DA9030_EVENT_WATCHDOG (1 << 15)
|
||||
#define DA9030_EVENT_LDO15 (1 << 16)
|
||||
#define DA9030_EVENT_LDO16 (1 << 17)
|
||||
#define DA9030_EVENT_LDO17 (1 << 18)
|
||||
#define DA9030_EVENT_LDO18 (1 << 19)
|
||||
#define DA9030_EVENT_LDO19 (1 << 20)
|
||||
#define DA9030_EVENT_BUCK2 (1 << 21)
|
||||
|
||||
/* bit definitions for DA9034 events */
|
||||
#define DA9034_EVENT_ONKEY (1 << 0)
|
||||
#define DA9034_EVENT_EXTON (1 << 2)
|
||||
#define DA9034_EVENT_CHDET (1 << 3)
|
||||
#define DA9034_EVENT_TBAT (1 << 4)
|
||||
#define DA9034_EVENT_VBATMON (1 << 5)
|
||||
#define DA9034_EVENT_REV_IOVER (1 << 6)
|
||||
#define DA9034_EVENT_CH_IOVER (1 << 7)
|
||||
#define DA9034_EVENT_CH_TCTO (1 << 8)
|
||||
#define DA9034_EVENT_CH_CCTO (1 << 9)
|
||||
#define DA9034_EVENT_USB_DEV (1 << 10)
|
||||
#define DA9034_EVENT_OTGCP_IOVER (1 << 11)
|
||||
#define DA9034_EVENT_VBUS_4P55 (1 << 12)
|
||||
#define DA9034_EVENT_VBUS_3P8 (1 << 13)
|
||||
#define DA9034_EVENT_SESS_1P8 (1 << 14)
|
||||
#define DA9034_EVENT_SRP_READY (1 << 15)
|
||||
#define DA9034_EVENT_ADC_MAN (1 << 16)
|
||||
#define DA9034_EVENT_ADC_AUTO4 (1 << 17)
|
||||
#define DA9034_EVENT_ADC_AUTO5 (1 << 18)
|
||||
#define DA9034_EVENT_ADC_AUTO6 (1 << 19)
|
||||
#define DA9034_EVENT_PEN_DOWN (1 << 20)
|
||||
#define DA9034_EVENT_TSI_READY (1 << 21)
|
||||
#define DA9034_EVENT_UART_TX (1 << 22)
|
||||
#define DA9034_EVENT_UART_RX (1 << 23)
|
||||
#define DA9034_EVENT_HEADSET (1 << 25)
|
||||
#define DA9034_EVENT_HOOKSWITCH (1 << 26)
|
||||
#define DA9034_EVENT_WATCHDOG (1 << 27)
|
||||
|
||||
extern int da903x_register_notifier(struct device *dev,
|
||||
struct notifier_block *nb, unsigned int events);
|
||||
extern int da903x_unregister_notifier(struct device *dev,
|
||||
struct notifier_block *nb, unsigned int events);
|
||||
|
||||
/* Status Query Interface */
|
||||
#define DA9030_STATUS_ONKEY (1 << 0)
|
||||
#define DA9030_STATUS_PWREN1 (1 << 1)
|
||||
#define DA9030_STATUS_EXTON (1 << 2)
|
||||
#define DA9030_STATUS_CHDET (1 << 3)
|
||||
#define DA9030_STATUS_TBAT (1 << 4)
|
||||
#define DA9030_STATUS_VBATMON (1 << 5)
|
||||
#define DA9030_STATUS_VBATMON_TXON (1 << 6)
|
||||
#define DA9030_STATUS_MCLKDET (1 << 7)
|
||||
|
||||
#define DA9034_STATUS_ONKEY (1 << 0)
|
||||
#define DA9034_STATUS_EXTON (1 << 2)
|
||||
#define DA9034_STATUS_CHDET (1 << 3)
|
||||
#define DA9034_STATUS_TBAT (1 << 4)
|
||||
#define DA9034_STATUS_VBATMON (1 << 5)
|
||||
#define DA9034_STATUS_PEN_DOWN (1 << 6)
|
||||
#define DA9034_STATUS_MCLKDET (1 << 7)
|
||||
#define DA9034_STATUS_USB_DEV (1 << 8)
|
||||
#define DA9034_STATUS_HEADSET (1 << 9)
|
||||
#define DA9034_STATUS_HOOKSWITCH (1 << 10)
|
||||
#define DA9034_STATUS_REMCON (1 << 11)
|
||||
#define DA9034_STATUS_VBUS_VALID_4P55 (1 << 12)
|
||||
#define DA9034_STATUS_VBUS_VALID_3P8 (1 << 13)
|
||||
#define DA9034_STATUS_SESS_VALID_1P8 (1 << 14)
|
||||
#define DA9034_STATUS_SRP_READY (1 << 15)
|
||||
|
||||
extern int da903x_query_status(struct device *dev, unsigned int status);
|
||||
|
||||
|
||||
/* NOTE: the two functions below are not intended for use outside
|
||||
* of the DA9034 sub-device drivers
|
||||
*/
|
||||
extern int da903x_write(struct device *dev, int reg, uint8_t val);
|
||||
extern int da903x_read(struct device *dev, int reg, uint8_t *val);
|
||||
extern int da903x_update(struct device *dev, int reg, uint8_t val, uint8_t mask);
|
||||
extern int da903x_set_bits(struct device *dev, int reg, uint8_t bit_mask);
|
||||
extern int da903x_clr_bits(struct device *dev, int reg, uint8_t bit_mask);
|
||||
#endif /* __LINUX_PMIC_DA903X_H */
|
||||
|
|
@ -15,8 +15,6 @@
|
|||
#include <linux/mfd/tmio.h>
|
||||
|
||||
struct t7l66xb_platform_data {
|
||||
int (*enable_clk32k)(struct platform_device *dev);
|
||||
void (*disable_clk32k)(struct platform_device *dev);
|
||||
int (*enable)(struct platform_device *dev);
|
||||
int (*disable)(struct platform_device *dev);
|
||||
int (*suspend)(struct platform_device *dev);
|
||||
|
|
|
|||
|
|
@ -11,9 +11,6 @@
|
|||
#define MFD_TC6387XB_H
|
||||
|
||||
struct tc6387xb_platform_data {
|
||||
int (*enable_clk32k)(struct platform_device *dev);
|
||||
void (*disable_clk32k)(struct platform_device *dev);
|
||||
|
||||
int (*enable)(struct platform_device *dev);
|
||||
int (*disable)(struct platform_device *dev);
|
||||
int (*suspend)(struct platform_device *dev);
|
||||
|
|
|
|||
|
|
@ -17,12 +17,12 @@
|
|||
#ifndef MFD_TC6393XB_H
|
||||
#define MFD_TC6393XB_H
|
||||
|
||||
#include <linux/fb.h>
|
||||
|
||||
/* Also one should provide the CK3P6MI clock */
|
||||
struct tc6393xb_platform_data {
|
||||
u16 scr_pll2cr; /* PLL2 Control */
|
||||
u16 scr_gper; /* GP Enable */
|
||||
u32 scr_gpo_doecr; /* GPO Data OE Control */
|
||||
u32 scr_gpo_dsr; /* GPO Data Set */
|
||||
|
||||
int (*enable)(struct platform_device *dev);
|
||||
int (*disable)(struct platform_device *dev);
|
||||
|
|
@ -31,15 +31,28 @@ struct tc6393xb_platform_data {
|
|||
|
||||
int irq_base; /* base for subdevice irqs */
|
||||
int gpio_base;
|
||||
int (*setup)(struct platform_device *dev);
|
||||
void (*teardown)(struct platform_device *dev);
|
||||
|
||||
struct tmio_nand_data *nand_data;
|
||||
struct tmio_fb_data *fb_data;
|
||||
|
||||
unsigned resume_restore : 1; /* make special actions
|
||||
to preserve the state
|
||||
on suspend/resume */
|
||||
};
|
||||
|
||||
extern int tc6393xb_lcd_mode(struct platform_device *fb,
|
||||
const struct fb_videomode *mode);
|
||||
extern int tc6393xb_lcd_set_power(struct platform_device *fb, bool on);
|
||||
|
||||
/*
|
||||
* Relative to irq_base
|
||||
*/
|
||||
#define IRQ_TC6393_NAND 0
|
||||
#define IRQ_TC6393_MMC 1
|
||||
#define IRQ_TC6393_OHCI 2
|
||||
#define IRQ_TC6393_FB 4
|
||||
|
||||
#define TC6393XB_NR_IRQS 8
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,8 @@
|
|||
#ifndef MFD_TMIO_H
|
||||
#define MFD_TMIO_H
|
||||
|
||||
#include <linux/fb.h>
|
||||
|
||||
#define tmio_ioread8(addr) readb(addr)
|
||||
#define tmio_ioread16(addr) readw(addr)
|
||||
#define tmio_ioread16_rep(r, b, l) readsw(r, b, l)
|
||||
|
|
@ -25,4 +27,21 @@ struct tmio_nand_data {
|
|||
unsigned int num_partitions;
|
||||
};
|
||||
|
||||
#define FBIO_TMIO_ACC_WRITE 0x7C639300
|
||||
#define FBIO_TMIO_ACC_SYNC 0x7C639301
|
||||
|
||||
struct tmio_fb_data {
|
||||
int (*lcd_set_power)(struct platform_device *fb_dev,
|
||||
bool on);
|
||||
int (*lcd_mode)(struct platform_device *fb_dev,
|
||||
const struct fb_videomode *mode);
|
||||
int num_modes;
|
||||
struct fb_videomode *modes;
|
||||
|
||||
/* in mm: size of screen */
|
||||
int height;
|
||||
int width;
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@
|
|||
typedef struct page *new_page_t(struct page *, unsigned long private, int **);
|
||||
|
||||
#ifdef CONFIG_MIGRATION
|
||||
extern int isolate_lru_page(struct page *p, struct list_head *pagelist);
|
||||
extern int putback_lru_pages(struct list_head *l);
|
||||
extern int migrate_page(struct address_space *,
|
||||
struct page *, struct page *);
|
||||
|
|
@ -21,8 +20,6 @@ extern int migrate_vmas(struct mm_struct *mm,
|
|||
const nodemask_t *from, const nodemask_t *to,
|
||||
unsigned long flags);
|
||||
#else
|
||||
static inline int isolate_lru_page(struct page *p, struct list_head *list)
|
||||
{ return -ENOSYS; }
|
||||
static inline int putback_lru_pages(struct list_head *l) { return 0; }
|
||||
static inline int migrate_pages(struct list_head *l, new_page_t x,
|
||||
unsigned long private) { return -ENOSYS; }
|
||||
|
|
|
|||
|
|
@ -131,6 +131,11 @@ extern unsigned int kobjsize(const void *objp);
|
|||
#define VM_SequentialReadHint(v) ((v)->vm_flags & VM_SEQ_READ)
|
||||
#define VM_RandomReadHint(v) ((v)->vm_flags & VM_RAND_READ)
|
||||
|
||||
/*
|
||||
* special vmas that are non-mergable, non-mlock()able
|
||||
*/
|
||||
#define VM_SPECIAL (VM_IO | VM_DONTEXPAND | VM_RESERVED | VM_PFNMAP)
|
||||
|
||||
/*
|
||||
* mapping from the currently active vm_flags protection bits (the
|
||||
* low four bits) to a page protection mask..
|
||||
|
|
@ -700,10 +705,10 @@ static inline int page_mapped(struct page *page)
|
|||
extern void show_free_areas(void);
|
||||
|
||||
#ifdef CONFIG_SHMEM
|
||||
int shmem_lock(struct file *file, int lock, struct user_struct *user);
|
||||
extern int shmem_lock(struct file *file, int lock, struct user_struct *user);
|
||||
#else
|
||||
static inline int shmem_lock(struct file *file, int lock,
|
||||
struct user_struct *user)
|
||||
struct user_struct *user)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,40 +1,100 @@
|
|||
static inline void
|
||||
add_page_to_active_list(struct zone *zone, struct page *page)
|
||||
#ifndef LINUX_MM_INLINE_H
|
||||
#define LINUX_MM_INLINE_H
|
||||
|
||||
/**
|
||||
* page_is_file_cache - should the page be on a file LRU or anon LRU?
|
||||
* @page: the page to test
|
||||
*
|
||||
* Returns LRU_FILE if @page is page cache page backed by a regular filesystem,
|
||||
* or 0 if @page is anonymous, tmpfs or otherwise ram or swap backed.
|
||||
* Used by functions that manipulate the LRU lists, to sort a page
|
||||
* onto the right LRU list.
|
||||
*
|
||||
* We would like to get this info without a page flag, but the state
|
||||
* needs to survive until the page is last deleted from the LRU, which
|
||||
* could be as far down as __page_cache_release.
|
||||
*/
|
||||
static inline int page_is_file_cache(struct page *page)
|
||||
{
|
||||
list_add(&page->lru, &zone->active_list);
|
||||
__inc_zone_state(zone, NR_ACTIVE);
|
||||
if (PageSwapBacked(page))
|
||||
return 0;
|
||||
|
||||
/* The page is page cache backed by a normal filesystem. */
|
||||
return LRU_FILE;
|
||||
}
|
||||
|
||||
static inline void
|
||||
add_page_to_inactive_list(struct zone *zone, struct page *page)
|
||||
add_page_to_lru_list(struct zone *zone, struct page *page, enum lru_list l)
|
||||
{
|
||||
list_add(&page->lru, &zone->inactive_list);
|
||||
__inc_zone_state(zone, NR_INACTIVE);
|
||||
list_add(&page->lru, &zone->lru[l].list);
|
||||
__inc_zone_state(zone, NR_LRU_BASE + l);
|
||||
}
|
||||
|
||||
static inline void
|
||||
del_page_from_active_list(struct zone *zone, struct page *page)
|
||||
del_page_from_lru_list(struct zone *zone, struct page *page, enum lru_list l)
|
||||
{
|
||||
list_del(&page->lru);
|
||||
__dec_zone_state(zone, NR_ACTIVE);
|
||||
}
|
||||
|
||||
static inline void
|
||||
del_page_from_inactive_list(struct zone *zone, struct page *page)
|
||||
{
|
||||
list_del(&page->lru);
|
||||
__dec_zone_state(zone, NR_INACTIVE);
|
||||
__dec_zone_state(zone, NR_LRU_BASE + l);
|
||||
}
|
||||
|
||||
static inline void
|
||||
del_page_from_lru(struct zone *zone, struct page *page)
|
||||
{
|
||||
enum lru_list l = LRU_BASE;
|
||||
|
||||
list_del(&page->lru);
|
||||
if (PageActive(page)) {
|
||||
__ClearPageActive(page);
|
||||
__dec_zone_state(zone, NR_ACTIVE);
|
||||
if (PageUnevictable(page)) {
|
||||
__ClearPageUnevictable(page);
|
||||
l = LRU_UNEVICTABLE;
|
||||
} else {
|
||||
__dec_zone_state(zone, NR_INACTIVE);
|
||||
if (PageActive(page)) {
|
||||
__ClearPageActive(page);
|
||||
l += LRU_ACTIVE;
|
||||
}
|
||||
l += page_is_file_cache(page);
|
||||
}
|
||||
__dec_zone_state(zone, NR_LRU_BASE + l);
|
||||
}
|
||||
|
||||
/**
|
||||
* page_lru - which LRU list should a page be on?
|
||||
* @page: the page to test
|
||||
*
|
||||
* Returns the LRU list a page should be on, as an index
|
||||
* into the array of LRU lists.
|
||||
*/
|
||||
static inline enum lru_list page_lru(struct page *page)
|
||||
{
|
||||
enum lru_list lru = LRU_BASE;
|
||||
|
||||
if (PageUnevictable(page))
|
||||
lru = LRU_UNEVICTABLE;
|
||||
else {
|
||||
if (PageActive(page))
|
||||
lru += LRU_ACTIVE;
|
||||
lru += page_is_file_cache(page);
|
||||
}
|
||||
|
||||
return lru;
|
||||
}
|
||||
|
||||
/**
|
||||
* inactive_anon_is_low - check if anonymous pages need to be deactivated
|
||||
* @zone: zone to check
|
||||
*
|
||||
* Returns true if the zone does not have enough inactive anon pages,
|
||||
* meaning some active anon pages need to be deactivated.
|
||||
*/
|
||||
static inline int inactive_anon_is_low(struct zone *zone)
|
||||
{
|
||||
unsigned long active, inactive;
|
||||
|
||||
active = zone_page_state(zone, NR_ACTIVE_ANON);
|
||||
inactive = zone_page_state(zone, NR_INACTIVE_ANON);
|
||||
|
||||
if (inactive * zone->inactive_ratio < active)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -94,9 +94,6 @@ struct page {
|
|||
void *virtual; /* Kernel virtual address (NULL if
|
||||
not kmapped, ie. highmem) */
|
||||
#endif /* WANT_PAGE_VIRTUAL */
|
||||
#ifdef CONFIG_CGROUP_MEM_RES_CTLR
|
||||
unsigned long page_cgroup;
|
||||
#endif
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -34,11 +34,15 @@ extern void unregister_kmmio_probe(struct kmmio_probe *p);
|
|||
/* Called from page fault handler. */
|
||||
extern int kmmio_handler(struct pt_regs *regs, unsigned long addr);
|
||||
|
||||
/* Called from ioremap.c */
|
||||
#ifdef CONFIG_MMIOTRACE
|
||||
/* Called from ioremap.c */
|
||||
extern void mmiotrace_ioremap(resource_size_t offset, unsigned long size,
|
||||
void __iomem *addr);
|
||||
extern void mmiotrace_iounmap(volatile void __iomem *addr);
|
||||
|
||||
/* For anyone to insert markers. Remember trailing newline. */
|
||||
extern int mmiotrace_printk(const char *fmt, ...)
|
||||
__attribute__ ((format (printf, 1, 2)));
|
||||
#else
|
||||
static inline void mmiotrace_ioremap(resource_size_t offset,
|
||||
unsigned long size, void __iomem *addr)
|
||||
|
|
@ -48,15 +52,22 @@ static inline void mmiotrace_ioremap(resource_size_t offset,
|
|||
static inline void mmiotrace_iounmap(volatile void __iomem *addr)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_MMIOTRACE_HOOKS */
|
||||
|
||||
static inline int mmiotrace_printk(const char *fmt, ...)
|
||||
__attribute__ ((format (printf, 1, 0)));
|
||||
|
||||
static inline int mmiotrace_printk(const char *fmt, ...)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_MMIOTRACE */
|
||||
|
||||
enum mm_io_opcode {
|
||||
MMIO_READ = 0x1, /* struct mmiotrace_rw */
|
||||
MMIO_WRITE = 0x2, /* struct mmiotrace_rw */
|
||||
MMIO_PROBE = 0x3, /* struct mmiotrace_map */
|
||||
MMIO_UNPROBE = 0x4, /* struct mmiotrace_map */
|
||||
MMIO_MARKER = 0x5, /* raw char data */
|
||||
MMIO_UNKNOWN_OP = 0x6, /* struct mmiotrace_rw */
|
||||
MMIO_UNKNOWN_OP = 0x5, /* struct mmiotrace_rw */
|
||||
};
|
||||
|
||||
struct mmiotrace_rw {
|
||||
|
|
@ -81,5 +92,6 @@ extern void enable_mmiotrace(void);
|
|||
extern void disable_mmiotrace(void);
|
||||
extern void mmio_trace_rw(struct mmiotrace_rw *rw);
|
||||
extern void mmio_trace_mapping(struct mmiotrace_map *map);
|
||||
extern int mmio_trace_printk(const char *fmt, va_list args);
|
||||
|
||||
#endif /* MMIOTRACE_H */
|
||||
|
|
|
|||
|
|
@ -81,21 +81,31 @@ struct zone_padding {
|
|||
enum zone_stat_item {
|
||||
/* First 128 byte cacheline (assuming 64 bit words) */
|
||||
NR_FREE_PAGES,
|
||||
NR_INACTIVE,
|
||||
NR_ACTIVE,
|
||||
NR_LRU_BASE,
|
||||
NR_INACTIVE_ANON = NR_LRU_BASE, /* must match order of LRU_[IN]ACTIVE */
|
||||
NR_ACTIVE_ANON, /* " " " " " */
|
||||
NR_INACTIVE_FILE, /* " " " " " */
|
||||
NR_ACTIVE_FILE, /* " " " " " */
|
||||
#ifdef CONFIG_UNEVICTABLE_LRU
|
||||
NR_UNEVICTABLE, /* " " " " " */
|
||||
NR_MLOCK, /* mlock()ed pages found and moved off LRU */
|
||||
#else
|
||||
NR_UNEVICTABLE = NR_ACTIVE_FILE, /* avoid compiler errors in dead code */
|
||||
NR_MLOCK = NR_ACTIVE_FILE,
|
||||
#endif
|
||||
NR_ANON_PAGES, /* Mapped anonymous pages */
|
||||
NR_FILE_MAPPED, /* pagecache pages mapped into pagetables.
|
||||
only modified from process context */
|
||||
NR_FILE_PAGES,
|
||||
NR_FILE_DIRTY,
|
||||
NR_WRITEBACK,
|
||||
/* Second 128 byte cacheline */
|
||||
NR_SLAB_RECLAIMABLE,
|
||||
NR_SLAB_UNRECLAIMABLE,
|
||||
NR_PAGETABLE, /* used for pagetables */
|
||||
NR_UNSTABLE_NFS, /* NFS unstable pages */
|
||||
NR_BOUNCE,
|
||||
NR_VMSCAN_WRITE,
|
||||
/* Second 128 byte cacheline */
|
||||
NR_WRITEBACK_TEMP, /* Writeback using temporary buffers */
|
||||
#ifdef CONFIG_NUMA
|
||||
NUMA_HIT, /* allocated in intended node */
|
||||
|
|
@ -107,6 +117,55 @@ enum zone_stat_item {
|
|||
#endif
|
||||
NR_VM_ZONE_STAT_ITEMS };
|
||||
|
||||
/*
|
||||
* We do arithmetic on the LRU lists in various places in the code,
|
||||
* so it is important to keep the active lists LRU_ACTIVE higher in
|
||||
* the array than the corresponding inactive lists, and to keep
|
||||
* the *_FILE lists LRU_FILE higher than the corresponding _ANON lists.
|
||||
*
|
||||
* This has to be kept in sync with the statistics in zone_stat_item
|
||||
* above and the descriptions in vmstat_text in mm/vmstat.c
|
||||
*/
|
||||
#define LRU_BASE 0
|
||||
#define LRU_ACTIVE 1
|
||||
#define LRU_FILE 2
|
||||
|
||||
enum lru_list {
|
||||
LRU_INACTIVE_ANON = LRU_BASE,
|
||||
LRU_ACTIVE_ANON = LRU_BASE + LRU_ACTIVE,
|
||||
LRU_INACTIVE_FILE = LRU_BASE + LRU_FILE,
|
||||
LRU_ACTIVE_FILE = LRU_BASE + LRU_FILE + LRU_ACTIVE,
|
||||
#ifdef CONFIG_UNEVICTABLE_LRU
|
||||
LRU_UNEVICTABLE,
|
||||
#else
|
||||
LRU_UNEVICTABLE = LRU_ACTIVE_FILE, /* avoid compiler errors in dead code */
|
||||
#endif
|
||||
NR_LRU_LISTS
|
||||
};
|
||||
|
||||
#define for_each_lru(l) for (l = 0; l < NR_LRU_LISTS; l++)
|
||||
|
||||
#define for_each_evictable_lru(l) for (l = 0; l <= LRU_ACTIVE_FILE; l++)
|
||||
|
||||
static inline int is_file_lru(enum lru_list l)
|
||||
{
|
||||
return (l == LRU_INACTIVE_FILE || l == LRU_ACTIVE_FILE);
|
||||
}
|
||||
|
||||
static inline int is_active_lru(enum lru_list l)
|
||||
{
|
||||
return (l == LRU_ACTIVE_ANON || l == LRU_ACTIVE_FILE);
|
||||
}
|
||||
|
||||
static inline int is_unevictable_lru(enum lru_list l)
|
||||
{
|
||||
#ifdef CONFIG_UNEVICTABLE_LRU
|
||||
return (l == LRU_UNEVICTABLE);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
struct per_cpu_pages {
|
||||
int count; /* number of pages in the list */
|
||||
int high; /* high watermark, emptying needed */
|
||||
|
|
@ -251,10 +310,22 @@ struct zone {
|
|||
|
||||
/* Fields commonly accessed by the page reclaim scanner */
|
||||
spinlock_t lru_lock;
|
||||
struct list_head active_list;
|
||||
struct list_head inactive_list;
|
||||
unsigned long nr_scan_active;
|
||||
unsigned long nr_scan_inactive;
|
||||
struct {
|
||||
struct list_head list;
|
||||
unsigned long nr_scan;
|
||||
} lru[NR_LRU_LISTS];
|
||||
|
||||
/*
|
||||
* The pageout code in vmscan.c keeps track of how many of the
|
||||
* mem/swap backed and file backed pages are refeferenced.
|
||||
* The higher the rotated/scanned ratio, the more valuable
|
||||
* that cache is.
|
||||
*
|
||||
* The anon LRU stats live in [0], file LRU stats in [1]
|
||||
*/
|
||||
unsigned long recent_rotated[2];
|
||||
unsigned long recent_scanned[2];
|
||||
|
||||
unsigned long pages_scanned; /* since last reclaim */
|
||||
unsigned long flags; /* zone flags, see below */
|
||||
|
||||
|
|
@ -276,6 +347,12 @@ struct zone {
|
|||
*/
|
||||
int prev_priority;
|
||||
|
||||
/*
|
||||
* The target ratio of ACTIVE_ANON to INACTIVE_ANON pages on
|
||||
* this zone's LRU. Maintained by the pageout code.
|
||||
*/
|
||||
unsigned int inactive_ratio;
|
||||
|
||||
|
||||
ZONE_PADDING(_pad2_)
|
||||
/* Rarely used or read-mostly fields */
|
||||
|
|
@ -524,8 +601,11 @@ typedef struct pglist_data {
|
|||
struct zone node_zones[MAX_NR_ZONES];
|
||||
struct zonelist node_zonelists[MAX_ZONELISTS];
|
||||
int nr_zones;
|
||||
#ifdef CONFIG_FLAT_NODE_MEM_MAP
|
||||
#ifdef CONFIG_FLAT_NODE_MEM_MAP /* means !SPARSEMEM */
|
||||
struct page *node_mem_map;
|
||||
#ifdef CONFIG_CGROUP_MEM_RES_CTLR
|
||||
struct page_cgroup *node_page_cgroup;
|
||||
#endif
|
||||
#endif
|
||||
struct bootmem_data *bdata;
|
||||
#ifdef CONFIG_MEMORY_HOTPLUG
|
||||
|
|
@ -854,6 +934,7 @@ static inline unsigned long early_pfn_to_nid(unsigned long pfn)
|
|||
#endif
|
||||
|
||||
struct page;
|
||||
struct page_cgroup;
|
||||
struct mem_section {
|
||||
/*
|
||||
* This is, logically, a pointer to an array of struct
|
||||
|
|
@ -871,6 +952,14 @@ struct mem_section {
|
|||
|
||||
/* See declaration of similar field in struct zone */
|
||||
unsigned long *pageblock_flags;
|
||||
#ifdef CONFIG_CGROUP_MEM_RES_CTLR
|
||||
/*
|
||||
* If !SPARSEMEM, pgdat doesn't have page_cgroup pointer. We use
|
||||
* section. (see memcontrol.h/page_cgroup.h about this.)
|
||||
*/
|
||||
struct page_cgroup *page_cgroup;
|
||||
unsigned long pad;
|
||||
#endif
|
||||
};
|
||||
|
||||
#ifdef CONFIG_SPARSEMEM_EXTREME
|
||||
|
|
|
|||
|
|
@ -284,7 +284,7 @@ struct pcmcia_device_id {
|
|||
/* Input */
|
||||
#define INPUT_DEVICE_ID_EV_MAX 0x1f
|
||||
#define INPUT_DEVICE_ID_KEY_MIN_INTERESTING 0x71
|
||||
#define INPUT_DEVICE_ID_KEY_MAX 0x1ff
|
||||
#define INPUT_DEVICE_ID_KEY_MAX 0x2ff
|
||||
#define INPUT_DEVICE_ID_REL_MAX 0x0f
|
||||
#define INPUT_DEVICE_ID_ABS_MAX 0x3f
|
||||
#define INPUT_DEVICE_ID_MSC_MAX 0x07
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@
|
|||
#include <linux/kobject.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/marker.h>
|
||||
#include <linux/tracepoint.h>
|
||||
#include <asm/local.h>
|
||||
|
||||
#include <asm/module.h>
|
||||
|
|
@ -331,6 +332,10 @@ struct module
|
|||
struct marker *markers;
|
||||
unsigned int num_markers;
|
||||
#endif
|
||||
#ifdef CONFIG_TRACEPOINTS
|
||||
struct tracepoint *tracepoints;
|
||||
unsigned int num_tracepoints;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MODULE_UNLOAD
|
||||
/* What modules depend on me? */
|
||||
|
|
@ -345,7 +350,6 @@ struct module
|
|||
/* Reference counts */
|
||||
struct module_ref ref[NR_CPUS];
|
||||
#endif
|
||||
|
||||
};
|
||||
#ifndef MODULE_ARCH_INIT
|
||||
#define MODULE_ARCH_INIT {}
|
||||
|
|
@ -454,6 +458,9 @@ extern void print_modules(void);
|
|||
|
||||
extern void module_update_markers(void);
|
||||
|
||||
extern void module_update_tracepoints(void);
|
||||
extern int module_get_iter_tracepoints(struct tracepoint_iter *iter);
|
||||
|
||||
#else /* !CONFIG_MODULES... */
|
||||
#define EXPORT_SYMBOL(sym)
|
||||
#define EXPORT_SYMBOL_GPL(sym)
|
||||
|
|
@ -558,6 +565,15 @@ static inline void module_update_markers(void)
|
|||
{
|
||||
}
|
||||
|
||||
static inline void module_update_tracepoints(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int module_get_iter_tracepoints(struct tracepoint_iter *iter)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_MODULES */
|
||||
|
||||
struct device_driver;
|
||||
|
|
|
|||
|
|
@ -5,8 +5,6 @@
|
|||
*
|
||||
* Author: Marco van Wieringen <mvw@planets.elm.net>
|
||||
*
|
||||
* Version: $Id: mount.h,v 2.0 1996/11/17 16:48:14 mvw Exp mvw $
|
||||
*
|
||||
*/
|
||||
#ifndef _LINUX_MOUNT_H
|
||||
#define _LINUX_MOUNT_H
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@
|
|||
#include <linux/mtd/flashchip.h>
|
||||
#include <linux/mtd/map.h>
|
||||
#include <linux/mtd/cfi_endian.h>
|
||||
#include <linux/mtd/xip.h>
|
||||
|
||||
#ifdef CONFIG_MTD_CFI_I1
|
||||
#define cfi_interleave(cfi) 1
|
||||
|
|
@ -430,7 +431,6 @@ static inline uint32_t cfi_send_gen_cmd(u_char cmd, uint32_t cmd_addr, uint32_t
|
|||
{
|
||||
map_word val;
|
||||
uint32_t addr = base + cfi_build_cmd_addr(cmd_addr, cfi_interleave(cfi), type);
|
||||
|
||||
val = cfi_build_cmd(cmd, map, cfi);
|
||||
|
||||
if (prev_val)
|
||||
|
|
@ -483,6 +483,13 @@ static inline void cfi_udelay(int us)
|
|||
}
|
||||
}
|
||||
|
||||
int __xipram cfi_qry_present(struct map_info *map, __u32 base,
|
||||
struct cfi_private *cfi);
|
||||
int __xipram cfi_qry_mode_on(uint32_t base, struct map_info *map,
|
||||
struct cfi_private *cfi);
|
||||
void __xipram cfi_qry_mode_off(uint32_t base, struct map_info *map,
|
||||
struct cfi_private *cfi);
|
||||
|
||||
struct cfi_extquery *cfi_read_pri(struct map_info *map, uint16_t adr, uint16_t size,
|
||||
const char* name);
|
||||
struct cfi_fixup {
|
||||
|
|
|
|||
|
|
@ -73,6 +73,10 @@ struct flchip {
|
|||
int buffer_write_time;
|
||||
int erase_time;
|
||||
|
||||
int word_write_time_max;
|
||||
int buffer_write_time_max;
|
||||
int erase_time_max;
|
||||
|
||||
void *priv;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -25,8 +25,10 @@
|
|||
#define MTD_ERASE_DONE 0x08
|
||||
#define MTD_ERASE_FAILED 0x10
|
||||
|
||||
#define MTD_FAIL_ADDR_UNKNOWN 0xffffffff
|
||||
|
||||
/* If the erase fails, fail_addr might indicate exactly which block failed. If
|
||||
fail_addr = 0xffffffff, the failure was not at the device level or was not
|
||||
fail_addr = MTD_FAIL_ADDR_UNKNOWN, the failure was not at the device level or was not
|
||||
specific to any particular block. */
|
||||
struct erase_info {
|
||||
struct mtd_info *mtd;
|
||||
|
|
|
|||
19
include/linux/mtd/nand-gpio.h
Normal file
19
include/linux/mtd/nand-gpio.h
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
#ifndef __LINUX_MTD_NAND_GPIO_H
|
||||
#define __LINUX_MTD_NAND_GPIO_H
|
||||
|
||||
#include <linux/mtd/nand.h>
|
||||
|
||||
struct gpio_nand_platdata {
|
||||
int gpio_nce;
|
||||
int gpio_nwp;
|
||||
int gpio_cle;
|
||||
int gpio_ale;
|
||||
int gpio_rdy;
|
||||
void (*adjust_parts)(struct gpio_nand_platdata *, size_t);
|
||||
struct mtd_partition *parts;
|
||||
unsigned int num_parts;
|
||||
unsigned int options;
|
||||
int chip_delay;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
@ -248,6 +248,7 @@ struct nand_hw_control {
|
|||
* @read_page_raw: function to read a raw page without ECC
|
||||
* @write_page_raw: function to write a raw page without ECC
|
||||
* @read_page: function to read a page according to the ecc generator requirements
|
||||
* @read_subpage: function to read parts of the page covered by ECC.
|
||||
* @write_page: function to write a page according to the ecc generator requirements
|
||||
* @read_oob: function to read chip OOB data
|
||||
* @write_oob: function to write chip OOB data
|
||||
|
|
|
|||
|
|
@ -152,6 +152,8 @@
|
|||
#define ONENAND_SYS_CFG1_INT (1 << 6)
|
||||
#define ONENAND_SYS_CFG1_IOBE (1 << 5)
|
||||
#define ONENAND_SYS_CFG1_RDY_CONF (1 << 4)
|
||||
#define ONENAND_SYS_CFG1_HF (1 << 2)
|
||||
#define ONENAND_SYS_CFG1_SYNC_WRITE (1 << 1)
|
||||
|
||||
/*
|
||||
* Controller Status Register F240h (R)
|
||||
|
|
|
|||
|
|
@ -73,7 +73,6 @@ struct device;
|
|||
struct device_node;
|
||||
|
||||
int __devinit of_mtd_parse_partitions(struct device *dev,
|
||||
struct mtd_info *mtd,
|
||||
struct device_node *node,
|
||||
struct mtd_partition **pparts);
|
||||
|
||||
|
|
|
|||
125
include/linux/mtd/sh_flctl.h
Normal file
125
include/linux/mtd/sh_flctl.h
Normal file
|
|
@ -0,0 +1,125 @@
|
|||
/*
|
||||
* SuperH FLCTL nand controller
|
||||
*
|
||||
* Copyright © 2008 Renesas Solutions Corp.
|
||||
*
|
||||
* 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; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef __SH_FLCTL_H__
|
||||
#define __SH_FLCTL_H__
|
||||
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/nand.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
|
||||
/* FLCTL registers */
|
||||
#define FLCMNCR(f) (f->reg + 0x0)
|
||||
#define FLCMDCR(f) (f->reg + 0x4)
|
||||
#define FLCMCDR(f) (f->reg + 0x8)
|
||||
#define FLADR(f) (f->reg + 0xC)
|
||||
#define FLADR2(f) (f->reg + 0x3C)
|
||||
#define FLDATAR(f) (f->reg + 0x10)
|
||||
#define FLDTCNTR(f) (f->reg + 0x14)
|
||||
#define FLINTDMACR(f) (f->reg + 0x18)
|
||||
#define FLBSYTMR(f) (f->reg + 0x1C)
|
||||
#define FLBSYCNT(f) (f->reg + 0x20)
|
||||
#define FLDTFIFO(f) (f->reg + 0x24)
|
||||
#define FLECFIFO(f) (f->reg + 0x28)
|
||||
#define FLTRCR(f) (f->reg + 0x2C)
|
||||
#define FL4ECCRESULT0(f) (f->reg + 0x80)
|
||||
#define FL4ECCRESULT1(f) (f->reg + 0x84)
|
||||
#define FL4ECCRESULT2(f) (f->reg + 0x88)
|
||||
#define FL4ECCRESULT3(f) (f->reg + 0x8C)
|
||||
#define FL4ECCCR(f) (f->reg + 0x90)
|
||||
#define FL4ECCCNT(f) (f->reg + 0x94)
|
||||
#define FLERRADR(f) (f->reg + 0x98)
|
||||
|
||||
/* FLCMNCR control bits */
|
||||
#define ECCPOS2 (0x1 << 25)
|
||||
#define _4ECCCNTEN (0x1 << 24)
|
||||
#define _4ECCEN (0x1 << 23)
|
||||
#define _4ECCCORRECT (0x1 << 22)
|
||||
#define SNAND_E (0x1 << 18) /* SNAND (0=512 1=2048)*/
|
||||
#define QTSEL_E (0x1 << 17)
|
||||
#define ENDIAN (0x1 << 16) /* 1 = little endian */
|
||||
#define FCKSEL_E (0x1 << 15)
|
||||
#define ECCPOS_00 (0x00 << 12)
|
||||
#define ECCPOS_01 (0x01 << 12)
|
||||
#define ECCPOS_02 (0x02 << 12)
|
||||
#define ACM_SACCES_MODE (0x01 << 10)
|
||||
#define NANWF_E (0x1 << 9)
|
||||
#define SE_D (0x1 << 8) /* Spare area disable */
|
||||
#define CE1_ENABLE (0x1 << 4) /* Chip Enable 1 */
|
||||
#define CE0_ENABLE (0x1 << 3) /* Chip Enable 0 */
|
||||
#define TYPESEL_SET (0x1 << 0)
|
||||
|
||||
/* FLCMDCR control bits */
|
||||
#define ADRCNT2_E (0x1 << 31) /* 5byte address enable */
|
||||
#define ADRMD_E (0x1 << 26) /* Sector address access */
|
||||
#define CDSRC_E (0x1 << 25) /* Data buffer selection */
|
||||
#define DOSR_E (0x1 << 24) /* Status read check */
|
||||
#define SELRW (0x1 << 21) /* 0:read 1:write */
|
||||
#define DOADR_E (0x1 << 20) /* Address stage execute */
|
||||
#define ADRCNT_1 (0x00 << 18) /* Address data bytes: 1byte */
|
||||
#define ADRCNT_2 (0x01 << 18) /* Address data bytes: 2byte */
|
||||
#define ADRCNT_3 (0x02 << 18) /* Address data bytes: 3byte */
|
||||
#define ADRCNT_4 (0x03 << 18) /* Address data bytes: 4byte */
|
||||
#define DOCMD2_E (0x1 << 17) /* 2nd cmd stage execute */
|
||||
#define DOCMD1_E (0x1 << 16) /* 1st cmd stage execute */
|
||||
|
||||
/* FLTRCR control bits */
|
||||
#define TRSTRT (0x1 << 0) /* translation start */
|
||||
#define TREND (0x1 << 1) /* translation end */
|
||||
|
||||
/* FL4ECCCR control bits */
|
||||
#define _4ECCFA (0x1 << 2) /* 4 symbols correct fault */
|
||||
#define _4ECCEND (0x1 << 1) /* 4 symbols end */
|
||||
#define _4ECCEXST (0x1 << 0) /* 4 symbols exist */
|
||||
|
||||
#define INIT_FL4ECCRESULT_VAL 0x03FF03FF
|
||||
#define LOOP_TIMEOUT_MAX 0x00010000
|
||||
|
||||
#define mtd_to_flctl(mtd) container_of(mtd, struct sh_flctl, mtd)
|
||||
|
||||
struct sh_flctl {
|
||||
struct mtd_info mtd;
|
||||
struct nand_chip chip;
|
||||
void __iomem *reg;
|
||||
|
||||
uint8_t done_buff[2048 + 64]; /* max size 2048 + 64 */
|
||||
int read_bytes;
|
||||
int index;
|
||||
int seqin_column; /* column in SEQIN cmd */
|
||||
int seqin_page_addr; /* page_addr in SEQIN cmd */
|
||||
uint32_t seqin_read_cmd; /* read cmd in SEQIN cmd */
|
||||
int erase1_page_addr; /* page_addr in ERASE1 cmd */
|
||||
uint32_t erase_ADRCNT; /* bits of FLCMDCR in ERASE1 cmd */
|
||||
uint32_t rw_ADRCNT; /* bits of FLCMDCR in READ WRITE cmd */
|
||||
|
||||
int hwecc_cant_correct[4];
|
||||
|
||||
unsigned page_size:1; /* NAND page size (0 = 512, 1 = 2048) */
|
||||
unsigned hwecc:1; /* Hardware ECC (0 = disabled, 1 = enabled) */
|
||||
};
|
||||
|
||||
struct sh_flctl_platform_data {
|
||||
struct mtd_partition *parts;
|
||||
int nr_parts;
|
||||
unsigned long flcmncr_val;
|
||||
|
||||
unsigned has_hwecc:1;
|
||||
};
|
||||
|
||||
#endif /* __SH_FLCTL_H__ */
|
||||
|
|
@ -78,6 +78,9 @@ extern int nfnetlink_send(struct sk_buff *skb, u32 pid, unsigned group,
|
|||
int echo);
|
||||
extern int nfnetlink_unicast(struct sk_buff *skb, u_int32_t pid, int flags);
|
||||
|
||||
extern void nfnl_lock(void);
|
||||
extern void nfnl_unlock(void);
|
||||
|
||||
#define MODULE_ALIAS_NFNL_SUBSYS(subsys) \
|
||||
MODULE_ALIAS("nfnetlink-subsys-" __stringify(subsys))
|
||||
|
||||
|
|
|
|||
|
|
@ -137,7 +137,7 @@ struct nfs_inode {
|
|||
unsigned long attrtimeo_timestamp;
|
||||
__u64 change_attr; /* v4 only */
|
||||
|
||||
unsigned long last_updated;
|
||||
unsigned long attr_gencount;
|
||||
/* "Generation counter" for the attribute cache. This is
|
||||
* bumped whenever we update the metadata on the
|
||||
* server.
|
||||
|
|
@ -200,11 +200,10 @@ struct nfs_inode {
|
|||
/*
|
||||
* Bit offsets in flags field
|
||||
*/
|
||||
#define NFS_INO_REVALIDATING (0) /* revalidating attrs */
|
||||
#define NFS_INO_ADVISE_RDPLUS (1) /* advise readdirplus */
|
||||
#define NFS_INO_STALE (2) /* possible stale inode */
|
||||
#define NFS_INO_ACL_LRU_SET (3) /* Inode is on the LRU list */
|
||||
#define NFS_INO_MOUNTPOINT (4) /* inode is remote mountpoint */
|
||||
#define NFS_INO_ADVISE_RDPLUS (0) /* advise readdirplus */
|
||||
#define NFS_INO_STALE (1) /* possible stale inode */
|
||||
#define NFS_INO_ACL_LRU_SET (2) /* Inode is on the LRU list */
|
||||
#define NFS_INO_MOUNTPOINT (3) /* inode is remote mountpoint */
|
||||
|
||||
static inline struct nfs_inode *NFS_I(const struct inode *inode)
|
||||
{
|
||||
|
|
@ -345,15 +344,11 @@ extern struct nfs_open_context *get_nfs_open_context(struct nfs_open_context *ct
|
|||
extern void put_nfs_open_context(struct nfs_open_context *ctx);
|
||||
extern struct nfs_open_context *nfs_find_open_context(struct inode *inode, struct rpc_cred *cred, int mode);
|
||||
extern u64 nfs_compat_user_ino64(u64 fileid);
|
||||
extern void nfs_fattr_init(struct nfs_fattr *fattr);
|
||||
|
||||
/* linux/net/ipv4/ipconfig.c: trims ip addr off front of name, too. */
|
||||
extern __be32 root_nfs_parse_addr(char *name); /*__init*/
|
||||
|
||||
static inline void nfs_fattr_init(struct nfs_fattr *fattr)
|
||||
{
|
||||
fattr->valid = 0;
|
||||
fattr->time_start = jiffies;
|
||||
}
|
||||
extern unsigned long nfs_inc_attr_generation_counter(void);
|
||||
|
||||
/*
|
||||
* linux/fs/nfs/file.c
|
||||
|
|
@ -372,8 +367,12 @@ static inline struct nfs_open_context *nfs_file_open_context(struct file *filp)
|
|||
|
||||
static inline struct rpc_cred *nfs_file_cred(struct file *file)
|
||||
{
|
||||
if (file != NULL)
|
||||
return nfs_file_open_context(file)->cred;
|
||||
if (file != NULL) {
|
||||
struct nfs_open_context *ctx =
|
||||
nfs_file_open_context(file);
|
||||
if (ctx)
|
||||
return ctx->cred;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -119,7 +119,6 @@ struct nfs_server {
|
|||
void (*destroy)(struct nfs_server *);
|
||||
|
||||
atomic_t active; /* Keep trace of any activity to this server */
|
||||
wait_queue_head_t active_wq; /* Wait for any activity to stop */
|
||||
|
||||
/* mountd-related mount options */
|
||||
struct sockaddr_storage mountd_address;
|
||||
|
|
|
|||
|
|
@ -65,4 +65,8 @@ struct nfs_mount_data {
|
|||
#define NFS_MOUNT_UNSHARED 0x8000 /* 5 */
|
||||
#define NFS_MOUNT_FLAGMASK 0xFFFF
|
||||
|
||||
/* The following are for internal use only */
|
||||
#define NFS_MOUNT_LOOKUP_CACHE_NONEG 0x10000
|
||||
#define NFS_MOUNT_LOOKUP_CACHE_NONE 0x20000
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@ struct nfs_fattr {
|
|||
__u32 nlink;
|
||||
__u32 uid;
|
||||
__u32 gid;
|
||||
dev_t rdev;
|
||||
__u64 size;
|
||||
union {
|
||||
struct {
|
||||
|
|
@ -46,7 +47,6 @@ struct nfs_fattr {
|
|||
__u64 used;
|
||||
} nfs3;
|
||||
} du;
|
||||
dev_t rdev;
|
||||
struct nfs_fsid fsid;
|
||||
__u64 fileid;
|
||||
struct timespec atime;
|
||||
|
|
@ -56,6 +56,7 @@ struct nfs_fattr {
|
|||
__u64 change_attr; /* NFSv4 change attribute */
|
||||
__u64 pre_change_attr;/* pre-op NFSv4 change attribute */
|
||||
unsigned long time_start;
|
||||
unsigned long gencount;
|
||||
};
|
||||
|
||||
#define NFS_ATTR_WCC 0x0001 /* pre-op WCC data */
|
||||
|
|
@ -672,16 +673,16 @@ struct nfs4_rename_res {
|
|||
struct nfs_fattr * new_fattr;
|
||||
};
|
||||
|
||||
#define NFS4_SETCLIENTID_NAMELEN (56)
|
||||
#define NFS4_SETCLIENTID_NAMELEN (127)
|
||||
struct nfs4_setclientid {
|
||||
const nfs4_verifier * sc_verifier;
|
||||
unsigned int sc_name_len;
|
||||
char sc_name[NFS4_SETCLIENTID_NAMELEN];
|
||||
char sc_name[NFS4_SETCLIENTID_NAMELEN + 1];
|
||||
u32 sc_prog;
|
||||
unsigned int sc_netid_len;
|
||||
char sc_netid[RPCBIND_MAXNETIDLEN];
|
||||
char sc_netid[RPCBIND_MAXNETIDLEN + 1];
|
||||
unsigned int sc_uaddr_len;
|
||||
char sc_uaddr[RPCBIND_MAXUADDRLEN];
|
||||
char sc_uaddr[RPCBIND_MAXUADDRLEN + 1];
|
||||
u32 sc_cb_ident;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -93,6 +93,11 @@ enum pageflags {
|
|||
PG_mappedtodisk, /* Has blocks allocated on-disk */
|
||||
PG_reclaim, /* To be reclaimed asap */
|
||||
PG_buddy, /* Page is free, on buddy lists */
|
||||
PG_swapbacked, /* Page is backed by RAM/swap */
|
||||
#ifdef CONFIG_UNEVICTABLE_LRU
|
||||
PG_unevictable, /* Page is "unevictable" */
|
||||
PG_mlocked, /* Page is vma mlocked */
|
||||
#endif
|
||||
#ifdef CONFIG_IA64_UNCACHED_ALLOCATOR
|
||||
PG_uncached, /* Page has been mapped as uncached */
|
||||
#endif
|
||||
|
|
@ -161,6 +166,18 @@ static inline int Page##uname(struct page *page) \
|
|||
#define TESTSCFLAG(uname, lname) \
|
||||
TESTSETFLAG(uname, lname) TESTCLEARFLAG(uname, lname)
|
||||
|
||||
#define SETPAGEFLAG_NOOP(uname) \
|
||||
static inline void SetPage##uname(struct page *page) { }
|
||||
|
||||
#define CLEARPAGEFLAG_NOOP(uname) \
|
||||
static inline void ClearPage##uname(struct page *page) { }
|
||||
|
||||
#define __CLEARPAGEFLAG_NOOP(uname) \
|
||||
static inline void __ClearPage##uname(struct page *page) { }
|
||||
|
||||
#define TESTCLEARFLAG_FALSE(uname) \
|
||||
static inline int TestClearPage##uname(struct page *page) { return 0; }
|
||||
|
||||
struct page; /* forward declaration */
|
||||
|
||||
TESTPAGEFLAG(Locked, locked)
|
||||
|
|
@ -169,6 +186,7 @@ PAGEFLAG(Referenced, referenced) TESTCLEARFLAG(Referenced, referenced)
|
|||
PAGEFLAG(Dirty, dirty) TESTSCFLAG(Dirty, dirty) __CLEARPAGEFLAG(Dirty, dirty)
|
||||
PAGEFLAG(LRU, lru) __CLEARPAGEFLAG(LRU, lru)
|
||||
PAGEFLAG(Active, active) __CLEARPAGEFLAG(Active, active)
|
||||
TESTCLEARFLAG(Active, active)
|
||||
__PAGEFLAG(Slab, slab)
|
||||
PAGEFLAG(Checked, checked) /* Used by some filesystems */
|
||||
PAGEFLAG(Pinned, pinned) TESTSCFLAG(Pinned, pinned) /* Xen */
|
||||
|
|
@ -176,6 +194,7 @@ PAGEFLAG(SavePinned, savepinned); /* Xen */
|
|||
PAGEFLAG(Reserved, reserved) __CLEARPAGEFLAG(Reserved, reserved)
|
||||
PAGEFLAG(Private, private) __CLEARPAGEFLAG(Private, private)
|
||||
__SETPAGEFLAG(Private, private)
|
||||
PAGEFLAG(SwapBacked, swapbacked) __CLEARPAGEFLAG(SwapBacked, swapbacked)
|
||||
|
||||
__PAGEFLAG(SlobPage, slob_page)
|
||||
__PAGEFLAG(SlobFree, slob_free)
|
||||
|
|
@ -211,6 +230,25 @@ PAGEFLAG(SwapCache, swapcache)
|
|||
PAGEFLAG_FALSE(SwapCache)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_UNEVICTABLE_LRU
|
||||
PAGEFLAG(Unevictable, unevictable) __CLEARPAGEFLAG(Unevictable, unevictable)
|
||||
TESTCLEARFLAG(Unevictable, unevictable)
|
||||
|
||||
#define MLOCK_PAGES 1
|
||||
PAGEFLAG(Mlocked, mlocked) __CLEARPAGEFLAG(Mlocked, mlocked)
|
||||
TESTSCFLAG(Mlocked, mlocked)
|
||||
|
||||
#else
|
||||
|
||||
#define MLOCK_PAGES 0
|
||||
PAGEFLAG_FALSE(Mlocked)
|
||||
SETPAGEFLAG_NOOP(Mlocked) TESTCLEARFLAG_FALSE(Mlocked)
|
||||
|
||||
PAGEFLAG_FALSE(Unevictable) TESTCLEARFLAG_FALSE(Unevictable)
|
||||
SETPAGEFLAG_NOOP(Unevictable) CLEARPAGEFLAG_NOOP(Unevictable)
|
||||
__CLEARPAGEFLAG_NOOP(Unevictable)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_IA64_UNCACHED_ALLOCATOR
|
||||
PAGEFLAG(Uncached, uncached)
|
||||
#else
|
||||
|
|
@ -326,15 +364,25 @@ static inline void __ClearPageTail(struct page *page)
|
|||
|
||||
#endif /* !PAGEFLAGS_EXTENDED */
|
||||
|
||||
#ifdef CONFIG_UNEVICTABLE_LRU
|
||||
#define __PG_UNEVICTABLE (1 << PG_unevictable)
|
||||
#define __PG_MLOCKED (1 << PG_mlocked)
|
||||
#else
|
||||
#define __PG_UNEVICTABLE 0
|
||||
#define __PG_MLOCKED 0
|
||||
#endif
|
||||
|
||||
#define PAGE_FLAGS (1 << PG_lru | 1 << PG_private | 1 << PG_locked | \
|
||||
1 << PG_buddy | 1 << PG_writeback | \
|
||||
1 << PG_slab | 1 << PG_swapcache | 1 << PG_active)
|
||||
1 << PG_slab | 1 << PG_swapcache | 1 << PG_active | \
|
||||
__PG_UNEVICTABLE | __PG_MLOCKED)
|
||||
|
||||
/*
|
||||
* Flags checked in bad_page(). Pages on the free list should not have
|
||||
* these flags set. It they are, there is a problem.
|
||||
*/
|
||||
#define PAGE_FLAGS_CLEAR_WHEN_BAD (PAGE_FLAGS | 1 << PG_reclaim | 1 << PG_dirty)
|
||||
#define PAGE_FLAGS_CLEAR_WHEN_BAD (PAGE_FLAGS | \
|
||||
1 << PG_reclaim | 1 << PG_dirty | 1 << PG_swapbacked)
|
||||
|
||||
/*
|
||||
* Flags checked when a page is freed. Pages being freed should not have
|
||||
|
|
@ -347,7 +395,8 @@ static inline void __ClearPageTail(struct page *page)
|
|||
* Pages being prepped should not have these flags set. It they are, there
|
||||
* is a problem.
|
||||
*/
|
||||
#define PAGE_FLAGS_CHECK_AT_PREP (PAGE_FLAGS | 1 << PG_reserved | 1 << PG_dirty)
|
||||
#define PAGE_FLAGS_CHECK_AT_PREP (PAGE_FLAGS | \
|
||||
1 << PG_reserved | 1 << PG_dirty | 1 << PG_swapbacked)
|
||||
|
||||
#endif /* !__GENERATING_BOUNDS_H */
|
||||
#endif /* PAGE_FLAGS_H */
|
||||
|
|
|
|||
103
include/linux/page_cgroup.h
Normal file
103
include/linux/page_cgroup.h
Normal file
|
|
@ -0,0 +1,103 @@
|
|||
#ifndef __LINUX_PAGE_CGROUP_H
|
||||
#define __LINUX_PAGE_CGROUP_H
|
||||
|
||||
#ifdef CONFIG_CGROUP_MEM_RES_CTLR
|
||||
#include <linux/bit_spinlock.h>
|
||||
/*
|
||||
* Page Cgroup can be considered as an extended mem_map.
|
||||
* A page_cgroup page is associated with every page descriptor. The
|
||||
* page_cgroup helps us identify information about the cgroup
|
||||
* All page cgroups are allocated at boot or memory hotplug event,
|
||||
* then the page cgroup for pfn always exists.
|
||||
*/
|
||||
struct page_cgroup {
|
||||
unsigned long flags;
|
||||
struct mem_cgroup *mem_cgroup;
|
||||
struct page *page;
|
||||
struct list_head lru; /* per cgroup LRU list */
|
||||
};
|
||||
|
||||
void __init pgdat_page_cgroup_init(struct pglist_data *pgdat);
|
||||
void __init page_cgroup_init(void);
|
||||
struct page_cgroup *lookup_page_cgroup(struct page *page);
|
||||
|
||||
enum {
|
||||
/* flags for mem_cgroup */
|
||||
PCG_LOCK, /* page cgroup is locked */
|
||||
PCG_CACHE, /* charged as cache */
|
||||
PCG_USED, /* this object is in use. */
|
||||
/* flags for LRU placement */
|
||||
PCG_ACTIVE, /* page is active in this cgroup */
|
||||
PCG_FILE, /* page is file system backed */
|
||||
PCG_UNEVICTABLE, /* page is unevictableable */
|
||||
};
|
||||
|
||||
#define TESTPCGFLAG(uname, lname) \
|
||||
static inline int PageCgroup##uname(struct page_cgroup *pc) \
|
||||
{ return test_bit(PCG_##lname, &pc->flags); }
|
||||
|
||||
#define SETPCGFLAG(uname, lname) \
|
||||
static inline void SetPageCgroup##uname(struct page_cgroup *pc)\
|
||||
{ set_bit(PCG_##lname, &pc->flags); }
|
||||
|
||||
#define CLEARPCGFLAG(uname, lname) \
|
||||
static inline void ClearPageCgroup##uname(struct page_cgroup *pc) \
|
||||
{ clear_bit(PCG_##lname, &pc->flags); }
|
||||
|
||||
/* Cache flag is set only once (at allocation) */
|
||||
TESTPCGFLAG(Cache, CACHE)
|
||||
|
||||
TESTPCGFLAG(Used, USED)
|
||||
CLEARPCGFLAG(Used, USED)
|
||||
|
||||
/* LRU management flags (from global-lru definition) */
|
||||
TESTPCGFLAG(File, FILE)
|
||||
SETPCGFLAG(File, FILE)
|
||||
CLEARPCGFLAG(File, FILE)
|
||||
|
||||
TESTPCGFLAG(Active, ACTIVE)
|
||||
SETPCGFLAG(Active, ACTIVE)
|
||||
CLEARPCGFLAG(Active, ACTIVE)
|
||||
|
||||
TESTPCGFLAG(Unevictable, UNEVICTABLE)
|
||||
SETPCGFLAG(Unevictable, UNEVICTABLE)
|
||||
CLEARPCGFLAG(Unevictable, UNEVICTABLE)
|
||||
|
||||
static inline int page_cgroup_nid(struct page_cgroup *pc)
|
||||
{
|
||||
return page_to_nid(pc->page);
|
||||
}
|
||||
|
||||
static inline enum zone_type page_cgroup_zid(struct page_cgroup *pc)
|
||||
{
|
||||
return page_zonenum(pc->page);
|
||||
}
|
||||
|
||||
static inline void lock_page_cgroup(struct page_cgroup *pc)
|
||||
{
|
||||
bit_spin_lock(PCG_LOCK, &pc->flags);
|
||||
}
|
||||
|
||||
static inline int trylock_page_cgroup(struct page_cgroup *pc)
|
||||
{
|
||||
return bit_spin_trylock(PCG_LOCK, &pc->flags);
|
||||
}
|
||||
|
||||
static inline void unlock_page_cgroup(struct page_cgroup *pc)
|
||||
{
|
||||
bit_spin_unlock(PCG_LOCK, &pc->flags);
|
||||
}
|
||||
|
||||
#else /* CONFIG_CGROUP_MEM_RES_CTLR */
|
||||
struct page_cgroup;
|
||||
|
||||
static inline void pgdat_page_cgroup_init(struct pglist_data *pgdat)
|
||||
{
|
||||
}
|
||||
|
||||
static inline struct page_cgroup *lookup_page_cgroup(struct page *page)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
|
@ -32,6 +32,34 @@ static inline void mapping_set_error(struct address_space *mapping, int error)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_UNEVICTABLE_LRU
|
||||
#define AS_UNEVICTABLE (__GFP_BITS_SHIFT + 2) /* e.g., ramdisk, SHM_LOCK */
|
||||
|
||||
static inline void mapping_set_unevictable(struct address_space *mapping)
|
||||
{
|
||||
set_bit(AS_UNEVICTABLE, &mapping->flags);
|
||||
}
|
||||
|
||||
static inline void mapping_clear_unevictable(struct address_space *mapping)
|
||||
{
|
||||
clear_bit(AS_UNEVICTABLE, &mapping->flags);
|
||||
}
|
||||
|
||||
static inline int mapping_unevictable(struct address_space *mapping)
|
||||
{
|
||||
if (likely(mapping))
|
||||
return test_bit(AS_UNEVICTABLE, &mapping->flags);
|
||||
return !!mapping;
|
||||
}
|
||||
#else
|
||||
static inline void mapping_set_unevictable(struct address_space *mapping) { }
|
||||
static inline void mapping_clear_unevictable(struct address_space *mapping) { }
|
||||
static inline int mapping_unevictable(struct address_space *mapping)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline gfp_t mapping_gfp_mask(struct address_space * mapping)
|
||||
{
|
||||
return (__force gfp_t)mapping->flags & __GFP_BITS_MASK;
|
||||
|
|
@ -271,19 +299,19 @@ extern int __lock_page_killable(struct page *page);
|
|||
extern void __lock_page_nosync(struct page *page);
|
||||
extern void unlock_page(struct page *page);
|
||||
|
||||
static inline void set_page_locked(struct page *page)
|
||||
static inline void __set_page_locked(struct page *page)
|
||||
{
|
||||
set_bit(PG_locked, &page->flags);
|
||||
__set_bit(PG_locked, &page->flags);
|
||||
}
|
||||
|
||||
static inline void clear_page_locked(struct page *page)
|
||||
static inline void __clear_page_locked(struct page *page)
|
||||
{
|
||||
clear_bit(PG_locked, &page->flags);
|
||||
__clear_bit(PG_locked, &page->flags);
|
||||
}
|
||||
|
||||
static inline int trylock_page(struct page *page)
|
||||
{
|
||||
return !test_and_set_bit(PG_locked, &page->flags);
|
||||
return (likely(!test_and_set_bit_lock(PG_locked, &page->flags)));
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -410,17 +438,17 @@ extern void __remove_from_page_cache(struct page *page);
|
|||
|
||||
/*
|
||||
* Like add_to_page_cache_locked, but used to add newly allocated pages:
|
||||
* the page is new, so we can just run set_page_locked() against it.
|
||||
* the page is new, so we can just run __set_page_locked() against it.
|
||||
*/
|
||||
static inline int add_to_page_cache(struct page *page,
|
||||
struct address_space *mapping, pgoff_t offset, gfp_t gfp_mask)
|
||||
{
|
||||
int error;
|
||||
|
||||
set_page_locked(page);
|
||||
__set_page_locked(page);
|
||||
error = add_to_page_cache_locked(page, mapping, offset, gfp_mask);
|
||||
if (unlikely(error))
|
||||
clear_page_locked(page);
|
||||
__clear_page_locked(page);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -23,9 +23,9 @@ struct pagevec {
|
|||
void __pagevec_release(struct pagevec *pvec);
|
||||
void __pagevec_release_nonlru(struct pagevec *pvec);
|
||||
void __pagevec_free(struct pagevec *pvec);
|
||||
void __pagevec_lru_add(struct pagevec *pvec);
|
||||
void __pagevec_lru_add_active(struct pagevec *pvec);
|
||||
void ____pagevec_lru_add(struct pagevec *pvec, enum lru_list lru);
|
||||
void pagevec_strip(struct pagevec *pvec);
|
||||
void pagevec_swap_free(struct pagevec *pvec);
|
||||
unsigned pagevec_lookup(struct pagevec *pvec, struct address_space *mapping,
|
||||
pgoff_t start, unsigned nr_pages);
|
||||
unsigned pagevec_lookup_tag(struct pagevec *pvec,
|
||||
|
|
@ -81,10 +81,36 @@ static inline void pagevec_free(struct pagevec *pvec)
|
|||
__pagevec_free(pvec);
|
||||
}
|
||||
|
||||
static inline void pagevec_lru_add(struct pagevec *pvec)
|
||||
static inline void __pagevec_lru_add_anon(struct pagevec *pvec)
|
||||
{
|
||||
____pagevec_lru_add(pvec, LRU_INACTIVE_ANON);
|
||||
}
|
||||
|
||||
static inline void __pagevec_lru_add_active_anon(struct pagevec *pvec)
|
||||
{
|
||||
____pagevec_lru_add(pvec, LRU_ACTIVE_ANON);
|
||||
}
|
||||
|
||||
static inline void __pagevec_lru_add_file(struct pagevec *pvec)
|
||||
{
|
||||
____pagevec_lru_add(pvec, LRU_INACTIVE_FILE);
|
||||
}
|
||||
|
||||
static inline void __pagevec_lru_add_active_file(struct pagevec *pvec)
|
||||
{
|
||||
____pagevec_lru_add(pvec, LRU_ACTIVE_FILE);
|
||||
}
|
||||
|
||||
static inline void pagevec_lru_add_file(struct pagevec *pvec)
|
||||
{
|
||||
if (pagevec_count(pvec))
|
||||
__pagevec_lru_add(pvec);
|
||||
__pagevec_lru_add_file(pvec);
|
||||
}
|
||||
|
||||
static inline void pagevec_lru_add_anon(struct pagevec *pvec)
|
||||
{
|
||||
if (pagevec_count(pvec))
|
||||
__pagevec_lru_add_anon(pvec);
|
||||
}
|
||||
|
||||
#endif /* _LINUX_PAGEVEC_H */
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
/* $Id: parport.h,v 1.1 1998/05/17 10:57:52 andrea Exp andrea $ */
|
||||
|
||||
/*
|
||||
* Any part of this program may be used in documents licensed under
|
||||
* the GNU Free Documentation License, Version 1.1 or any later version
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue