 Error Trace
 Error Trace
        
                          [Home]
Bug # 137
Show/hide error trace|       Error trace     
         {    20     typedef unsigned char __u8;    23     typedef unsigned short __u16;    25     typedef int __s32;    26     typedef unsigned int __u32;    30     typedef unsigned long long __u64;    15     typedef signed char s8;    16     typedef unsigned char u8;    19     typedef unsigned short u16;    21     typedef int s32;    22     typedef unsigned int u32;    24     typedef long long s64;    25     typedef unsigned long long u64;    14     typedef long __kernel_long_t;    15     typedef unsigned long __kernel_ulong_t;    27     typedef int __kernel_pid_t;    40     typedef __kernel_long_t __kernel_suseconds_t;    48     typedef unsigned int __kernel_uid32_t;    49     typedef unsigned int __kernel_gid32_t;    71     typedef __kernel_ulong_t __kernel_size_t;    72     typedef __kernel_long_t __kernel_ssize_t;    87     typedef long long __kernel_loff_t;    88     typedef __kernel_long_t __kernel_time_t;    89     typedef __kernel_long_t __kernel_clock_t;    90     typedef int __kernel_timer_t;    91     typedef int __kernel_clockid_t;   259     struct kernel_symbol {   unsigned long value;   const char *name; } ;    33     struct module ;    12     typedef __u32 __kernel_dev_t;    15     typedef __kernel_dev_t dev_t;    18     typedef unsigned short umode_t;    21     typedef __kernel_pid_t pid_t;    26     typedef __kernel_clockid_t clockid_t;    29     typedef _Bool bool;    31     typedef __kernel_uid32_t uid_t;    32     typedef __kernel_gid32_t gid_t;    45     typedef __kernel_loff_t loff_t;    54     typedef __kernel_size_t size_t;    59     typedef __kernel_ssize_t ssize_t;    69     typedef __kernel_time_t time_t;   102     typedef __s32 int32_t;   106     typedef __u8 uint8_t;   107     typedef __u16 uint16_t;   108     typedef __u32 uint32_t;   111     typedef __u64 uint64_t;   133     typedef unsigned long sector_t;   134     typedef unsigned long blkcnt_t;   152     typedef u64 dma_addr_t;   157     typedef unsigned int gfp_t;   158     typedef unsigned int fmode_t;   161     typedef u64 phys_addr_t;   166     typedef phys_addr_t resource_size_t;   176     struct __anonstruct_atomic_t_6 {   int counter; } ;   176     typedef struct __anonstruct_atomic_t_6 atomic_t;   181     struct __anonstruct_atomic64_t_7 {   long counter; } ;   181     typedef struct __anonstruct_atomic64_t_7 atomic64_t;   182     struct list_head {   struct list_head *next;   struct list_head *prev; } ;   187     struct hlist_node ;   187     struct hlist_head {   struct hlist_node *first; } ;   191     struct hlist_node {   struct hlist_node *next;   struct hlist_node **pprev; } ;   202     struct callback_head {   struct callback_head *next;   void (*func)(struct callback_head *); } ;   131     typedef void (*ctor_fn_t)();    48     struct device ;   432     struct file_operations ;   444     struct completion ;   445     struct pt_regs ;    21     struct kernel_param ;    26     struct kernel_param_ops {   unsigned int flags;   int (*set)(const char *, const struct kernel_param *);   int (*get)(char *, const struct kernel_param *);   void (*free)(void *); } ;    62     struct kparam_string ;    62     struct kparam_array ;    62     union __anonunion____missing_field_name_8 {   void *arg;   const struct kparam_string *str;   const struct kparam_array *arr; } ;    62     struct kernel_param {   const char *name;   struct module *mod;   const struct kernel_param_ops *ops;   const u16 perm;   s8 level;   u8 flags;   union __anonunion____missing_field_name_8 __annonCompField4; } ;    83     struct kparam_string {   unsigned int maxlen;   char *string; } ;    89     struct kparam_array {   unsigned int max;   unsigned int elemsize;   unsigned int *num;   const struct kernel_param_ops *ops;   void *elem; } ;    27     union __anonunion___u_10 {   struct list_head *__val;   char __c[1U]; } ;   189     union __anonunion___u_14 {   struct list_head *__val;   char __c[1U]; } ;   693     enum chipset_type {   NOT_SUPPORTED = 0,   SUPPORTED = 1 } ;   698     struct agp_version {   u16 major;   u16 minor; } ;    44     struct pci_dev ;    44     struct vm_operations_struct ;    44     struct agp_kern_info {   struct agp_version version;   struct pci_dev *device;   enum chipset_type chipset;   unsigned long mode;   unsigned long aper_base;   size_t aper_size;   int max_memory;   int current_memory;   bool cant_use_aperture;   unsigned long page_mask;   const struct vm_operations_struct *vm_ops; } ;    58     struct agp_bridge_data ;    59     struct page ;    59     struct scatterlist ;   555     struct task_struct ;    20     struct qspinlock {   atomic_t val; } ;    33     typedef struct qspinlock arch_spinlock_t;    34     struct qrwlock {   atomic_t cnts;   arch_spinlock_t wait_lock; } ;    14     typedef struct qrwlock arch_rwlock_t;    15     struct lockdep_map ;    26     union __anonunion___u_26 {   int __val;   char __c[1U]; } ;    23     typedef atomic64_t atomic_long_t;   186     struct bug_entry {   int bug_addr_disp;   int file_disp;   unsigned short line;   unsigned short flags; } ;    55     struct stack_trace {   unsigned int nr_entries;   unsigned int max_entries;   unsigned long *entries;   int skip; } ;    28     struct lockdep_subclass_key {   char __one_byte; } ;    53     struct lock_class_key {   struct lockdep_subclass_key subkeys[8U]; } ;    59     struct lock_class {   struct hlist_node hash_entry;   struct list_head lock_entry;   struct lockdep_subclass_key *key;   unsigned int subclass;   unsigned int dep_gen_id;   unsigned long usage_mask;   struct stack_trace usage_traces[13U];   struct list_head locks_after;   struct list_head locks_before;   unsigned int version;   unsigned long ops;   const char *name;   int name_version;   unsigned long contention_point[4U];   unsigned long contending_point[4U]; } ;   144     struct lockdep_map {   struct lock_class_key *key;   struct lock_class *class_cache[2U];   const char *name;   int cpu;   unsigned long ip; } ;   207     struct held_lock {   u64 prev_chain_key;   unsigned long acquire_ip;   struct lockdep_map *instance;   struct lockdep_map *nest_lock;   u64 waittime_stamp;   u64 holdtime_stamp;   unsigned short class_idx;   unsigned char irq_context;   unsigned char trylock;   unsigned char read;   unsigned char check;   unsigned char hardirqs_off;   unsigned short references;   unsigned int pin_count; } ;   572     struct raw_spinlock {   arch_spinlock_t raw_lock;   unsigned int magic;   unsigned int owner_cpu;   void *owner;   struct lockdep_map dep_map; } ;    32     typedef struct raw_spinlock raw_spinlock_t;    33     struct __anonstruct____missing_field_name_38 {   u8 __padding[24U];   struct lockdep_map dep_map; } ;    33     union __anonunion____missing_field_name_37 {   struct raw_spinlock rlock;   struct __anonstruct____missing_field_name_38 __annonCompField5; } ;    33     struct spinlock {   union __anonunion____missing_field_name_37 __annonCompField6; } ;    76     typedef struct spinlock spinlock_t;    23     struct __anonstruct_rwlock_t_39 {   arch_rwlock_t raw_lock;   unsigned int magic;   unsigned int owner_cpu;   void *owner;   struct lockdep_map dep_map; } ;    23     typedef struct __anonstruct_rwlock_t_39 rwlock_t;    23     struct mm_struct ;    72     struct pt_regs {   unsigned long r15;   unsigned long r14;   unsigned long r13;   unsigned long r12;   unsigned long bp;   unsigned long bx;   unsigned long r11;   unsigned long r10;   unsigned long r9;   unsigned long r8;   unsigned long ax;   unsigned long cx;   unsigned long dx;   unsigned long si;   unsigned long di;   unsigned long orig_ax;   unsigned long ip;   unsigned long cs;   unsigned long flags;   unsigned long sp;   unsigned long ss; } ;    66     struct __anonstruct____missing_field_name_41 {   unsigned int a;   unsigned int b; } ;    66     struct __anonstruct____missing_field_name_42 {   u16 limit0;   u16 base0;   unsigned char base1;   unsigned char type;   unsigned char s;   unsigned char dpl;   unsigned char p;   unsigned char limit;   unsigned char avl;   unsigned char l;   unsigned char d;   unsigned char g;   unsigned char base2; } ;    66     union __anonunion____missing_field_name_40 {   struct __anonstruct____missing_field_name_41 __annonCompField7;   struct __anonstruct____missing_field_name_42 __annonCompField8; } ;    66     struct desc_struct {   union __anonunion____missing_field_name_40 __annonCompField9; } ;    12     typedef unsigned long pteval_t;    13     typedef unsigned long pmdval_t;    15     typedef unsigned long pgdval_t;    16     typedef unsigned long pgprotval_t;    18     struct __anonstruct_pte_t_43 {   pteval_t pte; } ;    18     typedef struct __anonstruct_pte_t_43 pte_t;    20     struct pgprot {   pgprotval_t pgprot; } ;   250     typedef struct pgprot pgprot_t;   252     struct __anonstruct_pgd_t_44 {   pgdval_t pgd; } ;   252     typedef struct __anonstruct_pgd_t_44 pgd_t;   291     struct __anonstruct_pmd_t_46 {   pmdval_t pmd; } ;   291     typedef struct __anonstruct_pmd_t_46 pmd_t;   417     typedef struct page *pgtable_t;   428     struct file ;   441     struct seq_file ;   479     struct thread_struct ;   481     struct cpumask ;   253     struct math_emu_info {   long ___orig_eip;   struct pt_regs *regs; } ;   338     struct cpumask {   unsigned long bits[128U]; } ;    15     typedef struct cpumask cpumask_t;   654     typedef struct cpumask *cpumask_var_t;    82     struct static_key {   atomic_t enabled; } ;    22     struct tracepoint_func {   void *func;   void *data;   int prio; } ;    28     struct tracepoint {   const char *name;   struct static_key key;   void (*regfunc)();   void (*unregfunc)();   struct tracepoint_func *funcs; } ;   298     struct fregs_state {   u32 cwd;   u32 swd;   u32 twd;   u32 fip;   u32 fcs;   u32 foo;   u32 fos;   u32 st_space[20U];   u32 status; } ;    26     struct __anonstruct____missing_field_name_59 {   u64 rip;   u64 rdp; } ;    26     struct __anonstruct____missing_field_name_60 {   u32 fip;   u32 fcs;   u32 foo;   u32 fos; } ;    26     union __anonunion____missing_field_name_58 {   struct __anonstruct____missing_field_name_59 __annonCompField15;   struct __anonstruct____missing_field_name_60 __annonCompField16; } ;    26     union __anonunion____missing_field_name_61 {   u32 padding1[12U];   u32 sw_reserved[12U]; } ;    26     struct fxregs_state {   u16 cwd;   u16 swd;   u16 twd;   u16 fop;   union __anonunion____missing_field_name_58 __annonCompField17;   u32 mxcsr;   u32 mxcsr_mask;   u32 st_space[32U];   u32 xmm_space[64U];   u32 padding[12U];   union __anonunion____missing_field_name_61 __annonCompField18; } ;    66     struct swregs_state {   u32 cwd;   u32 swd;   u32 twd;   u32 fip;   u32 fcs;   u32 foo;   u32 fos;   u32 st_space[20U];   u8 ftop;   u8 changed;   u8 lookahead;   u8 no_update;   u8 rm;   u8 alimit;   struct math_emu_info *info;   u32 entry_eip; } ;   226     struct xstate_header {   u64 xfeatures;   u64 xcomp_bv;   u64 reserved[6U]; } ;   232     struct xregs_state {   struct fxregs_state i387;   struct xstate_header header;   u8 extended_state_area[0U]; } ;   247     union fpregs_state {   struct fregs_state fsave;   struct fxregs_state fxsave;   struct swregs_state soft;   struct xregs_state xsave;   u8 __padding[4096U]; } ;   264     struct fpu {   unsigned int last_cpu;   unsigned char fpstate_active;   unsigned char fpregs_active;   unsigned char counter;   union fpregs_state state; } ;   169     struct seq_operations ;   371     struct perf_event ;   372     struct thread_struct {   struct desc_struct tls_array[3U];   unsigned long sp0;   unsigned long sp;   unsigned short es;   unsigned short ds;   unsigned short fsindex;   unsigned short gsindex;   unsigned long fsbase;   unsigned long gsbase;   struct perf_event *ptrace_bps[4U];   unsigned long debugreg6;   unsigned long ptrace_dr7;   unsigned long cr2;   unsigned long trap_nr;   unsigned long error_code;   unsigned long *io_bitmap_ptr;   unsigned long iopl;   unsigned int io_bitmap_max;   struct fpu fpu; } ;    13     struct optimistic_spin_queue {   atomic_t tail; } ;    39     struct mutex {   atomic_t count;   spinlock_t wait_lock;   struct list_head wait_list;   struct task_struct *owner;   void *magic;   struct lockdep_map dep_map; } ;    67     struct mutex_waiter {   struct list_head list;   struct task_struct *task;   void *magic; } ;   177     struct timespec ;   178     struct compat_timespec ;   179     struct __anonstruct_futex_75 {   u32 *uaddr;   u32 val;   u32 flags;   u32 bitset;   u64 time;   u32 *uaddr2; } ;   179     struct __anonstruct_nanosleep_76 {   clockid_t clockid;   struct timespec *rmtp;   struct compat_timespec *compat_rmtp;   u64 expires; } ;   179     struct pollfd ;   179     struct __anonstruct_poll_77 {   struct pollfd *ufds;   int nfds;   int has_timeout;   unsigned long tv_sec;   unsigned long tv_nsec; } ;   179     union __anonunion____missing_field_name_74 {   struct __anonstruct_futex_75 futex;   struct __anonstruct_nanosleep_76 nanosleep;   struct __anonstruct_poll_77 poll; } ;   179     struct restart_block {   long int (*fn)(struct restart_block *);   union __anonunion____missing_field_name_74 __annonCompField21; } ;   416     struct seqcount {   unsigned int sequence;   struct lockdep_map dep_map; } ;    52     typedef struct seqcount seqcount_t;   404     struct __anonstruct_seqlock_t_90 {   struct seqcount seqcount;   spinlock_t lock; } ;   404     typedef struct __anonstruct_seqlock_t_90 seqlock_t;    38     struct __wait_queue_head {   spinlock_t lock;   struct list_head task_list; } ;    43     typedef struct __wait_queue_head wait_queue_head_t;  1221     struct completion {   unsigned int done;   wait_queue_head_t wait; } ;   108     struct timespec {   __kernel_time_t tv_sec;   long tv_nsec; } ;    13     struct timeval {   __kernel_time_t tv_sec;   __kernel_suseconds_t tv_usec; } ;   446     union ktime {   s64 tv64; } ;    41     typedef union ktime ktime_t;  1128     union __anonunion____missing_field_name_91 {   unsigned long bitmap[4U];   struct callback_head callback_head; } ;  1128     struct idr_layer {   int prefix;   int layer;   struct idr_layer *ary[256U];   int count;   union __anonunion____missing_field_name_91 __annonCompField22; } ;    41     struct idr {   struct idr_layer *hint;   struct idr_layer *top;   int layers;   int cur;   spinlock_t lock;   int id_free_cnt;   struct idr_layer *id_free; } ;   124     struct ida_bitmap {   long nr_busy;   unsigned long bitmap[15U]; } ;   167     struct ida {   struct idr idr;   struct ida_bitmap *free_bitmap; } ;   199     struct rb_node {   unsigned long __rb_parent_color;   struct rb_node *rb_right;   struct rb_node *rb_left; } ;    41     struct rb_root {   struct rb_node *rb_node; } ;    98     struct dentry ;    99     struct iattr ;   100     struct vm_area_struct ;   101     struct super_block ;   102     struct file_system_type ;   103     struct kernfs_open_node ;   104     struct kernfs_iattrs ;   127     struct kernfs_root ;   127     struct kernfs_elem_dir {   unsigned long subdirs;   struct rb_root children;   struct kernfs_root *root; } ;    85     struct kernfs_node ;    85     struct kernfs_elem_symlink {   struct kernfs_node *target_kn; } ;    89     struct kernfs_ops ;    89     struct kernfs_elem_attr {   const struct kernfs_ops *ops;   struct kernfs_open_node *open;   loff_t size;   struct kernfs_node *notify_next; } ;    96     union __anonunion____missing_field_name_98 {   struct kernfs_elem_dir dir;   struct kernfs_elem_symlink symlink;   struct kernfs_elem_attr attr; } ;    96     struct kernfs_node {   atomic_t count;   atomic_t active;   struct lockdep_map dep_map;   struct kernfs_node *parent;   const char *name;   struct rb_node rb;   const void *ns;   unsigned int hash;   union __anonunion____missing_field_name_98 __annonCompField23;   void *priv;   unsigned short flags;   umode_t mode;   unsigned int ino;   struct kernfs_iattrs *iattr; } ;   138     struct kernfs_syscall_ops {   int (*remount_fs)(struct kernfs_root *, int *, char *);   int (*show_options)(struct seq_file *, struct kernfs_root *);   int (*mkdir)(struct kernfs_node *, const char *, umode_t );   int (*rmdir)(struct kernfs_node *);   int (*rename)(struct kernfs_node *, struct kernfs_node *, const char *);   int (*show_path)(struct seq_file *, struct kernfs_node *, struct kernfs_root *); } ;   157     struct kernfs_root {   struct kernfs_node *kn;   unsigned int flags;   struct ida ino_ida;   struct kernfs_syscall_ops *syscall_ops;   struct list_head supers;   wait_queue_head_t deactivate_waitq; } ;   173     struct kernfs_open_file {   struct kernfs_node *kn;   struct file *file;   void *priv;   struct mutex mutex;   struct mutex prealloc_mutex;   int event;   struct list_head list;   char *prealloc_buf;   size_t atomic_write_len;   bool mmapped;   const struct vm_operations_struct *vm_ops; } ;   191     struct kernfs_ops {   int (*seq_show)(struct seq_file *, void *);   void * (*seq_start)(struct seq_file *, loff_t *);   void * (*seq_next)(struct seq_file *, void *, loff_t *);   void (*seq_stop)(struct seq_file *, void *);   ssize_t  (*read)(struct kernfs_open_file *, char *, size_t , loff_t );   size_t atomic_write_len;   bool prealloc;   ssize_t  (*write)(struct kernfs_open_file *, char *, size_t , loff_t );   int (*mmap)(struct kernfs_open_file *, struct vm_area_struct *);   struct lock_class_key lockdep_key; } ;   288     struct inode ;   499     struct sock ;   500     struct kobject ;   501     enum kobj_ns_type {   KOBJ_NS_TYPE_NONE = 0,   KOBJ_NS_TYPE_NET = 1,   KOBJ_NS_TYPES = 2 } ;   507     struct kobj_ns_type_operations {   enum kobj_ns_type type;   bool  (*current_may_mount)();   void * (*grab_current_ns)();   const void * (*netlink_ns)(struct sock *);   const void * (*initial_ns)();   void (*drop_ns)(void *); } ;    83     struct user_namespace ;    22     struct __anonstruct_kuid_t_101 {   uid_t val; } ;    22     typedef struct __anonstruct_kuid_t_101 kuid_t;    27     struct __anonstruct_kgid_t_102 {   gid_t val; } ;    27     typedef struct __anonstruct_kgid_t_102 kgid_t;   139     struct kstat {   u64 ino;   dev_t dev;   umode_t mode;   unsigned int nlink;   kuid_t uid;   kgid_t gid;   dev_t rdev;   loff_t size;   struct timespec atime;   struct timespec mtime;   struct timespec ctime;   unsigned long blksize;   unsigned long long blocks; } ;    36     struct bin_attribute ;    37     struct attribute {   const char *name;   umode_t mode;   bool ignore_lockdep;   struct lock_class_key *key;   struct lock_class_key skey; } ;    37     struct attribute_group {   const char *name;   umode_t  (*is_visible)(struct kobject *, struct attribute *, int);   umode_t  (*is_bin_visible)(struct kobject *, struct bin_attribute *, int);   struct attribute **attrs;   struct bin_attribute **bin_attrs; } ;    92     struct bin_attribute {   struct attribute attr;   size_t size;   void *private;   ssize_t  (*read)(struct file *, struct kobject *, struct bin_attribute *, char *, loff_t , size_t );   ssize_t  (*write)(struct file *, struct kobject *, struct bin_attribute *, char *, loff_t , size_t );   int (*mmap)(struct file *, struct kobject *, struct bin_attribute *, struct vm_area_struct *); } ;   165     struct sysfs_ops {   ssize_t  (*show)(struct kobject *, struct attribute *, char *);   ssize_t  (*store)(struct kobject *, struct attribute *, const char *, size_t ); } ;   530     struct kref {   atomic_t refcount; } ;   139     struct timer_list {   struct hlist_node entry;   unsigned long expires;   void (*function)(unsigned long);   unsigned long data;   u32 flags;   int slack;   int start_pid;   void *start_site;   char start_comm[16U];   struct lockdep_map lockdep_map; } ;   240     struct hrtimer ;   241     enum hrtimer_restart ;   838     struct nsproxy ;   261     struct workqueue_struct ;   262     struct work_struct ;    54     struct work_struct {   atomic_long_t data;   struct list_head entry;   void (*func)(struct work_struct *);   struct lockdep_map lockdep_map; } ;   107     struct delayed_work {   struct work_struct work;   struct timer_list timer;   struct workqueue_struct *wq;   int cpu; } ;    52     struct kset ;    52     struct kobj_type ;    52     struct kobject {   const char *name;   struct list_head entry;   struct kobject *parent;   struct kset *kset;   struct kobj_type *ktype;   struct kernfs_node *sd;   struct kref kref;   struct delayed_work release;   unsigned char state_initialized;   unsigned char state_in_sysfs;   unsigned char state_add_uevent_sent;   unsigned char state_remove_uevent_sent;   unsigned char uevent_suppress; } ;   115     struct kobj_type {   void (*release)(struct kobject *);   const struct sysfs_ops *sysfs_ops;   struct attribute **default_attrs;   const struct kobj_ns_type_operations * (*child_ns_type)(struct kobject *);   const void * (*namespace)(struct kobject *); } ;   123     struct kobj_uevent_env {   char *argv[3U];   char *envp[32U];   int envp_idx;   char buf[2048U];   int buflen; } ;   131     struct kset_uevent_ops {   const int (*filter)(struct kset *, struct kobject *);   const const char * (*name)(struct kset *, struct kobject *);   const int (*uevent)(struct kset *, struct kobject *, struct kobj_uevent_env *); } ;   148     struct kset {   struct list_head list;   spinlock_t list_lock;   struct kobject kobj;   const struct kset_uevent_ops *uevent_ops; } ;    81     struct cdev {   struct kobject kobj;   struct module *owner;   const struct file_operations *ops;   struct list_head list;   dev_t dev;   unsigned int count; } ;    32     struct resource {   resource_size_t start;   resource_size_t end;   const char *name;   unsigned long flags;   unsigned long desc;   struct resource *parent;   struct resource *sibling;   struct resource *child; } ;   282     struct klist_node ;    37     struct klist_node {   void *n_klist;   struct list_head n_node;   struct kref n_ref; } ;    97     struct __anonstruct_nodemask_t_105 {   unsigned long bits[16U]; } ;    97     typedef struct __anonstruct_nodemask_t_105 nodemask_t;    93     struct hlist_bl_node ;    93     struct hlist_bl_head {   struct hlist_bl_node *first; } ;    36     struct hlist_bl_node {   struct hlist_bl_node *next;   struct hlist_bl_node **pprev; } ;   114     struct __anonstruct____missing_field_name_133 {   spinlock_t lock;   int count; } ;   114     union __anonunion____missing_field_name_132 {   struct __anonstruct____missing_field_name_133 __annonCompField26; } ;   114     struct lockref {   union __anonunion____missing_field_name_132 __annonCompField27; } ;    75     struct path ;    76     struct vfsmount ;    77     struct __anonstruct____missing_field_name_135 {   u32 hash;   u32 len; } ;    77     union __anonunion____missing_field_name_134 {   struct __anonstruct____missing_field_name_135 __annonCompField28;   u64 hash_len; } ;    77     struct qstr {   union __anonunion____missing_field_name_134 __annonCompField29;   const unsigned char *name; } ;    65     struct dentry_operations ;    65     union __anonunion____missing_field_name_136 {   struct list_head d_lru;   wait_queue_head_t *d_wait; } ;    65     union __anonunion_d_u_137 {   struct hlist_node d_alias;   struct hlist_bl_node d_in_lookup_hash;   struct callback_head d_rcu; } ;    65     struct dentry {   unsigned int d_flags;   seqcount_t d_seq;   struct hlist_bl_node d_hash;   struct dentry *d_parent;   struct qstr d_name;   struct inode *d_inode;   unsigned char d_iname[32U];   struct lockref d_lockref;   const struct dentry_operations *d_op;   struct super_block *d_sb;   unsigned long d_time;   void *d_fsdata;   union __anonunion____missing_field_name_136 __annonCompField30;   struct list_head d_child;   struct list_head d_subdirs;   union __anonunion_d_u_137 d_u; } ;   121     struct dentry_operations {   int (*d_revalidate)(struct dentry *, unsigned int);   int (*d_weak_revalidate)(struct dentry *, unsigned int);   int (*d_hash)(const struct dentry *, struct qstr *);   int (*d_compare)(const struct dentry *, const struct dentry *, unsigned int, const char *, const struct qstr *);   int (*d_delete)(const struct dentry *);   void (*d_release)(struct dentry *);   void (*d_prune)(struct dentry *);   void (*d_iput)(struct dentry *, struct inode *);   char * (*d_dname)(struct dentry *, char *, int);   struct vfsmount * (*d_automount)(struct path *);   int (*d_manage)(struct dentry *, bool );   struct inode * (*d_select_inode)(struct dentry *, unsigned int);   struct dentry * (*d_real)(struct dentry *, struct inode *); } ;   577     struct path {   struct vfsmount *mnt;   struct dentry *dentry; } ;    19     struct mem_cgroup ;    19     struct shrink_control {   gfp_t gfp_mask;   unsigned long nr_to_scan;   int nid;   struct mem_cgroup *memcg; } ;    27     struct shrinker {   unsigned long int (*count_objects)(struct shrinker *, struct shrink_control *);   unsigned long int (*scan_objects)(struct shrinker *, struct shrink_control *);   int seeks;   long batch;   unsigned long flags;   struct list_head list;   atomic_long_t *nr_deferred; } ;    80     struct list_lru_one {   struct list_head list;   long nr_items; } ;    32     struct list_lru_memcg {   struct list_lru_one *lru[0U]; } ;    37     struct list_lru_node {   spinlock_t lock;   struct list_lru_one lru;   struct list_lru_memcg *memcg_lrus; } ;    47     struct list_lru {   struct list_lru_node *node;   struct list_head list; } ;   189     struct llist_node ;    64     struct llist_node {   struct llist_node *next; } ;    63     struct __anonstruct____missing_field_name_139 {   struct radix_tree_node *parent;   void *private_data; } ;    63     union __anonunion____missing_field_name_138 {   struct __anonstruct____missing_field_name_139 __annonCompField31;   struct callback_head callback_head; } ;    63     struct radix_tree_node {   unsigned char shift;   unsigned char offset;   unsigned int count;   union __anonunion____missing_field_name_138 __annonCompField32;   struct list_head private_list;   void *slots[64U];   unsigned long tags[3U][1U]; } ;   106     struct radix_tree_root {   gfp_t gfp_mask;   struct radix_tree_node *rnode; } ;   521     enum pid_type {   PIDTYPE_PID = 0,   PIDTYPE_PGID = 1,   PIDTYPE_SID = 2,   PIDTYPE_MAX = 3 } ;   528     struct pid_namespace ;   528     struct upid {   int nr;   struct pid_namespace *ns;   struct hlist_node pid_chain; } ;    56     struct pid {   atomic_t count;   unsigned int level;   struct hlist_head tasks[3U];   struct callback_head rcu;   struct upid numbers[1U]; } ;    68     struct pid_link {   struct hlist_node node;   struct pid *pid; } ;   174     struct rw_semaphore ;   175     struct rw_semaphore {   long count;   struct list_head wait_list;   raw_spinlock_t wait_lock;   struct optimistic_spin_queue osq;   struct task_struct *owner;   struct lockdep_map dep_map; } ;    22     struct kernel_cap_struct {   __u32 cap[2U]; } ;    25     typedef struct kernel_cap_struct kernel_cap_t;    45     struct fiemap_extent {   __u64 fe_logical;   __u64 fe_physical;   __u64 fe_length;   __u64 fe_reserved64[2U];   __u32 fe_flags;   __u32 fe_reserved[3U]; } ;    38     enum migrate_mode {   MIGRATE_ASYNC = 0,   MIGRATE_SYNC_LIGHT = 1,   MIGRATE_SYNC = 2 } ;    58     struct pm_message {   int event; } ;    64     typedef struct pm_message pm_message_t;    65     struct dev_pm_ops {   int (*prepare)(struct device *);   void (*complete)(struct device *);   int (*suspend)(struct device *);   int (*resume)(struct device *);   int (*freeze)(struct device *);   int (*thaw)(struct device *);   int (*poweroff)(struct device *);   int (*restore)(struct device *);   int (*suspend_late)(struct device *);   int (*resume_early)(struct device *);   int (*freeze_late)(struct device *);   int (*thaw_early)(struct device *);   int (*poweroff_late)(struct device *);   int (*restore_early)(struct device *);   int (*suspend_noirq)(struct device *);   int (*resume_noirq)(struct device *);   int (*freeze_noirq)(struct device *);   int (*thaw_noirq)(struct device *);   int (*poweroff_noirq)(struct device *);   int (*restore_noirq)(struct device *);   int (*runtime_suspend)(struct device *);   int (*runtime_resume)(struct device *);   int (*runtime_idle)(struct device *); } ;   320     enum rpm_status {   RPM_ACTIVE = 0,   RPM_RESUMING = 1,   RPM_SUSPENDED = 2,   RPM_SUSPENDING = 3 } ;   327     enum rpm_request {   RPM_REQ_NONE = 0,   RPM_REQ_IDLE = 1,   RPM_REQ_SUSPEND = 2,   RPM_REQ_AUTOSUSPEND = 3,   RPM_REQ_RESUME = 4 } ;   335     struct wakeup_source ;   336     struct wake_irq ;   337     struct pm_domain_data ;   338     struct pm_subsys_data {   spinlock_t lock;   unsigned int refcount;   struct list_head clock_list;   struct pm_domain_data *domain_data; } ;   556     struct dev_pm_qos ;   556     struct dev_pm_info {   pm_message_t power_state;   unsigned char can_wakeup;   unsigned char async_suspend;   bool is_prepared;   bool is_suspended;   bool is_noirq_suspended;   bool is_late_suspended;   bool early_init;   bool direct_complete;   spinlock_t lock;   struct list_head entry;   struct completion completion;   struct wakeup_source *wakeup;   bool wakeup_path;   bool syscore;   bool no_pm_callbacks;   struct timer_list suspend_timer;   unsigned long timer_expires;   struct work_struct work;   wait_queue_head_t wait_queue;   struct wake_irq *wakeirq;   atomic_t usage_count;   atomic_t child_count;   unsigned char disable_depth;   unsigned char idle_notification;   unsigned char request_pending;   unsigned char deferred_resume;   unsigned char run_wake;   unsigned char runtime_auto;   bool ignore_children;   unsigned char no_callbacks;   unsigned char irq_safe;   unsigned char use_autosuspend;   unsigned char timer_autosuspends;   unsigned char memalloc_noio;   enum rpm_request request;   enum rpm_status runtime_status;   int runtime_error;   int autosuspend_delay;   unsigned long last_busy;   unsigned long active_jiffies;   unsigned long suspended_jiffies;   unsigned long accounting_timestamp;   struct pm_subsys_data *subsys_data;   void (*set_latency_tolerance)(struct device *, s32 );   struct dev_pm_qos *qos; } ;   616     struct dev_pm_domain {   struct dev_pm_ops ops;   void (*detach)(struct device *, bool );   int (*activate)(struct device *);   void (*sync)(struct device *);   void (*dismiss)(struct device *); } ;   144     struct pci_bus ;    26     struct ldt_struct ;    26     struct vdso_image ;    26     struct __anonstruct_mm_context_t_209 {   struct ldt_struct *ldt;   unsigned short ia32_compat;   struct mutex lock;   void *vdso;   const struct vdso_image *vdso_image;   atomic_t perf_rdpmc_allowed; } ;    26     typedef struct __anonstruct_mm_context_t_209 mm_context_t;   124     enum rcu_sync_type {   RCU_SYNC = 0,   RCU_SCHED_SYNC = 1,   RCU_BH_SYNC = 2 } ;   130     struct rcu_sync {   int gp_state;   int gp_count;   wait_queue_head_t gp_wait;   int cb_state;   struct callback_head cb_head;   enum rcu_sync_type gp_type; } ;    65     struct percpu_rw_semaphore {   struct rcu_sync rss;   unsigned int *fast_read_ctr;   struct rw_semaphore rw_sem;   atomic_t slow_read_ctr;   wait_queue_head_t write_waitq; } ;    57     struct block_device ;    58     struct io_context ;    59     struct cgroup_subsys_state ;   268     struct delayed_call {   void (*fn)(void *);   void *arg; } ;   261     struct backing_dev_info ;   262     struct bdi_writeback ;   263     struct export_operations ;   266     struct kiocb ;   267     struct pipe_inode_info ;   268     struct poll_table_struct ;   269     struct kstatfs ;   270     struct cred ;   271     struct swap_info_struct ;   272     struct iov_iter ;   273     struct fscrypt_info ;   274     struct fscrypt_operations ;    76     struct iattr {   unsigned int ia_valid;   umode_t ia_mode;   kuid_t ia_uid;   kgid_t ia_gid;   loff_t ia_size;   struct timespec ia_atime;   struct timespec ia_mtime;   struct timespec ia_ctime;   struct file *ia_file; } ;   213     struct dquot ;   214     struct kqid ;    19     typedef __kernel_uid32_t projid_t;    23     struct __anonstruct_kprojid_t_240 {   projid_t val; } ;    23     typedef struct __anonstruct_kprojid_t_240 kprojid_t;   181     enum quota_type {   USRQUOTA = 0,   GRPQUOTA = 1,   PRJQUOTA = 2 } ;    66     typedef long long qsize_t;    67     union __anonunion____missing_field_name_241 {   kuid_t uid;   kgid_t gid;   kprojid_t projid; } ;    67     struct kqid {   union __anonunion____missing_field_name_241 __annonCompField44;   enum quota_type type; } ;   184     struct mem_dqblk {   qsize_t dqb_bhardlimit;   qsize_t dqb_bsoftlimit;   qsize_t dqb_curspace;   qsize_t dqb_rsvspace;   qsize_t dqb_ihardlimit;   qsize_t dqb_isoftlimit;   qsize_t dqb_curinodes;   time_t dqb_btime;   time_t dqb_itime; } ;   206     struct quota_format_type ;   207     struct mem_dqinfo {   struct quota_format_type *dqi_format;   int dqi_fmt_id;   struct list_head dqi_dirty_list;   unsigned long dqi_flags;   unsigned int dqi_bgrace;   unsigned int dqi_igrace;   qsize_t dqi_max_spc_limit;   qsize_t dqi_max_ino_limit;   void *dqi_priv; } ;   272     struct dquot {   struct hlist_node dq_hash;   struct list_head dq_inuse;   struct list_head dq_free;   struct list_head dq_dirty;   struct mutex dq_lock;   atomic_t dq_count;   wait_queue_head_t dq_wait_unused;   struct super_block *dq_sb;   struct kqid dq_id;   loff_t dq_off;   unsigned long dq_flags;   struct mem_dqblk dq_dqb; } ;   299     struct quota_format_ops {   int (*check_quota_file)(struct super_block *, int);   int (*read_file_info)(struct super_block *, int);   int (*write_file_info)(struct super_block *, int);   int (*free_file_info)(struct super_block *, int);   int (*read_dqblk)(struct dquot *);   int (*commit_dqblk)(struct dquot *);   int (*release_dqblk)(struct dquot *);   int (*get_next_id)(struct super_block *, struct kqid *); } ;   311     struct dquot_operations {   int (*write_dquot)(struct dquot *);   struct dquot * (*alloc_dquot)(struct super_block *, int);   void (*destroy_dquot)(struct dquot *);   int (*acquire_dquot)(struct dquot *);   int (*release_dquot)(struct dquot *);   int (*mark_dirty)(struct dquot *);   int (*write_info)(struct super_block *, int);   qsize_t * (*get_reserved_space)(struct inode *);   int (*get_projid)(struct inode *, kprojid_t *);   int (*get_next_id)(struct super_block *, struct kqid *); } ;   328     struct qc_dqblk {   int d_fieldmask;   u64 d_spc_hardlimit;   u64 d_spc_softlimit;   u64 d_ino_hardlimit;   u64 d_ino_softlimit;   u64 d_space;   u64 d_ino_count;   s64 d_ino_timer;   s64 d_spc_timer;   int d_ino_warns;   int d_spc_warns;   u64 d_rt_spc_hardlimit;   u64 d_rt_spc_softlimit;   u64 d_rt_space;   s64 d_rt_spc_timer;   int d_rt_spc_warns; } ;   351     struct qc_type_state {   unsigned int flags;   unsigned int spc_timelimit;   unsigned int ino_timelimit;   unsigned int rt_spc_timelimit;   unsigned int spc_warnlimit;   unsigned int ino_warnlimit;   unsigned int rt_spc_warnlimit;   unsigned long long ino;   blkcnt_t blocks;   blkcnt_t nextents; } ;   397     struct qc_state {   unsigned int s_incoredqs;   struct qc_type_state s_state[3U]; } ;   408     struct qc_info {   int i_fieldmask;   unsigned int i_flags;   unsigned int i_spc_timelimit;   unsigned int i_ino_timelimit;   unsigned int i_rt_spc_timelimit;   unsigned int i_spc_warnlimit;   unsigned int i_ino_warnlimit;   unsigned int i_rt_spc_warnlimit; } ;   421     struct quotactl_ops {   int (*quota_on)(struct super_block *, int, int, struct path *);   int (*quota_off)(struct super_block *, int);   int (*quota_enable)(struct super_block *, unsigned int);   int (*quota_disable)(struct super_block *, unsigned int);   int (*quota_sync)(struct super_block *, int);   int (*set_info)(struct super_block *, int, struct qc_info *);   int (*get_dqblk)(struct super_block *, struct kqid , struct qc_dqblk *);   int (*get_nextdqblk)(struct super_block *, struct kqid *, struct qc_dqblk *);   int (*set_dqblk)(struct super_block *, struct kqid , struct qc_dqblk *);   int (*get_state)(struct super_block *, struct qc_state *);   int (*rm_xquota)(struct super_block *, unsigned int); } ;   437     struct quota_format_type {   int qf_fmt_id;   const struct quota_format_ops *qf_ops;   struct module *qf_owner;   struct quota_format_type *qf_next; } ;   501     struct quota_info {   unsigned int flags;   struct mutex dqio_mutex;   struct mutex dqonoff_mutex;   struct inode *files[3U];   struct mem_dqinfo info[3U];   const struct quota_format_ops *ops[3U]; } ;   531     struct address_space ;   532     struct writeback_control ;   533     struct kiocb {   struct file *ki_filp;   loff_t ki_pos;   void (*ki_complete)(struct kiocb *, long, long);   void *private;   int ki_flags; } ;   371     struct address_space_operations {   int (*writepage)(struct page *, struct writeback_control *);   int (*readpage)(struct file *, struct page *);   int (*writepages)(struct address_space *, struct writeback_control *);   int (*set_page_dirty)(struct page *);   int (*readpages)(struct file *, struct address_space *, struct list_head *, unsigned int);   int (*write_begin)(struct file *, struct address_space *, loff_t , unsigned int, unsigned int, struct page **, void **);   int (*write_end)(struct file *, struct address_space *, loff_t , unsigned int, unsigned int, struct page *, void *);   sector_t  (*bmap)(struct address_space *, sector_t );   void (*invalidatepage)(struct page *, unsigned int, unsigned int);   int (*releasepage)(struct page *, gfp_t );   void (*freepage)(struct page *);   ssize_t  (*direct_IO)(struct kiocb *, struct iov_iter *);   int (*migratepage)(struct address_space *, struct page *, struct page *, enum migrate_mode );   int (*launder_page)(struct page *);   int (*is_partially_uptodate)(struct page *, unsigned long, unsigned long);   void (*is_dirty_writeback)(struct page *, bool *, bool *);   int (*error_remove_page)(struct address_space *, struct page *);   int (*swap_activate)(struct swap_info_struct *, struct file *, sector_t *);   void (*swap_deactivate)(struct file *); } ;   428     struct address_space {   struct inode *host;   struct radix_tree_root page_tree;   spinlock_t tree_lock;   atomic_t i_mmap_writable;   struct rb_root i_mmap;   struct rw_semaphore i_mmap_rwsem;   unsigned long nrpages;   unsigned long nrexceptional;   unsigned long writeback_index;   const struct address_space_operations *a_ops;   unsigned long flags;   spinlock_t private_lock;   struct list_head private_list;   void *private_data; } ;   449     struct request_queue ;   450     struct hd_struct ;   450     struct gendisk ;   450     struct block_device {   dev_t bd_dev;   int bd_openers;   struct inode *bd_inode;   struct super_block *bd_super;   struct mutex bd_mutex;   struct list_head bd_inodes;   void *bd_claiming;   void *bd_holder;   int bd_holders;   bool bd_write_holder;   struct list_head bd_holder_disks;   struct block_device *bd_contains;   unsigned int bd_block_size;   struct hd_struct *bd_part;   unsigned int bd_part_count;   int bd_invalidated;   struct gendisk *bd_disk;   struct request_queue *bd_queue;   struct list_head bd_list;   unsigned long bd_private;   int bd_fsfreeze_count;   struct mutex bd_fsfreeze_mutex; } ;   566     struct posix_acl ;   592     struct inode_operations ;   592     union __anonunion____missing_field_name_246 {   const unsigned int i_nlink;   unsigned int __i_nlink; } ;   592     union __anonunion____missing_field_name_247 {   struct hlist_head i_dentry;   struct callback_head i_rcu; } ;   592     struct file_lock_context ;   592     union __anonunion____missing_field_name_248 {   struct pipe_inode_info *i_pipe;   struct block_device *i_bdev;   struct cdev *i_cdev;   char *i_link;   unsigned int i_dir_seq; } ;   592     struct inode {   umode_t i_mode;   unsigned short i_opflags;   kuid_t i_uid;   kgid_t i_gid;   unsigned int i_flags;   struct posix_acl *i_acl;   struct posix_acl *i_default_acl;   const struct inode_operations *i_op;   struct super_block *i_sb;   struct address_space *i_mapping;   void *i_security;   unsigned long i_ino;   union __anonunion____missing_field_name_246 __annonCompField45;   dev_t i_rdev;   loff_t i_size;   struct timespec i_atime;   struct timespec i_mtime;   struct timespec i_ctime;   spinlock_t i_lock;   unsigned short i_bytes;   unsigned int i_blkbits;   blkcnt_t i_blocks;   unsigned long i_state;   struct rw_semaphore i_rwsem;   unsigned long dirtied_when;   unsigned long dirtied_time_when;   struct hlist_node i_hash;   struct list_head i_io_list;   struct bdi_writeback *i_wb;   int i_wb_frn_winner;   u16 i_wb_frn_avg_time;   u16 i_wb_frn_history;   struct list_head i_lru;   struct list_head i_sb_list;   union __anonunion____missing_field_name_247 __annonCompField46;   u64 i_version;   atomic_t i_count;   atomic_t i_dio_count;   atomic_t i_writecount;   atomic_t i_readcount;   const struct file_operations *i_fop;   struct file_lock_context *i_flctx;   struct address_space i_data;   struct list_head i_devices;   union __anonunion____missing_field_name_248 __annonCompField47;   __u32 i_generation;   __u32 i_fsnotify_mask;   struct hlist_head i_fsnotify_marks;   struct fscrypt_info *i_crypt_info;   void *i_private; } ;   870     struct fown_struct {   rwlock_t lock;   struct pid *pid;   enum pid_type pid_type;   kuid_t uid;   kuid_t euid;   int signum; } ;   878     struct file_ra_state {   unsigned long start;   unsigned int size;   unsigned int async_size;   unsigned int ra_pages;   unsigned int mmap_miss;   loff_t prev_pos; } ;   901     union __anonunion_f_u_249 {   struct llist_node fu_llist;   struct callback_head fu_rcuhead; } ;   901     struct file {   union __anonunion_f_u_249 f_u;   struct path f_path;   struct inode *f_inode;   const struct file_operations *f_op;   spinlock_t f_lock;   atomic_long_t f_count;   unsigned int f_flags;   fmode_t f_mode;   struct mutex f_pos_lock;   loff_t f_pos;   struct fown_struct f_owner;   const struct cred *f_cred;   struct file_ra_state f_ra;   u64 f_version;   void *f_security;   void *private_data;   struct list_head f_ep_links;   struct list_head f_tfile_llink;   struct address_space *f_mapping; } ;   986     typedef void *fl_owner_t;   987     struct file_lock ;   988     struct file_lock_operations {   void (*fl_copy_lock)(struct file_lock *, struct file_lock *);   void (*fl_release_private)(struct file_lock *); } ;   994     struct lock_manager_operations {   int (*lm_compare_owner)(struct file_lock *, struct file_lock *);   unsigned long int (*lm_owner_key)(struct file_lock *);   fl_owner_t  (*lm_get_owner)(fl_owner_t );   void (*lm_put_owner)(fl_owner_t );   void (*lm_notify)(struct file_lock *);   int (*lm_grant)(struct file_lock *, int);   bool  (*lm_break)(struct file_lock *);   int (*lm_change)(struct file_lock *, int, struct list_head *);   void (*lm_setup)(struct file_lock *, void **); } ;  1021     struct nlm_lockowner ;  1022     struct nfs_lock_info {   u32 state;   struct nlm_lockowner *owner;   struct list_head list; } ;    14     struct nfs4_lock_state ;    15     struct nfs4_lock_info {   struct nfs4_lock_state *owner; } ;    19     struct fasync_struct ;    19     struct __anonstruct_afs_251 {   struct list_head link;   int state; } ;    19     union __anonunion_fl_u_250 {   struct nfs_lock_info nfs_fl;   struct nfs4_lock_info nfs4_fl;   struct __anonstruct_afs_251 afs; } ;    19     struct file_lock {   struct file_lock *fl_next;   struct list_head fl_list;   struct hlist_node fl_link;   struct list_head fl_block;   fl_owner_t fl_owner;   unsigned int fl_flags;   unsigned char fl_type;   unsigned int fl_pid;   int fl_link_cpu;   struct pid *fl_nspid;   wait_queue_head_t fl_wait;   struct file *fl_file;   loff_t fl_start;   loff_t fl_end;   struct fasync_struct *fl_fasync;   unsigned long fl_break_time;   unsigned long fl_downgrade_time;   const struct file_lock_operations *fl_ops;   const struct lock_manager_operations *fl_lmops;   union __anonunion_fl_u_250 fl_u; } ;  1074     struct file_lock_context {   spinlock_t flc_lock;   struct list_head flc_flock;   struct list_head flc_posix;   struct list_head flc_lease; } ;  1129     struct files_struct ;  1287     struct fasync_struct {   spinlock_t fa_lock;   int magic;   int fa_fd;   struct fasync_struct *fa_next;   struct file *fa_file;   struct callback_head fa_rcu; } ;  1322     struct sb_writers {   int frozen;   wait_queue_head_t wait_unfrozen;   struct percpu_rw_semaphore rw_sem[3U]; } ;  1348     struct super_operations ;  1348     struct xattr_handler ;  1348     struct mtd_info ;  1348     struct super_block {   struct list_head s_list;   dev_t s_dev;   unsigned char s_blocksize_bits;   unsigned long s_blocksize;   loff_t s_maxbytes;   struct file_system_type *s_type;   const struct super_operations *s_op;   const struct dquot_operations *dq_op;   const struct quotactl_ops *s_qcop;   const struct export_operations *s_export_op;   unsigned long s_flags;   unsigned long s_iflags;   unsigned long s_magic;   struct dentry *s_root;   struct rw_semaphore s_umount;   int s_count;   atomic_t s_active;   void *s_security;   const struct xattr_handler **s_xattr;   const struct fscrypt_operations *s_cop;   struct hlist_bl_head s_anon;   struct list_head s_mounts;   struct block_device *s_bdev;   struct backing_dev_info *s_bdi;   struct mtd_info *s_mtd;   struct hlist_node s_instances;   unsigned int s_quota_types;   struct quota_info s_dquot;   struct sb_writers s_writers;   char s_id[32U];   u8 s_uuid[16U];   void *s_fs_info;   unsigned int s_max_links;   fmode_t s_mode;   u32 s_time_gran;   struct mutex s_vfs_rename_mutex;   char *s_subtype;   char *s_options;   const struct dentry_operations *s_d_op;   int cleancache_poolid;   struct shrinker s_shrink;   atomic_long_t s_remove_count;   int s_readonly_remount;   struct workqueue_struct *s_dio_done_wq;   struct hlist_head s_pins;   struct list_lru s_dentry_lru;   struct list_lru s_inode_lru;   struct callback_head rcu;   struct work_struct destroy_work;   struct mutex s_sync_lock;   int s_stack_depth;   spinlock_t s_inode_list_lock;   struct list_head s_inodes; } ;  1594     struct fiemap_extent_info {   unsigned int fi_flags;   unsigned int fi_extents_mapped;   unsigned int fi_extents_max;   struct fiemap_extent *fi_extents_start; } ;  1608     struct dir_context ;  1633     struct dir_context {   int (*actor)(struct dir_context *, const char *, int, loff_t , u64 , unsigned int);   loff_t pos; } ;  1640     struct file_operations {   struct module *owner;   loff_t  (*llseek)(struct file *, loff_t , int);   ssize_t  (*read)(struct file *, char *, size_t , loff_t *);   ssize_t  (*write)(struct file *, const char *, size_t , loff_t *);   ssize_t  (*read_iter)(struct kiocb *, struct iov_iter *);   ssize_t  (*write_iter)(struct kiocb *, struct iov_iter *);   int (*iterate)(struct file *, struct dir_context *);   int (*iterate_shared)(struct file *, struct dir_context *);   unsigned int (*poll)(struct file *, struct poll_table_struct *);   long int (*unlocked_ioctl)(struct file *, unsigned int, unsigned long);   long int (*compat_ioctl)(struct file *, unsigned int, unsigned long);   int (*mmap)(struct file *, struct vm_area_struct *);   int (*open)(struct inode *, struct file *);   int (*flush)(struct file *, fl_owner_t );   int (*release)(struct inode *, struct file *);   int (*fsync)(struct file *, loff_t , loff_t , int);   int (*aio_fsync)(struct kiocb *, int);   int (*fasync)(int, struct file *, int);   int (*lock)(struct file *, int, struct file_lock *);   ssize_t  (*sendpage)(struct file *, struct page *, int, size_t , loff_t *, int);   unsigned long int (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);   int (*check_flags)(int);   int (*flock)(struct file *, int, struct file_lock *);   ssize_t  (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t , unsigned int);   ssize_t  (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t , unsigned int);   int (*setlease)(struct file *, long, struct file_lock **, void **);   long int (*fallocate)(struct file *, int, loff_t , loff_t );   void (*show_fdinfo)(struct seq_file *, struct file *);   ssize_t  (*copy_file_range)(struct file *, loff_t , struct file *, loff_t , size_t , unsigned int);   int (*clone_file_range)(struct file *, loff_t , struct file *, loff_t , u64 );   ssize_t  (*dedupe_file_range)(struct file *, u64 , u64 , struct file *, u64 ); } ;  1709     struct inode_operations {   struct dentry * (*lookup)(struct inode *, struct dentry *, unsigned int);   const char * (*get_link)(struct dentry *, struct inode *, struct delayed_call *);   int (*permission)(struct inode *, int);   struct posix_acl * (*get_acl)(struct inode *, int);   int (*readlink)(struct dentry *, char *, int);   int (*create)(struct inode *, struct dentry *, umode_t , bool );   int (*link)(struct dentry *, struct inode *, struct dentry *);   int (*unlink)(struct inode *, struct dentry *);   int (*symlink)(struct inode *, struct dentry *, const char *);   int (*mkdir)(struct inode *, struct dentry *, umode_t );   int (*rmdir)(struct inode *, struct dentry *);   int (*mknod)(struct inode *, struct dentry *, umode_t , dev_t );   int (*rename)(struct inode *, struct dentry *, struct inode *, struct dentry *);   int (*rename2)(struct inode *, struct dentry *, struct inode *, struct dentry *, unsigned int);   int (*setattr)(struct dentry *, struct iattr *);   int (*getattr)(struct vfsmount *, struct dentry *, struct kstat *);   int (*setxattr)(struct dentry *, struct inode *, const char *, const void *, size_t , int);   ssize_t  (*getxattr)(struct dentry *, struct inode *, const char *, void *, size_t );   ssize_t  (*listxattr)(struct dentry *, char *, size_t );   int (*removexattr)(struct dentry *, const char *);   int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 , u64 );   int (*update_time)(struct inode *, struct timespec *, int);   int (*atomic_open)(struct inode *, struct dentry *, struct file *, unsigned int, umode_t , int *);   int (*tmpfile)(struct inode *, struct dentry *, umode_t );   int (*set_acl)(struct inode *, struct posix_acl *, int); } ;  1766     struct super_operations {   struct inode * (*alloc_inode)(struct super_block *);   void (*destroy_inode)(struct inode *);   void (*dirty_inode)(struct inode *, int);   int (*write_inode)(struct inode *, struct writeback_control *);   int (*drop_inode)(struct inode *);   void (*evict_inode)(struct inode *);   void (*put_super)(struct super_block *);   int (*sync_fs)(struct super_block *, int);   int (*freeze_super)(struct super_block *);   int (*freeze_fs)(struct super_block *);   int (*thaw_super)(struct super_block *);   int (*unfreeze_fs)(struct super_block *);   int (*statfs)(struct dentry *, struct kstatfs *);   int (*remount_fs)(struct super_block *, int *, char *);   void (*umount_begin)(struct super_block *);   int (*show_options)(struct seq_file *, struct dentry *);   int (*show_devname)(struct seq_file *, struct dentry *);   int (*show_path)(struct seq_file *, struct dentry *);   int (*show_stats)(struct seq_file *, struct dentry *);   ssize_t  (*quota_read)(struct super_block *, int, char *, size_t , loff_t );   ssize_t  (*quota_write)(struct super_block *, int, const char *, size_t , loff_t );   struct dquot ** (*get_dquots)(struct inode *);   int (*bdev_try_to_free_page)(struct super_block *, struct page *, gfp_t );   long int (*nr_cached_objects)(struct super_block *, struct shrink_control *);   long int (*free_cached_objects)(struct super_block *, struct shrink_control *); } ;  2005     struct file_system_type {   const char *name;   int fs_flags;   struct dentry * (*mount)(struct file_system_type *, int, const char *, void *);   void (*kill_sb)(struct super_block *);   struct module *owner;   struct file_system_type *next;   struct hlist_head fs_supers;   struct lock_class_key s_lock_key;   struct lock_class_key s_umount_key;   struct lock_class_key s_vfs_rename_key;   struct lock_class_key s_writers_key[3U];   struct lock_class_key i_lock_key;   struct lock_class_key i_mutex_key;   struct lock_class_key i_mutex_dir_key; } ;  2334     struct kmem_cache ;  3176     struct assoc_array_ptr ;  3176     struct assoc_array {   struct assoc_array_ptr *root;   unsigned long nr_leaves_on_tree; } ;    31     typedef int32_t key_serial_t;    34     typedef uint32_t key_perm_t;    35     struct key ;    36     struct user_struct ;    37     struct signal_struct ;    38     struct key_type ;    42     struct keyring_index_key {   struct key_type *type;   const char *description;   size_t desc_len; } ;    91     union key_payload {   void *rcu_data0;   void *data[4U]; } ;   128     union __anonunion____missing_field_name_252 {   struct list_head graveyard_link;   struct rb_node serial_node; } ;   128     struct key_user ;   128     union __anonunion____missing_field_name_253 {   time_t expiry;   time_t revoked_at; } ;   128     struct __anonstruct____missing_field_name_255 {   struct key_type *type;   char *description; } ;   128     union __anonunion____missing_field_name_254 {   struct keyring_index_key index_key;   struct __anonstruct____missing_field_name_255 __annonCompField50; } ;   128     struct __anonstruct____missing_field_name_257 {   struct list_head name_link;   struct assoc_array keys; } ;   128     union __anonunion____missing_field_name_256 {   union key_payload payload;   struct __anonstruct____missing_field_name_257 __annonCompField52;   int reject_error; } ;   128     struct key {   atomic_t usage;   key_serial_t serial;   union __anonunion____missing_field_name_252 __annonCompField48;   struct rw_semaphore sem;   struct key_user *user;   void *security;   union __anonunion____missing_field_name_253 __annonCompField49;   time_t last_used_at;   kuid_t uid;   kgid_t gid;   key_perm_t perm;   unsigned short quotalen;   unsigned short datalen;   unsigned long flags;   union __anonunion____missing_field_name_254 __annonCompField51;   union __anonunion____missing_field_name_256 __annonCompField53;   int (*restrict_link)(struct key *, const struct key_type *, const union key_payload *); } ;   377     struct audit_context ;    27     struct group_info {   atomic_t usage;   int ngroups;   int nblocks;   kgid_t small_block[32U];   kgid_t *blocks[0U]; } ;    90     struct cred {   atomic_t usage;   atomic_t subscribers;   void *put_addr;   unsigned int magic;   kuid_t uid;   kgid_t gid;   kuid_t suid;   kgid_t sgid;   kuid_t euid;   kgid_t egid;   kuid_t fsuid;   kgid_t fsgid;   unsigned int securebits;   kernel_cap_t cap_inheritable;   kernel_cap_t cap_permitted;   kernel_cap_t cap_effective;   kernel_cap_t cap_bset;   kernel_cap_t cap_ambient;   unsigned char jit_keyring;   struct key *session_keyring;   struct key *process_keyring;   struct key *thread_keyring;   struct key *request_key_auth;   void *security;   struct user_struct *user;   struct user_namespace *user_ns;   struct group_info *group_info;   struct callback_head rcu; } ;   377     struct seq_file {   char *buf;   size_t size;   size_t from;   size_t count;   size_t pad_until;   loff_t index;   loff_t read_pos;   u64 version;   struct mutex lock;   const struct seq_operations *op;   int poll_event;   const struct file *file;   void *private; } ;    30     struct seq_operations {   void * (*start)(struct seq_file *, loff_t *);   void (*stop)(struct seq_file *, void *);   void * (*next)(struct seq_file *, void *, loff_t *);   int (*show)(struct seq_file *, void *); } ;   222     struct pinctrl ;   223     struct pinctrl_state ;   194     struct dev_pin_info {   struct pinctrl *p;   struct pinctrl_state *default_state;   struct pinctrl_state *init_state;   struct pinctrl_state *sleep_state;   struct pinctrl_state *idle_state; } ;    48     struct dma_map_ops ;    48     struct dev_archdata {   struct dma_map_ops *dma_ops;   void *iommu; } ;    21     struct pdev_archdata { } ;    24     struct device_private ;    25     struct device_driver ;    26     struct driver_private ;    27     struct class ;    28     struct subsys_private ;    29     struct bus_type ;    30     struct device_node ;    31     struct fwnode_handle ;    32     struct iommu_ops ;    33     struct iommu_group ;    61     struct device_attribute ;    61     struct bus_type {   const char *name;   const char *dev_name;   struct device *dev_root;   struct device_attribute *dev_attrs;   const struct attribute_group **bus_groups;   const struct attribute_group **dev_groups;   const struct attribute_group **drv_groups;   int (*match)(struct device *, struct device_driver *);   int (*uevent)(struct device *, struct kobj_uevent_env *);   int (*probe)(struct device *);   int (*remove)(struct device *);   void (*shutdown)(struct device *);   int (*online)(struct device *);   int (*offline)(struct device *);   int (*suspend)(struct device *, pm_message_t );   int (*resume)(struct device *);   const struct dev_pm_ops *pm;   const struct iommu_ops *iommu_ops;   struct subsys_private *p;   struct lock_class_key lock_key; } ;   142     struct device_type ;   201     enum probe_type {   PROBE_DEFAULT_STRATEGY = 0,   PROBE_PREFER_ASYNCHRONOUS = 1,   PROBE_FORCE_SYNCHRONOUS = 2 } ;   207     struct of_device_id ;   207     struct acpi_device_id ;   207     struct device_driver {   const char *name;   struct bus_type *bus;   struct module *owner;   const char *mod_name;   bool suppress_bind_attrs;   enum probe_type probe_type;   const struct of_device_id *of_match_table;   const struct acpi_device_id *acpi_match_table;   int (*probe)(struct device *);   int (*remove)(struct device *);   void (*shutdown)(struct device *);   int (*suspend)(struct device *, pm_message_t );   int (*resume)(struct device *);   const struct attribute_group **groups;   const struct dev_pm_ops *pm;   struct driver_private *p; } ;   357     struct class_attribute ;   357     struct class {   const char *name;   struct module *owner;   struct class_attribute *class_attrs;   const struct attribute_group **dev_groups;   struct kobject *dev_kobj;   int (*dev_uevent)(struct device *, struct kobj_uevent_env *);   char * (*devnode)(struct device *, umode_t *);   void (*class_release)(struct class *);   void (*dev_release)(struct device *);   int (*suspend)(struct device *, pm_message_t );   int (*resume)(struct device *);   const struct kobj_ns_type_operations *ns_type;   const void * (*namespace)(struct device *);   const struct dev_pm_ops *pm;   struct subsys_private *p; } ;   450     struct class_attribute {   struct attribute attr;   ssize_t  (*show)(struct class *, struct class_attribute *, char *);   ssize_t  (*store)(struct class *, struct class_attribute *, const char *, size_t ); } ;   518     struct device_type {   const char *name;   const struct attribute_group **groups;   int (*uevent)(struct device *, struct kobj_uevent_env *);   char * (*devnode)(struct device *, umode_t *, kuid_t *, kgid_t *);   void (*release)(struct device *);   const struct dev_pm_ops *pm; } ;   546     struct device_attribute {   struct attribute attr;   ssize_t  (*show)(struct device *, struct device_attribute *, char *);   ssize_t  (*store)(struct device *, struct device_attribute *, const char *, size_t ); } ;   699     struct device_dma_parameters {   unsigned int max_segment_size;   unsigned long segment_boundary_mask; } ;   708     struct irq_domain ;   708     struct dma_coherent_mem ;   708     struct cma ;   708     struct device {   struct device *parent;   struct device_private *p;   struct kobject kobj;   const char *init_name;   const struct device_type *type;   struct mutex mutex;   struct bus_type *bus;   struct device_driver *driver;   void *platform_data;   void *driver_data;   struct dev_pm_info power;   struct dev_pm_domain *pm_domain;   struct irq_domain *msi_domain;   struct dev_pin_info *pins;   struct list_head msi_list;   int numa_node;   u64 *dma_mask;   u64 coherent_dma_mask;   unsigned long dma_pfn_offset;   struct device_dma_parameters *dma_parms;   struct list_head dma_pools;   struct dma_coherent_mem *dma_mem;   struct cma *cma_area;   struct dev_archdata archdata;   struct device_node *of_node;   struct fwnode_handle *fwnode;   dev_t devt;   u32 id;   spinlock_t devres_lock;   struct list_head devres_head;   struct klist_node knode_class;   struct class *class;   const struct attribute_group **groups;   void (*release)(struct device *);   struct iommu_group *iommu_group;   bool offline_disabled;   bool offline; } ;   862     struct wakeup_source {   const char *name;   struct list_head entry;   spinlock_t lock;   struct wake_irq *wakeirq;   struct timer_list timer;   unsigned long timer_expires;   ktime_t total_time;   ktime_t max_time;   ktime_t last_time;   ktime_t start_prevent_time;   ktime_t prevent_sleep_time;   unsigned long event_count;   unsigned long active_count;   unsigned long relax_count;   unsigned long expire_count;   unsigned long wakeup_count;   bool active;   bool autosleep_enabled; } ;  1339     struct dma_attrs {   unsigned long flags[1U]; } ;    89     enum dma_data_direction {   DMA_BIDIRECTIONAL = 0,   DMA_TO_DEVICE = 1,   DMA_FROM_DEVICE = 2,   DMA_NONE = 3 } ;    58     struct arch_uprobe_task {   unsigned long saved_scratch_register;   unsigned int saved_trap_nr;   unsigned int saved_tf; } ;    66     enum uprobe_task_state {   UTASK_RUNNING = 0,   UTASK_SSTEP = 1,   UTASK_SSTEP_ACK = 2,   UTASK_SSTEP_TRAPPED = 3 } ;    73     struct __anonstruct____missing_field_name_263 {   struct arch_uprobe_task autask;   unsigned long vaddr; } ;    73     struct __anonstruct____missing_field_name_264 {   struct callback_head dup_xol_work;   unsigned long dup_xol_addr; } ;    73     union __anonunion____missing_field_name_262 {   struct __anonstruct____missing_field_name_263 __annonCompField56;   struct __anonstruct____missing_field_name_264 __annonCompField57; } ;    73     struct uprobe ;    73     struct return_instance ;    73     struct uprobe_task {   enum uprobe_task_state state;   union __anonunion____missing_field_name_262 __annonCompField58;   struct uprobe *active_uprobe;   unsigned long xol_vaddr;   struct return_instance *return_instances;   unsigned int depth; } ;    94     struct return_instance {   struct uprobe *uprobe;   unsigned long func;   unsigned long stack;   unsigned long orig_ret_vaddr;   bool chained;   struct return_instance *next; } ;   110     struct xol_area ;   111     struct uprobes_state {   struct xol_area *xol_area; } ;   150     union __anonunion____missing_field_name_265 {   struct address_space *mapping;   void *s_mem;   atomic_t compound_mapcount; } ;   150     union __anonunion____missing_field_name_267 {   unsigned long index;   void *freelist; } ;   150     struct __anonstruct____missing_field_name_271 {   unsigned short inuse;   unsigned short objects;   unsigned char frozen; } ;   150     union __anonunion____missing_field_name_270 {   atomic_t _mapcount;   struct __anonstruct____missing_field_name_271 __annonCompField61;   int units; } ;   150     struct __anonstruct____missing_field_name_269 {   union __anonunion____missing_field_name_270 __annonCompField62;   atomic_t _refcount; } ;   150     union __anonunion____missing_field_name_268 {   unsigned long counters;   struct __anonstruct____missing_field_name_269 __annonCompField63;   unsigned int active; } ;   150     struct __anonstruct____missing_field_name_266 {   union __anonunion____missing_field_name_267 __annonCompField60;   union __anonunion____missing_field_name_268 __annonCompField64; } ;   150     struct dev_pagemap ;   150     struct __anonstruct____missing_field_name_273 {   struct page *next;   int pages;   int pobjects; } ;   150     struct __anonstruct____missing_field_name_274 {   unsigned long compound_head;   unsigned int compound_dtor;   unsigned int compound_order; } ;   150     struct __anonstruct____missing_field_name_275 {   unsigned long __pad;   pgtable_t pmd_huge_pte; } ;   150     union __anonunion____missing_field_name_272 {   struct list_head lru;   struct dev_pagemap *pgmap;   struct __anonstruct____missing_field_name_273 __annonCompField66;   struct callback_head callback_head;   struct __anonstruct____missing_field_name_274 __annonCompField67;   struct __anonstruct____missing_field_name_275 __annonCompField68; } ;   150     union __anonunion____missing_field_name_276 {   unsigned long private;   spinlock_t *ptl;   struct kmem_cache *slab_cache; } ;   150     struct page {   unsigned long flags;   union __anonunion____missing_field_name_265 __annonCompField59;   struct __anonstruct____missing_field_name_266 __annonCompField65;   union __anonunion____missing_field_name_272 __annonCompField69;   union __anonunion____missing_field_name_276 __annonCompField70;   struct mem_cgroup *mem_cgroup; } ;   196     struct page_frag {   struct page *page;   __u32 offset;   __u32 size; } ;   281     struct userfaultfd_ctx ;   281     struct vm_userfaultfd_ctx {   struct userfaultfd_ctx *ctx; } ;   288     struct __anonstruct_shared_277 {   struct rb_node rb;   unsigned long rb_subtree_last; } ;   288     struct anon_vma ;   288     struct mempolicy ;   288     struct vm_area_struct {   unsigned long vm_start;   unsigned long vm_end;   struct vm_area_struct *vm_next;   struct vm_area_struct *vm_prev;   struct rb_node vm_rb;   unsigned long rb_subtree_gap;   struct mm_struct *vm_mm;   pgprot_t vm_page_prot;   unsigned long vm_flags;   struct __anonstruct_shared_277 shared;   struct list_head anon_vma_chain;   struct anon_vma *anon_vma;   const struct vm_operations_struct *vm_ops;   unsigned long vm_pgoff;   struct file *vm_file;   void *vm_private_data;   struct mempolicy *vm_policy;   struct vm_userfaultfd_ctx vm_userfaultfd_ctx; } ;   361     struct core_thread {   struct task_struct *task;   struct core_thread *next; } ;   366     struct core_state {   atomic_t nr_threads;   struct core_thread dumper;   struct completion startup; } ;   380     struct task_rss_stat {   int events;   int count[4U]; } ;   388     struct mm_rss_stat {   atomic_long_t count[4U]; } ;   393     struct kioctx_table ;   394     struct linux_binfmt ;   394     struct mmu_notifier_mm ;   394     struct mm_struct {   struct vm_area_struct *mmap;   struct rb_root mm_rb;   u32 vmacache_seqnum;   unsigned long int (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);   unsigned long mmap_base;   unsigned long mmap_legacy_base;   unsigned long task_size;   unsigned long highest_vm_end;   pgd_t *pgd;   atomic_t mm_users;   atomic_t mm_count;   atomic_long_t nr_ptes;   atomic_long_t nr_pmds;   int map_count;   spinlock_t page_table_lock;   struct rw_semaphore mmap_sem;   struct list_head mmlist;   unsigned long hiwater_rss;   unsigned long hiwater_vm;   unsigned long total_vm;   unsigned long locked_vm;   unsigned long pinned_vm;   unsigned long data_vm;   unsigned long exec_vm;   unsigned long stack_vm;   unsigned long def_flags;   unsigned long start_code;   unsigned long end_code;   unsigned long start_data;   unsigned long end_data;   unsigned long start_brk;   unsigned long brk;   unsigned long start_stack;   unsigned long arg_start;   unsigned long arg_end;   unsigned long env_start;   unsigned long env_end;   unsigned long saved_auxv[46U];   struct mm_rss_stat rss_stat;   struct linux_binfmt *binfmt;   cpumask_var_t cpu_vm_mask_var;   mm_context_t context;   unsigned long flags;   struct core_state *core_state;   spinlock_t ioctx_lock;   struct kioctx_table *ioctx_table;   struct task_struct *owner;   struct file *exe_file;   struct mmu_notifier_mm *mmu_notifier_mm;   struct cpumask cpumask_allocation;   unsigned long numa_next_scan;   unsigned long numa_scan_offset;   int numa_scan_seq;   bool tlb_flush_pending;   struct uprobes_state uprobes_state;   void *bd_addr;   atomic_long_t hugetlb_usage;   struct work_struct async_put_work; } ;   564     struct vm_fault ;   615     struct percpu_ref ;    55     typedef void percpu_ref_func_t(struct percpu_ref *);    68     struct percpu_ref {   atomic_long_t count;   unsigned long percpu_count_ptr;   percpu_ref_func_t *release;   percpu_ref_func_t *confirm_switch;   bool force_atomic;   struct callback_head rcu; } ;    41     struct rlimit {   __kernel_ulong_t rlim_cur;   __kernel_ulong_t rlim_max; } ;   273     struct vm_fault {   unsigned int flags;   gfp_t gfp_mask;   unsigned long pgoff;   void *virtual_address;   struct page *cow_page;   struct page *page;   void *entry;   unsigned long max_pgoff;   pte_t *pte; } ;   317     struct vm_operations_struct {   void (*open)(struct vm_area_struct *);   void (*close)(struct vm_area_struct *);   int (*mremap)(struct vm_area_struct *);   int (*fault)(struct vm_area_struct *, struct vm_fault *);   int (*pmd_fault)(struct vm_area_struct *, unsigned long, pmd_t *, unsigned int);   void (*map_pages)(struct vm_area_struct *, struct vm_fault *);   int (*page_mkwrite)(struct vm_area_struct *, struct vm_fault *);   int (*pfn_mkwrite)(struct vm_area_struct *, struct vm_fault *);   int (*access)(struct vm_area_struct *, unsigned long, void *, int, int);   const char * (*name)(struct vm_area_struct *);   int (*set_policy)(struct vm_area_struct *, struct mempolicy *);   struct mempolicy * (*get_policy)(struct vm_area_struct *, unsigned long);   struct page * (*find_special_page)(struct vm_area_struct *, unsigned long); } ;  2409     struct scatterlist {   unsigned long sg_magic;   unsigned long page_link;   unsigned int offset;   unsigned int length;   dma_addr_t dma_address;   unsigned int dma_length; } ;    21     struct sg_table {   struct scatterlist *sgl;   unsigned int nents;   unsigned int orig_nents; } ;   158     struct dma_map_ops {   void * (*alloc)(struct device *, size_t , dma_addr_t *, gfp_t , struct dma_attrs *);   void (*free)(struct device *, size_t , void *, dma_addr_t , struct dma_attrs *);   int (*mmap)(struct device *, struct vm_area_struct *, void *, dma_addr_t , size_t , struct dma_attrs *);   int (*get_sgtable)(struct device *, struct sg_table *, void *, dma_addr_t , size_t , struct dma_attrs *);   dma_addr_t  (*map_page)(struct device *, struct page *, unsigned long, size_t , enum dma_data_direction , struct dma_attrs *);   void (*unmap_page)(struct device *, dma_addr_t , size_t , enum dma_data_direction , struct dma_attrs *);   int (*map_sg)(struct device *, struct scatterlist *, int, enum dma_data_direction , struct dma_attrs *);   void (*unmap_sg)(struct device *, struct scatterlist *, int, enum dma_data_direction , struct dma_attrs *);   void (*sync_single_for_cpu)(struct device *, dma_addr_t , size_t , enum dma_data_direction );   void (*sync_single_for_device)(struct device *, dma_addr_t , size_t , enum dma_data_direction );   void (*sync_sg_for_cpu)(struct device *, struct scatterlist *, int, enum dma_data_direction );   void (*sync_sg_for_device)(struct device *, struct scatterlist *, int, enum dma_data_direction );   int (*mapping_error)(struct device *, dma_addr_t );   int (*dma_supported)(struct device *, u64 );   int (*set_dma_mask)(struct device *, u64 );   int is_phys; } ;    84     struct plist_node {   int prio;   struct list_head prio_list;   struct list_head node_list; } ;     4     typedef unsigned long cputime_t;    25     struct sem_undo_list ;    25     struct sysv_sem {   struct sem_undo_list *undo_list; } ;    26     struct sysv_shm {   struct list_head shm_clist; } ;    24     struct __anonstruct_sigset_t_289 {   unsigned long sig[1U]; } ;    24     typedef struct __anonstruct_sigset_t_289 sigset_t;    25     struct siginfo ;    17     typedef void __signalfn_t(int);    18     typedef __signalfn_t *__sighandler_t;    20     typedef void __restorefn_t();    21     typedef __restorefn_t *__sigrestore_t;    34     union sigval {   int sival_int;   void *sival_ptr; } ;    10     typedef union sigval sigval_t;    11     struct __anonstruct__kill_291 {   __kernel_pid_t _pid;   __kernel_uid32_t _uid; } ;    11     struct __anonstruct__timer_292 {   __kernel_timer_t _tid;   int _overrun;   char _pad[0U];   sigval_t _sigval;   int _sys_private; } ;    11     struct __anonstruct__rt_293 {   __kernel_pid_t _pid;   __kernel_uid32_t _uid;   sigval_t _sigval; } ;    11     struct __anonstruct__sigchld_294 {   __kernel_pid_t _pid;   __kernel_uid32_t _uid;   int _status;   __kernel_clock_t _utime;   __kernel_clock_t _stime; } ;    11     struct __anonstruct__addr_bnd_297 {   void *_lower;   void *_upper; } ;    11     union __anonunion____missing_field_name_296 {   struct __anonstruct__addr_bnd_297 _addr_bnd;   __u32 _pkey; } ;    11     struct __anonstruct__sigfault_295 {   void *_addr;   short _addr_lsb;   union __anonunion____missing_field_name_296 __annonCompField71; } ;    11     struct __anonstruct__sigpoll_298 {   long _band;   int _fd; } ;    11     struct __anonstruct__sigsys_299 {   void *_call_addr;   int _syscall;   unsigned int _arch; } ;    11     union __anonunion__sifields_290 {   int _pad[28U];   struct __anonstruct__kill_291 _kill;   struct __anonstruct__timer_292 _timer;   struct __anonstruct__rt_293 _rt;   struct __anonstruct__sigchld_294 _sigchld;   struct __anonstruct__sigfault_295 _sigfault;   struct __anonstruct__sigpoll_298 _sigpoll;   struct __anonstruct__sigsys_299 _sigsys; } ;    11     struct siginfo {   int si_signo;   int si_errno;   int si_code;   union __anonunion__sifields_290 _sifields; } ;   118     typedef struct siginfo siginfo_t;    22     struct sigpending {   struct list_head list;   sigset_t signal; } ;   257     struct sigaction {   __sighandler_t sa_handler;   unsigned long sa_flags;   __sigrestore_t sa_restorer;   sigset_t sa_mask; } ;   271     struct k_sigaction {   struct sigaction sa; } ;    43     struct seccomp_filter ;    44     struct seccomp {   int mode;   struct seccomp_filter *filter; } ;    40     struct rt_mutex_waiter ;   100     struct timerqueue_node {   struct rb_node node;   ktime_t expires; } ;    12     struct timerqueue_head {   struct rb_root head;   struct timerqueue_node *next; } ;    50     struct hrtimer_clock_base ;    51     struct hrtimer_cpu_base ;    60     enum hrtimer_restart {   HRTIMER_NORESTART = 0,   HRTIMER_RESTART = 1 } ;    65     struct hrtimer {   struct timerqueue_node node;   ktime_t _softexpires;   enum hrtimer_restart  (*function)(struct hrtimer *);   struct hrtimer_clock_base *base;   u8 state;   u8 is_rel;   int start_pid;   void *start_site;   char start_comm[16U]; } ;   125     struct hrtimer_clock_base {   struct hrtimer_cpu_base *cpu_base;   int index;   clockid_t clockid;   struct timerqueue_head active;   ktime_t  (*get_time)();   ktime_t offset; } ;   158     struct hrtimer_cpu_base {   raw_spinlock_t lock;   seqcount_t seq;   struct hrtimer *running;   unsigned int cpu;   unsigned int active_bases;   unsigned int clock_was_set_seq;   bool migration_enabled;   bool nohz_active;   unsigned char in_hrtirq;   unsigned char hres_active;   unsigned char hang_detected;   ktime_t expires_next;   struct hrtimer *next_timer;   unsigned int nr_events;   unsigned int nr_retries;   unsigned int nr_hangs;   unsigned int max_hang_time;   struct hrtimer_clock_base clock_base[4U]; } ;    12     enum kcov_mode {   KCOV_MODE_DISABLED = 0,   KCOV_MODE_TRACE = 1 } ;    17     struct task_io_accounting {   u64 rchar;   u64 wchar;   u64 syscr;   u64 syscw;   u64 read_bytes;   u64 write_bytes;   u64 cancelled_write_bytes; } ;    45     struct latency_record {   unsigned long backtrace[12U];   unsigned int count;   unsigned long time;   unsigned long max; } ;    41     struct cgroup ;    42     struct cgroup_root ;    43     struct cgroup_subsys ;    44     struct cgroup_taskset ;    88     struct cgroup_file {   struct kernfs_node *kn; } ;    90     struct cgroup_subsys_state {   struct cgroup *cgroup;   struct cgroup_subsys *ss;   struct percpu_ref refcnt;   struct cgroup_subsys_state *parent;   struct list_head sibling;   struct list_head children;   int id;   unsigned int flags;   u64 serial_nr;   atomic_t online_cnt;   struct callback_head callback_head;   struct work_struct destroy_work; } ;   141     struct css_set {   atomic_t refcount;   struct hlist_node hlist;   struct list_head tasks;   struct list_head mg_tasks;   struct list_head cgrp_links;   struct cgroup *dfl_cgrp;   struct cgroup_subsys_state *subsys[13U];   struct list_head mg_preload_node;   struct list_head mg_node;   struct cgroup *mg_src_cgrp;   struct cgroup *mg_dst_cgrp;   struct css_set *mg_dst_cset;   struct list_head e_cset_node[13U];   struct list_head task_iters;   bool dead;   struct callback_head callback_head; } ;   221     struct cgroup {   struct cgroup_subsys_state self;   unsigned long flags;   int id;   int level;   int populated_cnt;   struct kernfs_node *kn;   struct cgroup_file procs_file;   struct cgroup_file events_file;   u16 subtree_control;   u16 subtree_ss_mask;   u16 old_subtree_control;   u16 old_subtree_ss_mask;   struct cgroup_subsys_state *subsys[13U];   struct cgroup_root *root;   struct list_head cset_links;   struct list_head e_csets[13U];   struct list_head pidlists;   struct mutex pidlist_mutex;   wait_queue_head_t offline_waitq;   struct work_struct release_agent_work;   int ancestor_ids[]; } ;   306     struct cgroup_root {   struct kernfs_root *kf_root;   unsigned int subsys_mask;   int hierarchy_id;   struct cgroup cgrp;   int cgrp_ancestor_id_storage;   atomic_t nr_cgrps;   struct list_head root_list;   unsigned int flags;   struct idr cgroup_idr;   char release_agent_path[4096U];   char name[64U]; } ;   345     struct cftype {   char name[64U];   unsigned long private;   size_t max_write_len;   unsigned int flags;   unsigned int file_offset;   struct cgroup_subsys *ss;   struct list_head node;   struct kernfs_ops *kf_ops;   u64  (*read_u64)(struct cgroup_subsys_state *, struct cftype *);   s64  (*read_s64)(struct cgroup_subsys_state *, struct cftype *);   int (*seq_show)(struct seq_file *, void *);   void * (*seq_start)(struct seq_file *, loff_t *);   void * (*seq_next)(struct seq_file *, void *, loff_t *);   void (*seq_stop)(struct seq_file *, void *);   int (*write_u64)(struct cgroup_subsys_state *, struct cftype *, u64 );   int (*write_s64)(struct cgroup_subsys_state *, struct cftype *, s64 );   ssize_t  (*write)(struct kernfs_open_file *, char *, size_t , loff_t );   struct lock_class_key lockdep_key; } ;   430     struct cgroup_subsys {   struct cgroup_subsys_state * (*css_alloc)(struct cgroup_subsys_state *);   int (*css_online)(struct cgroup_subsys_state *);   void (*css_offline)(struct cgroup_subsys_state *);   void (*css_released)(struct cgroup_subsys_state *);   void (*css_free)(struct cgroup_subsys_state *);   void (*css_reset)(struct cgroup_subsys_state *);   int (*can_attach)(struct cgroup_taskset *);   void (*cancel_attach)(struct cgroup_taskset *);   void (*attach)(struct cgroup_taskset *);   void (*post_attach)();   int (*can_fork)(struct task_struct *);   void (*cancel_fork)(struct task_struct *);   void (*fork)(struct task_struct *);   void (*exit)(struct task_struct *);   void (*free)(struct task_struct *);   void (*bind)(struct cgroup_subsys_state *);   bool early_init;   bool implicit_on_dfl;   bool broken_hierarchy;   bool warned_broken_hierarchy;   int id;   const char *name;   const char *legacy_name;   struct cgroup_root *root;   struct idr css_idr;   struct list_head cfts;   struct cftype *dfl_cftypes;   struct cftype *legacy_cftypes;   unsigned int depends_on; } ;   128     struct futex_pi_state ;   129     struct robust_list_head ;   130     struct bio_list ;   131     struct fs_struct ;   132     struct perf_event_context ;   133     struct blk_plug ;   134     struct nameidata ;   188     struct cfs_rq ;   189     struct task_group ;   492     struct sighand_struct {   atomic_t count;   struct k_sigaction action[64U];   spinlock_t siglock;   wait_queue_head_t signalfd_wqh; } ;   534     struct pacct_struct {   int ac_flag;   long ac_exitcode;   unsigned long ac_mem;   cputime_t ac_utime;   cputime_t ac_stime;   unsigned long ac_minflt;   unsigned long ac_majflt; } ;   542     struct cpu_itimer {   cputime_t expires;   cputime_t incr;   u32 error;   u32 incr_error; } ;   549     struct prev_cputime {   cputime_t utime;   cputime_t stime;   raw_spinlock_t lock; } ;   574     struct task_cputime {   cputime_t utime;   cputime_t stime;   unsigned long long sum_exec_runtime; } ;   590     struct task_cputime_atomic {   atomic64_t utime;   atomic64_t stime;   atomic64_t sum_exec_runtime; } ;   612     struct thread_group_cputimer {   struct task_cputime_atomic cputime_atomic;   bool running;   bool checking_timer; } ;   657     struct autogroup ;   658     struct tty_struct ;   658     struct taskstats ;   658     struct tty_audit_buf ;   658     struct signal_struct {   atomic_t sigcnt;   atomic_t live;   int nr_threads;   atomic_t oom_victims;   struct list_head thread_head;   wait_queue_head_t wait_chldexit;   struct task_struct *curr_target;   struct sigpending shared_pending;   int group_exit_code;   int notify_count;   struct task_struct *group_exit_task;   int group_stop_count;   unsigned int flags;   unsigned char is_child_subreaper;   unsigned char has_child_subreaper;   int posix_timer_id;   struct list_head posix_timers;   struct hrtimer real_timer;   struct pid *leader_pid;   ktime_t it_real_incr;   struct cpu_itimer it[2U];   struct thread_group_cputimer cputimer;   struct task_cputime cputime_expires;   struct list_head cpu_timers[3U];   struct pid *tty_old_pgrp;   int leader;   struct tty_struct *tty;   struct autogroup *autogroup;   seqlock_t stats_lock;   cputime_t utime;   cputime_t stime;   cputime_t cutime;   cputime_t cstime;   cputime_t gtime;   cputime_t cgtime;   struct prev_cputime prev_cputime;   unsigned long nvcsw;   unsigned long nivcsw;   unsigned long cnvcsw;   unsigned long cnivcsw;   unsigned long min_flt;   unsigned long maj_flt;   unsigned long cmin_flt;   unsigned long cmaj_flt;   unsigned long inblock;   unsigned long oublock;   unsigned long cinblock;   unsigned long coublock;   unsigned long maxrss;   unsigned long cmaxrss;   struct task_io_accounting ioac;   unsigned long long sum_sched_runtime;   struct rlimit rlim[16U];   struct pacct_struct pacct;   struct taskstats *stats;   unsigned int audit_tty;   struct tty_audit_buf *tty_audit_buf;   bool oom_flag_origin;   short oom_score_adj;   short oom_score_adj_min;   struct mutex cred_guard_mutex; } ;   833     struct user_struct {   atomic_t __count;   atomic_t processes;   atomic_t sigpending;   atomic_t inotify_watches;   atomic_t inotify_devs;   atomic_t fanotify_listeners;   atomic_long_t epoll_watches;   unsigned long mq_bytes;   unsigned long locked_shm;   unsigned long unix_inflight;   atomic_long_t pipe_bufs;   struct key *uid_keyring;   struct key *session_keyring;   struct hlist_node uidhash_node;   kuid_t uid;   atomic_long_t locked_vm; } ;   878     struct reclaim_state ;   879     struct sched_info {   unsigned long pcount;   unsigned long long run_delay;   unsigned long long last_arrival;   unsigned long long last_queued; } ;   894     struct task_delay_info {   spinlock_t lock;   unsigned int flags;   u64 blkio_start;   u64 blkio_delay;   u64 swapin_delay;   u32 blkio_count;   u32 swapin_count;   u64 freepages_start;   u64 freepages_delay;   u32 freepages_count; } ;   951     struct wake_q_node {   struct wake_q_node *next; } ;  1218     struct load_weight {   unsigned long weight;   u32 inv_weight; } ;  1226     struct sched_avg {   u64 last_update_time;   u64 load_sum;   u32 util_sum;   u32 period_contrib;   unsigned long load_avg;   unsigned long util_avg; } ;  1284     struct sched_statistics {   u64 wait_start;   u64 wait_max;   u64 wait_count;   u64 wait_sum;   u64 iowait_count;   u64 iowait_sum;   u64 sleep_start;   u64 sleep_max;   s64 sum_sleep_runtime;   u64 block_start;   u64 block_max;   u64 exec_max;   u64 slice_max;   u64 nr_migrations_cold;   u64 nr_failed_migrations_affine;   u64 nr_failed_migrations_running;   u64 nr_failed_migrations_hot;   u64 nr_forced_migrations;   u64 nr_wakeups;   u64 nr_wakeups_sync;   u64 nr_wakeups_migrate;   u64 nr_wakeups_local;   u64 nr_wakeups_remote;   u64 nr_wakeups_affine;   u64 nr_wakeups_affine_attempts;   u64 nr_wakeups_passive;   u64 nr_wakeups_idle; } ;  1319     struct sched_entity {   struct load_weight load;   struct rb_node run_node;   struct list_head group_node;   unsigned int on_rq;   u64 exec_start;   u64 sum_exec_runtime;   u64 vruntime;   u64 prev_sum_exec_runtime;   u64 nr_migrations;   struct sched_statistics statistics;   int depth;   struct sched_entity *parent;   struct cfs_rq *cfs_rq;   struct cfs_rq *my_q;   struct sched_avg avg; } ;  1356     struct rt_rq ;  1356     struct sched_rt_entity {   struct list_head run_list;   unsigned long timeout;   unsigned long watchdog_stamp;   unsigned int time_slice;   unsigned short on_rq;   unsigned short on_list;   struct sched_rt_entity *back;   struct sched_rt_entity *parent;   struct rt_rq *rt_rq;   struct rt_rq *my_q; } ;  1374     struct sched_dl_entity {   struct rb_node rb_node;   u64 dl_runtime;   u64 dl_deadline;   u64 dl_period;   u64 dl_bw;   s64 runtime;   u64 deadline;   unsigned int flags;   int dl_throttled;   int dl_boosted;   int dl_yielded;   struct hrtimer dl_timer; } ;  1438     struct tlbflush_unmap_batch {   struct cpumask cpumask;   bool flush_required;   bool writable; } ;  1457     struct sched_class ;  1457     struct compat_robust_list_head ;  1457     struct numa_group ;  1457     struct kcov ;  1457     struct task_struct {   volatile long state;   void *stack;   atomic_t usage;   unsigned int flags;   unsigned int ptrace;   struct llist_node wake_entry;   int on_cpu;   unsigned int wakee_flips;   unsigned long wakee_flip_decay_ts;   struct task_struct *last_wakee;   int wake_cpu;   int on_rq;   int prio;   int static_prio;   int normal_prio;   unsigned int rt_priority;   const struct sched_class *sched_class;   struct sched_entity se;   struct sched_rt_entity rt;   struct task_group *sched_task_group;   struct sched_dl_entity dl;   struct hlist_head preempt_notifiers;   unsigned int policy;   int nr_cpus_allowed;   cpumask_t cpus_allowed;   unsigned long rcu_tasks_nvcsw;   bool rcu_tasks_holdout;   struct list_head rcu_tasks_holdout_list;   int rcu_tasks_idle_cpu;   struct sched_info sched_info;   struct list_head tasks;   struct plist_node pushable_tasks;   struct rb_node pushable_dl_tasks;   struct mm_struct *mm;   struct mm_struct *active_mm;   u32 vmacache_seqnum;   struct vm_area_struct *vmacache[4U];   struct task_rss_stat rss_stat;   int exit_state;   int exit_code;   int exit_signal;   int pdeath_signal;   unsigned long jobctl;   unsigned int personality;   unsigned char sched_reset_on_fork;   unsigned char sched_contributes_to_load;   unsigned char sched_migrated;   unsigned char sched_remote_wakeup;   unsigned char;   unsigned char in_execve;   unsigned char in_iowait;   unsigned char memcg_may_oom;   unsigned char memcg_kmem_skip_account;   unsigned char brk_randomized;   unsigned long atomic_flags;   struct restart_block restart_block;   pid_t pid;   pid_t tgid;   struct task_struct *real_parent;   struct task_struct *parent;   struct list_head children;   struct list_head sibling;   struct task_struct *group_leader;   struct list_head ptraced;   struct list_head ptrace_entry;   struct pid_link pids[3U];   struct list_head thread_group;   struct list_head thread_node;   struct completion *vfork_done;   int *set_child_tid;   int *clear_child_tid;   cputime_t utime;   cputime_t stime;   cputime_t utimescaled;   cputime_t stimescaled;   cputime_t gtime;   struct prev_cputime prev_cputime;   unsigned long nvcsw;   unsigned long nivcsw;   u64 start_time;   u64 real_start_time;   unsigned long min_flt;   unsigned long maj_flt;   struct task_cputime cputime_expires;   struct list_head cpu_timers[3U];   const struct cred *real_cred;   const struct cred *cred;   char comm[16U];   struct nameidata *nameidata;   struct sysv_sem sysvsem;   struct sysv_shm sysvshm;   unsigned long last_switch_count;   struct fs_struct *fs;   struct files_struct *files;   struct nsproxy *nsproxy;   struct signal_struct *signal;   struct sighand_struct *sighand;   sigset_t blocked;   sigset_t real_blocked;   sigset_t saved_sigmask;   struct sigpending pending;   unsigned long sas_ss_sp;   size_t sas_ss_size;   unsigned int sas_ss_flags;   struct callback_head *task_works;   struct audit_context *audit_context;   kuid_t loginuid;   unsigned int sessionid;   struct seccomp seccomp;   u32 parent_exec_id;   u32 self_exec_id;   spinlock_t alloc_lock;   raw_spinlock_t pi_lock;   struct wake_q_node wake_q;   struct rb_root pi_waiters;   struct rb_node *pi_waiters_leftmost;   struct rt_mutex_waiter *pi_blocked_on;   struct mutex_waiter *blocked_on;   unsigned int irq_events;   unsigned long hardirq_enable_ip;   unsigned long hardirq_disable_ip;   unsigned int hardirq_enable_event;   unsigned int hardirq_disable_event;   int hardirqs_enabled;   int hardirq_context;   unsigned long softirq_disable_ip;   unsigned long softirq_enable_ip;   unsigned int softirq_disable_event;   unsigned int softirq_enable_event;   int softirqs_enabled;   int softirq_context;   u64 curr_chain_key;   int lockdep_depth;   unsigned int lockdep_recursion;   struct held_lock held_locks[48U];   gfp_t lockdep_reclaim_gfp;   unsigned int in_ubsan;   void *journal_info;   struct bio_list *bio_list;   struct blk_plug *plug;   struct reclaim_state *reclaim_state;   struct backing_dev_info *backing_dev_info;   struct io_context *io_context;   unsigned long ptrace_message;   siginfo_t *last_siginfo;   struct task_io_accounting ioac;   u64 acct_rss_mem1;   u64 acct_vm_mem1;   cputime_t acct_timexpd;   nodemask_t mems_allowed;   seqcount_t mems_allowed_seq;   int cpuset_mem_spread_rotor;   int cpuset_slab_spread_rotor;   struct css_set *cgroups;   struct list_head cg_list;   struct robust_list_head *robust_list;   struct compat_robust_list_head *compat_robust_list;   struct list_head pi_state_list;   struct futex_pi_state *pi_state_cache;   struct perf_event_context *perf_event_ctxp[2U];   struct mutex perf_event_mutex;   struct list_head perf_event_list;   struct mempolicy *mempolicy;   short il_next;   short pref_node_fork;   int numa_scan_seq;   unsigned int numa_scan_period;   unsigned int numa_scan_period_max;   int numa_preferred_nid;   unsigned long numa_migrate_retry;   u64 node_stamp;   u64 last_task_numa_placement;   u64 last_sum_exec_runtime;   struct callback_head numa_work;   struct list_head numa_entry;   struct numa_group *numa_group;   unsigned long *numa_faults;   unsigned long total_numa_faults;   unsigned long numa_faults_locality[3U];   unsigned long numa_pages_migrated;   struct tlbflush_unmap_batch tlb_ubc;   struct callback_head rcu;   struct pipe_inode_info *splice_pipe;   struct page_frag task_frag;   struct task_delay_info *delays;   int make_it_fail;   int nr_dirtied;   int nr_dirtied_pause;   unsigned long dirty_paused_when;   int latency_record_count;   struct latency_record latency_record[32U];   u64 timer_slack_ns;   u64 default_timer_slack_ns;   unsigned int kasan_depth;   unsigned long trace;   unsigned long trace_recursion;   enum kcov_mode kcov_mode;   unsigned int kcov_size;   void *kcov_area;   struct kcov *kcov;   struct mem_cgroup *memcg_in_oom;   gfp_t memcg_oom_gfp_mask;   int memcg_oom_order;   unsigned int memcg_nr_pages_over_high;   struct uprobe_task *utask;   unsigned int sequential_io;   unsigned int sequential_io_avg;   unsigned long task_state_change;   int pagefault_disabled;   struct task_struct *oom_reaper_list;   struct thread_struct thread; } ;    63     struct exception_table_entry {   int insn;   int fixup;   int handler; } ;    13     enum irqreturn {   IRQ_NONE = 0,   IRQ_HANDLED = 1,   IRQ_WAKE_THREAD = 2 } ;    16     typedef enum irqreturn irqreturn_t;   414     struct proc_dir_entry ;    13     typedef unsigned long kernel_ulong_t;    14     struct pci_device_id {   __u32 vendor;   __u32 device;   __u32 subvendor;   __u32 subdevice;   __u32 class;   __u32 class_mask;   kernel_ulong_t driver_data; } ;   186     struct acpi_device_id {   __u8 id[9U];   kernel_ulong_t driver_data;   __u32 cls;   __u32 cls_msk; } ;   229     struct of_device_id {   char name[32U];   char type[32U];   char compatible[128U];   const void *data; } ;   484     struct platform_device_id {   char name[20U];   kernel_ulong_t driver_data; } ;    70     struct hotplug_slot ;    70     struct pci_slot {   struct pci_bus *bus;   struct list_head list;   struct hotplug_slot *hotplug;   unsigned char number;   struct kobject kobj; } ;   104     typedef int pci_power_t;   131     typedef unsigned int pci_channel_state_t;   132     enum pci_channel_state {   pci_channel_io_normal = 1,   pci_channel_io_frozen = 2,   pci_channel_io_perm_failure = 3 } ;   157     typedef unsigned short pci_dev_flags_t;   184     typedef unsigned short pci_bus_flags_t;   241     struct pcie_link_state ;   242     struct pci_vpd ;   243     struct pci_sriov ;   245     struct pci_driver ;   245     union __anonunion____missing_field_name_336 {   struct pci_sriov *sriov;   struct pci_dev *physfn; } ;   245     struct pci_dev {   struct list_head bus_list;   struct pci_bus *bus;   struct pci_bus *subordinate;   void *sysdata;   struct proc_dir_entry *procent;   struct pci_slot *slot;   unsigned int devfn;   unsigned short vendor;   unsigned short device;   unsigned short subsystem_vendor;   unsigned short subsystem_device;   unsigned int class;   u8 revision;   u8 hdr_type;   u8 pcie_cap;   u8 msi_cap;   u8 msix_cap;   unsigned char pcie_mpss;   u8 rom_base_reg;   u8 pin;   u16 pcie_flags_reg;   unsigned long *dma_alias_mask;   struct pci_driver *driver;   u64 dma_mask;   struct device_dma_parameters dma_parms;   pci_power_t current_state;   u8 pm_cap;   unsigned char pme_support;   unsigned char pme_interrupt;   unsigned char pme_poll;   unsigned char d1_support;   unsigned char d2_support;   unsigned char no_d1d2;   unsigned char no_d3cold;   unsigned char d3cold_allowed;   unsigned char mmio_always_on;   unsigned char wakeup_prepared;   unsigned char runtime_d3cold;   unsigned char ignore_hotplug;   unsigned int d3_delay;   unsigned int d3cold_delay;   struct pcie_link_state *link_state;   pci_channel_state_t error_state;   struct device dev;   int cfg_size;   unsigned int irq;   struct resource resource[17U];   bool match_driver;   unsigned char transparent;   unsigned char multifunction;   unsigned char is_added;   unsigned char is_busmaster;   unsigned char no_msi;   unsigned char no_64bit_msi;   unsigned char block_cfg_access;   unsigned char broken_parity_status;   unsigned char irq_reroute_variant;   unsigned char msi_enabled;   unsigned char msix_enabled;   unsigned char ari_enabled;   unsigned char ats_enabled;   unsigned char is_managed;   unsigned char needs_freset;   unsigned char state_saved;   unsigned char is_physfn;   unsigned char is_virtfn;   unsigned char reset_fn;   unsigned char is_hotplug_bridge;   unsigned char __aer_firmware_first_valid;   unsigned char __aer_firmware_first;   unsigned char broken_intx_masking;   unsigned char io_window_1k;   unsigned char irq_managed;   unsigned char has_secondary_link;   unsigned char non_compliant_bars;   pci_dev_flags_t dev_flags;   atomic_t enable_cnt;   u32 saved_config_space[16U];   struct hlist_head saved_cap_space;   struct bin_attribute *rom_attr;   int rom_attr_enabled;   struct bin_attribute *res_attr[17U];   struct bin_attribute *res_attr_wc[17U];   const struct attribute_group **msi_irq_groups;   struct pci_vpd *vpd;   union __anonunion____missing_field_name_336 __annonCompField85;   u16 ats_cap;   u8 ats_stu;   atomic_t ats_ref_cnt;   phys_addr_t rom;   size_t romlen;   char *driver_override; } ;   446     struct pci_ops ;   446     struct msi_controller ;   446     struct pci_bus {   struct list_head node;   struct pci_bus *parent;   struct list_head children;   struct list_head devices;   struct pci_dev *self;   struct list_head slots;   struct resource *resource[4U];   struct list_head resources;   struct resource busn_res;   struct pci_ops *ops;   struct msi_controller *msi;   void *sysdata;   struct proc_dir_entry *procdir;   unsigned char number;   unsigned char primary;   unsigned char max_bus_speed;   unsigned char cur_bus_speed;   char name[48U];   unsigned short bridge_ctl;   pci_bus_flags_t bus_flags;   struct device *bridge;   struct device dev;   struct bin_attribute *legacy_io;   struct bin_attribute *legacy_mem;   unsigned char is_added; } ;   570     struct pci_ops {   int (*add_bus)(struct pci_bus *);   void (*remove_bus)(struct pci_bus *);   void * (*map_bus)(struct pci_bus *, unsigned int, int);   int (*read)(struct pci_bus *, unsigned int, int, int, u32 *);   int (*write)(struct pci_bus *, unsigned int, int, int, u32 ); } ;   600     struct pci_dynids {   spinlock_t lock;   struct list_head list; } ;   614     typedef unsigned int pci_ers_result_t;   624     struct pci_error_handlers {   pci_ers_result_t  (*error_detected)(struct pci_dev *, enum pci_channel_state );   pci_ers_result_t  (*mmio_enabled)(struct pci_dev *);   pci_ers_result_t  (*link_reset)(struct pci_dev *);   pci_ers_result_t  (*slot_reset)(struct pci_dev *);   void (*reset_notify)(struct pci_dev *, bool );   void (*resume)(struct pci_dev *); } ;   657     struct pci_driver {   struct list_head node;   const char *name;   const struct pci_device_id *id_table;   int (*probe)(struct pci_dev *, const struct pci_device_id *);   void (*remove)(struct pci_dev *);   int (*suspend)(struct pci_dev *, pm_message_t );   int (*suspend_late)(struct pci_dev *, pm_message_t );   int (*resume_early)(struct pci_dev *);   int (*resume)(struct pci_dev *);   void (*shutdown)(struct pci_dev *);   int (*sriov_configure)(struct pci_dev *, int);   const struct pci_error_handlers *err_handler;   struct device_driver driver;   struct pci_dynids dynids; } ;   134     struct mfd_cell ;   136     struct platform_device {   const char *name;   int id;   bool id_auto;   struct device dev;   u32 num_resources;   struct resource *resource;   const struct platform_device_id *id_entry;   char *driver_override;   struct mfd_cell *mfd_cell;   struct pdev_archdata archdata; } ;   352     struct pollfd {   int fd;   short events;   short revents; } ;    32     struct poll_table_struct {   void (*_qproc)(struct file *, wait_queue_head_t *, struct poll_table_struct *);   unsigned long _key; } ;    85     typedef unsigned int drm_magic_t;    86     struct drm_clip_rect {   unsigned short x1;   unsigned short y1;   unsigned short x2;   unsigned short y2; } ;   121     struct drm_hw_lock {   volatile unsigned int lock;   char padding[60U]; } ;   370     struct drm_mode_fb_cmd2 {   __u32 fb_id;   __u32 width;   __u32 height;   __u32 pixel_format;   __u32 flags;   __u32 handles[4U];   __u32 pitches[4U];   __u32 offsets[4U];   __u64 modifier[4U]; } ;   557     struct drm_mode_create_dumb {   __u32 height;   __u32 width;   __u32 bpp;   __u32 flags;   __u32 handle;   __u32 pitch;   __u64 size; } ;   629     struct drm_event {   __u32 type;   __u32 length; } ;   843     struct drm_event_vblank {   struct drm_event base;   __u64 user_data;   __u32 tv_sec;   __u32 tv_usec;   __u32 sequence;   __u32 reserved; } ;   855     struct drm_device ;   856     struct drm_file ;   857     struct drm_agp_head {   struct agp_kern_info agp_info;   struct list_head memory;   unsigned long mode;   struct agp_bridge_data *bridge;   int enabled;   int acquired;   unsigned long base;   int agp_mtrr;   int cant_use_aperture;   unsigned long page_mask; } ;    64     enum fwnode_type {   FWNODE_INVALID = 0,   FWNODE_OF = 1,   FWNODE_ACPI = 2,   FWNODE_ACPI_DATA = 3,   FWNODE_PDATA = 4,   FWNODE_IRQCHIP = 5 } ;    73     struct fwnode_handle {   enum fwnode_type type;   struct fwnode_handle *secondary; } ;    32     typedef u32 phandle;    34     struct property {   char *name;   int length;   void *value;   struct property *next;   unsigned long _flags;   unsigned int unique_id;   struct bin_attribute attr; } ;    44     struct device_node {   const char *name;   const char *type;   phandle phandle;   const char *full_name;   struct fwnode_handle fwnode;   struct property *properties;   struct property *deadprops;   struct device_node *parent;   struct device_node *child;   struct device_node *sibling;   struct kobject kobj;   unsigned long _flags;   void *data; } ;    76     enum hdmi_picture_aspect {   HDMI_PICTURE_ASPECT_NONE = 0,   HDMI_PICTURE_ASPECT_4_3 = 1,   HDMI_PICTURE_ASPECT_16_9 = 2,   HDMI_PICTURE_ASPECT_RESERVED = 3 } ;   334     struct ww_class {   atomic_long_t stamp;   struct lock_class_key acquire_key;   struct lock_class_key mutex_key;   const char *acquire_name;   const char *mutex_name; } ;    26     struct ww_mutex ;    26     struct ww_acquire_ctx {   struct task_struct *task;   unsigned long stamp;   unsigned int acquired;   unsigned int done_acquire;   struct ww_class *ww_class;   struct ww_mutex *contending_lock;   struct lockdep_map dep_map;   unsigned int deadlock_inject_interval;   unsigned int deadlock_inject_countdown; } ;    43     struct ww_mutex {   struct mutex base;   struct ww_acquire_ctx *ctx;   struct ww_class *ww_class; } ;   377     struct drm_modeset_lock ;   378     struct drm_modeset_acquire_ctx {   struct ww_acquire_ctx ww_ctx;   struct drm_modeset_lock *contended;   struct list_head locked;   bool trylock_only; } ;    63     struct drm_modeset_lock {   struct ww_mutex mutex;   struct list_head head; } ;   127     struct drm_crtc ;   128     struct drm_plane ;   142     struct drm_mode_set ;   143     struct drm_framebuffer ;   144     struct drm_object_properties ;   145     struct fence ;   146     struct drm_mode_object {   uint32_t id;   uint32_t type;   struct drm_object_properties *properties;   struct kref refcount;   void (*free_cb)(struct kref *); } ;    55     struct drm_property ;    55     struct drm_object_properties {   int count;   int atomic_count;   struct drm_property *properties[24U];   uint64_t values[24U]; } ;    79     enum drm_connector_force {   DRM_FORCE_UNSPECIFIED = 0,   DRM_FORCE_OFF = 1,   DRM_FORCE_ON = 2,   DRM_FORCE_ON_DIGITAL = 3 } ;    86     enum drm_mode_status {   MODE_OK = 0,   MODE_HSYNC = 1,   MODE_VSYNC = 2,   MODE_H_ILLEGAL = 3,   MODE_V_ILLEGAL = 4,   MODE_BAD_WIDTH = 5,   MODE_NOMODE = 6,   MODE_NO_INTERLACE = 7,   MODE_NO_DBLESCAN = 8,   MODE_NO_VSCAN = 9,   MODE_MEM = 10,   MODE_VIRTUAL_X = 11,   MODE_VIRTUAL_Y = 12,   MODE_MEM_VIRT = 13,   MODE_NOCLOCK = 14,   MODE_CLOCK_HIGH = 15,   MODE_CLOCK_LOW = 16,   MODE_CLOCK_RANGE = 17,   MODE_BAD_HVALUE = 18,   MODE_BAD_VVALUE = 19,   MODE_BAD_VSCAN = 20,   MODE_HSYNC_NARROW = 21,   MODE_HSYNC_WIDE = 22,   MODE_HBLANK_NARROW = 23,   MODE_HBLANK_WIDE = 24,   MODE_VSYNC_NARROW = 25,   MODE_VSYNC_WIDE = 26,   MODE_VBLANK_NARROW = 27,   MODE_VBLANK_WIDE = 28,   MODE_PANEL = 29,   MODE_INTERLACE_WIDTH = 30,   MODE_ONE_WIDTH = 31,   MODE_ONE_HEIGHT = 32,   MODE_ONE_SIZE = 33,   MODE_NO_REDUCED = 34,   MODE_NO_STEREO = 35,   MODE_STALE = -3,   MODE_BAD = -2,   MODE_ERROR = -1 } ;   128     struct drm_display_mode {   struct list_head head;   struct drm_mode_object base;   char name[32U];   enum drm_mode_status status;   unsigned int type;   int clock;   int hdisplay;   int hsync_start;   int hsync_end;   int htotal;   int hskew;   int vdisplay;   int vsync_start;   int vsync_end;   int vtotal;   int vscan;   unsigned int flags;   int width_mm;   int height_mm;   int crtc_clock;   int crtc_hdisplay;   int crtc_hblank_start;   int crtc_hblank_end;   int crtc_hsync_start;   int crtc_hsync_end;   int crtc_htotal;   int crtc_hskew;   int crtc_vdisplay;   int crtc_vblank_start;   int crtc_vblank_end;   int crtc_vsync_start;   int crtc_vsync_end;   int crtc_vtotal;   int *private;   int private_flags;   int vrefresh;   int hsync;   enum hdmi_picture_aspect picture_aspect_ratio; } ;   400     struct drm_cmdline_mode {   bool specified;   bool refresh_specified;   bool bpp_specified;   int xres;   int yres;   int bpp;   int refresh;   bool rb;   bool interlace;   bool cvt;   bool margins;   enum drm_connector_force force; } ;   428     struct drm_connector ;   495     enum drm_connector_status {   connector_status_connected = 1,   connector_status_disconnected = 2,   connector_status_unknown = 3 } ;   501     enum subpixel_order {   SubPixelUnknown = 0,   SubPixelHorizontalRGB = 1,   SubPixelHorizontalBGR = 2,   SubPixelVerticalRGB = 3,   SubPixelVerticalBGR = 4,   SubPixelNone = 5 } ;   510     struct drm_display_info {   char name[32U];   unsigned int width_mm;   unsigned int height_mm;   unsigned int min_vfreq;   unsigned int max_vfreq;   unsigned int min_hfreq;   unsigned int max_hfreq;   unsigned int pixel_clock;   unsigned int bpc;   enum subpixel_order subpixel_order;   u32 color_formats;   const u32 *bus_formats;   unsigned int num_bus_formats;   u32 bus_flags;   u8 edid_hdmi_dc_modes;   u8 cea_rev; } ;   157     struct drm_tile_group {   struct kref refcount;   struct drm_device *dev;   int id;   u8 group_data[8U]; } ;   165     struct drm_framebuffer_funcs {   void (*destroy)(struct drm_framebuffer *);   int (*create_handle)(struct drm_framebuffer *, struct drm_file *, unsigned int *);   int (*dirty)(struct drm_framebuffer *, struct drm_file *, unsigned int, unsigned int, struct drm_clip_rect *, unsigned int); } ;   223     struct drm_framebuffer {   struct drm_device *dev;   struct list_head head;   struct drm_mode_object base;   const struct drm_framebuffer_funcs *funcs;   unsigned int pitches[4U];   unsigned int offsets[4U];   uint64_t modifier[4U];   unsigned int width;   unsigned int height;   unsigned int depth;   int bits_per_pixel;   int flags;   uint32_t pixel_format;   struct list_head filp_head; } ;   258     struct drm_property_blob {   struct drm_mode_object base;   struct drm_device *dev;   struct list_head head_global;   struct list_head head_file;   size_t length;   unsigned char data[]; } ;   273     struct drm_property {   struct list_head head;   struct drm_mode_object base;   uint32_t flags;   char name[32U];   uint32_t num_values;   uint64_t *values;   struct drm_device *dev;   struct list_head enum_list; } ;   285     struct drm_encoder ;   286     struct drm_pending_vblank_event ;   287     struct drm_bridge ;   288     struct drm_atomic_state ;   289     struct drm_crtc_helper_funcs ;   290     struct drm_encoder_helper_funcs ;   291     struct drm_connector_helper_funcs ;   292     struct drm_plane_helper_funcs ;   293     struct drm_crtc_state {   struct drm_crtc *crtc;   bool enable;   bool active;   bool planes_changed;   bool mode_changed;   bool active_changed;   bool connectors_changed;   bool color_mgmt_changed;   u32 plane_mask;   u32 connector_mask;   u32 encoder_mask;   u32 last_vblank_count;   struct drm_display_mode adjusted_mode;   struct drm_display_mode mode;   struct drm_property_blob *mode_blob;   struct drm_property_blob *degamma_lut;   struct drm_property_blob *ctm;   struct drm_property_blob *gamma_lut;   struct drm_pending_vblank_event *event;   struct drm_atomic_state *state; } ;   375     struct drm_crtc_funcs {   void (*reset)(struct drm_crtc *);   int (*cursor_set)(struct drm_crtc *, struct drm_file *, uint32_t , uint32_t , uint32_t );   int (*cursor_set2)(struct drm_crtc *, struct drm_file *, uint32_t , uint32_t , uint32_t , int32_t , int32_t );   int (*cursor_move)(struct drm_crtc *, int, int);   void (*gamma_set)(struct drm_crtc *, u16 *, u16 *, u16 *, uint32_t , uint32_t );   void (*destroy)(struct drm_crtc *);   int (*set_config)(struct drm_mode_set *);   int (*page_flip)(struct drm_crtc *, struct drm_framebuffer *, struct drm_pending_vblank_event *, uint32_t );   int (*set_property)(struct drm_crtc *, struct drm_property *, uint64_t );   struct drm_crtc_state * (*atomic_duplicate_state)(struct drm_crtc *);   void (*atomic_destroy_state)(struct drm_crtc *, struct drm_crtc_state *);   int (*atomic_set_property)(struct drm_crtc *, struct drm_crtc_state *, struct drm_property *, uint64_t );   int (*atomic_get_property)(struct drm_crtc *, const struct drm_crtc_state *, struct drm_property *, uint64_t *); } ;   702     struct drm_crtc {   struct drm_device *dev;   struct device_node *port;   struct list_head head;   char *name;   struct drm_modeset_lock mutex;   struct drm_mode_object base;   struct drm_plane *primary;   struct drm_plane *cursor;   int cursor_x;   int cursor_y;   bool enabled;   struct drm_display_mode mode;   struct drm_display_mode hwmode;   int x;   int y;   const struct drm_crtc_funcs *funcs;   uint32_t gamma_size;   uint16_t *gamma_store;   const struct drm_crtc_helper_funcs *helper_private;   struct drm_object_properties properties;   struct drm_crtc_state *state;   struct drm_modeset_acquire_ctx *acquire_ctx; } ;   790     struct drm_connector_state {   struct drm_connector *connector;   struct drm_crtc *crtc;   struct drm_encoder *best_encoder;   struct drm_atomic_state *state; } ;   807     struct drm_connector_funcs {   int (*dpms)(struct drm_connector *, int);   void (*reset)(struct drm_connector *);   enum drm_connector_status  (*detect)(struct drm_connector *, bool );   void (*force)(struct drm_connector *);   int (*fill_modes)(struct drm_connector *, uint32_t , uint32_t );   int (*set_property)(struct drm_connector *, struct drm_property *, uint64_t );   void (*destroy)(struct drm_connector *);   struct drm_connector_state * (*atomic_duplicate_state)(struct drm_connector *);   void (*atomic_destroy_state)(struct drm_connector *, struct drm_connector_state *);   int (*atomic_set_property)(struct drm_connector *, struct drm_connector_state *, struct drm_property *, uint64_t );   int (*atomic_get_property)(struct drm_connector *, const struct drm_connector_state *, struct drm_property *, uint64_t *); } ;  1045     struct drm_encoder_funcs {   void (*reset)(struct drm_encoder *);   void (*destroy)(struct drm_encoder *); } ;  1073     struct drm_encoder {   struct drm_device *dev;   struct list_head head;   struct drm_mode_object base;   char *name;   int encoder_type;   uint32_t possible_crtcs;   uint32_t possible_clones;   struct drm_crtc *crtc;   struct drm_bridge *bridge;   const struct drm_encoder_funcs *funcs;   const struct drm_encoder_helper_funcs *helper_private; } ;  1108     struct drm_connector {   struct drm_device *dev;   struct device *kdev;   struct device_attribute *attr;   struct list_head head;   struct drm_mode_object base;   char *name;   int connector_id;   int connector_type;   int connector_type_id;   bool interlace_allowed;   bool doublescan_allowed;   bool stereo_allowed;   struct list_head modes;   enum drm_connector_status status;   struct list_head probed_modes;   struct drm_display_info display_info;   const struct drm_connector_funcs *funcs;   struct drm_property_blob *edid_blob_ptr;   struct drm_object_properties properties;   struct drm_property_blob *path_blob_ptr;   struct drm_property_blob *tile_blob_ptr;   uint8_t polled;   int dpms;   const struct drm_connector_helper_funcs *helper_private;   struct drm_cmdline_mode cmdline_mode;   enum drm_connector_force force;   bool override_edid;   uint32_t encoder_ids[3U];   struct drm_encoder *encoder;   uint8_t eld[128U];   bool dvi_dual;   int max_tmds_clock;   bool latency_present[2U];   int video_latency[2U];   int audio_latency[2U];   int null_edid_counter;   unsigned int bad_edid_counter;   bool edid_corrupt;   struct dentry *debugfs_entry;   struct drm_connector_state *state;   bool has_tile;   struct drm_tile_group *tile_group;   bool tile_is_single_monitor;   uint8_t num_h_tile;   uint8_t num_v_tile;   uint8_t tile_h_loc;   uint8_t tile_v_loc;   uint16_t tile_h_size;   uint16_t tile_v_size; } ;  1249     struct drm_plane_state {   struct drm_plane *plane;   struct drm_crtc *crtc;   struct drm_framebuffer *fb;   struct fence *fence;   int32_t crtc_x;   int32_t crtc_y;   uint32_t crtc_w;   uint32_t crtc_h;   uint32_t src_x;   uint32_t src_y;   uint32_t src_h;   uint32_t src_w;   unsigned int rotation;   struct drm_atomic_state *state; } ;  1288     struct drm_plane_funcs {   int (*update_plane)(struct drm_plane *, struct drm_crtc *, struct drm_framebuffer *, int, int, unsigned int, unsigned int, uint32_t , uint32_t , uint32_t , uint32_t );   int (*disable_plane)(struct drm_plane *);   void (*destroy)(struct drm_plane *);   void (*reset)(struct drm_plane *);   int (*set_property)(struct drm_plane *, struct drm_property *, uint64_t );   struct drm_plane_state * (*atomic_duplicate_state)(struct drm_plane *);   void (*atomic_destroy_state)(struct drm_plane *, struct drm_plane_state *);   int (*atomic_set_property)(struct drm_plane *, struct drm_plane_state *, struct drm_property *, uint64_t );   int (*atomic_get_property)(struct drm_plane *, const struct drm_plane_state *, struct drm_property *, uint64_t *); } ;  1491     enum drm_plane_type {   DRM_PLANE_TYPE_OVERLAY = 0,   DRM_PLANE_TYPE_PRIMARY = 1,   DRM_PLANE_TYPE_CURSOR = 2 } ;  1497     struct drm_plane {   struct drm_device *dev;   struct list_head head;   char *name;   struct drm_modeset_lock mutex;   struct drm_mode_object base;   uint32_t possible_crtcs;   uint32_t *format_types;   unsigned int format_count;   bool format_default;   struct drm_crtc *crtc;   struct drm_framebuffer *fb;   struct drm_framebuffer *old_fb;   const struct drm_plane_funcs *funcs;   struct drm_object_properties properties;   enum drm_plane_type type;   const struct drm_plane_helper_funcs *helper_private;   struct drm_plane_state *state; } ;  1550     struct drm_bridge_funcs {   int (*attach)(struct drm_bridge *);   bool  (*mode_fixup)(struct drm_bridge *, const struct drm_display_mode *, struct drm_display_mode *);   void (*disable)(struct drm_bridge *);   void (*post_disable)(struct drm_bridge *);   void (*mode_set)(struct drm_bridge *, struct drm_display_mode *, struct drm_display_mode *);   void (*pre_enable)(struct drm_bridge *);   void (*enable)(struct drm_bridge *); } ;  1672     struct drm_bridge {   struct drm_device *dev;   struct drm_encoder *encoder;   struct drm_bridge *next;   struct device_node *of_node;   struct list_head list;   const struct drm_bridge_funcs *funcs;   void *driver_private; } ;  1695     struct drm_atomic_state {   struct drm_device *dev;   bool allow_modeset;   bool legacy_cursor_update;   bool legacy_set_config;   struct drm_plane **planes;   struct drm_plane_state **plane_states;   struct drm_crtc **crtcs;   struct drm_crtc_state **crtc_states;   int num_connector;   struct drm_connector **connectors;   struct drm_connector_state **connector_states;   struct drm_modeset_acquire_ctx *acquire_ctx; } ;  1726     struct drm_mode_set {   struct drm_framebuffer *fb;   struct drm_crtc *crtc;   struct drm_display_mode *mode;   uint32_t x;   uint32_t y;   struct drm_connector **connectors;   size_t num_connectors; } ;  1754     struct drm_mode_config_funcs {   struct drm_framebuffer * (*fb_create)(struct drm_device *, struct drm_file *, const struct drm_mode_fb_cmd2 *);   void (*output_poll_changed)(struct drm_device *);   int (*atomic_check)(struct drm_device *, struct drm_atomic_state *);   int (*atomic_commit)(struct drm_device *, struct drm_atomic_state *, bool );   struct drm_atomic_state * (*atomic_state_alloc)(struct drm_device *);   void (*atomic_state_clear)(struct drm_atomic_state *);   void (*atomic_state_free)(struct drm_atomic_state *); } ;  2018     struct drm_mode_config {   struct mutex mutex;   struct drm_modeset_lock connection_mutex;   struct drm_modeset_acquire_ctx *acquire_ctx;   struct mutex idr_mutex;   struct idr crtc_idr;   struct idr tile_idr;   struct mutex fb_lock;   int num_fb;   struct list_head fb_list;   int num_connector;   struct ida connector_ida;   struct list_head connector_list;   int num_encoder;   struct list_head encoder_list;   int num_overlay_plane;   int num_total_plane;   struct list_head plane_list;   int num_crtc;   struct list_head crtc_list;   struct list_head property_list;   int min_width;   int min_height;   int max_width;   int max_height;   const struct drm_mode_config_funcs *funcs;   resource_size_t fb_base;   bool poll_enabled;   bool poll_running;   bool delayed_event;   struct delayed_work output_poll_work;   struct mutex blob_lock;   struct list_head property_blob_list;   struct drm_property *edid_property;   struct drm_property *dpms_property;   struct drm_property *path_property;   struct drm_property *tile_property;   struct drm_property *plane_type_property;   struct drm_property *rotation_property;   struct drm_property *prop_src_x;   struct drm_property *prop_src_y;   struct drm_property *prop_src_w;   struct drm_property *prop_src_h;   struct drm_property *prop_crtc_x;   struct drm_property *prop_crtc_y;   struct drm_property *prop_crtc_w;   struct drm_property *prop_crtc_h;   struct drm_property *prop_fb_id;   struct drm_property *prop_crtc_id;   struct drm_property *prop_active;   struct drm_property *prop_mode_id;   struct drm_property *dvi_i_subconnector_property;   struct drm_property *dvi_i_select_subconnector_property;   struct drm_property *tv_subconnector_property;   struct drm_property *tv_select_subconnector_property;   struct drm_property *tv_mode_property;   struct drm_property *tv_left_margin_property;   struct drm_property *tv_right_margin_property;   struct drm_property *tv_top_margin_property;   struct drm_property *tv_bottom_margin_property;   struct drm_property *tv_brightness_property;   struct drm_property *tv_contrast_property;   struct drm_property *tv_flicker_reduction_property;   struct drm_property *tv_overscan_property;   struct drm_property *tv_saturation_property;   struct drm_property *tv_hue_property;   struct drm_property *scaling_mode_property;   struct drm_property *aspect_ratio_property;   struct drm_property *dirty_info_property;   struct drm_property *degamma_lut_property;   struct drm_property *degamma_lut_size_property;   struct drm_property *ctm_property;   struct drm_property *gamma_lut_property;   struct drm_property *gamma_lut_size_property;   struct drm_property *suggested_x_property;   struct drm_property *suggested_y_property;   uint32_t preferred_depth;   uint32_t prefer_shadow;   bool async_page_flip;   bool allow_fb_modifiers;   uint32_t cursor_width;   uint32_t cursor_height; } ;    46     struct drm_open_hash {   struct hlist_head *table;   u8 order; } ;    91     struct drm_mm ;    91     struct drm_mm_node {   struct list_head node_list;   struct list_head hole_stack;   unsigned char hole_follows;   unsigned char scanned_block;   unsigned char scanned_prev_free;   unsigned char scanned_next_free;   unsigned char scanned_preceeds_hole;   unsigned char allocated;   unsigned long color;   u64 start;   u64 size;   struct drm_mm *mm; } ;    75     struct drm_mm {   struct list_head hole_stack;   struct drm_mm_node head_node;   unsigned char scan_check_range;   unsigned int scan_alignment;   unsigned long scan_color;   u64 scan_size;   u64 scan_hit_start;   u64 scan_hit_end;   unsigned int scanned_blocks;   u64 scan_start;   u64 scan_end;   struct drm_mm_node *prev_scanned_node;   void (*color_adjust)(struct drm_mm_node *, unsigned long, u64 *, u64 *); } ;    19     struct vdso_image {   void *data;   unsigned long size;   unsigned long alt;   unsigned long alt_len;   long sym_vvar_start;   long sym_vvar_page;   long sym_hpet_page;   long sym_pvclock_page;   long sym_VDSO32_NOTE_MASK;   long sym___kernel_sigreturn;   long sym___kernel_rt_sigreturn;   long sym___kernel_vsyscall;   long sym_int80_landing_pad; } ;    15     typedef __u64 Elf64_Addr;    16     typedef __u16 Elf64_Half;    18     typedef __u64 Elf64_Off;    20     typedef __u32 Elf64_Word;    21     typedef __u64 Elf64_Xword;   190     struct elf64_sym {   Elf64_Word st_name;   unsigned char st_info;   unsigned char st_other;   Elf64_Half st_shndx;   Elf64_Addr st_value;   Elf64_Xword st_size; } ;   198     typedef struct elf64_sym Elf64_Sym;   219     struct elf64_hdr {   unsigned char e_ident[16U];   Elf64_Half e_type;   Elf64_Half e_machine;   Elf64_Word e_version;   Elf64_Addr e_entry;   Elf64_Off e_phoff;   Elf64_Off e_shoff;   Elf64_Word e_flags;   Elf64_Half e_ehsize;   Elf64_Half e_phentsize;   Elf64_Half e_phnum;   Elf64_Half e_shentsize;   Elf64_Half e_shnum;   Elf64_Half e_shstrndx; } ;   235     typedef struct elf64_hdr Elf64_Ehdr;   313     struct elf64_shdr {   Elf64_Word sh_name;   Elf64_Word sh_type;   Elf64_Xword sh_flags;   Elf64_Addr sh_addr;   Elf64_Off sh_offset;   Elf64_Xword sh_size;   Elf64_Word sh_link;   Elf64_Word sh_info;   Elf64_Xword sh_addralign;   Elf64_Xword sh_entsize; } ;   325     typedef struct elf64_shdr Elf64_Shdr;    53     struct latch_tree_node {   struct rb_node node[2U]; } ;   211     struct mod_arch_specific { } ;    38     struct module_param_attrs ;    38     struct module_kobject {   struct kobject kobj;   struct module *mod;   struct kobject *drivers_dir;   struct module_param_attrs *mp;   struct completion *kobj_completion; } ;    48     struct module_attribute {   struct attribute attr;   ssize_t  (*show)(struct module_attribute *, struct module_kobject *, char *);   ssize_t  (*store)(struct module_attribute *, struct module_kobject *, const char *, size_t );   void (*setup)(struct module *, const char *);   int (*test)(struct module *);   void (*free)(struct module *); } ;   290     enum module_state {   MODULE_STATE_LIVE = 0,   MODULE_STATE_COMING = 1,   MODULE_STATE_GOING = 2,   MODULE_STATE_UNFORMED = 3 } ;   297     struct mod_tree_node {   struct module *mod;   struct latch_tree_node node; } ;   304     struct module_layout {   void *base;   unsigned int size;   unsigned int text_size;   unsigned int ro_size;   struct mod_tree_node mtn; } ;   318     struct mod_kallsyms {   Elf64_Sym *symtab;   unsigned int num_symtab;   char *strtab; } ;   332     struct klp_modinfo {   Elf64_Ehdr hdr;   Elf64_Shdr *sechdrs;   char *secstrings;   unsigned int symndx; } ;   340     struct module_sect_attrs ;   340     struct module_notes_attrs ;   340     struct trace_event_call ;   340     struct trace_enum_map ;   340     struct module {   enum module_state state;   struct list_head list;   char name[56U];   struct module_kobject mkobj;   struct module_attribute *modinfo_attrs;   const char *version;   const char *srcversion;   struct kobject *holders_dir;   const struct kernel_symbol *syms;   const unsigned long *crcs;   unsigned int num_syms;   struct mutex param_lock;   struct kernel_param *kp;   unsigned int num_kp;   unsigned int num_gpl_syms;   const struct kernel_symbol *gpl_syms;   const unsigned long *gpl_crcs;   const struct kernel_symbol *unused_syms;   const unsigned long *unused_crcs;   unsigned int num_unused_syms;   unsigned int num_unused_gpl_syms;   const struct kernel_symbol *unused_gpl_syms;   const unsigned long *unused_gpl_crcs;   bool sig_ok;   bool async_probe_requested;   const struct kernel_symbol *gpl_future_syms;   const unsigned long *gpl_future_crcs;   unsigned int num_gpl_future_syms;   unsigned int num_exentries;   struct exception_table_entry *extable;   int (*init)();   struct module_layout core_layout;   struct module_layout init_layout;   struct mod_arch_specific arch;   unsigned int taints;   unsigned int num_bugs;   struct list_head bug_list;   struct bug_entry *bug_table;   struct mod_kallsyms *kallsyms;   struct mod_kallsyms core_kallsyms;   struct module_sect_attrs *sect_attrs;   struct module_notes_attrs *notes_attrs;   char *args;   void *percpu;   unsigned int percpu_size;   unsigned int num_tracepoints;   const struct tracepoint **tracepoints_ptrs;   unsigned int num_trace_bprintk_fmt;   const char **trace_bprintk_fmt_start;   struct trace_event_call **trace_events;   unsigned int num_trace_events;   struct trace_enum_map **trace_enums;   unsigned int num_trace_enums;   bool klp;   bool klp_alive;   struct klp_modinfo *klp_info;   struct list_head source_list;   struct list_head target_list;   void (*exit)();   atomic_t refcnt;   ctor_fn_t  (**ctors)();   unsigned int num_ctors; } ;    46     struct drm_vma_offset_manager {   rwlock_t vm_lock;   struct rb_root vm_addr_space_rb;   struct drm_mm vm_addr_space_mm; } ;   233     struct drm_local_map ;   234     struct drm_device_dma ;   236     struct drm_gem_object ;   237     struct reservation_object ;   238     struct dma_buf_attachment ;   246     typedef int drm_ioctl_t(struct drm_device *, void *, struct drm_file *);   250     struct drm_ioctl_desc {   unsigned int cmd;   int flags;   drm_ioctl_t *func;   const char *name; } ;   268     struct drm_pending_event {   struct drm_event *event;   struct list_head link;   struct list_head pending_link;   struct drm_file *file_priv;   pid_t pid;   void (*destroy)(struct drm_pending_event *); } ;   292     struct drm_prime_file_private {   struct list_head head;   struct mutex lock; } ;   298     struct drm_minor ;   298     struct drm_master ;   298     struct drm_file {   unsigned char authenticated;   unsigned char is_master;   unsigned char stereo_allowed;   unsigned char universal_planes;   unsigned char atomic;   unsigned char allowed_master;   struct pid *pid;   kuid_t uid;   drm_magic_t magic;   struct list_head lhead;   struct drm_minor *minor;   unsigned long lock_count;   struct idr object_idr;   spinlock_t table_lock;   struct file *filp;   void *driver_priv;   struct drm_master *master;   struct list_head fbs;   struct mutex fbs_lock;   struct list_head blobs;   wait_queue_head_t event_wait;   struct list_head pending_event_list;   struct list_head event_list;   int event_space;   struct mutex event_read_lock;   struct drm_prime_file_private prime; } ;   358     struct drm_lock_data {   struct drm_hw_lock *hw_lock;   struct drm_file *file_priv;   wait_queue_head_t lock_queue;   unsigned long lock_time;   spinlock_t spinlock;   uint32_t kernel_waiters;   uint32_t user_waiters;   int idle_has_lock; } ;   373     struct drm_master {   struct kref refcount;   struct drm_minor *minor;   char *unique;   int unique_len;   struct idr magic_map;   struct drm_lock_data lock;   void *driver_priv; } ;   394     struct dma_buf ;   394     struct drm_driver {   int (*load)(struct drm_device *, unsigned long);   int (*firstopen)(struct drm_device *);   int (*open)(struct drm_device *, struct drm_file *);   void (*preclose)(struct drm_device *, struct drm_file *);   void (*postclose)(struct drm_device *, struct drm_file *);   void (*lastclose)(struct drm_device *);   int (*unload)(struct drm_device *);   int (*suspend)(struct drm_device *, pm_message_t );   int (*resume)(struct drm_device *);   int (*dma_ioctl)(struct drm_device *, void *, struct drm_file *);   int (*dma_quiescent)(struct drm_device *);   int (*context_dtor)(struct drm_device *, int);   int (*set_busid)(struct drm_device *, struct drm_master *);   u32  (*get_vblank_counter)(struct drm_device *, unsigned int);   int (*enable_vblank)(struct drm_device *, unsigned int);   void (*disable_vblank)(struct drm_device *, unsigned int);   int (*device_is_agp)(struct drm_device *);   int (*get_scanout_position)(struct drm_device *, unsigned int, unsigned int, int *, int *, ktime_t *, ktime_t *, const struct drm_display_mode *);   int (*get_vblank_timestamp)(struct drm_device *, unsigned int, int *, struct timeval *, unsigned int);   irqreturn_t  (*irq_handler)(int, void *);   void (*irq_preinstall)(struct drm_device *);   int (*irq_postinstall)(struct drm_device *);   void (*irq_uninstall)(struct drm_device *);   int (*master_create)(struct drm_device *, struct drm_master *);   void (*master_destroy)(struct drm_device *, struct drm_master *);   int (*master_set)(struct drm_device *, struct drm_file *, bool );   void (*master_drop)(struct drm_device *, struct drm_file *, bool );   int (*debugfs_init)(struct drm_minor *);   void (*debugfs_cleanup)(struct drm_minor *);   void (*gem_free_object)(struct drm_gem_object *);   void (*gem_free_object_unlocked)(struct drm_gem_object *);   int (*gem_open_object)(struct drm_gem_object *, struct drm_file *);   void (*gem_close_object)(struct drm_gem_object *, struct drm_file *);   struct drm_gem_object * (*gem_create_object)(struct drm_device *, size_t );   int (*prime_handle_to_fd)(struct drm_device *, struct drm_file *, uint32_t , uint32_t , int *);   int (*prime_fd_to_handle)(struct drm_device *, struct drm_file *, int, uint32_t *);   struct dma_buf * (*gem_prime_export)(struct drm_device *, struct drm_gem_object *, int);   struct drm_gem_object * (*gem_prime_import)(struct drm_device *, struct dma_buf *);   int (*gem_prime_pin)(struct drm_gem_object *);   void (*gem_prime_unpin)(struct drm_gem_object *);   struct reservation_object * (*gem_prime_res_obj)(struct drm_gem_object *);   struct sg_table * (*gem_prime_get_sg_table)(struct drm_gem_object *);   struct drm_gem_object * (*gem_prime_import_sg_table)(struct drm_device *, struct dma_buf_attachment *, struct sg_table *);   void * (*gem_prime_vmap)(struct drm_gem_object *);   void (*gem_prime_vunmap)(struct drm_gem_object *, void *);   int (*gem_prime_mmap)(struct drm_gem_object *, struct vm_area_struct *);   void (*vgaarb_irq)(struct drm_device *, bool );   int (*dumb_create)(struct drm_file *, struct drm_device *, struct drm_mode_create_dumb *);   int (*dumb_map_offset)(struct drm_file *, struct drm_device *, uint32_t , uint64_t *);   int (*dumb_destroy)(struct drm_file *, struct drm_device *, uint32_t );   const struct vm_operations_struct *gem_vm_ops;   int major;   int minor;   int patchlevel;   char *name;   char *desc;   char *date;   u32 driver_features;   int dev_priv_size;   const struct drm_ioctl_desc *ioctls;   int num_ioctls;   const struct file_operations *fops;   struct list_head legacy_dev_list; } ;   697     struct drm_minor {   int index;   int type;   struct device *kdev;   struct drm_device *dev;   struct dentry *debugfs_root;   struct list_head debugfs_list;   struct mutex debugfs_lock;   struct drm_master *master; } ;   715     struct drm_pending_vblank_event {   struct drm_pending_event base;   unsigned int pipe;   struct drm_event_vblank event; } ;   722     struct drm_vblank_crtc {   struct drm_device *dev;   wait_queue_head_t queue;   struct timer_list disable_timer;   u32 count;   struct timeval time[2U];   atomic_t refcount;   u32 last;   u32 last_wait;   unsigned int inmodeset;   unsigned int pipe;   int framedur_ns;   int linedur_ns;   bool enabled; } ;   743     struct virtio_device ;   743     struct drm_sg_mem ;   743     struct __anonstruct_sigdata_354 {   int context;   struct drm_hw_lock *lock; } ;   743     struct drm_device {   struct list_head legacy_dev_list;   int if_version;   struct kref ref;   struct device *dev;   struct drm_driver *driver;   void *dev_private;   struct drm_minor *control;   struct drm_minor *primary;   struct drm_minor *render;   atomic_t unplugged;   struct inode *anon_inode;   char *unique;   struct mutex struct_mutex;   struct mutex master_mutex;   int open_count;   spinlock_t buf_lock;   int buf_use;   atomic_t buf_alloc;   struct mutex filelist_mutex;   struct list_head filelist;   struct list_head maplist;   struct drm_open_hash map_hash;   struct list_head ctxlist;   struct mutex ctxlist_mutex;   struct idr ctx_idr;   struct list_head vmalist;   struct drm_device_dma *dma;   volatile long context_flag;   int last_context;   bool irq_enabled;   int irq;   bool vblank_disable_immediate;   struct drm_vblank_crtc *vblank;   spinlock_t vblank_time_lock;   spinlock_t vbl_lock;   u32 max_vblank_count;   struct list_head vblank_event_list;   spinlock_t event_lock;   struct drm_agp_head *agp;   struct pci_dev *pdev;   struct platform_device *platformdev;   struct virtio_device *virtdev;   struct drm_sg_mem *sg;   unsigned int num_crtcs;   struct __anonstruct_sigdata_354 sigdata;   struct drm_local_map *agp_buffer_map;   unsigned int agp_buffer_token;   struct drm_mode_config mode_config;   struct mutex object_name_lock;   struct idr object_name_idr;   struct drm_vma_offset_manager *vma_offset_manager;   int switch_power_state; } ;   171     enum mode_set_atomic ;   172     struct drm_crtc_helper_funcs {   void (*dpms)(struct drm_crtc *, int);   void (*prepare)(struct drm_crtc *);   void (*commit)(struct drm_crtc *);   bool  (*mode_fixup)(struct drm_crtc *, const struct drm_display_mode *, struct drm_display_mode *);   int (*mode_set)(struct drm_crtc *, struct drm_display_mode *, struct drm_display_mode *, int, int, struct drm_framebuffer *);   void (*mode_set_nofb)(struct drm_crtc *);   int (*mode_set_base)(struct drm_crtc *, int, int, struct drm_framebuffer *);   int (*mode_set_base_atomic)(struct drm_crtc *, struct drm_framebuffer *, int, int, int);   void (*load_lut)(struct drm_crtc *);   void (*disable)(struct drm_crtc *);   void (*enable)(struct drm_crtc *);   int (*atomic_check)(struct drm_crtc *, struct drm_crtc_state *);   void (*atomic_begin)(struct drm_crtc *, struct drm_crtc_state *);   void (*atomic_flush)(struct drm_crtc *, struct drm_crtc_state *); } ;   406     struct drm_encoder_helper_funcs {   void (*dpms)(struct drm_encoder *, int);   bool  (*mode_fixup)(struct drm_encoder *, const struct drm_display_mode *, struct drm_display_mode *);   void (*prepare)(struct drm_encoder *);   void (*commit)(struct drm_encoder *);   void (*mode_set)(struct drm_encoder *, struct drm_display_mode *, struct drm_display_mode *);   struct drm_crtc * (*get_crtc)(struct drm_encoder *);   enum drm_connector_status  (*detect)(struct drm_encoder *, struct drm_connector *);   void (*disable)(struct drm_encoder *);   void (*enable)(struct drm_encoder *);   int (*atomic_check)(struct drm_encoder *, struct drm_crtc_state *, struct drm_connector_state *); } ;   653     struct drm_connector_helper_funcs {   int (*get_modes)(struct drm_connector *);   enum drm_mode_status  (*mode_valid)(struct drm_connector *, struct drm_display_mode *);   struct drm_encoder * (*best_encoder)(struct drm_connector *);   struct drm_encoder * (*atomic_best_encoder)(struct drm_connector *, struct drm_connector_state *); } ;   786     struct drm_plane_helper_funcs {   int (*prepare_fb)(struct drm_plane *, const struct drm_plane_state *);   void (*cleanup_fb)(struct drm_plane *, const struct drm_plane_state *);   int (*atomic_check)(struct drm_plane *, struct drm_plane_state *);   void (*atomic_update)(struct drm_plane *, struct drm_plane_state *);   void (*atomic_disable)(struct drm_plane *, struct drm_plane_state *); } ;    20     struct rt_mutex {   raw_spinlock_t wait_lock;   struct rb_root waiters;   struct rb_node *waiters_leftmost;   struct task_struct *owner;   int save_state;   const char *name;   const char *file;   int line;   void *magic; } ;  1150     struct i2c_msg {   __u16 addr;   __u16 flags;   __u16 len;   __u8 *buf; } ;    83     union i2c_smbus_data {   __u8 byte;   __u16 word;   __u8 block[34U]; } ;    39     struct i2c_algorithm ;    40     struct i2c_adapter ;    41     struct i2c_client ;    44     enum i2c_slave_event ;   199     struct i2c_client {   unsigned short flags;   unsigned short addr;   char name[20U];   struct i2c_adapter *adapter;   struct device dev;   int irq;   struct list_head detected;   int (*slave_cb)(struct i2c_client *, enum i2c_slave_event , u8 *); } ;   254     enum i2c_slave_event {   I2C_SLAVE_READ_REQUESTED = 0,   I2C_SLAVE_WRITE_REQUESTED = 1,   I2C_SLAVE_READ_PROCESSED = 2,   I2C_SLAVE_WRITE_RECEIVED = 3,   I2C_SLAVE_STOP = 4 } ;   362     struct i2c_algorithm {   int (*master_xfer)(struct i2c_adapter *, struct i2c_msg *, int);   int (*smbus_xfer)(struct i2c_adapter *, u16 , unsigned short, char, u8 , int, union i2c_smbus_data *);   u32  (*functionality)(struct i2c_adapter *);   int (*reg_slave)(struct i2c_client *);   int (*unreg_slave)(struct i2c_client *); } ;   431     struct i2c_bus_recovery_info {   int (*recover_bus)(struct i2c_adapter *);   int (*get_scl)(struct i2c_adapter *);   void (*set_scl)(struct i2c_adapter *, int);   int (*get_sda)(struct i2c_adapter *);   void (*prepare_recovery)(struct i2c_adapter *);   void (*unprepare_recovery)(struct i2c_adapter *);   int scl_gpio;   int sda_gpio; } ;   470     struct i2c_adapter_quirks {   u64 flags;   int max_num_msgs;   u16 max_write_len;   u16 max_read_len;   u16 max_comb_1st_msg_len;   u16 max_comb_2nd_msg_len; } ;   500     struct i2c_adapter {   struct module *owner;   unsigned int class;   const struct i2c_algorithm *algo;   void *algo_data;   struct rt_mutex bus_lock;   struct rt_mutex mux_lock;   int timeout;   int retries;   struct device dev;   int nr;   char name[48U];   struct completion dev_released;   struct mutex userspace_clients_lock;   struct list_head userspace_clients;   struct i2c_bus_recovery_info *bus_recovery_info;   const struct i2c_adapter_quirks *quirks;   void (*lock_bus)(struct i2c_adapter *, unsigned int);   int (*trylock_bus)(struct i2c_adapter *, unsigned int);   void (*unlock_bus)(struct i2c_adapter *, unsigned int); } ;   683     struct drm_dp_aux_msg {   unsigned int address;   u8 request;   u8 reply;   void *buffer;   size_t size; } ;   704     struct drm_dp_aux {   const char *name;   struct i2c_adapter ddc;   struct device *dev;   struct mutex hw_mutex;   ssize_t  (*transfer)(struct drm_dp_aux *, struct drm_dp_aux_msg *);   unsigned int i2c_nack_count;   unsigned int i2c_defer_count; } ;   788     struct drm_dp_link {   unsigned char revision;   unsigned int rate;   unsigned int num_lanes;   unsigned long capabilities; } ;    32     typedef __u16 __le16;    27     union __anonunion___u_10___0 {   struct list_head *__val;   char __c[1U]; } ;   189     union __anonunion___u_14___0 {   struct list_head *__val;   char __c[1U]; } ;    26     union __anonunion___u_26___0 {   int __val;   char __c[1U]; } ;  2343     struct edid ;   295     struct est_timings {   u8 t1;   u8 t2;   u8 mfg_rsvd; } ;    44     struct std_timing {   u8 hsize;   u8 vfreq_aspect; } ;    57     struct detailed_pixel_timing {   u8 hactive_lo;   u8 hblank_lo;   u8 hactive_hblank_hi;   u8 vactive_lo;   u8 vblank_lo;   u8 vactive_vblank_hi;   u8 hsync_offset_lo;   u8 hsync_pulse_width_lo;   u8 vsync_offset_pulse_width_lo;   u8 hsync_vsync_offset_pulse_width_hi;   u8 width_mm_lo;   u8 height_mm_lo;   u8 width_height_mm_hi;   u8 hborder;   u8 vborder;   u8 misc; } ;    83     struct detailed_data_string {   u8 str[13U]; } ;    88     struct __anonstruct_gtf2_356 {   u8 reserved;   u8 hfreq_start_khz;   u8 c;   __le16 m;   u8 k;   u8 j; } ;    88     struct __anonstruct_cvt_357 {   u8 version;   u8 data1;   u8 data2;   u8 supported_aspects;   u8 flags;   u8 supported_scalings;   u8 preferred_refresh; } ;    88     union __anonunion_formula_355 {   struct __anonstruct_gtf2_356 gtf2;   struct __anonstruct_cvt_357 cvt; } ;    88     struct detailed_data_monitor_range {   u8 min_vfreq;   u8 max_vfreq;   u8 min_hfreq_khz;   u8 max_hfreq_khz;   u8 pixel_clock_mhz;   u8 flags;   union __anonunion_formula_355 formula; } ;   116     struct detailed_data_wpindex {   u8 white_yx_lo;   u8 white_x_hi;   u8 white_y_hi;   u8 gamma; } ;   130     struct cvt_timing {   u8 code[3U]; } ;   134     union __anonunion_data_358 {   struct detailed_data_string str;   struct detailed_data_monitor_range range;   struct detailed_data_wpindex color;   struct std_timing timings[6U];   struct cvt_timing cvt[4U]; } ;   134     struct detailed_non_pixel {   u8 pad1;   u8 type;   u8 pad2;   union __anonunion_data_358 data; } ;   149     union __anonunion_data_359 {   struct detailed_pixel_timing pixel_data;   struct detailed_non_pixel other_data; } ;   149     struct detailed_timing {   __le16 pixel_clock;   union __anonunion_data_359 data; } ;   167     struct edid {   u8 header[8U];   u8 mfg_id[2U];   u8 prod_code[2U];   u32 serial;   u8 mfg_week;   u8 mfg_year;   u8 version;   u8 revision;   u8 input;   u8 width_cm;   u8 height_cm;   u8 gamma;   u8 features;   u8 red_green_lo;   u8 black_white_lo;   u8 red_x;   u8 red_y;   u8 green_x;   u8 green_y;   u8 blue_x;   u8 blue_y;   u8 white_x;   u8 white_y;   struct est_timings established_timings;   struct std_timing standard_timings[8U];   struct detailed_timing detailed_timings[4U];   u8 extensions;   u8 checksum; } ;    26     union __anonunion___u_25 {   int __val;   char __c[1U]; } ;  1147     struct drm_rect {   int x1;   int y1;   int x2;   int y2; } ;    27     union __anonunion___u_10___1 {   struct list_head *__val;   char __c[1U]; } ;   189     union __anonunion___u_14___1 {   struct list_head *__val;   char __c[1U]; } ;    26     union __anonunion___u_43 {   int __val;   char __c[1U]; } ;    38     union __anonunion___u_45 {   int __val;   char __c[1U]; } ;    12     struct __wait_queue ;    12     typedef struct __wait_queue wait_queue_t;    15     struct __wait_queue {   unsigned int flags;   void *private;   int (*func)(wait_queue_t *, unsigned int, int, void *);   struct list_head task_list; } ;   809     struct drm_dp_mst_branch ;   810     struct drm_dp_vcpi {   int vcpi;   int pbn;   int aligned_pbn;   int num_slots; } ;    43     struct drm_dp_mst_topology_mgr ;    43     struct drm_dp_mst_port {   struct kref kref;   u8 port_num;   bool input;   bool mcs;   bool ddps;   u8 pdt;   bool ldps;   u8 dpcd_rev;   u8 num_sdp_streams;   u8 num_sdp_stream_sinks;   uint16_t available_pbn;   struct list_head next;   struct drm_dp_mst_branch *mstb;   struct drm_dp_aux aux;   struct drm_dp_mst_branch *parent;   struct drm_dp_vcpi vcpi;   struct drm_connector *connector;   struct drm_dp_mst_topology_mgr *mgr;   struct edid *cached_edid;   bool has_audio; } ;    93     struct drm_dp_sideband_msg_tx ;    93     struct drm_dp_mst_branch {   struct kref kref;   u8 rad[8U];   u8 lct;   int num_ports;   int msg_slots;   struct list_head ports;   struct drm_dp_mst_port *port_parent;   struct drm_dp_mst_topology_mgr *mgr;   struct drm_dp_sideband_msg_tx *tx_slots[2U];   int last_seqno;   bool link_address_sent;   u8 guid[16U]; } ;   135     struct drm_dp_sideband_msg_hdr {   u8 lct;   u8 lcr;   u8 rad[8U];   bool broadcast;   bool path_msg;   u8 msg_len;   bool somt;   bool eomt;   bool seqno; } ;   149     struct drm_dp_nak_reply {   u8 guid[16U];   u8 reason;   u8 nak_data; } ;   155     struct drm_dp_link_addr_reply_port {   bool input_port;   u8 peer_device_type;   u8 port_number;   bool mcs;   bool ddps;   bool legacy_device_plug_status;   u8 dpcd_revision;   u8 peer_guid[16U];   u8 num_sdp_streams;   u8 num_sdp_stream_sinks; } ;   171     struct drm_dp_link_address_ack_reply {   u8 guid[16U];   u8 nports;   struct drm_dp_link_addr_reply_port ports[16U]; } ;   172     struct drm_dp_remote_dpcd_read_ack_reply {   u8 port_number;   u8 num_bytes;   u8 bytes[255U]; } ;   178     struct drm_dp_remote_dpcd_write_ack_reply {   u8 port_number; } ;   182     struct drm_dp_remote_dpcd_write_nak_reply {   u8 port_number;   u8 reason;   u8 bytes_written_before_failure; } ;   188     struct drm_dp_remote_i2c_read_ack_reply {   u8 port_number;   u8 num_bytes;   u8 bytes[255U]; } ;   194     struct drm_dp_remote_i2c_read_nak_reply {   u8 port_number;   u8 nak_reason;   u8 i2c_nak_transaction; } ;   200     struct drm_dp_remote_i2c_write_ack_reply {   u8 port_number; } ;   204     struct drm_dp_sideband_msg_rx {   u8 chunk[48U];   u8 msg[256U];   u8 curchunk_len;   u8 curchunk_idx;   u8 curchunk_hdrlen;   u8 curlen;   bool have_somt;   bool have_eomt;   struct drm_dp_sideband_msg_hdr initial_hdr; } ;   217     struct drm_dp_allocate_payload {   u8 port_number;   u8 number_sdp_streams;   u8 vcpi;   u16 pbn;   u8 sdp_stream_sink[16U]; } ;   226     struct drm_dp_allocate_payload_ack_reply {   u8 port_number;   u8 vcpi;   u16 allocated_pbn; } ;   232     struct drm_dp_connection_status_notify {   u8 guid[16U];   u8 port_number;   bool legacy_device_plug_status;   bool displayport_device_plug_status;   bool message_capability_status;   bool input_port;   u8 peer_device_type; } ;   242     struct drm_dp_remote_dpcd_read {   u8 port_number;   u32 dpcd_address;   u8 num_bytes; } ;   248     struct drm_dp_remote_dpcd_write {   u8 port_number;   u32 dpcd_address;   u8 num_bytes;   u8 *bytes; } ;   255     struct __anonstruct_transactions_319 {   u8 i2c_dev_id;   u8 num_bytes;   u8 *bytes;   u8 no_stop_bit;   u8 i2c_transaction_delay; } ;   255     struct drm_dp_remote_i2c_read {   u8 num_transactions;   u8 port_number;   struct __anonstruct_transactions_319 transactions[4U];   u8 read_i2c_device_id;   u8 num_bytes_read; } ;   270     struct drm_dp_remote_i2c_write {   u8 port_number;   u8 write_i2c_device_id;   u8 num_bytes;   u8 *bytes; } ;   277     struct drm_dp_port_number_req {   u8 port_number; } ;   282     struct drm_dp_enum_path_resources_ack_reply {   u8 port_number;   u16 full_payload_bw_number;   u16 avail_payload_bw_number; } ;   288     struct drm_dp_port_number_rep {   u8 port_number; } ;   293     struct drm_dp_query_payload {   u8 port_number;   u8 vcpi; } ;   298     struct drm_dp_resource_status_notify {   u8 port_number;   u8 guid[16U];   u16 available_pbn; } ;   304     struct drm_dp_query_payload_ack_reply {   u8 port_number;   u8 allocated_pbn; } ;   309     union ack_req {   struct drm_dp_connection_status_notify conn_stat;   struct drm_dp_port_number_req port_num;   struct drm_dp_resource_status_notify resource_stat;   struct drm_dp_query_payload query_payload;   struct drm_dp_allocate_payload allocate_payload;   struct drm_dp_remote_dpcd_read dpcd_read;   struct drm_dp_remote_dpcd_write dpcd_write;   struct drm_dp_remote_i2c_read i2c_read;   struct drm_dp_remote_i2c_write i2c_write; } ;   326     struct drm_dp_sideband_msg_req_body {   u8 req_type;   union ack_req u; } ;   327     union ack_replies {   struct drm_dp_nak_reply nak;   struct drm_dp_link_address_ack_reply link_addr;   struct drm_dp_port_number_rep port_number;   struct drm_dp_enum_path_resources_ack_reply path_resources;   struct drm_dp_allocate_payload_ack_reply allocate_payload;   struct drm_dp_query_payload_ack_reply query_payload;   struct drm_dp_remote_dpcd_read_ack_reply remote_dpcd_read_ack;   struct drm_dp_remote_dpcd_write_ack_reply remote_dpcd_write_ack;   struct drm_dp_remote_dpcd_write_nak_reply remote_dpcd_write_nack;   struct drm_dp_remote_i2c_read_ack_reply remote_i2c_read_ack;   struct drm_dp_remote_i2c_read_nak_reply remote_i2c_read_nack;   struct drm_dp_remote_i2c_write_ack_reply remote_i2c_write_ack; } ;   348     struct drm_dp_sideband_msg_reply_body {   u8 reply_type;   u8 req_type;   union ack_replies u; } ;   349     struct drm_dp_sideband_msg_tx {   u8 msg[256U];   u8 chunk[48U];   u8 cur_offset;   u8 cur_len;   struct drm_dp_mst_branch *dst;   struct list_head next;   int seqno;   int state;   bool path_msg;   struct drm_dp_sideband_msg_reply_body reply; } ;   372     struct drm_dp_mst_topology_cbs {   struct drm_connector * (*add_connector)(struct drm_dp_mst_topology_mgr *, struct drm_dp_mst_port *, const char *);   void (*register_connector)(struct drm_connector *);   void (*destroy_connector)(struct drm_dp_mst_topology_mgr *, struct drm_connector *);   void (*hotplug)(struct drm_dp_mst_topology_mgr *); } ;   383     struct drm_dp_payload {   int payload_state;   int start_slot;   int num_slots;   int vcpi; } ;   397     struct drm_dp_mst_topology_mgr {   struct device *dev;   const struct drm_dp_mst_topology_cbs *cbs;   int max_dpcd_transaction_bytes;   struct drm_dp_aux *aux;   int max_payloads;   int conn_base_id;   struct drm_dp_sideband_msg_rx down_rep_recv;   struct drm_dp_sideband_msg_rx up_req_recv;   struct mutex lock;   bool mst_state;   struct drm_dp_mst_branch *mst_primary;   u8 dpcd[15U];   u8 sink_count;   int pbn_div;   int total_slots;   int avail_slots;   int total_pbn;   struct mutex qlock;   struct list_head tx_msg_downq;   bool tx_down_in_progress;   struct mutex payload_lock;   struct drm_dp_vcpi **proposed_vcpis;   struct drm_dp_payload *payloads;   unsigned long payload_mask;   unsigned long vcpi_mask;   wait_queue_head_t tx_waitq;   struct work_struct work;   struct work_struct tx_work;   struct list_head destroy_connector_list;   struct mutex destroy_connector_lock;   struct work_struct destroy_connector_work; } ;    27     union __anonunion___u_9 {   struct list_head *__val;   char __c[1U]; } ;    26     union __anonunion___u_25___0 {   int __val;   char __c[1U]; } ;   510     struct drm_color_lut {   __u16 red;   __u16 green;   __u16 blue;   __u16 reserved; } ;   215     struct fence_ops ;   217     struct fence {   struct kref refcount;   const struct fence_ops *ops;   struct callback_head rcu;   struct list_head cb_list;   spinlock_t *lock;   unsigned int context;   unsigned int seqno;   unsigned long flags;   ktime_t timestamp;   int status;   struct list_head child_list;   struct list_head active_list; } ;   106     struct fence_ops {   const char * (*get_driver_name)(struct fence *);   const char * (*get_timeline_name)(struct fence *);   bool  (*enable_signaling)(struct fence *);   bool  (*signaled)(struct fence *);   long int (*wait)(struct fence *, bool , long);   void (*release)(struct fence *);   int (*fill_driver_data)(struct fence *, void *, int);   void (*fence_value_str)(struct fence *, char *, int);   void (*timeline_value_str)(struct fence *, char *, int); } ;    63     enum drm_dp_dual_mode_type {   DRM_DP_DUAL_MODE_NONE = 0,   DRM_DP_DUAL_MODE_UNKNOWN = 1,   DRM_DP_DUAL_MODE_TYPE1_DVI = 2,   DRM_DP_DUAL_MODE_TYPE1_HDMI = 3,   DRM_DP_DUAL_MODE_TYPE2_DVI = 4,   DRM_DP_DUAL_MODE_TYPE2_HDMI = 5 } ;   820     struct firmware {   size_t size;   const u8 *data;   struct page **pages;   void *priv; } ;   135     struct property_entry ;    61     struct platform_device_info {   struct device *parent;   struct fwnode_handle *fwnode;   const char *name;   int id;   const struct resource *res;   unsigned int num_res;   const void *data;   size_t size_data;   u64 dma_mask;   struct property_entry *properties; } ;   143     union __anonunion_pointer_350 {   void *raw_data;   u8 *u8_data;   u16 *u16_data;   u32 *u32_data;   u64 *u64_data;   const char **str; } ;   143     union __anonunion_value_351 {   unsigned long long raw_data;   u8 u8_data;   u16 u16_data;   u32 u32_data;   u64 u64_data;   const char *str; } ;   143     union __anonunion____missing_field_name_349 {   union __anonunion_pointer_350 pointer;   union __anonunion_value_351 value; } ;   143     struct property_entry {   const char *name;   size_t length;   bool is_array;   bool is_string;   union __anonunion____missing_field_name_349 __annonCompField86; } ;    21     struct sysrq_key_op {   void (*handler)(int);   char *help_msg;   char *action_msg;   int enable_mask; } ;    27     union __anonunion___u_9___0 {   struct list_head *__val;   char __c[1U]; } ;   189     union __anonunion___u_13 {   struct list_head *__val;   char __c[1U]; } ;    26     union __anonunion___u_42 {   int __val;   char __c[1U]; } ;   268     struct notifier_block ;    53     struct notifier_block {   int (*notifier_call)(struct notifier_block *, unsigned long, void *);   struct notifier_block *next;   int priority; } ;   737     struct fb_fix_screeninfo {   char id[16U];   unsigned long smem_start;   __u32 smem_len;   __u32 type;   __u32 type_aux;   __u32 visual;   __u16 xpanstep;   __u16 ypanstep;   __u16 ywrapstep;   __u32 line_length;   unsigned long mmio_start;   __u32 mmio_len;   __u32 accel;   __u16 capabilities;   __u16 reserved[2U]; } ;   176     struct fb_bitfield {   __u32 offset;   __u32 length;   __u32 msb_right; } ;   192     struct fb_var_screeninfo {   __u32 xres;   __u32 yres;   __u32 xres_virtual;   __u32 yres_virtual;   __u32 xoffset;   __u32 yoffset;   __u32 bits_per_pixel;   __u32 grayscale;   struct fb_bitfield red;   struct fb_bitfield green;   struct fb_bitfield blue;   struct fb_bitfield transp;   __u32 nonstd;   __u32 activate;   __u32 height;   __u32 width;   __u32 accel_flags;   __u32 pixclock;   __u32 left_margin;   __u32 right_margin;   __u32 upper_margin;   __u32 lower_margin;   __u32 hsync_len;   __u32 vsync_len;   __u32 sync;   __u32 vmode;   __u32 rotate;   __u32 colorspace;   __u32 reserved[4U]; } ;   279     struct fb_cmap {   __u32 start;   __u32 len;   __u16 *red;   __u16 *green;   __u16 *blue;   __u16 *transp; } ;   335     struct fb_copyarea {   __u32 dx;   __u32 dy;   __u32 width;   __u32 height;   __u32 sx;   __u32 sy; } ;   348     struct fb_fillrect {   __u32 dx;   __u32 dy;   __u32 width;   __u32 height;   __u32 color;   __u32 rop; } ;   357     struct fb_image {   __u32 dx;   __u32 dy;   __u32 width;   __u32 height;   __u32 fg_color;   __u32 bg_color;   __u8 depth;   const char *data;   struct fb_cmap cmap; } ;   369     struct fbcurpos {   __u16 x;   __u16 y; } ;   385     struct fb_cursor {   __u16 set;   __u16 enable;   __u16 rop;   const char *mask;   struct fbcurpos hot;   struct fb_image image; } ;   399     enum backlight_type {   BACKLIGHT_RAW = 1,   BACKLIGHT_PLATFORM = 2,   BACKLIGHT_FIRMWARE = 3,   BACKLIGHT_TYPE_MAX = 4 } ;   411     struct backlight_device ;   412     struct fb_info ;   413     struct backlight_ops {   unsigned int options;   int (*update_status)(struct backlight_device *);   int (*get_brightness)(struct backlight_device *);   int (*check_fb)(struct backlight_device *, struct fb_info *); } ;    65     struct backlight_properties {   int brightness;   int max_brightness;   int power;   int fb_blank;   enum backlight_type type;   unsigned int state; } ;    84     struct backlight_device {   struct backlight_properties props;   struct mutex update_lock;   struct mutex ops_lock;   const struct backlight_ops *ops;   struct notifier_block fb_notif;   struct list_head entry;   struct device dev;   bool fb_bl_on[32U];   int use_count; } ;   168     struct fb_chroma {   __u32 redx;   __u32 greenx;   __u32 bluex;   __u32 whitex;   __u32 redy;   __u32 greeny;   __u32 bluey;   __u32 whitey; } ;    61     struct fb_videomode ;    61     struct fb_monspecs {   struct fb_chroma chroma;   struct fb_videomode *modedb;   __u8 manufacturer[4U];   __u8 monitor[14U];   __u8 serial_no[14U];   __u8 ascii[14U];   __u32 modedb_len;   __u32 model;   __u32 serial;   __u32 year;   __u32 week;   __u32 hfmin;   __u32 hfmax;   __u32 dclkmin;   __u32 dclkmax;   __u16 input;   __u16 dpms;   __u16 signal;   __u16 vfmin;   __u16 vfmax;   __u16 gamma;   unsigned char gtf;   __u16 misc;   __u8 version;   __u8 revision;   __u8 max_x;   __u8 max_y; } ;   170     struct fb_blit_caps {   u32 x;   u32 y;   u32 len;   u32 flags; } ;   182     struct fb_pixmap {   u8 *addr;   u32 size;   u32 offset;   u32 buf_align;   u32 scan_align;   u32 access_align;   u32 flags;   u32 blit_x;   u32 blit_y;   void (*writeio)(struct fb_info *, void *, void *, unsigned int);   void (*readio)(struct fb_info *, void *, void *, unsigned int); } ;   228     struct fb_deferred_io {   unsigned long delay;   struct mutex lock;   struct list_head pagelist;   void (*first_io)(struct fb_info *);   void (*deferred_io)(struct fb_info *, struct list_head *); } ;   239     struct fb_ops {   struct module *owner;   int (*fb_open)(struct fb_info *, int);   int (*fb_release)(struct fb_info *, int);   ssize_t  (*fb_read)(struct fb_info *, char *, size_t , loff_t *);   ssize_t  (*fb_write)(struct fb_info *, const char *, size_t , loff_t *);   int (*fb_check_var)(struct fb_var_screeninfo *, struct fb_info *);   int (*fb_set_par)(struct fb_info *);   int (*fb_setcolreg)(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, struct fb_info *);   int (*fb_setcmap)(struct fb_cmap *, struct fb_info *);   int (*fb_blank)(int, struct fb_info *);   int (*fb_pan_display)(struct fb_var_screeninfo *, struct fb_info *);   void (*fb_fillrect)(struct fb_info *, const struct fb_fillrect *);   void (*fb_copyarea)(struct fb_info *, const struct fb_copyarea *);   void (*fb_imageblit)(struct fb_info *, const struct fb_image *);   int (*fb_cursor)(struct fb_info *, struct fb_cursor *);   int (*fb_sync)(struct fb_info *);   int (*fb_ioctl)(struct fb_info *, unsigned int, unsigned long);   int (*fb_compat_ioctl)(struct fb_info *, unsigned int, unsigned long);   int (*fb_mmap)(struct fb_info *, struct vm_area_struct *);   void (*fb_get_caps)(struct fb_info *, struct fb_blit_caps *, struct fb_var_screeninfo *);   void (*fb_destroy)(struct fb_info *);   int (*fb_debug_enter)(struct fb_info *);   int (*fb_debug_leave)(struct fb_info *); } ;   324     struct fb_tilemap {   __u32 width;   __u32 height;   __u32 depth;   __u32 length;   const __u8 *data; } ;   340     struct fb_tilerect {   __u32 sx;   __u32 sy;   __u32 width;   __u32 height;   __u32 index;   __u32 fg;   __u32 bg;   __u32 rop; } ;   352     struct fb_tilearea {   __u32 sx;   __u32 sy;   __u32 dx;   __u32 dy;   __u32 width;   __u32 height; } ;   361     struct fb_tileblit {   __u32 sx;   __u32 sy;   __u32 width;   __u32 height;   __u32 fg;   __u32 bg;   __u32 length;   __u32 *indices; } ;   372     struct fb_tilecursor {   __u32 sx;   __u32 sy;   __u32 mode;   __u32 shape;   __u32 fg;   __u32 bg; } ;   381     struct fb_tile_ops {   void (*fb_settile)(struct fb_info *, struct fb_tilemap *);   void (*fb_tilecopy)(struct fb_info *, struct fb_tilearea *);   void (*fb_tilefill)(struct fb_info *, struct fb_tilerect *);   void (*fb_tileblit)(struct fb_info *, struct fb_tileblit *);   void (*fb_tilecursor)(struct fb_info *, struct fb_tilecursor *);   int (*fb_get_tilemax)(struct fb_info *); } ;   400     struct aperture {   resource_size_t base;   resource_size_t size; } ;   522     struct apertures_struct {   unsigned int count;   struct aperture ranges[0U]; } ;   523     union __anonunion____missing_field_name_321 {   char *screen_base;   char *screen_buffer; } ;   523     struct fb_info {   atomic_t count;   int node;   int flags;   struct mutex lock;   struct mutex mm_lock;   struct fb_var_screeninfo var;   struct fb_fix_screeninfo fix;   struct fb_monspecs monspecs;   struct work_struct queue;   struct fb_pixmap pixmap;   struct fb_pixmap sprite;   struct fb_cmap cmap;   struct list_head modelist;   struct fb_videomode *mode;   struct backlight_device *bl_dev;   struct mutex bl_curve_mutex;   u8 bl_curve[128U];   struct delayed_work deferred_work;   struct fb_deferred_io *fbdefio;   struct fb_ops *fbops;   struct device *device;   struct device *dev;   int class_flag;   struct fb_tile_ops *tileops;   union __anonunion____missing_field_name_321 __annonCompField77;   unsigned long screen_size;   void *pseudo_palette;   u32 state;   void *fbcon_par;   void *par;   struct apertures_struct *apertures;   bool skip_vt_switch; } ;   783     struct fb_videomode {   const char *name;   u32 refresh;   u32 xres;   u32 yres;   u32 pixclock;   u32 left_margin;   u32 right_margin;   u32 upper_margin;   u32 lower_margin;   u32 hsync_len;   u32 vsync_len;   u32 sync;   u32 vmode;   u32 flag; } ;  1147     struct drm_fb_helper ;  1153     struct drm_fb_offset {   int x;   int y; } ;    45     struct drm_fb_helper_crtc {   struct drm_mode_set mode_set;   struct drm_display_mode *desired_mode;   int x;   int y; } ;    51     struct drm_fb_helper_surface_size {   u32 fb_width;   u32 fb_height;   u32 surface_width;   u32 surface_height;   u32 surface_bpp;   u32 surface_depth; } ;    79     struct drm_fb_helper_funcs {   void (*gamma_set)(struct drm_crtc *, u16 , u16 , u16 , int);   void (*gamma_get)(struct drm_crtc *, u16 *, u16 *, u16 *, int);   int (*fb_probe)(struct drm_fb_helper *, struct drm_fb_helper_surface_size *);   bool  (*initial_config)(struct drm_fb_helper *, struct drm_fb_helper_crtc **, struct drm_display_mode **, struct drm_fb_offset *, bool *, int, int); } ;   154     struct drm_fb_helper_connector {   struct drm_connector *connector; } ;   162     struct drm_fb_helper {   struct drm_framebuffer *fb;   struct drm_device *dev;   int crtc_count;   struct drm_fb_helper_crtc *crtc_info;   int connector_count;   int connector_info_alloc_count;   struct drm_fb_helper_connector **connector_info;   const struct drm_fb_helper_funcs *funcs;   struct fb_info *fbdev;   u32 pseudo_palette[17U];   struct drm_clip_rect dirty_clip;   spinlock_t dirty_lock;   struct work_struct dirty_work;   struct list_head kernel_fb_list;   bool delayed_hotplug;   bool atomic; } ;    26     union __anonunion___u_25___1 {   int __val;   char __c[1U]; } ;    39     struct drm_vma_offset_node {   rwlock_t vm_lock;   struct drm_mm_node vm_node;   struct rb_node vm_rb;   struct rb_root vm_files; } ;   676     struct drm_info_list {   const char *name;   int (*show)(struct seq_file *, void *);   u32 driver_features;   void *data; } ;   687     struct drm_info_node {   struct list_head list;   struct drm_minor *minor;   const struct drm_info_list *info_ent;   struct dentry *dent; } ;    84     struct drm_gem_object {   struct kref refcount;   unsigned int handle_count;   struct drm_device *dev;   struct file *filp;   struct drm_vma_offset_node vma_node;   size_t size;   int name;   uint32_t read_domains;   uint32_t write_domain;   uint32_t pending_read_domains;   uint32_t pending_write_domain;   struct dma_buf *dma_buf;   struct dma_buf_attachment *import_attach; } ;   243     struct drm_gem_cma_object {   struct drm_gem_object base;   dma_addr_t paddr;   struct sg_table *sgt;   void *vaddr; } ;    69     struct drm_fbdev_cma ;    47     struct drm_fb_cma {   struct drm_framebuffer fb;   struct drm_gem_cma_object *obj[4U]; } ;    35     struct drm_fbdev_cma {   struct drm_fb_helper fb_helper;   struct drm_fb_cma *fb; } ;    26     union __anonunion___u_25___2 {   int __val;   char __c[1U]; } ;    38     union __anonunion___u_27 {   int __val;   char __c[1U]; } ;   480     struct tss_struct ;   212     struct x86_hw_tss {   u32 reserved1;   u64 sp0;   u64 sp1;   u64 sp2;   u64 reserved2;   u64 ist[7U];   u32 reserved3;   u32 reserved4;   u16 reserved5;   u16 io_bitmap_base; } ;   274     struct tss_struct {   struct x86_hw_tss x86_tss;   unsigned long io_bitmap[1025U]; } ;   495     struct __anonstruct_mm_segment_t_72 {   unsigned long seg; } ;   495     typedef struct __anonstruct_mm_segment_t_72 mm_segment_t;    48     struct thread_info {   struct task_struct *task;   __u32 flags;   __u32 status;   __u32 cpu;   mm_segment_t addr_limit;   unsigned char sig_on_uaccess_error;   unsigned char uaccess_err; } ;   117     union __anonunion___u_92 {   struct idr_layer *__val;   char __c[1U]; } ;   120     union __anonunion___u_94 {   struct idr_layer *__val;   char __c[1U]; } ;   251     struct __large_struct {   unsigned long buf[100U]; } ;  1147     struct drm_dp_aux_dev {   unsigned int index;   struct drm_dp_aux *aux;   struct device *dev;   struct kref refcount;   atomic_t usecount; } ;    48     typedef int ldv_func_ret_type;     1     void * __builtin_memcpy(void *, const void *, unsigned long);     1     long int __builtin_expect(long, long);   220     void __read_once_size(const volatile void *p, void *res, int size);   245     void __write_once_size(volatile void *p, void *res, int size);   448     extern int oops_in_progress;    25     void INIT_LIST_HEAD(struct list_head *list);    48     void __list_add(struct list_head *, struct list_head *, struct list_head *);    75     void list_add_tail(struct list_head *new, struct list_head *head);   112     void __list_del_entry(struct list_head *);   165     void list_move_tail(struct list_head *list, struct list_head *head);   187     int list_empty(const struct list_head *head);   274     void __list_splice(const struct list_head *list, struct list_head *prev, struct list_head *next);   293     void list_splice(const struct list_head *list, struct list_head *head);    24     int atomic_read(const atomic_t *v);    71     void warn_slowpath_null(const char *, const int);   128     int mutex_is_locked(struct mutex *lock);   154     void kfree(const void *);   318     void * __kmalloc(size_t , gfp_t );   466     void * kmalloc(size_t size, gfp_t flags);   620     void * kzalloc(size_t size, gfp_t flags);   373     bool  ww_mutex_is_locked(struct ww_mutex *lock);   117     bool  drm_modeset_is_locked(struct drm_modeset_lock *lock);   132     void drm_modeset_lock_all(struct drm_device *);   133     void drm_modeset_unlock_all(struct drm_device *);   137     void drm_warn_on_modeset_not_all_locked(struct drm_device *);   433     void drm_mode_destroy(struct drm_device *, struct drm_display_mode *);   439     void drm_mode_debug_printmodeline(const struct drm_display_mode *);   468     void drm_mode_copy(struct drm_display_mode *, const struct drm_display_mode *);   470     struct drm_display_mode * drm_mode_duplicate(struct drm_device *, const struct drm_display_mode *);   472     bool  drm_mode_equal(const struct drm_display_mode *, const struct drm_display_mode *);  2233     unsigned int drm_crtc_index(struct drm_crtc *);  2242     uint32_t  drm_crtc_mask(struct drm_crtc *crtc);  2271     bool  drm_bridge_mode_fixup(struct drm_bridge *, const struct drm_display_mode *, struct drm_display_mode *);  2274     void drm_bridge_disable(struct drm_bridge *);  2275     void drm_bridge_post_disable(struct drm_bridge *);  2276     void drm_bridge_mode_set(struct drm_bridge *, struct drm_display_mode *, struct drm_display_mode *);  2279     void drm_bridge_pre_enable(struct drm_bridge *);  2280     void drm_bridge_enable(struct drm_bridge *);  2296     bool  drm_encoder_crtc_ok(struct drm_encoder *encoder, struct drm_crtc *crtc);  2394     void drm_object_attach_property(struct drm_mode_object *, struct drm_property *, uint64_t );  2447     void drm_mode_object_reference(struct drm_mode_object *);  2448     void drm_mode_object_unreference(struct drm_mode_object *);  2543     void drm_fb_get_bpp_depth(uint32_t , unsigned int *, int *);  2665     void drm_connector_reference(struct drm_connector *connector);  2676     void drm_connector_unreference(struct drm_connector *connector);  2693     void assert_drm_connector_list_read_locked(struct drm_mode_config *mode_config);   134     void drm_ut_debug_printk(const char *, const char *, ...);   137     void drm_err(const char *, ...);  1004     void drm_calc_timestamping_constants(struct drm_crtc *, const struct drm_display_mode *);  1029     extern unsigned int drm_debug;   113     int drm_atomic_set_mode_for_crtc(struct drm_crtc_state *, struct drm_display_mode *);   121     void drm_atomic_set_fb_for_plane(struct drm_plane_state *, struct drm_framebuffer *);    45     void drm_helper_disable_unused_functions(struct drm_device *dev);    46     int drm_crtc_helper_set_config(struct drm_mode_set *set);    47     bool  drm_crtc_helper_set_mode(struct drm_crtc *crtc, struct drm_display_mode *mode, int x, int y, struct drm_framebuffer *old_fb);    51     void drm_helper_crtc_enable_color_mgmt(struct drm_crtc *crtc, int degamma_lut_size, int gamma_lut_size);    54     bool  drm_helper_crtc_in_use(struct drm_crtc *crtc);    55     bool  drm_helper_encoder_in_use(struct drm_encoder *encoder);    57     int drm_helper_connector_dpms(struct drm_connector *connector, int mode);    59     void drm_helper_move_panel_connectors_to_head(struct drm_device *dev);    61     void drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb, const struct drm_mode_fb_cmd2 *mode_cmd);    64     void drm_helper_resume_force_mode(struct drm_device *dev);    66     int drm_helper_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mode, struct drm_display_mode *adjusted_mode, int x, int y, struct drm_framebuffer *old_fb);    69     int drm_helper_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y, struct drm_framebuffer *old_fb);    74     int drm_plane_helper_commit(struct drm_plane *plane, struct drm_plane_state *plane_state, struct drm_framebuffer *old_fb);   117     void drm_atomic_helper_crtc_reset(struct drm_crtc *crtc);   121     struct drm_crtc_state * drm_atomic_helper_crtc_duplicate_state(struct drm_crtc *crtc);   123     void drm_atomic_helper_crtc_destroy_state(struct drm_crtc *crtc, struct drm_crtc_state *state);   126     void drm_atomic_helper_plane_reset(struct drm_plane *plane);   130     struct drm_plane_state * drm_atomic_helper_plane_duplicate_state(struct drm_plane *plane);   104     const char __kstrtab_drm_helper_move_panel_connectors_to_head[41U] = { 'd', 'r', 'm', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'm', 'o', 'v', 'e', '_', 'p', 'a', 'n', 'e', 'l', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'o', 'r', 's', '_', 't', 'o', '_', 'h', 'e', 'a', 'd', '\x0' };   104     const struct kernel_symbol __ksymtab_drm_helper_move_panel_connectors_to_head;   104     const struct kernel_symbol __ksymtab_drm_helper_move_panel_connectors_to_head = { (unsigned long)(&drm_helper_move_panel_connectors_to_head), (const char *)(&__kstrtab_drm_helper_move_panel_connectors_to_head) };   136     const char __kstrtab_drm_helper_encoder_in_use[26U] = { 'd', 'r', 'm', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'e', 'n', 'c', 'o', 'd', 'e', 'r', '_', 'i', 'n', '_', 'u', 's', 'e', '\x0' };   136     const struct kernel_symbol __ksymtab_drm_helper_encoder_in_use;   136     const struct kernel_symbol __ksymtab_drm_helper_encoder_in_use = { (unsigned long)(&drm_helper_encoder_in_use), (const char *)(&__kstrtab_drm_helper_encoder_in_use) };   166     const char __kstrtab_drm_helper_crtc_in_use[23U] = { 'd', 'r', 'm', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'c', 'r', 't', 'c', '_', 'i', 'n', '_', 'u', 's', 'e', '\x0' };   166     const struct kernel_symbol __ksymtab_drm_helper_crtc_in_use;   166     const struct kernel_symbol __ksymtab_drm_helper_crtc_in_use = { (unsigned long)(&drm_helper_crtc_in_use), (const char *)(&__kstrtab_drm_helper_crtc_in_use) };   169     void drm_encoder_disable(struct drm_encoder *encoder);   186     void __drm_helper_disable_unused_functions(struct drm_device *dev);   239     const char __kstrtab_drm_helper_disable_unused_functions[36U] = { 'd', 'r', 'm', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'd', 'i', 's', 'a', 'b', 'l', 'e', '_', 'u', 'n', 'u', 's', 'e', 'd', '_', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', 's', '\x0' };   239     const struct kernel_symbol __ksymtab_drm_helper_disable_unused_functions;   239     const struct kernel_symbol __ksymtab_drm_helper_disable_unused_functions = { (unsigned long)(&drm_helper_disable_unused_functions), (const char *)(&__kstrtab_drm_helper_disable_unused_functions) };   247     void drm_crtc_prepare_encoders(struct drm_device *dev);   454     const char __kstrtab_drm_crtc_helper_set_mode[25U] = { 'd', 'r', 'm', '_', 'c', 'r', 't', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 's', 'e', 't', '_', 'm', 'o', 'd', 'e', '\x0' };   454     const struct kernel_symbol __ksymtab_drm_crtc_helper_set_mode;   454     const struct kernel_symbol __ksymtab_drm_crtc_helper_set_mode = { (unsigned long)(&drm_crtc_helper_set_mode), (const char *)(&__kstrtab_drm_crtc_helper_set_mode) };   457     void drm_crtc_helper_disable(struct drm_crtc *crtc);   794     const char __kstrtab_drm_crtc_helper_set_config[27U] = { 'd', 'r', 'm', '_', 'c', 'r', 't', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 's', 'e', 't', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\x0' };   794     const struct kernel_symbol __ksymtab_drm_crtc_helper_set_config;   794     const struct kernel_symbol __ksymtab_drm_crtc_helper_set_config = { (unsigned long)(&drm_crtc_helper_set_config), (const char *)(&__kstrtab_drm_crtc_helper_set_config) };   796     int drm_helper_choose_encoder_dpms(struct drm_encoder *encoder);   810     void drm_helper_encoder_dpms(struct drm_encoder *encoder, int mode);   833     int drm_helper_choose_crtc_dpms(struct drm_crtc *crtc);   908     const char __kstrtab_drm_helper_connector_dpms[26U] = { 'd', 'r', 'm', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'o', 'r', '_', 'd', 'p', 'm', 's', '\x0' };   908     const struct kernel_symbol __ksymtab_drm_helper_connector_dpms;   908     const struct kernel_symbol __ksymtab_drm_helper_connector_dpms = { (unsigned long)(&drm_helper_connector_dpms), (const char *)(&__kstrtab_drm_helper_connector_dpms) };   935     const char __kstrtab_drm_helper_mode_fill_fb_struct[31U] = { 'd', 'r', 'm', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'm', 'o', 'd', 'e', '_', 'f', 'i', 'l', 'l', '_', 'f', 'b', '_', 's', 't', 'r', 'u', 'c', 't', '\x0' };   935     const struct kernel_symbol __ksymtab_drm_helper_mode_fill_fb_struct;   935     const struct kernel_symbol __ksymtab_drm_helper_mode_fill_fb_struct = { (unsigned long)(&drm_helper_mode_fill_fb_struct), (const char *)(&__kstrtab_drm_helper_mode_fill_fb_struct) };  1008     const char __kstrtab_drm_helper_resume_force_mode[29U] = { 'd', 'r', 'm', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'r', 'e', 's', 'u', 'm', 'e', '_', 'f', 'o', 'r', 'c', 'e', '_', 'm', 'o', 'd', 'e', '\x0' };  1008     const struct kernel_symbol __ksymtab_drm_helper_resume_force_mode;  1008     const struct kernel_symbol __ksymtab_drm_helper_resume_force_mode = { (unsigned long)(&drm_helper_resume_force_mode), (const char *)(&__kstrtab_drm_helper_resume_force_mode) };  1076     const char __kstrtab_drm_helper_crtc_mode_set[25U] = { 'd', 'r', 'm', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'c', 'r', 't', 'c', '_', 'm', 'o', 'd', 'e', '_', 's', 'e', 't', '\x0' };  1076     const struct kernel_symbol __ksymtab_drm_helper_crtc_mode_set;  1076     const struct kernel_symbol __ksymtab_drm_helper_crtc_mode_set = { (unsigned long)(&drm_helper_crtc_mode_set), (const char *)(&__kstrtab_drm_helper_crtc_mode_set) };  1123     const char __kstrtab_drm_helper_crtc_mode_set_base[30U] = { 'd', 'r', 'm', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'c', 'r', 't', 'c', '_', 'm', 'o', 'd', 'e', '_', 's', 'e', 't', '_', 'b', 'a', 's', 'e', '\x0' };  1123     const struct kernel_symbol __ksymtab_drm_helper_crtc_mode_set_base;  1123     const struct kernel_symbol __ksymtab_drm_helper_crtc_mode_set_base = { (unsigned long)(&drm_helper_crtc_mode_set_base), (const char *)(&__kstrtab_drm_helper_crtc_mode_set_base) };  1156     const char __kstrtab_drm_helper_crtc_enable_color_mgmt[34U] = { 'd', 'r', 'm', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'c', 'r', 't', 'c', '_', 'e', 'n', 'a', 'b', 'l', 'e', '_', 'c', 'o', 'l', 'o', 'r', '_', 'm', 'g', 'm', 't', '\x0' };  1156     const struct kernel_symbol __ksymtab_drm_helper_crtc_enable_color_mgmt;  1156     const struct kernel_symbol __ksymtab_drm_helper_crtc_enable_color_mgmt = { (unsigned long)(&drm_helper_crtc_enable_color_mgmt), (const char *)(&__kstrtab_drm_helper_crtc_enable_color_mgmt) };    33     extern struct module __this_module;    56     void * __memset(void *, int, size_t );    27     size_t  strlcpy(char *, const char *, size_t );   119     void __mutex_init(struct mutex *, const char *, struct lock_class_key *);   138     void mutex_lock_nested(struct mutex *, unsigned int);   174     void mutex_unlock(struct mutex *);    87     const char * kobject_name(const struct kobject *kobj);    10     void __const_udelay(unsigned long);    48     void usleep_range(unsigned long, unsigned long);   865     const char * dev_name(const struct device *dev);   642     int i2c_add_adapter(struct i2c_adapter *);   643     void i2c_del_adapter(struct i2c_adapter *);   613     bool  drm_dp_channel_eq_ok(const u8 *link_status, int lane_count);   615     bool  drm_dp_clock_recovery_ok(const u8 *link_status, int lane_count);   617     u8  drm_dp_get_adjust_request_voltage(const u8 *link_status, int lane);   619     u8  drm_dp_get_adjust_request_pre_emphasis(const u8 *link_status, int lane);   626     void drm_dp_link_train_clock_recovery_delay(const u8 *dpcd);   627     void drm_dp_link_train_channel_eq_delay(const u8 *dpcd);   629     u8  drm_dp_link_rate_to_bw_code(int link_rate);   630     int drm_dp_bw_code_to_link_rate(u8 link_bw);   752     ssize_t  drm_dp_dpcd_read(struct drm_dp_aux *aux, unsigned int offset, void *buffer, size_t size);   754     ssize_t  drm_dp_dpcd_write(struct drm_dp_aux *aux, unsigned int offset, void *buffer, size_t size);   766     ssize_t  drm_dp_dpcd_readb(struct drm_dp_aux *aux, unsigned int offset, u8 *valuep);   781     ssize_t  drm_dp_dpcd_writeb(struct drm_dp_aux *aux, unsigned int offset, u8 value);   787     int drm_dp_dpcd_read_link_status(struct drm_dp_aux *aux, u8 *status);   802     int drm_dp_link_probe(struct drm_dp_aux *aux, struct drm_dp_link *link);   803     int drm_dp_link_power_up(struct drm_dp_aux *aux, struct drm_dp_link *link);   804     int drm_dp_link_power_down(struct drm_dp_aux *aux, struct drm_dp_link *link);   805     int drm_dp_link_configure(struct drm_dp_aux *aux, struct drm_dp_link *link);   807     int drm_dp_aux_register(struct drm_dp_aux *aux);   808     void drm_dp_aux_unregister(struct drm_dp_aux *aux);    37     int drm_dp_aux_register_devnode(struct drm_dp_aux *aux);    38     void drm_dp_aux_unregister_devnode(struct drm_dp_aux *aux);    45     u8  dp_link_status(const u8 *link_status, int r);    50     u8  dp_get_lane_status(const u8 *link_status, int lane);    77     const char __kstrtab_drm_dp_channel_eq_ok[21U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'c', 'h', 'a', 'n', 'n', 'e', 'l', '_', 'e', 'q', '_', 'o', 'k', '\x0' };    77     const struct kernel_symbol __ksymtab_drm_dp_channel_eq_ok;    77     const struct kernel_symbol __ksymtab_drm_dp_channel_eq_ok = { (unsigned long)(&drm_dp_channel_eq_ok), (const char *)(&__kstrtab_drm_dp_channel_eq_ok) };    92     const char __kstrtab_drm_dp_clock_recovery_ok[25U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'c', 'l', 'o', 'c', 'k', '_', 'r', 'e', 'c', 'o', 'v', 'e', 'r', 'y', '_', 'o', 'k', '\x0' };    92     const struct kernel_symbol __ksymtab_drm_dp_clock_recovery_ok;    92     const struct kernel_symbol __ksymtab_drm_dp_clock_recovery_ok = { (unsigned long)(&drm_dp_clock_recovery_ok), (const char *)(&__kstrtab_drm_dp_clock_recovery_ok) };   105     const char __kstrtab_drm_dp_get_adjust_request_voltage[34U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'g', 'e', 't', '_', 'a', 'd', 'j', 'u', 's', 't', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'v', 'o', 'l', 't', 'a', 'g', 'e', '\x0' };   105     const struct kernel_symbol __ksymtab_drm_dp_get_adjust_request_voltage;   105     const struct kernel_symbol __ksymtab_drm_dp_get_adjust_request_voltage = { (unsigned long)(&drm_dp_get_adjust_request_voltage), (const char *)(&__kstrtab_drm_dp_get_adjust_request_voltage) };   118     const char __kstrtab_drm_dp_get_adjust_request_pre_emphasis[39U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'g', 'e', 't', '_', 'a', 'd', 'j', 'u', 's', 't', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'p', 'r', 'e', '_', 'e', 'm', 'p', 'h', 'a', 's', 'i', 's', '\x0' };   118     const struct kernel_symbol __ksymtab_drm_dp_get_adjust_request_pre_emphasis;   118     const struct kernel_symbol __ksymtab_drm_dp_get_adjust_request_pre_emphasis = { (unsigned long)(&drm_dp_get_adjust_request_pre_emphasis), (const char *)(&__kstrtab_drm_dp_get_adjust_request_pre_emphasis) };   126     const char __kstrtab_drm_dp_link_train_clock_recovery_delay[39U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'l', 'i', 'n', 'k', '_', 't', 'r', 'a', 'i', 'n', '_', 'c', 'l', 'o', 'c', 'k', '_', 'r', 'e', 'c', 'o', 'v', 'e', 'r', 'y', '_', 'd', 'e', 'l', 'a', 'y', '\x0' };   126     const struct kernel_symbol __ksymtab_drm_dp_link_train_clock_recovery_delay;   126     const struct kernel_symbol __ksymtab_drm_dp_link_train_clock_recovery_delay = { (unsigned long)(&drm_dp_link_train_clock_recovery_delay), (const char *)(&__kstrtab_drm_dp_link_train_clock_recovery_delay) };   134     const char __kstrtab_drm_dp_link_train_channel_eq_delay[35U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'l', 'i', 'n', 'k', '_', 't', 'r', 'a', 'i', 'n', '_', 'c', 'h', 'a', 'n', 'n', 'e', 'l', '_', 'e', 'q', '_', 'd', 'e', 'l', 'a', 'y', '\x0' };   134     const struct kernel_symbol __ksymtab_drm_dp_link_train_channel_eq_delay;   134     const struct kernel_symbol __ksymtab_drm_dp_link_train_channel_eq_delay = { (unsigned long)(&drm_dp_link_train_channel_eq_delay), (const char *)(&__kstrtab_drm_dp_link_train_channel_eq_delay) };   148     const char __kstrtab_drm_dp_link_rate_to_bw_code[28U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'l', 'i', 'n', 'k', '_', 'r', 'a', 't', 'e', '_', 't', 'o', '_', 'b', 'w', '_', 'c', 'o', 'd', 'e', '\x0' };   148     const struct kernel_symbol __ksymtab_drm_dp_link_rate_to_bw_code;   148     const struct kernel_symbol __ksymtab_drm_dp_link_rate_to_bw_code = { (unsigned long)(&drm_dp_link_rate_to_bw_code), (const char *)(&__kstrtab_drm_dp_link_rate_to_bw_code) };   162     const char __kstrtab_drm_dp_bw_code_to_link_rate[28U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'b', 'w', '_', 'c', 'o', 'd', 'e', '_', 't', 'o', '_', 'l', 'i', 'n', 'k', '_', 'r', 'a', 't', 'e', '\x0' };   162     const struct kernel_symbol __ksymtab_drm_dp_bw_code_to_link_rate;   162     const struct kernel_symbol __ksymtab_drm_dp_bw_code_to_link_rate = { (unsigned long)(&drm_dp_bw_code_to_link_rate), (const char *)(&__kstrtab_drm_dp_bw_code_to_link_rate) };   178     int drm_dp_dpcd_access(struct drm_dp_aux *aux, u8 request, unsigned int offset, void *buffer, size_t size);   274     const char __kstrtab_drm_dp_dpcd_read[17U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'd', 'p', 'c', 'd', '_', 'r', 'e', 'a', 'd', '\x0' };   274     const struct kernel_symbol __ksymtab_drm_dp_dpcd_read;   274     const struct kernel_symbol __ksymtab_drm_dp_dpcd_read = { (unsigned long)(&drm_dp_dpcd_read), (const char *)(&__kstrtab_drm_dp_dpcd_read) };   296     const char __kstrtab_drm_dp_dpcd_write[18U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'd', 'p', 'c', 'd', '_', 'w', 'r', 'i', 't', 'e', '\x0' };   296     const struct kernel_symbol __ksymtab_drm_dp_dpcd_write;   296     const struct kernel_symbol __ksymtab_drm_dp_dpcd_write = { (unsigned long)(&drm_dp_dpcd_write), (const char *)(&__kstrtab_drm_dp_dpcd_write) };   312     const char __kstrtab_drm_dp_dpcd_read_link_status[29U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'd', 'p', 'c', 'd', '_', 'r', 'e', 'a', 'd', '_', 'l', 'i', 'n', 'k', '_', 's', 't', 'a', 't', 'u', 's', '\x0' };   312     const struct kernel_symbol __ksymtab_drm_dp_dpcd_read_link_status;   312     const struct kernel_symbol __ksymtab_drm_dp_dpcd_read_link_status = { (unsigned long)(&drm_dp_dpcd_read_link_status), (const char *)(&__kstrtab_drm_dp_dpcd_read_link_status) };   345     const char __kstrtab_drm_dp_link_probe[18U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'l', 'i', 'n', 'k', '_', 'p', 'r', 'o', 'b', 'e', '\x0' };   345     const struct kernel_symbol __ksymtab_drm_dp_link_probe;   345     const struct kernel_symbol __ksymtab_drm_dp_link_probe = { (unsigned long)(&drm_dp_link_probe), (const char *)(&__kstrtab_drm_dp_link_probe) };   383     const char __kstrtab_drm_dp_link_power_up[21U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'l', 'i', 'n', 'k', '_', 'p', 'o', 'w', 'e', 'r', '_', 'u', 'p', '\x0' };   383     const struct kernel_symbol __ksymtab_drm_dp_link_power_up;   383     const struct kernel_symbol __ksymtab_drm_dp_link_power_up = { (unsigned long)(&drm_dp_link_power_up), (const char *)(&__kstrtab_drm_dp_link_power_up) };   414     const char __kstrtab_drm_dp_link_power_down[23U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'l', 'i', 'n', 'k', '_', 'p', 'o', 'w', 'e', 'r', '_', 'd', 'o', 'w', 'n', '\x0' };   414     const struct kernel_symbol __ksymtab_drm_dp_link_power_down;   414     const struct kernel_symbol __ksymtab_drm_dp_link_power_down = { (unsigned long)(&drm_dp_link_power_down), (const char *)(&__kstrtab_drm_dp_link_power_down) };   440     const char __kstrtab_drm_dp_link_configure[22U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'l', 'i', 'n', 'k', '_', 'c', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'e', '\x0' };   440     const struct kernel_symbol __ksymtab_drm_dp_link_configure;   440     const struct kernel_symbol __ksymtab_drm_dp_link_configure = { (unsigned long)(&drm_dp_link_configure), (const char *)(&__kstrtab_drm_dp_link_configure) };   446     u32  drm_dp_i2c_functionality(struct i2c_adapter *adapter);   454     void drm_dp_i2c_msg_write_status_update(struct drm_dp_aux_msg *msg);   479     int drm_dp_aux_req_duration(const struct drm_dp_aux_msg *msg);   490     int drm_dp_aux_reply_duration(const struct drm_dp_aux_msg *msg);   518     int drm_dp_i2c_msg_duration(const struct drm_dp_aux_msg *msg, int i2c_speed_khz);   532     int drm_dp_i2c_retry_count(const struct drm_dp_aux_msg *msg, int i2c_speed_khz);   546     int dp_aux_i2c_speed_khz = 10;   559     int drm_dp_i2c_do_msg(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg);   653     void drm_dp_i2c_msg_set_request(struct drm_dp_aux_msg *msg, const struct i2c_msg *i2c_msg);   666     int drm_dp_i2c_drain_msg(struct drm_dp_aux *aux, struct drm_dp_aux_msg *orig_msg);   694     int dp_aux_i2c_transfer_size = 16;   699     int drm_dp_i2c_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs, int num);   773     const struct i2c_algorithm drm_dp_i2c_algo = { &drm_dp_i2c_xfer, 0, &drm_dp_i2c_functionality, 0, 0 };   814     const char __kstrtab_drm_dp_aux_register[20U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'a', 'u', 'x', '_', 'r', 'e', 'g', 'i', 's', 't', 'e', 'r', '\x0' };   814     const struct kernel_symbol __ksymtab_drm_dp_aux_register;   814     const struct kernel_symbol __ksymtab_drm_dp_aux_register = { (unsigned long)(&drm_dp_aux_register), (const char *)(&__kstrtab_drm_dp_aux_register) };   825     const char __kstrtab_drm_dp_aux_unregister[22U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'a', 'u', 'x', '_', 'u', 'n', 'r', 'e', 'g', 'i', 's', 't', 'e', 'r', '\x0' };   825     const struct kernel_symbol __ksymtab_drm_dp_aux_unregister;   825     const struct kernel_symbol __ksymtab_drm_dp_aux_unregister = { (unsigned long)(&drm_dp_aux_unregister), (const char *)(&__kstrtab_drm_dp_aux_unregister) };   843     void ldv_check_final_state();   852     void ldv_initialize();   855     void ldv_handler_precall();   858     int nondet_int();   861     int LDV_IN_INTERRUPT = 0;   864     void ldv_main1_sequence_infinite_withcheck_stateful();    25     void INIT_LIST_HEAD___0(struct list_head *list);   187     int list_empty___0(const struct list_head *head);    24     int atomic_read___0(const atomic_t *v);   281     void lockdep_init_map(struct lockdep_map *, const char *, struct lock_class_key *, int);   128     int mutex_is_locked___0(struct mutex *lock);    88     void init_timer_key(struct timer_list *, unsigned int, const char *, struct lock_class_key *);    20     void delayed_work_timer_fn(unsigned long);   136     struct delayed_work * to_delayed_work(struct work_struct *work);   181     void __init_work(struct work_struct *, int);   353     extern struct workqueue_struct *system_wq;   432     bool  queue_delayed_work_on(int, struct workqueue_struct *, struct delayed_work *, unsigned long);   449     bool  cancel_delayed_work_sync(struct delayed_work *);   484     bool  queue_delayed_work(struct workqueue_struct *wq, struct delayed_work *dwork, unsigned long delay);   586     bool  schedule_delayed_work(struct delayed_work *dwork, unsigned long delay);   373     bool  ww_mutex_is_locked___0(struct ww_mutex *lock);   117     bool  drm_modeset_is_locked___0(struct drm_modeset_lock *lock);   438     void drm_mode_probed_add(struct drm_connector *, struct drm_display_mode *);   464     int drm_mode_vrefresh(const struct drm_display_mode *);   466     void drm_mode_set_crtcinfo(struct drm_display_mode *, int);   480     enum drm_mode_status  drm_mode_validate_basic(const struct drm_display_mode *);   481     enum drm_mode_status  drm_mode_validate_size(const struct drm_display_mode *, int, int);   483     void drm_mode_prune_invalid(struct drm_device *, struct list_head *, bool );   485     void drm_mode_sort(struct list_head *);   486     void drm_mode_connector_list_update(struct drm_connector *);   494     struct drm_display_mode * drm_mode_create_from_cmdline_mode(struct drm_device *, struct drm_cmdline_mode *);  2332     const char * drm_get_connector_status_name(enum drm_connector_status );  2348     int drm_add_edid_modes(struct drm_connector *, struct edid *);  2356     int drm_mode_connector_update_edid_property(struct drm_connector *, const struct edid *);  2505     int drm_add_modes_noedid(struct drm_connector *, int, int);  2693     void assert_drm_connector_list_read_locked___0(struct drm_mode_config *mode_config);  1076     void drm_sysfs_hotplug_event(struct drm_device *);    73     int drm_helper_probe_single_connector_modes(struct drm_connector *connector, uint32_t maxX, uint32_t maxY);    76     void drm_kms_helper_poll_init(struct drm_device *dev);    77     void drm_kms_helper_poll_fini(struct drm_device *dev);    78     bool  drm_helper_hpd_irq_event(struct drm_device *dev);    79     void drm_kms_helper_hotplug_event(struct drm_device *dev);    81     void drm_kms_helper_poll_disable(struct drm_device *dev);    82     void drm_kms_helper_poll_enable(struct drm_device *dev);    83     void drm_kms_helper_poll_enable_locked(struct drm_device *dev);   325     void drm_edid_to_eld(struct drm_connector *, struct edid *);   333     int drm_load_edid_firmware(struct drm_connector *connector);    61     _Bool drm_kms_helper_poll = 1;    65     enum drm_mode_status  drm_mode_validate_flag(const struct drm_display_mode *mode, int flags);    83     int drm_helper_probe_add_cmdline_mode(struct drm_connector *connector);   130     const char __kstrtab_drm_kms_helper_poll_enable_locked[34U] = { 'd', 'r', 'm', '_', 'k', 'm', 's', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'p', 'o', 'l', 'l', '_', 'e', 'n', 'a', 'b', 'l', 'e', '_', 'l', 'o', 'c', 'k', 'e', 'd', '\x0' };   130     const struct kernel_symbol __ksymtab_drm_kms_helper_poll_enable_locked;   130     const struct kernel_symbol __ksymtab_drm_kms_helper_poll_enable_locked = { (unsigned long)(&drm_kms_helper_poll_enable_locked), (const char *)(&__kstrtab_drm_kms_helper_poll_enable_locked) };   322     const char __kstrtab_drm_helper_probe_single_connector_modes[40U] = { 'd', 'r', 'm', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'p', 'r', 'o', 'b', 'e', '_', 's', 'i', 'n', 'g', 'l', 'e', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'o', 'r', '_', 'm', 'o', 'd', 'e', 's', '\x0' };   322     const struct kernel_symbol __ksymtab_drm_helper_probe_single_connector_modes;   322     const struct kernel_symbol __ksymtab_drm_helper_probe_single_connector_modes = { (unsigned long)(&drm_helper_probe_single_connector_modes), (const char *)(&__kstrtab_drm_helper_probe_single_connector_modes) };   347     const char __kstrtab_drm_kms_helper_hotplug_event[29U] = { 'd', 'r', 'm', '_', 'k', 'm', 's', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'h', 'o', 't', 'p', 'l', 'u', 'g', '_', 'e', 'v', 'e', 'n', 't', '\x0' };   347     const struct kernel_symbol __ksymtab_drm_kms_helper_hotplug_event;   347     const struct kernel_symbol __ksymtab_drm_kms_helper_hotplug_event = { (unsigned long)(&drm_kms_helper_hotplug_event), (const char *)(&__kstrtab_drm_kms_helper_hotplug_event) };   349     void output_poll_execute(struct work_struct *work);   446     const char __kstrtab_drm_kms_helper_poll_disable[28U] = { 'd', 'r', 'm', '_', 'k', 'm', 's', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'p', 'o', 'l', 'l', '_', 'd', 'i', 's', 'a', 'b', 'l', 'e', '\x0' };   446     const struct kernel_symbol __ksymtab_drm_kms_helper_poll_disable;   446     const struct kernel_symbol __ksymtab_drm_kms_helper_poll_disable = { (unsigned long)(&drm_kms_helper_poll_disable), (const char *)(&__kstrtab_drm_kms_helper_poll_disable) };   464     const char __kstrtab_drm_kms_helper_poll_enable[27U] = { 'd', 'r', 'm', '_', 'k', 'm', 's', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'p', 'o', 'l', 'l', '_', 'e', 'n', 'a', 'b', 'l', 'e', '\x0' };   464     const struct kernel_symbol __ksymtab_drm_kms_helper_poll_enable;   464     const struct kernel_symbol __ksymtab_drm_kms_helper_poll_enable = { (unsigned long)(&drm_kms_helper_poll_enable), (const char *)(&__kstrtab_drm_kms_helper_poll_enable) };   492     const char __kstrtab_drm_kms_helper_poll_init[25U] = { 'd', 'r', 'm', '_', 'k', 'm', 's', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'p', 'o', 'l', 'l', '_', 'i', 'n', 'i', 't', '\x0' };   492     const struct kernel_symbol __ksymtab_drm_kms_helper_poll_init;   492     const struct kernel_symbol __ksymtab_drm_kms_helper_poll_init = { (unsigned long)(&drm_kms_helper_poll_init), (const char *)(&__kstrtab_drm_kms_helper_poll_init) };   502     const char __kstrtab_drm_kms_helper_poll_fini[25U] = { 'd', 'r', 'm', '_', 'k', 'm', 's', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'p', 'o', 'l', 'l', '_', 'f', 'i', 'n', 'i', '\x0' };   502     const struct kernel_symbol __ksymtab_drm_kms_helper_poll_fini;   502     const struct kernel_symbol __ksymtab_drm_kms_helper_poll_fini = { (unsigned long)(&drm_kms_helper_poll_fini), (const char *)(&__kstrtab_drm_kms_helper_poll_fini) };   562     const char __kstrtab_drm_helper_hpd_irq_event[25U] = { 'd', 'r', 'm', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'h', 'p', 'd', '_', 'i', 'r', 'q', '_', 'e', 'v', 'e', 'n', 't', '\x0' };   562     const struct kernel_symbol __ksymtab_drm_helper_hpd_irq_event;   562     const struct kernel_symbol __ksymtab_drm_helper_hpd_irq_event = { (unsigned long)(&drm_helper_hpd_irq_event), (const char *)(&__kstrtab_drm_helper_hpd_irq_event) };    24     int atomic_read___1(const atomic_t *v);   128     int mutex_is_locked___1(struct mutex *lock);   373     bool  ww_mutex_is_locked___1(struct ww_mutex *lock);   117     bool  drm_modeset_is_locked___1(struct drm_modeset_lock *lock);  2226     int drm_crtc_init_with_planes(struct drm_device *, struct drm_crtc *, struct drm_plane *, struct drm_plane *, const struct drm_crtc_funcs *, const char *, ...);  2303     int drm_universal_plane_init(struct drm_device *, struct drm_plane *, unsigned long, const struct drm_plane_funcs *, const uint32_t *, unsigned int, enum drm_plane_type , const char *, ...);  2317     void drm_plane_cleanup(struct drm_plane *);  2693     void assert_drm_connector_list_read_locked___1(struct drm_mode_config *mode_config);   987     int drm_crtc_vblank_get(struct drm_crtc *);   988     void drm_crtc_vblank_put(struct drm_crtc *);   990     void drm_crtc_wait_one_vblank(struct drm_crtc *);   142     bool  drm_rect_equals(const struct drm_rect *r1, const struct drm_rect *r2);   150     bool  drm_rect_clip_scaled(struct drm_rect *, struct drm_rect *, const struct drm_rect *, int, int);   153     int drm_rect_calc_hscale(const struct drm_rect *, const struct drm_rect *, int, int);   156     int drm_rect_calc_vscale(const struct drm_rect *, const struct drm_rect *, int, int);   165     void drm_rect_debug_print(const char *, const struct drm_rect *, bool );    40     int drm_crtc_init(struct drm_device *dev, struct drm_crtc *crtc, const struct drm_crtc_funcs *funcs);    43     int drm_plane_helper_check_update(struct drm_plane *plane, struct drm_crtc *crtc, struct drm_framebuffer *fb, struct drm_rect *src, struct drm_rect *dest, const struct drm_rect *clip, int min_scale, int max_scale, bool can_position, bool can_update_disabled, bool *visible);    54     int drm_primary_helper_update(struct drm_plane *plane, struct drm_crtc *crtc, struct drm_framebuffer *fb, int crtc_x, int crtc_y, unsigned int crtc_w, unsigned int crtc_h, uint32_t src_x, uint32_t src_y, uint32_t src_w, uint32_t src_h);    61     int drm_primary_helper_disable(struct drm_plane *plane);    62     void drm_primary_helper_destroy(struct drm_plane *plane);    63     const struct drm_plane_funcs drm_primary_helper_funcs;    65     int drm_plane_helper_update(struct drm_plane *plane, struct drm_crtc *crtc, struct drm_framebuffer *fb, int crtc_x, int crtc_y, unsigned int crtc_w, unsigned int crtc_h, uint32_t src_x, uint32_t src_y, uint32_t src_w, uint32_t src_h);    71     int drm_plane_helper_disable(struct drm_plane *plane);   132     void drm_atomic_helper_plane_destroy_state(struct drm_plane *plane, struct drm_plane_state *state);   192     bool  drm_atomic_plane_disabling(struct drm_plane *plane, struct drm_plane_state *old_state);    74     const uint32_t safe_modeset_formats[2U] = { 875713112U, 875713089U };    84     int get_connectors_for_crtc(struct drm_crtc *crtc, struct drm_connector **connector_list, int num_connectors);   197     const char __kstrtab_drm_plane_helper_check_update[30U] = { 'd', 'r', 'm', '_', 'p', 'l', 'a', 'n', 'e', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'c', 'h', 'e', 'c', 'k', '_', 'u', 'p', 'd', 'a', 't', 'e', '\x0' };   197     const struct kernel_symbol __ksymtab_drm_plane_helper_check_update;   197     const struct kernel_symbol __ksymtab_drm_plane_helper_check_update = { (unsigned long)(&drm_plane_helper_check_update), (const char *)(&__kstrtab_drm_plane_helper_check_update) };   308     const char __kstrtab_drm_primary_helper_update[26U] = { 'd', 'r', 'm', '_', 'p', 'r', 'i', 'm', 'a', 'r', 'y', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'u', 'p', 'd', 'a', 't', 'e', '\x0' };   308     const struct kernel_symbol __ksymtab_drm_primary_helper_update;   308     const struct kernel_symbol __ksymtab_drm_primary_helper_update = { (unsigned long)(&drm_primary_helper_update), (const char *)(&__kstrtab_drm_primary_helper_update) };   333     const char __kstrtab_drm_primary_helper_disable[27U] = { 'd', 'r', 'm', '_', 'p', 'r', 'i', 'm', 'a', 'r', 'y', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'd', 'i', 's', 'a', 'b', 'l', 'e', '\x0' };   333     const struct kernel_symbol __ksymtab_drm_primary_helper_disable;   333     const struct kernel_symbol __ksymtab_drm_primary_helper_disable = { (unsigned long)(&drm_primary_helper_disable), (const char *)(&__kstrtab_drm_primary_helper_disable) };   348     const char __kstrtab_drm_primary_helper_destroy[27U] = { 'd', 'r', 'm', '_', 'p', 'r', 'i', 'm', 'a', 'r', 'y', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'd', 'e', 's', 't', 'r', 'o', 'y', '\x0' };   348     const struct kernel_symbol __ksymtab_drm_primary_helper_destroy;   348     const struct kernel_symbol __ksymtab_drm_primary_helper_destroy = { (unsigned long)(&drm_primary_helper_destroy), (const char *)(&__kstrtab_drm_primary_helper_destroy) };   350     const struct drm_plane_funcs drm_primary_helper_funcs = { &drm_primary_helper_update, &drm_primary_helper_disable, &drm_primary_helper_destroy, 0, 0, 0, 0, 0, 0 };   355     const char __kstrtab_drm_primary_helper_funcs[25U] = { 'd', 'r', 'm', '_', 'p', 'r', 'i', 'm', 'a', 'r', 'y', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'f', 'u', 'n', 'c', 's', '\x0' };   355     const struct kernel_symbol __ksymtab_drm_primary_helper_funcs;   355     const struct kernel_symbol __ksymtab_drm_primary_helper_funcs = { (unsigned long)(&drm_primary_helper_funcs), (const char *)(&__kstrtab_drm_primary_helper_funcs) };   357     struct drm_plane * create_primary_plane(struct drm_device *dev);   409     const char __kstrtab_drm_crtc_init[14U] = { 'd', 'r', 'm', '_', 'c', 'r', 't', 'c', '_', 'i', 'n', 'i', 't', '\x0' };   409     const struct kernel_symbol __ksymtab_drm_crtc_init;   409     const struct kernel_symbol __ksymtab_drm_crtc_init = { (unsigned long)(&drm_crtc_init), (const char *)(&__kstrtab_drm_crtc_init) };   562     const char __kstrtab_drm_plane_helper_update[24U] = { 'd', 'r', 'm', '_', 'p', 'l', 'a', 'n', 'e', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'u', 'p', 'd', 'a', 't', 'e', '\x0' };   562     const struct kernel_symbol __ksymtab_drm_plane_helper_update;   562     const struct kernel_symbol __ksymtab_drm_plane_helper_update = { (unsigned long)(&drm_plane_helper_update), (const char *)(&__kstrtab_drm_plane_helper_update) };   603     const char __kstrtab_drm_plane_helper_disable[25U] = { 'd', 'r', 'm', '_', 'p', 'l', 'a', 'n', 'e', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'd', 'i', 's', 'a', 'b', 'l', 'e', '\x0' };   603     const struct kernel_symbol __ksymtab_drm_plane_helper_disable;   603     const struct kernel_symbol __ksymtab_drm_plane_helper_disable = { (unsigned long)(&drm_plane_helper_disable), (const char *)(&__kstrtab_drm_plane_helper_disable) };   642     void ldv_main3_sequence_infinite_withcheck_stateful();    72     void set_bit(long nr, volatile unsigned long *addr);   110     void clear_bit(long nr, volatile unsigned long *addr);    53     unsigned long int find_first_zero_bit(const unsigned long *, unsigned long);   443     void print_hex_dump(const char *, const char *, int, int, int, const void *, size_t , bool );   185     void __might_sleep(const char *, int, int);   415     int snprintf(char *, size_t , const char *, ...);    25     void INIT_LIST_HEAD___1(struct list_head *list);    61     void list_add(struct list_head *new, struct list_head *head);   113     void list_del(struct list_head *);   187     int list_empty___1(const struct list_head *head);    31     void * __memcpy(void *, const void *, size_t );    62     int memcmp(const void *, const void *, size_t );    39     size_t  strlcat(char *, const char *, __kernel_size_t );    16     void __xadd_wrong_size();    24     int atomic_read___2(const atomic_t *v);    36     void atomic_set(atomic_t *v, int i);    78     int atomic_sub_and_test(int i, atomic_t *v);   154     int atomic_add_return(int i, atomic_t *v);    36     u64  div64_u64_rem(u64 dividend, u64 divisor, u64 *remainder);    78     extern volatile unsigned long jiffies;    83     u64  get_jiffies_64();    72     void __init_waitqueue_head(wait_queue_head_t *, const char *, struct lock_class_key *);   200     void __wake_up(wait_queue_head_t *, unsigned int, int, void *);   977     long int prepare_to_wait_event(wait_queue_head_t *, wait_queue_t *, int);   978     void finish_wait(wait_queue_head_t *, wait_queue_t *);   128     int mutex_is_locked___2(struct mutex *lock);   355     extern struct workqueue_struct *system_long_wq;   430     bool  queue_work_on(int, struct workqueue_struct *, struct work_struct *);   444     bool  flush_work(struct work_struct *);   470     bool  queue_work(struct workqueue_struct *wq, struct work_struct *work);   529     bool  schedule_work(struct work_struct *work);   435     long int schedule_timeout(long);   117     void seq_printf(struct seq_file *, const char *, ...);    31     void kref_init(struct kref *kref);    40     void kref_get(struct kref *kref);    67     int kref_sub(struct kref *kref, unsigned int count, void (*release)(struct kref *));    96     int kref_put(struct kref *kref, void (*release)(struct kref *));   468     int drm_dp_mst_topology_mgr_init(struct drm_dp_mst_topology_mgr *mgr, struct device *dev, struct drm_dp_aux *aux, int max_dpcd_transaction_bytes, int max_payloads, int conn_base_id);   470     void drm_dp_mst_topology_mgr_destroy(struct drm_dp_mst_topology_mgr *mgr);   473     int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool mst_state);   476     int drm_dp_mst_hpd_irq(struct drm_dp_mst_topology_mgr *mgr, u8 *esi, bool *handled);   479     enum drm_connector_status  drm_dp_mst_detect_port(struct drm_connector *connector, struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port);   481     bool  drm_dp_mst_port_has_audio(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port);   483     struct edid * drm_dp_mst_get_edid(struct drm_connector *connector, struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port);   486     int drm_dp_calc_pbn_mode(int clock, int bpp);   489     bool  drm_dp_mst_allocate_vcpi(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port, int pbn, int *slots);   491     int drm_dp_mst_get_vcpi_slots(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port);   494     void drm_dp_mst_reset_vcpi_slots(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port);   497     void drm_dp_mst_deallocate_vcpi(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port);   501     int drm_dp_find_vcpi_slots(struct drm_dp_mst_topology_mgr *mgr, int pbn);   505     int drm_dp_update_payload_part1(struct drm_dp_mst_topology_mgr *mgr);   508     int drm_dp_update_payload_part2(struct drm_dp_mst_topology_mgr *mgr);   510     int drm_dp_check_act_status(struct drm_dp_mst_topology_mgr *mgr);   512     void drm_dp_mst_dump_topology(struct seq_file *m, struct drm_dp_mst_topology_mgr *mgr);   515     void drm_dp_mst_topology_mgr_suspend(struct drm_dp_mst_topology_mgr *mgr);   516     int drm_dp_mst_topology_mgr_resume(struct drm_dp_mst_topology_mgr *mgr);   564     void * kmalloc_array(size_t n, size_t size, gfp_t flags);   577     void * kcalloc(size_t n, size_t size, gfp_t flags);  2343     struct edid * drm_get_edid(struct drm_connector *, struct i2c_adapter *);  2347     struct edid * drm_edid_duplicate(const struct edid *);  2355     int drm_mode_connector_set_tile_property(struct drm_connector *);  2501     bool  drm_detect_monitor_audio(struct edid *);  2514     void drm_edid_get_monitor_name(struct edid *, char *, int);    84     int drm_fixp2int(s64 a);    89     int drm_fixp2int_ceil(s64 a);   149     s64  drm_fixp_from_fraction(s64 a, s64 b);    43     bool  dump_dp_payload_table(struct drm_dp_mst_topology_mgr *mgr, char *buf);    45     int test_calc_pbn_mode();    47     void drm_dp_put_port(struct drm_dp_mst_port *port);    49     int drm_dp_dpcd_write_payload(struct drm_dp_mst_topology_mgr *mgr, int id, struct drm_dp_payload *payload);    53     int drm_dp_send_dpcd_write(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port, int offset, int size, u8 *bytes);    57     void drm_dp_send_link_address(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_branch *mstb);    59     int drm_dp_send_enum_path_resources(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_branch *mstb, struct drm_dp_mst_port *port);    62     bool  drm_dp_validate_guid(struct drm_dp_mst_topology_mgr *mgr, u8 *guid);    65     int drm_dp_mst_register_i2c_bus(struct drm_dp_aux *aux);    66     void drm_dp_mst_unregister_i2c_bus(struct drm_dp_aux *aux);    67     void drm_dp_mst_kick_tx(struct drm_dp_mst_topology_mgr *mgr);    69     u8  drm_dp_msg_header_crc4(const uint8_t *data, size_t num_nibbles);   103     u8  drm_dp_msg_data_crc4(const uint8_t *data, u8 number_of_bytes);   136     u8  drm_dp_calc_sb_hdr_size(struct drm_dp_sideband_msg_hdr *hdr);   143     void drm_dp_encode_sideband_msg_hdr(struct drm_dp_sideband_msg_hdr *hdr, u8 *buf, int *len);   162     bool  drm_dp_decode_sideband_msg_hdr(struct drm_dp_sideband_msg_hdr *hdr, u8 *buf, int buflen, u8 *hdrlen);   199     void drm_dp_encode_sideband_req(struct drm_dp_sideband_msg_req_body *req, struct drm_dp_sideband_msg_tx *raw);   300     void drm_dp_crc_sideband_chunk_req(u8 *msg, u8 len);   307     void drm_dp_encode_sideband_reply(struct drm_dp_sideband_msg_reply_body *rep, struct drm_dp_sideband_msg_tx *raw);   319     bool  drm_dp_sideband_msg_build(struct drm_dp_sideband_msg_rx *msg, u8 *replybuf, u8 replybuflen, bool hdr);   367     bool  drm_dp_sideband_parse_link_address(struct drm_dp_sideband_msg_rx *raw, struct drm_dp_sideband_msg_reply_body *repmsg);   419     bool  drm_dp_sideband_parse_remote_dpcd_read(struct drm_dp_sideband_msg_rx *raw, struct drm_dp_sideband_msg_reply_body *repmsg);   438     bool  drm_dp_sideband_parse_remote_dpcd_write(struct drm_dp_sideband_msg_rx *raw, struct drm_dp_sideband_msg_reply_body *repmsg);   452     bool  drm_dp_sideband_parse_remote_i2c_read_ack(struct drm_dp_sideband_msg_rx *raw, struct drm_dp_sideband_msg_reply_body *repmsg);   471     bool  drm_dp_sideband_parse_enum_path_resources_ack(struct drm_dp_sideband_msg_rx *raw, struct drm_dp_sideband_msg_reply_body *repmsg);   493     bool  drm_dp_sideband_parse_allocate_payload_ack(struct drm_dp_sideband_msg_rx *raw, struct drm_dp_sideband_msg_reply_body *repmsg);   515     bool  drm_dp_sideband_parse_query_payload_ack(struct drm_dp_sideband_msg_rx *raw, struct drm_dp_sideband_msg_reply_body *repmsg);   533     bool  drm_dp_sideband_parse_reply(struct drm_dp_sideband_msg_rx *raw, struct drm_dp_sideband_msg_reply_body *msg);   568     bool  drm_dp_sideband_parse_connection_status_notify(struct drm_dp_sideband_msg_rx *raw, struct drm_dp_sideband_msg_req_body *msg);   595     bool  drm_dp_sideband_parse_resource_status_notify(struct drm_dp_sideband_msg_rx *raw, struct drm_dp_sideband_msg_req_body *msg);   618     bool  drm_dp_sideband_parse_req(struct drm_dp_sideband_msg_rx *raw, struct drm_dp_sideband_msg_req_body *msg);   635     int build_dpcd_write(struct drm_dp_sideband_msg_tx *msg, u8 port_num, u32 offset, u8 num_bytes, u8 *bytes);   649     int build_link_address(struct drm_dp_sideband_msg_tx *msg);   658     int build_enum_path_resources(struct drm_dp_sideband_msg_tx *msg, int port_num);   669     int build_allocate_payload(struct drm_dp_sideband_msg_tx *msg, int port_num, u8 vcpi, uint16_t pbn, u8 number_sdp_streams, u8 *sdp_stream_sink);   688     int drm_dp_mst_assign_payload_id(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_vcpi *vcpi);   717     void drm_dp_mst_put_payload_id(struct drm_dp_mst_topology_mgr *mgr, int vcpi);   738     bool  check_txmsg_state(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_sideband_msg_tx *txmsg);   753     int drm_dp_mst_wait_tx_reply(struct drm_dp_mst_branch *mstb, struct drm_dp_sideband_msg_tx *txmsg);   791     struct drm_dp_mst_branch * drm_dp_add_mst_branch_device(u8 lct, u8 *rad);   807     void drm_dp_free_mst_port(struct kref *kref);   809     void drm_dp_free_mst_branch_device(struct kref *kref);   819     void drm_dp_destroy_mst_branch_device(struct kref *kref);   864     void drm_dp_put_mst_branch_device(struct drm_dp_mst_branch *mstb);   870     void drm_dp_port_teardown_pdt(struct drm_dp_mst_port *port, int old_pdt);   888     void drm_dp_destroy_port(struct kref *kref);   927     struct drm_dp_mst_branch * drm_dp_mst_get_validated_mstb_ref_locked(struct drm_dp_mst_branch *mstb, struct drm_dp_mst_branch *to_find);   945     struct drm_dp_mst_branch * drm_dp_get_validated_mstb_ref(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_branch *mstb);   955     struct drm_dp_mst_port * drm_dp_mst_get_port_ref_locked(struct drm_dp_mst_branch *mstb, struct drm_dp_mst_port *to_find);   973     struct drm_dp_mst_port * drm_dp_get_validated_port_ref(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port);   983     struct drm_dp_mst_port * drm_dp_get_port(struct drm_dp_mst_branch *mstb, u8 port_num);  1002     u8  drm_dp_calculate_rad(struct drm_dp_mst_port *port, u8 *rad);  1021     bool  drm_dp_port_setup_pdt(struct drm_dp_mst_port *port);  1045     void drm_dp_check_mstb_guid(struct drm_dp_mst_branch *mstb, u8 *guid);  1070     void build_mst_prop_path(const struct drm_dp_mst_branch *mstb, int pnum, char *proppath, size_t proppath_size);  1088     void drm_dp_add_port(struct drm_dp_mst_branch *mstb, struct device *dev, struct drm_dp_link_addr_reply_port *port_msg);  1175     void drm_dp_update_port(struct drm_dp_mst_branch *mstb, struct drm_dp_connection_status_notify *conn_stat);  1213     struct drm_dp_mst_branch * drm_dp_get_mst_branch_device(struct drm_dp_mst_topology_mgr *mgr, u8 lct, u8 *rad);  1246     struct drm_dp_mst_branch * get_mst_branch_device_by_guid_helper(struct drm_dp_mst_branch *mstb, uint8_t *guid);  1270     struct drm_dp_mst_branch * drm_dp_get_mst_branch_device_by_guid(struct drm_dp_mst_topology_mgr *mgr, uint8_t *guid);  1288     void drm_dp_check_and_send_link_address(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_branch *mstb);  1316     void drm_dp_mst_link_probe_work(struct work_struct *work);  1362     int drm_dp_send_sideband_msg(struct drm_dp_mst_topology_mgr *mgr, bool up___0, u8 *msg, int len);  1394     int set_hdr_from_dst_qlock(struct drm_dp_sideband_msg_hdr *hdr, struct drm_dp_sideband_msg_tx *txmsg);  1433     int process_single_tx_qlock(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_sideband_msg_tx *txmsg, bool up___0);  1489     void process_single_down_tx_qlock(struct drm_dp_mst_topology_mgr *mgr);  1523     void process_single_up_tx_qlock(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_sideband_msg_tx *txmsg);  1537     void drm_dp_queue_down_tx(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_sideband_msg_tx *txmsg);  1634     struct drm_dp_mst_port * drm_dp_get_last_connected_port_to_mstb(struct drm_dp_mst_branch *mstb);  1645     struct drm_dp_mst_branch * drm_dp_get_last_connected_port_and_mstb(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_branch *mstb, int *port_num);  1665     int drm_dp_payload_send_msg(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port, int id, int pbn);  1721     int drm_dp_create_payload_step1(struct drm_dp_mst_topology_mgr *mgr, int id, struct drm_dp_payload *payload);  1736     int drm_dp_create_payload_step2(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port, int id, struct drm_dp_payload *payload);  1749     int drm_dp_destroy_payload_step1(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port, int id, struct drm_dp_payload *payload);  1765     int drm_dp_destroy_payload_step2(struct drm_dp_mst_topology_mgr *mgr, int id, struct drm_dp_payload *payload);  1859     const char __kstrtab_drm_dp_update_payload_part1[28U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'u', 'p', 'd', 'a', 't', 'e', '_', 'p', 'a', 'y', 'l', 'o', 'a', 'd', '_', 'p', 'a', 'r', 't', '1', '\x0' };  1859     const struct kernel_symbol __ksymtab_drm_dp_update_payload_part1;  1859     const struct kernel_symbol __ksymtab_drm_dp_update_payload_part1 = { (unsigned long)(&drm_dp_update_payload_part1), (const char *)(&__kstrtab_drm_dp_update_payload_part1) };  1897     const char __kstrtab_drm_dp_update_payload_part2[28U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'u', 'p', 'd', 'a', 't', 'e', '_', 'p', 'a', 'y', 'l', 'o', 'a', 'd', '_', 'p', 'a', 'r', 't', '2', '\x0' };  1897     const struct kernel_symbol __ksymtab_drm_dp_update_payload_part2;  1897     const struct kernel_symbol __ksymtab_drm_dp_update_payload_part2 = { (unsigned long)(&drm_dp_update_payload_part2), (const char *)(&__kstrtab_drm_dp_update_payload_part2) };  1957     int drm_dp_encode_up_ack_reply(struct drm_dp_sideband_msg_tx *msg, u8 req_type);  1967     int drm_dp_send_up_ack_reply(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_branch *mstb, int req_type, int seqno, bool broadcast);  1991     bool  drm_dp_get_vc_payload_bw(int dp_link_bw, int dp_link_count, int *out);  2102     const char __kstrtab_drm_dp_mst_topology_mgr_set_mst[32U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'm', 's', 't', '_', 't', 'o', 'p', 'o', 'l', 'o', 'g', 'y', '_', 'm', 'g', 'r', '_', 's', 'e', 't', '_', 'm', 's', 't', '\x0' };  2102     const struct kernel_symbol __ksymtab_drm_dp_mst_topology_mgr_set_mst;  2102     const struct kernel_symbol __ksymtab_drm_dp_mst_topology_mgr_set_mst = { (unsigned long)(&drm_dp_mst_topology_mgr_set_mst), (const char *)(&__kstrtab_drm_dp_mst_topology_mgr_set_mst) };  2120     const char __kstrtab_drm_dp_mst_topology_mgr_suspend[32U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'm', 's', 't', '_', 't', 'o', 'p', 'o', 'l', 'o', 'g', 'y', '_', 'm', 'g', 'r', '_', 's', 'u', 's', 'p', 'e', 'n', 'd', '\x0' };  2120     const struct kernel_symbol __ksymtab_drm_dp_mst_topology_mgr_suspend;  2120     const struct kernel_symbol __ksymtab_drm_dp_mst_topology_mgr_suspend = { (unsigned long)(&drm_dp_mst_topology_mgr_suspend), (const char *)(&__kstrtab_drm_dp_mst_topology_mgr_suspend) };  2174     const char __kstrtab_drm_dp_mst_topology_mgr_resume[31U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'm', 's', 't', '_', 't', 'o', 'p', 'o', 'l', 'o', 'g', 'y', '_', 'm', 'g', 'r', '_', 'r', 'e', 's', 'u', 'm', 'e', '\x0' };  2174     const struct kernel_symbol __ksymtab_drm_dp_mst_topology_mgr_resume;  2174     const struct kernel_symbol __ksymtab_drm_dp_mst_topology_mgr_resume = { (unsigned long)(&drm_dp_mst_topology_mgr_resume), (const char *)(&__kstrtab_drm_dp_mst_topology_mgr_resume) };  2176     void drm_dp_get_one_sb_msg(struct drm_dp_mst_topology_mgr *mgr, bool up___0);  2218     int drm_dp_mst_handle_down_rep(struct drm_dp_mst_topology_mgr *mgr);  2275     int drm_dp_mst_handle_up_req(struct drm_dp_mst_topology_mgr *mgr);  2372     const char __kstrtab_drm_dp_mst_hpd_irq[19U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'm', 's', 't', '_', 'h', 'p', 'd', '_', 'i', 'r', 'q', '\x0' };  2372     const struct kernel_symbol __ksymtab_drm_dp_mst_hpd_irq;  2372     const struct kernel_symbol __ksymtab_drm_dp_mst_hpd_irq = { (unsigned long)(&drm_dp_mst_hpd_irq), (const char *)(&__kstrtab_drm_dp_mst_hpd_irq) };  2416     const char __kstrtab_drm_dp_mst_detect_port[23U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'm', 's', 't', '_', 'd', 'e', 't', 'e', 'c', 't', '_', 'p', 'o', 'r', 't', '\x0' };  2416     const struct kernel_symbol __ksymtab_drm_dp_mst_detect_port;  2416     const struct kernel_symbol __ksymtab_drm_dp_mst_detect_port = { (unsigned long)(&drm_dp_mst_detect_port), (const char *)(&__kstrtab_drm_dp_mst_detect_port) };  2437     const char __kstrtab_drm_dp_mst_port_has_audio[26U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'm', 's', 't', '_', 'p', 'o', 'r', 't', '_', 'h', 'a', 's', '_', 'a', 'u', 'd', 'i', 'o', '\x0' };  2437     const struct kernel_symbol __ksymtab_drm_dp_mst_port_has_audio;  2437     const struct kernel_symbol __ksymtab_drm_dp_mst_port_has_audio = { (unsigned long)(&drm_dp_mst_port_has_audio), (const char *)(&__kstrtab_drm_dp_mst_port_has_audio) };  2468     const char __kstrtab_drm_dp_mst_get_edid[20U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'm', 's', 't', '_', 'g', 'e', 't', '_', 'e', 'd', 'i', 'd', '\x0' };  2468     const struct kernel_symbol __ksymtab_drm_dp_mst_get_edid;  2468     const struct kernel_symbol __ksymtab_drm_dp_mst_get_edid = { (unsigned long)(&drm_dp_mst_get_edid), (const char *)(&__kstrtab_drm_dp_mst_get_edid) };  2486     const char __kstrtab_drm_dp_find_vcpi_slots[23U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'f', 'i', 'n', 'd', '_', 'v', 'c', 'p', 'i', '_', 's', 'l', 'o', 't', 's', '\x0' };  2486     const struct kernel_symbol __ksymtab_drm_dp_find_vcpi_slots;  2486     const struct kernel_symbol __ksymtab_drm_dp_find_vcpi_slots = { (unsigned long)(&drm_dp_find_vcpi_slots), (const char *)(&__kstrtab_drm_dp_find_vcpi_slots) };  2488     int drm_dp_init_vcpi(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_vcpi *vcpi, int pbn);  2546     const char __kstrtab_drm_dp_mst_allocate_vcpi[25U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'm', 's', 't', '_', 'a', 'l', 'l', 'o', 'c', 'a', 't', 'e', '_', 'v', 'c', 'p', 'i', '\x0' };  2546     const struct kernel_symbol __ksymtab_drm_dp_mst_allocate_vcpi;  2546     const struct kernel_symbol __ksymtab_drm_dp_mst_allocate_vcpi = { (unsigned long)(&drm_dp_mst_allocate_vcpi), (const char *)(&__kstrtab_drm_dp_mst_allocate_vcpi) };  2559     const char __kstrtab_drm_dp_mst_get_vcpi_slots[26U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'm', 's', 't', '_', 'g', 'e', 't', '_', 'v', 'c', 'p', 'i', '_', 's', 'l', 'o', 't', 's', '\x0' };  2559     const struct kernel_symbol __ksymtab_drm_dp_mst_get_vcpi_slots;  2559     const struct kernel_symbol __ksymtab_drm_dp_mst_get_vcpi_slots = { (unsigned long)(&drm_dp_mst_get_vcpi_slots), (const char *)(&__kstrtab_drm_dp_mst_get_vcpi_slots) };  2576     const char __kstrtab_drm_dp_mst_reset_vcpi_slots[28U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'm', 's', 't', '_', 'r', 'e', 's', 'e', 't', '_', 'v', 'c', 'p', 'i', '_', 's', 'l', 'o', 't', 's', '\x0' };  2576     const struct kernel_symbol __ksymtab_drm_dp_mst_reset_vcpi_slots;  2576     const struct kernel_symbol __ksymtab_drm_dp_mst_reset_vcpi_slots = { (unsigned long)(&drm_dp_mst_reset_vcpi_slots), (const char *)(&__kstrtab_drm_dp_mst_reset_vcpi_slots) };  2596     const char __kstrtab_drm_dp_mst_deallocate_vcpi[27U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'm', 's', 't', '_', 'd', 'e', 'a', 'l', 'l', 'o', 'c', 'a', 't', 'e', '_', 'v', 'c', 'p', 'i', '\x0' };  2596     const struct kernel_symbol __ksymtab_drm_dp_mst_deallocate_vcpi;  2596     const struct kernel_symbol __ksymtab_drm_dp_mst_deallocate_vcpi = { (unsigned long)(&drm_dp_mst_deallocate_vcpi), (const char *)(&__kstrtab_drm_dp_mst_deallocate_vcpi) };  2677     const char __kstrtab_drm_dp_check_act_status[24U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'c', 'h', 'e', 'c', 'k', '_', 'a', 'c', 't', '_', 's', 't', 'a', 't', 'u', 's', '\x0' };  2677     const struct kernel_symbol __ksymtab_drm_dp_check_act_status;  2677     const struct kernel_symbol __ksymtab_drm_dp_check_act_status = { (unsigned long)(&drm_dp_check_act_status), (const char *)(&__kstrtab_drm_dp_check_act_status) };  2714     const char __kstrtab_drm_dp_calc_pbn_mode[21U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'c', 'a', 'l', 'c', '_', 'p', 'b', 'n', '_', 'm', 'o', 'd', 'e', '\x0' };  2714     const struct kernel_symbol __ksymtab_drm_dp_calc_pbn_mode;  2714     const struct kernel_symbol __ksymtab_drm_dp_calc_pbn_mode = { (unsigned long)(&drm_dp_calc_pbn_mode), (const char *)(&__kstrtab_drm_dp_calc_pbn_mode) };  2746     void drm_dp_mst_dump_mstb(struct seq_file *m, struct drm_dp_mst_branch *mstb);  2781     void fetch_monitor_name(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port, char *name, int namelen);  2884     const char __kstrtab_drm_dp_mst_dump_topology[25U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'm', 's', 't', '_', 'd', 'u', 'm', 'p', '_', 't', 'o', 'p', 'o', 'l', 'o', 'g', 'y', '\x0' };  2884     const struct kernel_symbol __ksymtab_drm_dp_mst_dump_topology;  2884     const struct kernel_symbol __ksymtab_drm_dp_mst_dump_topology = { (unsigned long)(&drm_dp_mst_dump_topology), (const char *)(&__kstrtab_drm_dp_mst_dump_topology) };  2886     void drm_dp_tx_work(struct work_struct *work);  2903     void drm_dp_destroy_connector_work(struct work_struct *work);  2991     const char __kstrtab_drm_dp_mst_topology_mgr_init[29U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'm', 's', 't', '_', 't', 'o', 'p', 'o', 'l', 'o', 'g', 'y', '_', 'm', 'g', 'r', '_', 'i', 'n', 'i', 't', '\x0' };  2991     const struct kernel_symbol __ksymtab_drm_dp_mst_topology_mgr_init;  2991     const struct kernel_symbol __ksymtab_drm_dp_mst_topology_mgr_init = { (unsigned long)(&drm_dp_mst_topology_mgr_init), (const char *)(&__kstrtab_drm_dp_mst_topology_mgr_init) };  3010     const char __kstrtab_drm_dp_mst_topology_mgr_destroy[32U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'm', 's', 't', '_', 't', 'o', 'p', 'o', 'l', 'o', 'g', 'y', '_', 'm', 'g', 'r', '_', 'd', 'e', 's', 't', 'r', 'o', 'y', '\x0' };  3010     const struct kernel_symbol __ksymtab_drm_dp_mst_topology_mgr_destroy;  3010     const struct kernel_symbol __ksymtab_drm_dp_mst_topology_mgr_destroy = { (unsigned long)(&drm_dp_mst_topology_mgr_destroy), (const char *)(&__kstrtab_drm_dp_mst_topology_mgr_destroy) };  3013     int drm_dp_mst_i2c_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs, int num);  3084     u32  drm_dp_mst_i2c_functionality(struct i2c_adapter *adapter);  3092     const struct i2c_algorithm drm_dp_mst_i2c_algo = { &drm_dp_mst_i2c_xfer, 0, &drm_dp_mst_i2c_functionality, 0, 0 };  3166     void ldv_main4_sequence_infinite_withcheck_stateful();     3     bool  ldv_is_err(const void *ptr);     5     void * ldv_err_ptr(long error);     6     long int ldv_ptr_err(const void *ptr);    25     void INIT_LIST_HEAD___2(struct list_head *list);    23     void * ERR_PTR(long error);    32     long int PTR_ERR(const void *ptr);    41     bool  IS_ERR(const void *ptr);    24     int atomic_read___3(const atomic_t *v);    66     void warn_slowpath_fmt(const char *, const int, const char *, ...);   128     int mutex_is_locked___3(struct mutex *lock);   292     unsigned long int __msecs_to_jiffies(const unsigned int);   354     unsigned long int msecs_to_jiffies(const unsigned int m);   373     bool  ww_mutex_is_locked___2(struct ww_mutex *lock);    87     void drm_modeset_acquire_init(struct drm_modeset_acquire_ctx *, uint32_t );    89     void drm_modeset_acquire_fini(struct drm_modeset_acquire_ctx *);    90     void drm_modeset_drop_locks(struct drm_modeset_acquire_ctx *);    91     void drm_modeset_backoff(struct drm_modeset_acquire_ctx *);   117     bool  drm_modeset_is_locked___2(struct drm_modeset_lock *lock);   122     int drm_modeset_lock(struct drm_modeset_lock *, struct drm_modeset_acquire_ctx *);   139     struct drm_modeset_acquire_ctx * drm_modeset_legacy_acquire_ctx(struct drm_crtc *);   141     int drm_modeset_lock_all_ctx(struct drm_device *, struct drm_modeset_acquire_ctx *);  2257     unsigned int drm_connector_index(struct drm_connector *connector);  2287     unsigned int drm_encoder_index(struct drm_encoder *);  2318     unsigned int drm_plane_index(struct drm_plane *);  2323     void drm_crtc_get_hv_timing(const struct drm_display_mode *, int *, int *);  2350     void drm_mode_config_reset(struct drm_device *);  2379     int drm_object_property_set_value(struct drm_mode_object *, struct drm_property *, uint64_t );  2418     struct drm_property_blob * drm_property_create_blob(struct drm_device *, size_t , const void *);  2423     struct drm_property_blob * drm_property_reference_blob(struct drm_property_blob *);  2424     void drm_property_unreference_blob(struct drm_property_blob *);  2445     struct drm_mode_object * drm_mode_object_find(struct drm_device *, uint32_t , uint32_t );  2575     struct drm_encoder * drm_encoder_find(struct drm_device *dev, uint32_t id);  2632     void drm_framebuffer_reference(struct drm_framebuffer *fb);  2643     void drm_framebuffer_unreference(struct drm_framebuffer *fb);  2693     void assert_drm_connector_list_read_locked___2(struct drm_mode_config *mode_config);   970     u32  drm_crtc_vblank_count(struct drm_crtc *);    34     struct drm_atomic_state * drm_atomic_state_alloc(struct drm_device *);    35     void drm_atomic_state_clear(struct drm_atomic_state *);    36     void drm_atomic_state_free(struct drm_atomic_state *);    44     struct drm_crtc_state * drm_atomic_get_crtc_state(struct drm_atomic_state *, struct drm_crtc *);    46     int drm_atomic_crtc_set_property(struct drm_crtc *, struct drm_crtc_state *, struct drm_property *, uint64_t );    50     struct drm_plane_state * drm_atomic_get_plane_state(struct drm_atomic_state *, struct drm_plane *);    52     int drm_atomic_plane_set_property(struct drm_plane *, struct drm_plane_state *, struct drm_property *, uint64_t );    56     struct drm_connector_state * drm_atomic_get_connector_state(struct drm_atomic_state *, struct drm_connector *);    58     int drm_atomic_connector_set_property(struct drm_connector *, struct drm_connector_state *, struct drm_property *, uint64_t );    71     struct drm_crtc_state * drm_atomic_get_existing_crtc_state(struct drm_atomic_state *state, struct drm_crtc *crtc);    86     struct drm_plane_state * drm_atomic_get_existing_plane_state(struct drm_atomic_state *state, struct drm_plane *plane);   101     struct drm_connector_state * drm_atomic_get_existing_connector_state(struct drm_atomic_state *state, struct drm_connector *connector);   116     int drm_atomic_set_mode_prop_for_crtc(struct drm_crtc_state *, struct drm_property_blob *);   119     int drm_atomic_set_crtc_for_plane(struct drm_plane_state *, struct drm_crtc *);   124     int drm_atomic_set_crtc_for_connector(struct drm_connector_state *, struct drm_crtc *);   127     int drm_atomic_add_affected_connectors(struct drm_atomic_state *, struct drm_crtc *);   130     int drm_atomic_add_affected_planes(struct drm_atomic_state *, struct drm_crtc *);   133     void drm_atomic_legacy_backoff(struct drm_atomic_state *);   139     int drm_atomic_commit(struct drm_atomic_state *);   140     int drm_atomic_nonblocking_commit(struct drm_atomic_state *);   166     bool  drm_atomic_crtc_needs_modeset(struct drm_crtc_state *state);    35     int drm_atomic_helper_check_modeset(struct drm_device *dev, struct drm_atomic_state *state);    37     int drm_atomic_helper_check_planes(struct drm_device *dev, struct drm_atomic_state *state);    39     int drm_atomic_helper_check(struct drm_device *dev, struct drm_atomic_state *state);    41     int drm_atomic_helper_commit(struct drm_device *dev, struct drm_atomic_state *state, bool nonblock);    45     void drm_atomic_helper_wait_for_fences(struct drm_device *dev, struct drm_atomic_state *state);    47     bool  drm_atomic_helper_framebuffer_changed(struct drm_device *dev, struct drm_atomic_state *old_state, struct drm_crtc *crtc);    51     void drm_atomic_helper_wait_for_vblanks(struct drm_device *dev, struct drm_atomic_state *old_state);    55     void drm_atomic_helper_update_legacy_modeset_state(struct drm_device *dev, struct drm_atomic_state *old_state);    58     void drm_atomic_helper_commit_modeset_disables(struct drm_device *dev, struct drm_atomic_state *old_state);    60     void drm_atomic_helper_commit_modeset_enables(struct drm_device *dev, struct drm_atomic_state *old_state);    63     int drm_atomic_helper_prepare_planes(struct drm_device *dev, struct drm_atomic_state *state);    65     void drm_atomic_helper_commit_planes(struct drm_device *dev, struct drm_atomic_state *old_state, bool active_only);    68     void drm_atomic_helper_cleanup_planes(struct drm_device *dev, struct drm_atomic_state *old_state);    70     void drm_atomic_helper_commit_planes_on_crtc(struct drm_crtc_state *old_crtc_state);    71     void drm_atomic_helper_disable_planes_on_crtc(struct drm_crtc *crtc, bool atomic);    74     void drm_atomic_helper_swap_state(struct drm_device *dev, struct drm_atomic_state *state);    78     int drm_atomic_helper_update_plane(struct drm_plane *plane, struct drm_crtc *crtc, struct drm_framebuffer *fb, int crtc_x, int crtc_y, unsigned int crtc_w, unsigned int crtc_h, uint32_t src_x, uint32_t src_y, uint32_t src_w, uint32_t src_h);    85     int drm_atomic_helper_disable_plane(struct drm_plane *plane);    86     int __drm_atomic_helper_disable_plane(struct drm_plane *plane, struct drm_plane_state *plane_state);    88     int drm_atomic_helper_set_config(struct drm_mode_set *set);    89     int __drm_atomic_helper_set_config(struct drm_mode_set *set, struct drm_atomic_state *state);    92     int drm_atomic_helper_disable_all(struct drm_device *dev, struct drm_modeset_acquire_ctx *ctx);    94     struct drm_atomic_state * drm_atomic_helper_suspend(struct drm_device *dev);    95     int drm_atomic_helper_resume(struct drm_device *dev, struct drm_atomic_state *state);    98     int drm_atomic_helper_crtc_set_property(struct drm_crtc *crtc, struct drm_property *property, uint64_t val);   101     int drm_atomic_helper_plane_set_property(struct drm_plane *plane, struct drm_property *property, uint64_t val);   104     int drm_atomic_helper_connector_set_property(struct drm_connector *connector, struct drm_property *property, uint64_t val);   107     int drm_atomic_helper_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb, struct drm_pending_vblank_event *event, uint32_t flags);   111     int drm_atomic_helper_connector_dpms(struct drm_connector *connector, int mode);   114     struct drm_encoder * drm_atomic_helper_best_encoder(struct drm_connector *connector);   118     void __drm_atomic_helper_crtc_duplicate_state(struct drm_crtc *crtc, struct drm_crtc_state *state);   122     void __drm_atomic_helper_crtc_destroy_state(struct drm_crtc_state *state);   127     void __drm_atomic_helper_plane_duplicate_state(struct drm_plane *plane, struct drm_plane_state *state);   131     void __drm_atomic_helper_plane_destroy_state(struct drm_plane_state *state);   135     void __drm_atomic_helper_connector_reset(struct drm_connector *connector, struct drm_connector_state *conn_state);   137     void drm_atomic_helper_connector_reset(struct drm_connector *connector);   139     void __drm_atomic_helper_connector_duplicate_state(struct drm_connector *connector, struct drm_connector_state *state);   142     struct drm_connector_state * drm_atomic_helper_connector_duplicate_state(struct drm_connector *connector);   144     struct drm_atomic_state * drm_atomic_helper_duplicate_state(struct drm_device *dev, struct drm_modeset_acquire_ctx *ctx);   147     void __drm_atomic_helper_connector_destroy_state(struct drm_connector_state *state);   148     void drm_atomic_helper_connector_destroy_state(struct drm_connector *connector, struct drm_connector_state *state);   150     void drm_atomic_helper_legacy_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green, u16 *blue, uint32_t start, uint32_t size);   183     void fence_release(struct kref *);   217     void fence_put(struct fence *fence);   325     long int fence_wait_timeout(struct fence *, bool , long);   342     long int fence_wait(struct fence *fence, bool intr);    63     void drm_atomic_helper_plane_changed(struct drm_atomic_state *state, struct drm_plane_state *plane_state, struct drm_plane *plane);    90     int handle_conflicting_encoders(struct drm_atomic_state *state, bool disable_conflicting_encoders);   191     void set_best_encoder(struct drm_atomic_state *state, struct drm_connector_state *conn_state, struct drm_encoder *encoder);   232     void steal_encoder(struct drm_atomic_state *state, struct drm_encoder *encoder);   262     int update_connector_routing(struct drm_atomic_state *state, struct drm_connector *connector, struct drm_connector_state *connector_state);   352     int mode_fixup(struct drm_atomic_state *state);   561     const char __kstrtab_drm_atomic_helper_check_modeset[32U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'c', 'h', 'e', 'c', 'k', '_', 'm', 'o', 'd', 'e', 's', 'e', 't', '\x0' };   561     const struct kernel_symbol __ksymtab_drm_atomic_helper_check_modeset;   561     const struct kernel_symbol __ksymtab_drm_atomic_helper_check_modeset = { (unsigned long)(&drm_atomic_helper_check_modeset), (const char *)(&__kstrtab_drm_atomic_helper_check_modeset) };   624     const char __kstrtab_drm_atomic_helper_check_planes[31U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'c', 'h', 'e', 'c', 'k', '_', 'p', 'l', 'a', 'n', 'e', 's', '\x0' };   624     const struct kernel_symbol __ksymtab_drm_atomic_helper_check_planes;   624     const struct kernel_symbol __ksymtab_drm_atomic_helper_check_planes = { (unsigned long)(&drm_atomic_helper_check_planes), (const char *)(&__kstrtab_drm_atomic_helper_check_planes) };   661     const char __kstrtab_drm_atomic_helper_check[24U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'c', 'h', 'e', 'c', 'k', '\x0' };   661     const struct kernel_symbol __ksymtab_drm_atomic_helper_check;   661     const struct kernel_symbol __ksymtab_drm_atomic_helper_check = { (unsigned long)(&drm_atomic_helper_check), (const char *)(&__kstrtab_drm_atomic_helper_check) };   664     void disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state);   824     const char __kstrtab_drm_atomic_helper_update_legacy_modeset_state[46U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'u', 'p', 'd', 'a', 't', 'e', '_', 'l', 'e', 'g', 'a', 'c', 'y', '_', 'm', 'o', 'd', 'e', 's', 'e', 't', '_', 's', 't', 'a', 't', 'e', '\x0' };   824     const struct kernel_symbol __ksymtab_drm_atomic_helper_update_legacy_modeset_state;   824     const struct kernel_symbol __ksymtab_drm_atomic_helper_update_legacy_modeset_state = { (unsigned long)(&drm_atomic_helper_update_legacy_modeset_state), (const char *)(&__kstrtab_drm_atomic_helper_update_legacy_modeset_state) };   827     void crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *old_state);   906     const char __kstrtab_drm_atomic_helper_commit_modeset_disables[42U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'c', 'o', 'm', 'm', 'i', 't', '_', 'm', 'o', 'd', 'e', 's', 'e', 't', '_', 'd', 'i', 's', 'a', 'b', 'l', 'e', 's', '\x0' };   906     const struct kernel_symbol __ksymtab_drm_atomic_helper_commit_modeset_disables;   906     const struct kernel_symbol __ksymtab_drm_atomic_helper_commit_modeset_disables = { (unsigned long)(&drm_atomic_helper_commit_modeset_disables), (const char *)(&__kstrtab_drm_atomic_helper_commit_modeset_disables) };   987     const char __kstrtab_drm_atomic_helper_commit_modeset_enables[41U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'c', 'o', 'm', 'm', 'i', 't', '_', 'm', 'o', 'd', 'e', 's', 'e', 't', '_', 'e', 'n', 'a', 'b', 'l', 'e', 's', '\x0' };   987     const struct kernel_symbol __ksymtab_drm_atomic_helper_commit_modeset_enables;   987     const struct kernel_symbol __ksymtab_drm_atomic_helper_commit_modeset_enables = { (unsigned long)(&drm_atomic_helper_commit_modeset_enables), (const char *)(&__kstrtab_drm_atomic_helper_commit_modeset_enables) };  1017     const char __kstrtab_drm_atomic_helper_wait_for_fences[34U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'w', 'a', 'i', 't', '_', 'f', 'o', 'r', '_', 'f', 'e', 'n', 'c', 'e', 's', '\x0' };  1017     const struct kernel_symbol __ksymtab_drm_atomic_helper_wait_for_fences;  1017     const struct kernel_symbol __ksymtab_drm_atomic_helper_wait_for_fences = { (unsigned long)(&drm_atomic_helper_wait_for_fences), (const char *)(&__kstrtab_drm_atomic_helper_wait_for_fences) };  1052     const char __kstrtab_drm_atomic_helper_framebuffer_changed[38U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'f', 'r', 'a', 'm', 'e', 'b', 'u', 'f', 'f', 'e', 'r', '_', 'c', 'h', 'a', 'n', 'g', 'e', 'd', '\x0' };  1052     const struct kernel_symbol __ksymtab_drm_atomic_helper_framebuffer_changed;  1052     const struct kernel_symbol __ksymtab_drm_atomic_helper_framebuffer_changed = { (unsigned long)(&drm_atomic_helper_framebuffer_changed), (const char *)(&__kstrtab_drm_atomic_helper_framebuffer_changed) };  1113     const char __kstrtab_drm_atomic_helper_wait_for_vblanks[35U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'w', 'a', 'i', 't', '_', 'f', 'o', 'r', '_', 'v', 'b', 'l', 'a', 'n', 'k', 's', '\x0' };  1113     const struct kernel_symbol __ksymtab_drm_atomic_helper_wait_for_vblanks;  1113     const struct kernel_symbol __ksymtab_drm_atomic_helper_wait_for_vblanks = { (unsigned long)(&drm_atomic_helper_wait_for_vblanks), (const char *)(&__kstrtab_drm_atomic_helper_wait_for_vblanks) };  1197     const char __kstrtab_drm_atomic_helper_commit[25U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'c', 'o', 'm', 'm', 'i', 't', '\x0' };  1197     const struct kernel_symbol __ksymtab_drm_atomic_helper_commit;  1197     const struct kernel_symbol __ksymtab_drm_atomic_helper_commit = { (unsigned long)(&drm_atomic_helper_commit), (const char *)(&__kstrtab_drm_atomic_helper_commit) };  1292     const char __kstrtab_drm_atomic_helper_prepare_planes[33U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'p', 'r', 'e', 'p', 'a', 'r', 'e', '_', 'p', 'l', 'a', 'n', 'e', 's', '\x0' };  1292     const struct kernel_symbol __ksymtab_drm_atomic_helper_prepare_planes;  1292     const struct kernel_symbol __ksymtab_drm_atomic_helper_prepare_planes = { (unsigned long)(&drm_atomic_helper_prepare_planes), (const char *)(&__kstrtab_drm_atomic_helper_prepare_planes) };  1294     bool  plane_crtc_active(struct drm_plane_state *state);  1405     const char __kstrtab_drm_atomic_helper_commit_planes[32U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'c', 'o', 'm', 'm', 'i', 't', '_', 'p', 'l', 'a', 'n', 'e', 's', '\x0' };  1405     const struct kernel_symbol __ksymtab_drm_atomic_helper_commit_planes;  1405     const struct kernel_symbol __ksymtab_drm_atomic_helper_commit_planes = { (unsigned long)(&drm_atomic_helper_commit_planes), (const char *)(&__kstrtab_drm_atomic_helper_commit_planes) };  1463     const char __kstrtab_drm_atomic_helper_commit_planes_on_crtc[40U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'c', 'o', 'm', 'm', 'i', 't', '_', 'p', 'l', 'a', 'n', 'e', 's', '_', 'o', 'n', '_', 'c', 'r', 't', 'c', '\x0' };  1463     const struct kernel_symbol __ksymtab_drm_atomic_helper_commit_planes_on_crtc;  1463     const struct kernel_symbol __ksymtab_drm_atomic_helper_commit_planes_on_crtc = { (unsigned long)(&drm_atomic_helper_commit_planes_on_crtc), (const char *)(&__kstrtab_drm_atomic_helper_commit_planes_on_crtc) };  1506     const char __kstrtab_drm_atomic_helper_disable_planes_on_crtc[41U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'd', 'i', 's', 'a', 'b', 'l', 'e', '_', 'p', 'l', 'a', 'n', 'e', 's', '_', 'o', 'n', '_', 'c', 'r', 't', 'c', '\x0' };  1506     const struct kernel_symbol __ksymtab_drm_atomic_helper_disable_planes_on_crtc;  1506     const struct kernel_symbol __ksymtab_drm_atomic_helper_disable_planes_on_crtc = { (unsigned long)(&drm_atomic_helper_disable_planes_on_crtc), (const char *)(&__kstrtab_drm_atomic_helper_disable_planes_on_crtc) };  1536     const char __kstrtab_drm_atomic_helper_cleanup_planes[33U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'c', 'l', 'e', 'a', 'n', 'u', 'p', '_', 'p', 'l', 'a', 'n', 'e', 's', '\x0' };  1536     const struct kernel_symbol __ksymtab_drm_atomic_helper_cleanup_planes;  1536     const struct kernel_symbol __ksymtab_drm_atomic_helper_cleanup_planes = { (unsigned long)(&drm_atomic_helper_cleanup_planes), (const char *)(&__kstrtab_drm_atomic_helper_cleanup_planes) };  1601     const char __kstrtab_drm_atomic_helper_swap_state[29U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 's', 'w', 'a', 'p', '_', 's', 't', 'a', 't', 'e', '\x0' };  1601     const struct kernel_symbol __ksymtab_drm_atomic_helper_swap_state;  1601     const struct kernel_symbol __ksymtab_drm_atomic_helper_swap_state = { (unsigned long)(&drm_atomic_helper_swap_state), (const char *)(&__kstrtab_drm_atomic_helper_swap_state) };  1688     const char __kstrtab_drm_atomic_helper_update_plane[31U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'u', 'p', 'd', 'a', 't', 'e', '_', 'p', 'l', 'a', 'n', 'e', '\x0' };  1688     const struct kernel_symbol __ksymtab_drm_atomic_helper_update_plane;  1688     const struct kernel_symbol __ksymtab_drm_atomic_helper_update_plane = { (unsigned long)(&drm_atomic_helper_update_plane), (const char *)(&__kstrtab_drm_atomic_helper_update_plane) };  1761     const char __kstrtab_drm_atomic_helper_disable_plane[32U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'd', 'i', 's', 'a', 'b', 'l', 'e', '_', 'p', 'l', 'a', 'n', 'e', '\x0' };  1761     const struct kernel_symbol __ksymtab_drm_atomic_helper_disable_plane;  1761     const struct kernel_symbol __ksymtab_drm_atomic_helper_disable_plane = { (unsigned long)(&drm_atomic_helper_disable_plane), (const char *)(&__kstrtab_drm_atomic_helper_disable_plane) };  1786     int update_output_state(struct drm_atomic_state *state, struct drm_mode_set *set);  1901     const char __kstrtab_drm_atomic_helper_set_config[29U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 's', 'e', 't', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\x0' };  1901     const struct kernel_symbol __ksymtab_drm_atomic_helper_set_config;  1901     const struct kernel_symbol __ksymtab_drm_atomic_helper_set_config = { (unsigned long)(&drm_atomic_helper_set_config), (const char *)(&__kstrtab_drm_atomic_helper_set_config) };  2036     const char __kstrtab_drm_atomic_helper_disable_all[30U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'd', 'i', 's', 'a', 'b', 'l', 'e', '_', 'a', 'l', 'l', '\x0' };  2036     const struct kernel_symbol __ksymtab_drm_atomic_helper_disable_all;  2036     const struct kernel_symbol __ksymtab_drm_atomic_helper_disable_all = { (unsigned long)(&drm_atomic_helper_disable_all), (const char *)(&__kstrtab_drm_atomic_helper_disable_all) };  2099     const char __kstrtab_drm_atomic_helper_suspend[26U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 's', 'u', 's', 'p', 'e', 'n', 'd', '\x0' };  2099     const struct kernel_symbol __ksymtab_drm_atomic_helper_suspend;  2099     const struct kernel_symbol __ksymtab_drm_atomic_helper_suspend = { (unsigned long)(&drm_atomic_helper_suspend), (const char *)(&__kstrtab_drm_atomic_helper_suspend) };  2131     const char __kstrtab_drm_atomic_helper_resume[25U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'r', 'e', 's', 'u', 'm', 'e', '\x0' };  2131     const struct kernel_symbol __ksymtab_drm_atomic_helper_resume;  2131     const struct kernel_symbol __ksymtab_drm_atomic_helper_resume = { (unsigned long)(&drm_atomic_helper_resume), (const char *)(&__kstrtab_drm_atomic_helper_resume) };  2191     const char __kstrtab_drm_atomic_helper_crtc_set_property[36U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'c', 'r', 't', 'c', '_', 's', 'e', 't', '_', 'p', 'r', 'o', 'p', 'e', 'r', 't', 'y', '\x0' };  2191     const struct kernel_symbol __ksymtab_drm_atomic_helper_crtc_set_property;  2191     const struct kernel_symbol __ksymtab_drm_atomic_helper_crtc_set_property = { (unsigned long)(&drm_atomic_helper_crtc_set_property), (const char *)(&__kstrtab_drm_atomic_helper_crtc_set_property) };  2251     const char __kstrtab_drm_atomic_helper_plane_set_property[37U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'p', 'l', 'a', 'n', 'e', '_', 's', 'e', 't', '_', 'p', 'r', 'o', 'p', 'e', 'r', 't', 'y', '\x0' };  2251     const struct kernel_symbol __ksymtab_drm_atomic_helper_plane_set_property;  2251     const struct kernel_symbol __ksymtab_drm_atomic_helper_plane_set_property = { (unsigned long)(&drm_atomic_helper_plane_set_property), (const char *)(&__kstrtab_drm_atomic_helper_plane_set_property) };  2311     const char __kstrtab_drm_atomic_helper_connector_set_property[41U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'o', 'r', '_', 's', 'e', 't', '_', 'p', 'r', 'o', 'p', 'e', 'r', 't', 'y', '\x0' };  2311     const struct kernel_symbol __ksymtab_drm_atomic_helper_connector_set_property;  2311     const struct kernel_symbol __ksymtab_drm_atomic_helper_connector_set_property = { (unsigned long)(&drm_atomic_helper_connector_set_property), (const char *)(&__kstrtab_drm_atomic_helper_connector_set_property) };  2402     const char __kstrtab_drm_atomic_helper_page_flip[28U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'p', 'a', 'g', 'e', '_', 'f', 'l', 'i', 'p', '\x0' };  2402     const struct kernel_symbol __ksymtab_drm_atomic_helper_page_flip;  2402     const struct kernel_symbol __ksymtab_drm_atomic_helper_page_flip = { (unsigned long)(&drm_atomic_helper_page_flip), (const char *)(&__kstrtab_drm_atomic_helper_page_flip) };  2483     const char __kstrtab_drm_atomic_helper_connector_dpms[33U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'o', 'r', '_', 'd', 'p', 'm', 's', '\x0' };  2483     const struct kernel_symbol __ksymtab_drm_atomic_helper_connector_dpms;  2483     const struct kernel_symbol __ksymtab_drm_atomic_helper_connector_dpms = { (unsigned long)(&drm_atomic_helper_connector_dpms), (const char *)(&__kstrtab_drm_atomic_helper_connector_dpms) };  2500     const char __kstrtab_drm_atomic_helper_best_encoder[31U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'b', 'e', 's', 't', '_', 'e', 'n', 'c', 'o', 'd', 'e', 'r', '\x0' };  2500     const struct kernel_symbol __ksymtab_drm_atomic_helper_best_encoder;  2500     const struct kernel_symbol __ksymtab_drm_atomic_helper_best_encoder = { (unsigned long)(&drm_atomic_helper_best_encoder), (const char *)(&__kstrtab_drm_atomic_helper_best_encoder) };  2541     const char __kstrtab_drm_atomic_helper_crtc_reset[29U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'c', 'r', 't', 'c', '_', 'r', 'e', 's', 'e', 't', '\x0' };  2541     const struct kernel_symbol __ksymtab_drm_atomic_helper_crtc_reset;  2541     const struct kernel_symbol __ksymtab_drm_atomic_helper_crtc_reset = { (unsigned long)(&drm_atomic_helper_crtc_reset), (const char *)(&__kstrtab_drm_atomic_helper_crtc_reset) };  2571     const char __kstrtab___drm_atomic_helper_crtc_duplicate_state[41U] = { '_', '_', 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'c', 'r', 't', 'c', '_', 'd', 'u', 'p', 'l', 'i', 'c', 'a', 't', 'e', '_', 's', 't', 'a', 't', 'e', '\x0' };  2571     const struct kernel_symbol __ksymtab___drm_atomic_helper_crtc_duplicate_state;  2571     const struct kernel_symbol __ksymtab___drm_atomic_helper_crtc_duplicate_state = { (unsigned long)(&__drm_atomic_helper_crtc_duplicate_state), (const char *)(&__kstrtab___drm_atomic_helper_crtc_duplicate_state) };  2594     const char __kstrtab_drm_atomic_helper_crtc_duplicate_state[39U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'c', 'r', 't', 'c', '_', 'd', 'u', 'p', 'l', 'i', 'c', 'a', 't', 'e', '_', 's', 't', 'a', 't', 'e', '\x0' };  2594     const struct kernel_symbol __ksymtab_drm_atomic_helper_crtc_duplicate_state;  2594     const struct kernel_symbol __ksymtab_drm_atomic_helper_crtc_duplicate_state = { (unsigned long)(&drm_atomic_helper_crtc_duplicate_state), (const char *)(&__kstrtab_drm_atomic_helper_crtc_duplicate_state) };  2611     const char __kstrtab___drm_atomic_helper_crtc_destroy_state[39U] = { '_', '_', 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'c', 'r', 't', 'c', '_', 'd', 'e', 's', 't', 'r', 'o', 'y', '_', 's', 't', 'a', 't', 'e', '\x0' };  2611     const struct kernel_symbol __ksymtab___drm_atomic_helper_crtc_destroy_state;  2611     const struct kernel_symbol __ksymtab___drm_atomic_helper_crtc_destroy_state = { (unsigned long)(&__drm_atomic_helper_crtc_destroy_state), (const char *)(&__kstrtab___drm_atomic_helper_crtc_destroy_state) };  2627     const char __kstrtab_drm_atomic_helper_crtc_destroy_state[37U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'c', 'r', 't', 'c', '_', 'd', 'e', 's', 't', 'r', 'o', 'y', '_', 's', 't', 'a', 't', 'e', '\x0' };  2627     const struct kernel_symbol __ksymtab_drm_atomic_helper_crtc_destroy_state;  2627     const struct kernel_symbol __ksymtab_drm_atomic_helper_crtc_destroy_state = { (unsigned long)(&drm_atomic_helper_crtc_destroy_state), (const char *)(&__kstrtab_drm_atomic_helper_crtc_destroy_state) };  2649     const char __kstrtab_drm_atomic_helper_plane_reset[30U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'p', 'l', 'a', 'n', 'e', '_', 'r', 'e', 's', 'e', 't', '\x0' };  2649     const struct kernel_symbol __ksymtab_drm_atomic_helper_plane_reset;  2649     const struct kernel_symbol __ksymtab_drm_atomic_helper_plane_reset = { (unsigned long)(&drm_atomic_helper_plane_reset), (const char *)(&__kstrtab_drm_atomic_helper_plane_reset) };  2667     const char __kstrtab___drm_atomic_helper_plane_duplicate_state[42U] = { '_', '_', 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'p', 'l', 'a', 'n', 'e', '_', 'd', 'u', 'p', 'l', 'i', 'c', 'a', 't', 'e', '_', 's', 't', 'a', 't', 'e', '\x0' };  2667     const struct kernel_symbol __ksymtab___drm_atomic_helper_plane_duplicate_state;  2667     const struct kernel_symbol __ksymtab___drm_atomic_helper_plane_duplicate_state = { (unsigned long)(&__drm_atomic_helper_plane_duplicate_state), (const char *)(&__kstrtab___drm_atomic_helper_plane_duplicate_state) };  2690     const char __kstrtab_drm_atomic_helper_plane_duplicate_state[40U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'p', 'l', 'a', 'n', 'e', '_', 'd', 'u', 'p', 'l', 'i', 'c', 'a', 't', 'e', '_', 's', 't', 'a', 't', 'e', '\x0' };  2690     const struct kernel_symbol __ksymtab_drm_atomic_helper_plane_duplicate_state;  2690     const struct kernel_symbol __ksymtab_drm_atomic_helper_plane_duplicate_state = { (unsigned long)(&drm_atomic_helper_plane_duplicate_state), (const char *)(&__kstrtab_drm_atomic_helper_plane_duplicate_state) };  2705     const char __kstrtab___drm_atomic_helper_plane_destroy_state[40U] = { '_', '_', 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'p', 'l', 'a', 'n', 'e', '_', 'd', 'e', 's', 't', 'r', 'o', 'y', '_', 's', 't', 'a', 't', 'e', '\x0' };  2705     const struct kernel_symbol __ksymtab___drm_atomic_helper_plane_destroy_state;  2705     const struct kernel_symbol __ksymtab___drm_atomic_helper_plane_destroy_state = { (unsigned long)(&__drm_atomic_helper_plane_destroy_state), (const char *)(&__kstrtab___drm_atomic_helper_plane_destroy_state) };  2721     const char __kstrtab_drm_atomic_helper_plane_destroy_state[38U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'p', 'l', 'a', 'n', 'e', '_', 'd', 'e', 's', 't', 'r', 'o', 'y', '_', 's', 't', 'a', 't', 'e', '\x0' };  2721     const struct kernel_symbol __ksymtab_drm_atomic_helper_plane_destroy_state;  2721     const struct kernel_symbol __ksymtab_drm_atomic_helper_plane_destroy_state = { (unsigned long)(&drm_atomic_helper_plane_destroy_state), (const char *)(&__kstrtab_drm_atomic_helper_plane_destroy_state) };  2743     const char __kstrtab___drm_atomic_helper_connector_reset[36U] = { '_', '_', 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'o', 'r', '_', 'r', 'e', 's', 'e', 't', '\x0' };  2743     const struct kernel_symbol __ksymtab___drm_atomic_helper_connector_reset;  2743     const struct kernel_symbol __ksymtab___drm_atomic_helper_connector_reset = { (unsigned long)(&__drm_atomic_helper_connector_reset), (const char *)(&__kstrtab___drm_atomic_helper_connector_reset) };  2764     const char __kstrtab_drm_atomic_helper_connector_reset[34U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'o', 'r', '_', 'r', 'e', 's', 'e', 't', '\x0' };  2764     const struct kernel_symbol __ksymtab_drm_atomic_helper_connector_reset;  2764     const struct kernel_symbol __ksymtab_drm_atomic_helper_connector_reset = { (unsigned long)(&drm_atomic_helper_connector_reset), (const char *)(&__kstrtab_drm_atomic_helper_connector_reset) };  2782     const char __kstrtab___drm_atomic_helper_connector_duplicate_state[46U] = { '_', '_', 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'o', 'r', '_', 'd', 'u', 'p', 'l', 'i', 'c', 'a', 't', 'e', '_', 's', 't', 'a', 't', 'e', '\x0' };  2782     const struct kernel_symbol __ksymtab___drm_atomic_helper_connector_duplicate_state;  2782     const struct kernel_symbol __ksymtab___drm_atomic_helper_connector_duplicate_state = { (unsigned long)(&__drm_atomic_helper_connector_duplicate_state), (const char *)(&__kstrtab___drm_atomic_helper_connector_duplicate_state) };  2805     const char __kstrtab_drm_atomic_helper_connector_duplicate_state[44U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'o', 'r', '_', 'd', 'u', 'p', 'l', 'i', 'c', 'a', 't', 'e', '_', 's', 't', 'a', 't', 'e', '\x0' };  2805     const struct kernel_symbol __ksymtab_drm_atomic_helper_connector_duplicate_state;  2805     const struct kernel_symbol __ksymtab_drm_atomic_helper_connector_duplicate_state = { (unsigned long)(&drm_atomic_helper_connector_duplicate_state), (const char *)(&__kstrtab_drm_atomic_helper_connector_duplicate_state) };  2888     const char __kstrtab_drm_atomic_helper_duplicate_state[34U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'd', 'u', 'p', 'l', 'i', 'c', 'a', 't', 'e', '_', 's', 't', 'a', 't', 'e', '\x0' };  2888     const struct kernel_symbol __ksymtab_drm_atomic_helper_duplicate_state;  2888     const struct kernel_symbol __ksymtab_drm_atomic_helper_duplicate_state = { (unsigned long)(&drm_atomic_helper_duplicate_state), (const char *)(&__kstrtab_drm_atomic_helper_duplicate_state) };  2909     const char __kstrtab___drm_atomic_helper_connector_destroy_state[44U] = { '_', '_', 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'o', 'r', '_', 'd', 'e', 's', 't', 'r', 'o', 'y', '_', 's', 't', 'a', 't', 'e', '\x0' };  2909     const struct kernel_symbol __ksymtab___drm_atomic_helper_connector_destroy_state;  2909     const struct kernel_symbol __ksymtab___drm_atomic_helper_connector_destroy_state = { (unsigned long)(&__drm_atomic_helper_connector_destroy_state), (const char *)(&__kstrtab___drm_atomic_helper_connector_destroy_state) };  2925     const char __kstrtab_drm_atomic_helper_connector_destroy_state[42U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'o', 'r', '_', 'd', 'e', 's', 't', 'r', 'o', 'y', '_', 's', 't', 'a', 't', 'e', '\x0' };  2925     const struct kernel_symbol __ksymtab_drm_atomic_helper_connector_destroy_state;  2925     const struct kernel_symbol __ksymtab_drm_atomic_helper_connector_destroy_state = { (unsigned long)(&drm_atomic_helper_connector_destroy_state), (const char *)(&__kstrtab_drm_atomic_helper_connector_destroy_state) };  3020     const char __kstrtab_drm_atomic_helper_legacy_gamma_set[35U] = { 'd', 'r', 'm', '_', 'a', 't', 'o', 'm', 'i', 'c', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'l', 'e', 'g', 'a', 'c', 'y', '_', 'g', 'a', 'm', 'm', 'a', '_', 's', 'e', 't', '\x0' };  3020     const struct kernel_symbol __ksymtab_drm_atomic_helper_legacy_gamma_set;  3020     const struct kernel_symbol __ksymtab_drm_atomic_helper_legacy_gamma_set = { (unsigned long)(&drm_atomic_helper_legacy_gamma_set), (const char *)(&__kstrtab_drm_atomic_helper_legacy_gamma_set) };   229     int drm_fb_helper_modinit();    35     int drm_dp_aux_dev_init();    36     void drm_dp_aux_dev_exit();    37     int drm_kms_helper_init();    54     void drm_kms_helper_exit();   100     void ldv_main6_sequence_infinite_withcheck_stateful();    69     int i2c_transfer(struct i2c_adapter *, struct i2c_msg *, int);    60     ssize_t  drm_dp_dual_mode_read(struct i2c_adapter *adapter, u8 offset, void *buffer, size_t size);    62     ssize_t  drm_dp_dual_mode_write(struct i2c_adapter *adapter, u8 offset, const void *buffer, size_t size);    83     enum drm_dp_dual_mode_type  drm_dp_dual_mode_detect(struct i2c_adapter *adapter);    84     int drm_dp_dual_mode_max_tmds_clock(enum drm_dp_dual_mode_type type, struct i2c_adapter *adapter);    86     int drm_dp_dual_mode_get_tmds_output(enum drm_dp_dual_mode_type type, struct i2c_adapter *adapter, bool *enabled);    88     int drm_dp_dual_mode_set_tmds_output(enum drm_dp_dual_mode_type type, struct i2c_adapter *adapter, bool enable);    90     const char * drm_dp_get_dual_mode_type_name(enum drm_dp_dual_mode_type type);    88     const char __kstrtab_drm_dp_dual_mode_read[22U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'd', 'u', 'a', 'l', '_', 'm', 'o', 'd', 'e', '_', 'r', 'e', 'a', 'd', '\x0' };    88     const struct kernel_symbol __ksymtab_drm_dp_dual_mode_read;    88     const struct kernel_symbol __ksymtab_drm_dp_dual_mode_read = { (unsigned long)(&drm_dp_dual_mode_read), (const char *)(&__kstrtab_drm_dp_dual_mode_read) };   135     const char __kstrtab_drm_dp_dual_mode_write[23U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'd', 'u', 'a', 'l', '_', 'm', 'o', 'd', 'e', '_', 'w', 'r', 'i', 't', 'e', '\x0' };   135     const struct kernel_symbol __ksymtab_drm_dp_dual_mode_write;   135     const struct kernel_symbol __ksymtab_drm_dp_dual_mode_write = { (unsigned long)(&drm_dp_dual_mode_write), (const char *)(&__kstrtab_drm_dp_dual_mode_write) };   137     bool  is_hdmi_adaptor(const char *hdmi_id);   146     bool  is_type2_adaptor(uint8_t adaptor_id);   220     const char __kstrtab_drm_dp_dual_mode_detect[24U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'd', 'u', 'a', 'l', '_', 'm', 'o', 'd', 'e', '_', 'd', 'e', 't', 'e', 'c', 't', '\x0' };   220     const struct kernel_symbol __ksymtab_drm_dp_dual_mode_detect;   220     const struct kernel_symbol __ksymtab_drm_dp_dual_mode_detect = { (unsigned long)(&drm_dp_dual_mode_detect), (const char *)(&__kstrtab_drm_dp_dual_mode_detect) };   263     const char __kstrtab_drm_dp_dual_mode_max_tmds_clock[32U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'd', 'u', 'a', 'l', '_', 'm', 'o', 'd', 'e', '_', 'm', 'a', 'x', '_', 't', 'm', 'd', 's', '_', 'c', 'l', 'o', 'c', 'k', '\x0' };   263     const struct kernel_symbol __ksymtab_drm_dp_dual_mode_max_tmds_clock;   263     const struct kernel_symbol __ksymtab_drm_dp_dual_mode_max_tmds_clock = { (unsigned long)(&drm_dp_dual_mode_max_tmds_clock), (const char *)(&__kstrtab_drm_dp_dual_mode_max_tmds_clock) };   304     const char __kstrtab_drm_dp_dual_mode_get_tmds_output[33U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'd', 'u', 'a', 'l', '_', 'm', 'o', 'd', 'e', '_', 'g', 'e', 't', '_', 't', 'm', 'd', 's', '_', 'o', 'u', 't', 'p', 'u', 't', '\x0' };   304     const struct kernel_symbol __ksymtab_drm_dp_dual_mode_get_tmds_output;   304     const struct kernel_symbol __ksymtab_drm_dp_dual_mode_get_tmds_output = { (unsigned long)(&drm_dp_dual_mode_get_tmds_output), (const char *)(&__kstrtab_drm_dp_dual_mode_get_tmds_output) };   340     const char __kstrtab_drm_dp_dual_mode_set_tmds_output[33U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'd', 'u', 'a', 'l', '_', 'm', 'o', 'd', 'e', '_', 's', 'e', 't', '_', 't', 'm', 'd', 's', '_', 'o', 'u', 't', 'p', 'u', 't', '\x0' };   340     const struct kernel_symbol __ksymtab_drm_dp_dual_mode_set_tmds_output;   340     const struct kernel_symbol __ksymtab_drm_dp_dual_mode_set_tmds_output = { (unsigned long)(&drm_dp_dual_mode_set_tmds_output), (const char *)(&__kstrtab_drm_dp_dual_mode_set_tmds_output) };   367     const char __kstrtab_drm_dp_get_dual_mode_type_name[31U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'g', 'e', 't', '_', 'd', 'u', 'a', 'l', '_', 'm', 'o', 'd', 'e', '_', 't', 'y', 'p', 'e', '_', 'n', 'a', 'm', 'e', '\x0' };   367     const struct kernel_symbol __ksymtab_drm_dp_get_dual_mode_type_name;   367     const struct kernel_symbol __ksymtab_drm_dp_get_dual_mode_type_name = { (unsigned long)(&drm_dp_get_dual_mode_type_name), (const char *)(&__kstrtab_drm_dp_get_dual_mode_type_name) };   406     void ldv_main7_sequence_infinite_withcheck_stateful();   154     int printk(const char *, ...);     4     bool  ldv_is_err_or_null(const void *ptr);    63     size_t  strlen(const char *);    45     int strncmp(const char *, const char *, __kernel_size_t );    54     char * strchr(const char *, int);    90     char * strsep(char **, const char *);   122     char * kstrdup(const char *, gfp_t );   125     void * kmemdup(const void *, size_t , gfp_t );   137     int match_string(const const char **, size_t , const char *);    50     bool  IS_ERR_OR_NULL(const void *ptr);    54     void * ERR_CAST(const void *ptr);    42     int request_firmware(const struct firmware **, const char *, struct device *);    51     void release_firmware(const struct firmware *);   153     void * krealloc(const void *, size_t , gfp_t );    46     void platform_device_unregister(struct platform_device *);    78     struct platform_device * platform_device_register_full(const struct platform_device_info *);    95     struct platform_device * platform_device_register_resndata(struct device *parent, const char *name, int id, const struct resource *res, unsigned int num, const void *data, size_t size);   136     struct platform_device * platform_device_register_simple(const char *name, int id, const struct resource *res, unsigned int num);  2511     bool  drm_edid_block_valid(u8 *, int, bool , bool *);    29     char edid_firmware[4096U] = {  };    35     const const char *generic_edid_name[6U] = { "edid/800x600.bin", "edid/1024x768.bin", "edid/1280x1024.bin", "edid/1600x1200.bin", "edid/1680x1050.bin", "edid/1920x1080.bin" };    44     const u8 generic_edid[6U][128U] = { { 0U, 255U, 255U, 255U, 255U, 255U, 255U, 0U, 49U, 216U, 0U, 0U, 0U, 0U, 0U, 0U, 5U, 22U, 1U, 3U, 109U, 27U, 20U, 120U, 234U, 94U, 192U, 164U, 89U, 74U, 152U, 37U, 32U, 80U, 84U, 1U, 0U, 0U, 69U, 64U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 160U, 15U, 32U, 0U, 49U, 88U, 28U, 32U, 40U, 128U, 20U, 0U, 21U, 208U, 16U, 0U, 0U, 30U, 0U, 0U, 0U, 255U, 0U, 76U, 105U, 110U, 117U, 120U, 32U, 35U, 48U, 10U, 32U, 32U, 32U, 32U, 0U, 0U, 0U, 253U, 0U, 59U, 61U, 36U, 38U, 5U, 0U, 10U, 32U, 32U, 32U, 32U, 32U, 32U, 0U, 0U, 0U, 252U, 0U, 76U, 105U, 110U, 117U, 120U, 32U, 83U, 86U, 71U, 65U, 10U, 32U, 32U, 0U, 194U }, { 0U, 255U, 255U, 255U, 255U, 255U, 255U, 0U, 49U, 216U, 0U, 0U, 0U, 0U, 0U, 0U, 5U, 22U, 1U, 3U, 109U, 35U, 26U, 120U, 234U, 94U, 192U, 164U, 89U, 74U, 152U, 37U, 32U, 80U, 84U, 0U, 8U, 0U, 97U, 64U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 100U, 25U, 0U, 64U, 65U, 0U, 38U, 48U, 8U, 144U, 54U, 0U, 99U, 10U, 17U, 0U, 0U, 24U, 0U, 0U, 0U, 255U, 0U, 76U, 105U, 110U, 117U, 120U, 32U, 35U, 48U, 10U, 32U, 32U, 32U, 32U, 0U, 0U, 0U, 253U, 0U, 59U, 61U, 47U, 49U, 7U, 0U, 10U, 32U, 32U, 32U, 32U, 32U, 32U, 0U, 0U, 0U, 252U, 0U, 76U, 105U, 110U, 117U, 120U, 32U, 88U, 71U, 65U, 10U, 32U, 32U, 32U, 0U, 85U }, { 0U, 255U, 255U, 255U, 255U, 255U, 255U, 0U, 49U, 216U, 0U, 0U, 0U, 0U, 0U, 0U, 5U, 22U, 1U, 3U, 109U, 44U, 35U, 120U, 234U, 94U, 192U, 164U, 89U, 74U, 152U, 37U, 32U, 80U, 84U, 0U, 0U, 0U, 129U, 128U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 48U, 42U, 0U, 152U, 81U, 0U, 42U, 64U, 48U, 112U, 19U, 0U, 188U, 99U, 17U, 0U, 0U, 30U, 0U, 0U, 0U, 255U, 0U, 76U, 105U, 110U, 117U, 120U, 32U, 35U, 48U, 10U, 32U, 32U, 32U, 32U, 0U, 0U, 0U, 253U, 0U, 59U, 61U, 62U, 64U, 11U, 0U, 10U, 32U, 32U, 32U, 32U, 32U, 32U, 0U, 0U, 0U, 252U, 0U, 76U, 105U, 110U, 117U, 120U, 32U, 83U, 88U, 71U, 65U, 10U, 32U, 32U, 0U, 160U }, { 0U, 255U, 255U, 255U, 255U, 255U, 255U, 0U, 49U, 216U, 0U, 0U, 0U, 0U, 0U, 0U, 5U, 22U, 1U, 3U, 109U, 55U, 41U, 120U, 234U, 94U, 192U, 164U, 89U, 74U, 152U, 37U, 32U, 80U, 84U, 0U, 0U, 0U, 169U, 64U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 72U, 63U, 64U, 48U, 98U, 176U, 50U, 64U, 64U, 192U, 19U, 0U, 43U, 160U, 33U, 0U, 0U, 30U, 0U, 0U, 0U, 255U, 0U, 76U, 105U, 110U, 117U, 120U, 32U, 35U, 48U, 10U, 32U, 32U, 32U, 32U, 0U, 0U, 0U, 253U, 0U, 59U, 61U, 74U, 76U, 17U, 0U, 10U, 32U, 32U, 32U, 32U, 32U, 32U, 0U, 0U, 0U, 252U, 0U, 76U, 105U, 110U, 117U, 120U, 32U, 85U, 88U, 71U, 65U, 10U, 32U, 32U, 0U, 157U }, { 0U, 255U, 255U, 255U, 255U, 255U, 255U, 0U, 49U, 216U, 0U, 0U, 0U, 0U, 0U, 0U, 5U, 22U, 1U, 3U, 109U, 43U, 27U, 120U, 234U, 94U, 192U, 164U, 89U, 74U, 152U, 37U, 32U, 80U, 84U, 0U, 0U, 0U, 179U, 0U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 33U, 57U, 144U, 48U, 98U, 26U, 39U, 64U, 104U, 176U, 54U, 0U, 181U, 17U, 17U, 0U, 0U, 30U, 0U, 0U, 0U, 255U, 0U, 76U, 105U, 110U, 117U, 120U, 32U, 35U, 48U, 10U, 32U, 32U, 32U, 32U, 0U, 0U, 0U, 253U, 0U, 59U, 61U, 64U, 66U, 15U, 0U, 10U, 32U, 32U, 32U, 32U, 32U, 32U, 0U, 0U, 0U, 252U, 0U, 76U, 105U, 110U, 117U, 120U, 32U, 87U, 83U, 88U, 71U, 65U, 10U, 32U, 0U, 38U }, { 0U, 255U, 255U, 255U, 255U, 255U, 255U, 0U, 49U, 216U, 0U, 0U, 0U, 0U, 0U, 0U, 5U, 22U, 1U, 3U, 109U, 50U, 28U, 120U, 234U, 94U, 192U, 164U, 89U, 74U, 152U, 37U, 32U, 80U, 84U, 0U, 0U, 0U, 209U, 192U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 1U, 2U, 58U, 128U, 24U, 113U, 56U, 45U, 64U, 88U, 44U, 69U, 0U, 244U, 25U, 17U, 0U, 0U, 30U, 0U, 0U, 0U, 255U, 0U, 76U, 105U, 110U, 117U, 120U, 32U, 35U, 48U, 10U, 32U, 32U, 32U, 32U, 0U, 0U, 0U, 253U, 0U, 59U, 61U, 66U, 68U, 15U, 0U, 10U, 32U, 32U, 32U, 32U, 32U, 32U, 0U, 0U, 0U, 252U, 0U, 76U, 105U, 110U, 117U, 120U, 32U, 70U, 72U, 68U, 10U, 32U, 32U, 32U, 0U, 5U } };   155     int edid_size(const u8 *edid, int data_size);   163     void * edid_load(struct drm_connector *connector, const char *name, const char *connector_name);    47     int register_sysrq_key(int, struct sysrq_key_op *);    48     int unregister_sysrq_key(int, struct sysrq_key_op *);    25     void INIT_LIST_HEAD___3(struct list_head *list);   187     int list_empty___2(const struct list_head *head);    87     void __bad_percpu_size();   295     void __bad_size_call_parameter();    24     int atomic_read___4(const atomic_t *v);    93     void __raw_spin_lock_init(raw_spinlock_t *, const char *, struct lock_class_key *);    34     unsigned long int _raw_spin_lock_irqsave(raw_spinlock_t *);    45     void _raw_spin_unlock_irqrestore(raw_spinlock_t *, unsigned long);   289     raw_spinlock_t * spinlock_check(spinlock_t *lock);   360     void spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags);   128     int mutex_is_locked___4(struct mutex *lock);    28     extern int cpu_number;   318     extern struct __anonstruct_atomic_t_6 kgdb_active;  1141     void _dev_info(const struct device *, const char *, ...);   527     struct apertures_struct * alloc_apertures(unsigned int max_num);   617     void cfb_fillrect(struct fb_info *, const struct fb_fillrect *);   618     void cfb_copyarea(struct fb_info *, const struct fb_copyarea *);   619     void cfb_imageblit(struct fb_info *, const struct fb_image *);   623     void sys_fillrect(struct fb_info *, const struct fb_fillrect *);   624     void sys_copyarea(struct fb_info *, const struct fb_copyarea *);   625     void sys_imageblit(struct fb_info *, const struct fb_image *);   626     ssize_t  fb_sys_read(struct fb_info *, char *, size_t , loff_t *);   628     ssize_t  fb_sys_write(struct fb_info *, const char *, size_t , loff_t *);   632     int register_framebuffer(struct fb_info *);   633     int unregister_framebuffer(struct fb_info *);   634     int unlink_framebuffer(struct fb_info *);   643     void fb_set_suspend(struct fb_info *, int);   705     struct fb_info * framebuffer_alloc(size_t , struct device *);   706     void framebuffer_release(struct fb_info *);   774     int fb_alloc_cmap(struct fb_cmap *, int, int);   776     void fb_dealloc_cmap(struct fb_cmap *);   373     bool  ww_mutex_is_locked___3(struct ww_mutex *lock);   117     bool  drm_modeset_is_locked___3(struct drm_modeset_lock *lock);  2320     void drm_plane_force_disable(struct drm_plane *);  2459     int drm_mode_set_config_internal(struct drm_mode_set *);  2523     struct drm_display_mode * drm_mode_find_dmt(struct drm_device *, int, int, int, bool );  2537     int drm_mode_plane_set_obj_prop(struct drm_plane *, struct drm_property *, uint64_t );  2693     void assert_drm_connector_list_read_locked___3(struct drm_mode_config *mode_config);   880     int drm_core_check_feature(struct drm_device *dev, int feature);   230     void drm_fb_helper_prepare(struct drm_device *dev, struct drm_fb_helper *helper, const struct drm_fb_helper_funcs *funcs);   232     int drm_fb_helper_init(struct drm_device *dev, struct drm_fb_helper *fb_helper, int crtc_count, int max_conn_count);   235     void drm_fb_helper_fini(struct drm_fb_helper *fb_helper);   236     int drm_fb_helper_blank(int blank, struct fb_info *info);   237     int drm_fb_helper_pan_display(struct fb_var_screeninfo *var, struct fb_info *info);   239     int drm_fb_helper_set_par(struct fb_info *info);   240     int drm_fb_helper_check_var(struct fb_var_screeninfo *var, struct fb_info *info);   243     int drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper);   245     struct fb_info * drm_fb_helper_alloc_fbi(struct drm_fb_helper *fb_helper);   246     void drm_fb_helper_unregister_fbi(struct drm_fb_helper *fb_helper);   247     void drm_fb_helper_release_fbi(struct drm_fb_helper *fb_helper);   248     void drm_fb_helper_fill_var(struct fb_info *info, struct drm_fb_helper *fb_helper, uint32_t fb_width, uint32_t fb_height);   250     void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch, uint32_t depth);   253     void drm_fb_helper_unlink_fbi(struct drm_fb_helper *fb_helper);   255     void drm_fb_helper_deferred_io(struct fb_info *info, struct list_head *pagelist);   258     ssize_t  drm_fb_helper_sys_read(struct fb_info *info, char *buf, size_t count, loff_t *ppos);   260     ssize_t  drm_fb_helper_sys_write(struct fb_info *info, const char *buf, size_t count, loff_t *ppos);   263     void drm_fb_helper_sys_fillrect(struct fb_info *info, const struct fb_fillrect *rect);   265     void drm_fb_helper_sys_copyarea(struct fb_info *info, const struct fb_copyarea *area);   267     void drm_fb_helper_sys_imageblit(struct fb_info *info, const struct fb_image *image);   270     void drm_fb_helper_cfb_fillrect(struct fb_info *info, const struct fb_fillrect *rect);   272     void drm_fb_helper_cfb_copyarea(struct fb_info *info, const struct fb_copyarea *area);   274     void drm_fb_helper_cfb_imageblit(struct fb_info *info, const struct fb_image *image);   277     void drm_fb_helper_set_suspend(struct drm_fb_helper *fb_helper, int state);   279     int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info);   281     int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper);   282     int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel);   283     int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper);   284     int drm_fb_helper_debug_enter(struct fb_info *info);   285     int drm_fb_helper_debug_leave(struct fb_info *info);   287     struct drm_display_mode * drm_has_preferred_mode(struct drm_fb_helper_connector *fb_connector, int width, int height);   290     struct drm_display_mode * drm_pick_cmdline_mode(struct drm_fb_helper_connector *fb_helper_conn, int width, int height);   293     int drm_fb_helper_add_one_connector(struct drm_fb_helper *fb_helper, struct drm_connector *connector);   294     int drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper, struct drm_connector *connector);   136     void drm_atomic_clean_old_fb(struct drm_device *, unsigned int, int);    45     _Bool drm_fbdev_emulation = 1;    50     struct list_head kernel_fb_helper_list = { &kernel_fb_helper_list, &kernel_fb_helper_list };   141     const char __kstrtab_drm_fb_helper_single_add_all_connectors[40U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 's', 'i', 'n', 'g', 'l', 'e', '_', 'a', 'd', 'd', '_', 'a', 'l', 'l', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'o', 'r', 's', '\x0' };   141     const struct kernel_symbol __ksymtab_drm_fb_helper_single_add_all_connectors;   141     const struct kernel_symbol __ksymtab_drm_fb_helper_single_add_all_connectors = { (unsigned long)(&drm_fb_helper_single_add_all_connectors), (const char *)(&__kstrtab_drm_fb_helper_single_add_all_connectors) };   171     const char __kstrtab_drm_fb_helper_add_one_connector[32U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'a', 'd', 'd', '_', 'o', 'n', 'e', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'o', 'r', '\x0' };   171     const struct kernel_symbol __ksymtab_drm_fb_helper_add_one_connector;   171     const struct kernel_symbol __ksymtab_drm_fb_helper_add_one_connector = { (unsigned long)(&drm_fb_helper_add_one_connector), (const char *)(&__kstrtab_drm_fb_helper_add_one_connector) };   202     const char __kstrtab_drm_fb_helper_remove_one_connector[35U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'r', 'e', 'm', 'o', 'v', 'e', '_', 'o', 'n', 'e', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'o', 'r', '\x0' };   202     const struct kernel_symbol __ksymtab_drm_fb_helper_remove_one_connector;   202     const struct kernel_symbol __ksymtab_drm_fb_helper_remove_one_connector = { (unsigned long)(&drm_fb_helper_remove_one_connector), (const char *)(&__kstrtab_drm_fb_helper_remove_one_connector) };   204     void drm_fb_helper_save_lut_atomic(struct drm_crtc *crtc, struct drm_fb_helper *helper);   220     void drm_fb_helper_restore_lut_atomic(struct drm_crtc *crtc);   264     const char __kstrtab_drm_fb_helper_debug_enter[26U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'd', 'e', 'b', 'u', 'g', '_', 'e', 'n', 't', 'e', 'r', '\x0' };   264     const struct kernel_symbol __ksymtab_drm_fb_helper_debug_enter;   264     const struct kernel_symbol __ksymtab_drm_fb_helper_debug_enter = { (unsigned long)(&drm_fb_helper_debug_enter), (const char *)(&__kstrtab_drm_fb_helper_debug_enter) };   267     struct drm_framebuffer * drm_mode_config_fb(struct drm_crtc *crtc);   313     const char __kstrtab_drm_fb_helper_debug_leave[26U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'd', 'e', 'b', 'u', 'g', '_', 'l', 'e', 'a', 'v', 'e', '\x0' };   313     const struct kernel_symbol __ksymtab_drm_fb_helper_debug_leave;   313     const struct kernel_symbol __ksymtab_drm_fb_helper_debug_leave = { (unsigned long)(&drm_fb_helper_debug_leave), (const char *)(&__kstrtab_drm_fb_helper_debug_leave) };   315     int restore_fbdev_mode_atomic(struct drm_fb_helper *fb_helper);   381     int restore_fbdev_mode(struct drm_fb_helper *fb_helper);   458     const char __kstrtab_drm_fb_helper_restore_fbdev_mode_unlocked[42U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'r', 'e', 's', 't', 'o', 'r', 'e', '_', 'f', 'b', 'd', 'e', 'v', '_', 'm', 'o', 'd', 'e', '_', 'u', 'n', 'l', 'o', 'c', 'k', 'e', 'd', '\x0' };   458     const struct kernel_symbol __ksymtab_drm_fb_helper_restore_fbdev_mode_unlocked;   458     const struct kernel_symbol __ksymtab_drm_fb_helper_restore_fbdev_mode_unlocked = { (unsigned long)(&drm_fb_helper_restore_fbdev_mode_unlocked), (const char *)(&__kstrtab_drm_fb_helper_restore_fbdev_mode_unlocked) };   460     bool  drm_fb_helper_is_bound(struct drm_fb_helper *fb_helper);   489     bool  drm_fb_helper_force_kernel_mode();   512     void drm_fb_helper_restore_work_fn(struct work_struct *ignored);   519     struct work_struct drm_fb_helper_restore_work = { { 137438953424L }, { &(drm_fb_helper_restore_work.entry), &(drm_fb_helper_restore_work.entry) }, &drm_fb_helper_restore_work_fn, { (struct lock_class_key *)(&drm_fb_helper_restore_work), { 0, 0 }, "drm_fb_helper_restore_work", 0, 0UL } };   521     void drm_fb_helper_sysrq(int dummy1);   526     struct sysrq_key_op sysrq_drm_fb_helper_restore_op = { &drm_fb_helper_sysrq, (char *)"force-fb(V)", (char *)"Restore framebuffer console", 0 };   535     void drm_fb_helper_dpms(struct fb_info *info, int dpms_mode);   603     const char __kstrtab_drm_fb_helper_blank[20U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'b', 'l', 'a', 'n', 'k', '\x0' };   603     const struct kernel_symbol __ksymtab_drm_fb_helper_blank;   603     const struct kernel_symbol __ksymtab_drm_fb_helper_blank = { (unsigned long)(&drm_fb_helper_blank), (const char *)(&__kstrtab_drm_fb_helper_blank) };   605     void drm_fb_helper_crtc_free(struct drm_fb_helper *helper);   622     void drm_fb_helper_dirty_work(struct work_struct *work);   658     const char __kstrtab_drm_fb_helper_prepare[22U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'p', 'r', 'e', 'p', 'a', 'r', 'e', '\x0' };   658     const struct kernel_symbol __ksymtab_drm_fb_helper_prepare;   658     const struct kernel_symbol __ksymtab_drm_fb_helper_prepare = { (unsigned long)(&drm_fb_helper_prepare), (const char *)(&__kstrtab_drm_fb_helper_prepare) };   727     const char __kstrtab_drm_fb_helper_init[19U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'i', 'n', 'i', 't', '\x0' };   727     const struct kernel_symbol __ksymtab_drm_fb_helper_init;   727     const struct kernel_symbol __ksymtab_drm_fb_helper_init = { (unsigned long)(&drm_fb_helper_init), (const char *)(&__kstrtab_drm_fb_helper_init) };   770     const char __kstrtab_drm_fb_helper_alloc_fbi[24U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'a', 'l', 'l', 'o', 'c', '_', 'f', 'b', 'i', '\x0' };   770     const struct kernel_symbol __ksymtab_drm_fb_helper_alloc_fbi;   770     const struct kernel_symbol __ksymtab_drm_fb_helper_alloc_fbi = { (unsigned long)(&drm_fb_helper_alloc_fbi), (const char *)(&__kstrtab_drm_fb_helper_alloc_fbi) };   784     const char __kstrtab_drm_fb_helper_unregister_fbi[29U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'u', 'n', 'r', 'e', 'g', 'i', 's', 't', 'e', 'r', '_', 'f', 'b', 'i', '\x0' };   784     const struct kernel_symbol __ksymtab_drm_fb_helper_unregister_fbi;   784     const struct kernel_symbol __ksymtab_drm_fb_helper_unregister_fbi = { (unsigned long)(&drm_fb_helper_unregister_fbi), (const char *)(&__kstrtab_drm_fb_helper_unregister_fbi) };   807     const char __kstrtab_drm_fb_helper_release_fbi[26U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'r', 'e', 'l', 'e', 'a', 's', 'e', '_', 'f', 'b', 'i', '\x0' };   807     const struct kernel_symbol __ksymtab_drm_fb_helper_release_fbi;   807     const struct kernel_symbol __ksymtab_drm_fb_helper_release_fbi = { (unsigned long)(&drm_fb_helper_release_fbi), (const char *)(&__kstrtab_drm_fb_helper_release_fbi) };   824     const char __kstrtab_drm_fb_helper_fini[19U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'f', 'i', 'n', 'i', '\x0' };   824     const struct kernel_symbol __ksymtab_drm_fb_helper_fini;   824     const struct kernel_symbol __ksymtab_drm_fb_helper_fini = { (unsigned long)(&drm_fb_helper_fini), (const char *)(&__kstrtab_drm_fb_helper_fini) };   837     const char __kstrtab_drm_fb_helper_unlink_fbi[25U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'u', 'n', 'l', 'i', 'n', 'k', '_', 'f', 'b', 'i', '\x0' };   837     const struct kernel_symbol __ksymtab_drm_fb_helper_unlink_fbi;   837     const struct kernel_symbol __ksymtab_drm_fb_helper_unlink_fbi = { (unsigned long)(&drm_fb_helper_unlink_fbi), (const char *)(&__kstrtab_drm_fb_helper_unlink_fbi) };   839     void drm_fb_helper_dirty(struct fb_info *info, u32 x, u32 y, u32 width, u32 height);   890     const char __kstrtab_drm_fb_helper_deferred_io[26U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'd', 'e', 'f', 'e', 'r', 'r', 'e', 'd', '_', 'i', 'o', '\x0' };   890     const struct kernel_symbol __ksymtab_drm_fb_helper_deferred_io;   890     const struct kernel_symbol __ksymtab_drm_fb_helper_deferred_io = { (unsigned long)(&drm_fb_helper_deferred_io), (const char *)(&__kstrtab_drm_fb_helper_deferred_io) };   906     const char __kstrtab_drm_fb_helper_sys_read[23U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 's', 'y', 's', '_', 'r', 'e', 'a', 'd', '\x0' };   906     const struct kernel_symbol __ksymtab_drm_fb_helper_sys_read;   906     const struct kernel_symbol __ksymtab_drm_fb_helper_sys_read = { (unsigned long)(&drm_fb_helper_sys_read), (const char *)(&__kstrtab_drm_fb_helper_sys_read) };   929     const char __kstrtab_drm_fb_helper_sys_write[24U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 's', 'y', 's', '_', 'w', 'r', 'i', 't', 'e', '\x0' };   929     const struct kernel_symbol __ksymtab_drm_fb_helper_sys_write;   929     const struct kernel_symbol __ksymtab_drm_fb_helper_sys_write = { (unsigned long)(&drm_fb_helper_sys_write), (const char *)(&__kstrtab_drm_fb_helper_sys_write) };   945     const char __kstrtab_drm_fb_helper_sys_fillrect[27U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 's', 'y', 's', '_', 'f', 'i', 'l', 'l', 'r', 'e', 'c', 't', '\x0' };   945     const struct kernel_symbol __ksymtab_drm_fb_helper_sys_fillrect;   945     const struct kernel_symbol __ksymtab_drm_fb_helper_sys_fillrect = { (unsigned long)(&drm_fb_helper_sys_fillrect), (const char *)(&__kstrtab_drm_fb_helper_sys_fillrect) };   961     const char __kstrtab_drm_fb_helper_sys_copyarea[27U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 's', 'y', 's', '_', 'c', 'o', 'p', 'y', 'a', 'r', 'e', 'a', '\x0' };   961     const struct kernel_symbol __ksymtab_drm_fb_helper_sys_copyarea;   961     const struct kernel_symbol __ksymtab_drm_fb_helper_sys_copyarea = { (unsigned long)(&drm_fb_helper_sys_copyarea), (const char *)(&__kstrtab_drm_fb_helper_sys_copyarea) };   977     const char __kstrtab_drm_fb_helper_sys_imageblit[28U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 's', 'y', 's', '_', 'i', 'm', 'a', 'g', 'e', 'b', 'l', 'i', 't', '\x0' };   977     const struct kernel_symbol __ksymtab_drm_fb_helper_sys_imageblit;   977     const struct kernel_symbol __ksymtab_drm_fb_helper_sys_imageblit = { (unsigned long)(&drm_fb_helper_sys_imageblit), (const char *)(&__kstrtab_drm_fb_helper_sys_imageblit) };   993     const char __kstrtab_drm_fb_helper_cfb_fillrect[27U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'c', 'f', 'b', '_', 'f', 'i', 'l', 'l', 'r', 'e', 'c', 't', '\x0' };   993     const struct kernel_symbol __ksymtab_drm_fb_helper_cfb_fillrect;   993     const struct kernel_symbol __ksymtab_drm_fb_helper_cfb_fillrect = { (unsigned long)(&drm_fb_helper_cfb_fillrect), (const char *)(&__kstrtab_drm_fb_helper_cfb_fillrect) };  1009     const char __kstrtab_drm_fb_helper_cfb_copyarea[27U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'c', 'f', 'b', '_', 'c', 'o', 'p', 'y', 'a', 'r', 'e', 'a', '\x0' };  1009     const struct kernel_symbol __ksymtab_drm_fb_helper_cfb_copyarea;  1009     const struct kernel_symbol __ksymtab_drm_fb_helper_cfb_copyarea = { (unsigned long)(&drm_fb_helper_cfb_copyarea), (const char *)(&__kstrtab_drm_fb_helper_cfb_copyarea) };  1025     const char __kstrtab_drm_fb_helper_cfb_imageblit[28U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'c', 'f', 'b', '_', 'i', 'm', 'a', 'g', 'e', 'b', 'l', 'i', 't', '\x0' };  1025     const struct kernel_symbol __ksymtab_drm_fb_helper_cfb_imageblit;  1025     const struct kernel_symbol __ksymtab_drm_fb_helper_cfb_imageblit = { (unsigned long)(&drm_fb_helper_cfb_imageblit), (const char *)(&__kstrtab_drm_fb_helper_cfb_imageblit) };  1039     const char __kstrtab_drm_fb_helper_set_suspend[26U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 's', 'e', 't', '_', 's', 'u', 's', 'p', 'e', 'n', 'd', '\x0' };  1039     const struct kernel_symbol __ksymtab_drm_fb_helper_set_suspend;  1039     const struct kernel_symbol __ksymtab_drm_fb_helper_set_suspend = { (unsigned long)(&drm_fb_helper_set_suspend), (const char *)(&__kstrtab_drm_fb_helper_set_suspend) };  1041     int setcolreg(struct drm_crtc *crtc, u16 red, u16 green, u16 blue, u16 regno, struct fb_info *info);  1168     const char __kstrtab_drm_fb_helper_setcmap[22U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 's', 'e', 't', 'c', 'm', 'a', 'p', '\x0' };  1168     const struct kernel_symbol __ksymtab_drm_fb_helper_setcmap;  1168     const struct kernel_symbol __ksymtab_drm_fb_helper_setcmap = { (unsigned long)(&drm_fb_helper_setcmap), (const char *)(&__kstrtab_drm_fb_helper_setcmap) };  1265     const char __kstrtab_drm_fb_helper_check_var[24U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'c', 'h', 'e', 'c', 'k', '_', 'v', 'a', 'r', '\x0' };  1265     const struct kernel_symbol __ksymtab_drm_fb_helper_check_var;  1265     const struct kernel_symbol __ksymtab_drm_fb_helper_check_var = { (unsigned long)(&drm_fb_helper_check_var), (const char *)(&__kstrtab_drm_fb_helper_check_var) };  1292     const char __kstrtab_drm_fb_helper_set_par[22U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 's', 'e', 't', '_', 'p', 'a', 'r', '\x0' };  1292     const struct kernel_symbol __ksymtab_drm_fb_helper_set_par;  1292     const struct kernel_symbol __ksymtab_drm_fb_helper_set_par = { (unsigned long)(&drm_fb_helper_set_par), (const char *)(&__kstrtab_drm_fb_helper_set_par) };  1294     int pan_display_atomic(struct fb_var_screeninfo *var, struct fb_info *info);  1400     const char __kstrtab_drm_fb_helper_pan_display[26U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'p', 'a', 'n', '_', 'd', 'i', 's', 'p', 'l', 'a', 'y', '\x0' };  1400     const struct kernel_symbol __ksymtab_drm_fb_helper_pan_display;  1400     const struct kernel_symbol __ksymtab_drm_fb_helper_pan_display = { (unsigned long)(&drm_fb_helper_pan_display), (const char *)(&__kstrtab_drm_fb_helper_pan_display) };  1407     int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper, int preferred_bpp);  1576     const char __kstrtab_drm_fb_helper_fill_fix[23U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'f', 'i', 'l', 'l', '_', 'f', 'i', 'x', '\x0' };  1576     const struct kernel_symbol __ksymtab_drm_fb_helper_fill_fix;  1576     const struct kernel_symbol __ksymtab_drm_fb_helper_fill_fix = { (unsigned long)(&drm_fb_helper_fill_fix), (const char *)(&__kstrtab_drm_fb_helper_fill_fix) };  1664     const char __kstrtab_drm_fb_helper_fill_var[23U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'f', 'i', 'l', 'l', '_', 'v', 'a', 'r', '\x0' };  1664     const struct kernel_symbol __ksymtab_drm_fb_helper_fill_var;  1664     const struct kernel_symbol __ksymtab_drm_fb_helper_fill_var = { (unsigned long)(&drm_fb_helper_fill_var), (const char *)(&__kstrtab_drm_fb_helper_fill_var) };  1666     int drm_fb_helper_probe_connector_modes(struct drm_fb_helper *fb_helper, uint32_t maxX, uint32_t maxY);  1695     const char __kstrtab_drm_has_preferred_mode[23U] = { 'd', 'r', 'm', '_', 'h', 'a', 's', '_', 'p', 'r', 'e', 'f', 'e', 'r', 'r', 'e', 'd', '_', 'm', 'o', 'd', 'e', '\x0' };  1695     const struct kernel_symbol __ksymtab_drm_has_preferred_mode;  1695     const struct kernel_symbol __ksymtab_drm_has_preferred_mode = { (unsigned long)(&drm_has_preferred_mode), (const char *)(&__kstrtab_drm_has_preferred_mode) };  1697     bool  drm_has_cmdline_mode(struct drm_fb_helper_connector *fb_connector);  1753     const char __kstrtab_drm_pick_cmdline_mode[22U] = { 'd', 'r', 'm', '_', 'p', 'i', 'c', 'k', '_', 'c', 'm', 'd', 'l', 'i', 'n', 'e', '_', 'm', 'o', 'd', 'e', '\x0' };  1753     const struct kernel_symbol __ksymtab_drm_pick_cmdline_mode;  1753     const struct kernel_symbol __ksymtab_drm_pick_cmdline_mode = { (unsigned long)(&drm_pick_cmdline_mode), (const char *)(&__kstrtab_drm_pick_cmdline_mode) };  1755     bool  drm_connector_enabled(struct drm_connector *connector, bool strict);  1767     void drm_enable_connectors(struct drm_fb_helper *fb_helper, bool *enabled);  1791     bool  drm_target_cloned(struct drm_fb_helper *fb_helper, struct drm_display_mode **modes, struct drm_fb_offset *offsets, bool *enabled, int width, int height);  1865     int drm_get_tile_offsets(struct drm_fb_helper *fb_helper, struct drm_display_mode **modes, struct drm_fb_offset *offsets, int idx, int h_idx, int v_idx);  1897     bool  drm_target_preferred(struct drm_fb_helper *fb_helper, struct drm_display_mode **modes, struct drm_fb_offset *offsets, bool *enabled, int width, int height);  1966     int drm_pick_crtcs(struct drm_fb_helper *fb_helper, struct drm_fb_helper_crtc **best_crtcs, struct drm_display_mode **modes, int n, int width, int height);  2045     void drm_setup_crtcs(struct drm_fb_helper *fb_helper);  2210     const char __kstrtab_drm_fb_helper_initial_config[29U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'i', 'n', 'i', 't', 'i', 'a', 'l', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\x0' };  2210     const struct kernel_symbol __ksymtab_drm_fb_helper_initial_config;  2210     const struct kernel_symbol __ksymtab_drm_fb_helper_initial_config = { (unsigned long)(&drm_fb_helper_initial_config), (const char *)(&__kstrtab_drm_fb_helper_initial_config) };  2262     const char __kstrtab_drm_fb_helper_hotplug_event[28U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'h', 'o', 't', 'p', 'l', 'u', 'g', '_', 'e', 'v', 'e', 'n', 't', '\x0' };  2262     const struct kernel_symbol __ksymtab_drm_fb_helper_hotplug_event;  2262     const struct kernel_symbol __ksymtab_drm_fb_helper_hotplug_event = { (unsigned long)(&drm_fb_helper_hotplug_event), (const char *)(&__kstrtab_drm_fb_helper_hotplug_event) };  2283     const char __kstrtab_drm_fb_helper_modinit[22U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'h', 'e', 'l', 'p', 'e', 'r', '_', 'm', 'o', 'd', 'i', 'n', 'i', 't', '\x0' };  2283     const struct kernel_symbol __ksymtab_drm_fb_helper_modinit;  2283     const struct kernel_symbol __ksymtab_drm_fb_helper_modinit = { (unsigned long)(&drm_fb_helper_modinit), (const char *)(&__kstrtab_drm_fb_helper_modinit) };  2322     void ldv_main9_sequence_infinite_withcheck_stateful();    24     int atomic_read___5(const atomic_t *v);   424     pgprot_t  pgprot_writecombine(pgprot_t );    23     unsigned long int __phys_addr(unsigned long);   128     int mutex_is_locked___5(struct mutex *lock);  1135     void dev_err(const struct device *, const char *, ...);   676     int fb_deferred_io_mmap(struct fb_info *, struct vm_area_struct *);   677     void fb_deferred_io_init(struct fb_info *);   681     void fb_deferred_io_cleanup(struct fb_info *);  2385     int drm_framebuffer_init(struct drm_device *, struct drm_framebuffer *, const struct drm_framebuffer_funcs *);  2391     void drm_framebuffer_cleanup(struct drm_framebuffer *);  2392     void drm_framebuffer_unregister_private(struct drm_framebuffer *);  2474     uint32_t  drm_mode_legacy_fb_format(uint32_t , uint32_t );  2545     int drm_format_num_planes(uint32_t );  2546     int drm_format_plane_cpp(uint32_t , int);  2547     int drm_format_horz_chroma_subsampling(uint32_t );  2548     int drm_format_vert_chroma_subsampling(uint32_t );   224     void drm_gem_object_unreference_unlocked(struct drm_gem_object *);   227     int drm_gem_handle_create(struct drm_file *, struct drm_gem_object *, u32 *);   241     struct drm_gem_object * drm_gem_object_lookup(struct drm_file *, u32 );    24     struct drm_gem_cma_object * to_drm_gem_cma_obj(struct drm_gem_object *gem_obj);    51     struct drm_gem_cma_object * drm_gem_cma_create(struct drm_device *, size_t );    57     void drm_gem_cma_describe(struct drm_gem_cma_object *, struct seq_file *);    16     struct drm_fbdev_cma * drm_fbdev_cma_init_with_funcs(struct drm_device *dev, unsigned int preferred_bpp, unsigned int num_crtc, unsigned int max_conn_count, const struct drm_fb_helper_funcs *funcs);    19     struct drm_fbdev_cma * drm_fbdev_cma_init(struct drm_device *dev, unsigned int preferred_bpp, unsigned int num_crtc, unsigned int max_conn_count);    22     void drm_fbdev_cma_fini(struct drm_fbdev_cma *fbdev_cma);    24     void drm_fbdev_cma_restore_mode(struct drm_fbdev_cma *fbdev_cma);    25     void drm_fbdev_cma_hotplug_event(struct drm_fbdev_cma *fbdev_cma);    26     int drm_fbdev_cma_create_with_funcs(struct drm_fb_helper *helper, struct drm_fb_helper_surface_size *sizes, const struct drm_framebuffer_funcs *funcs);    30     void drm_fb_cma_destroy(struct drm_framebuffer *fb);    31     int drm_fb_cma_create_handle(struct drm_framebuffer *fb, struct drm_file *file_priv, unsigned int *handle);    34     struct drm_framebuffer * drm_fb_cma_create_with_funcs(struct drm_device *dev, struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd, const struct drm_framebuffer_funcs *funcs);    37     struct drm_framebuffer * drm_fb_cma_create(struct drm_device *dev, struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd);    40     struct drm_gem_cma_object * drm_fb_cma_get_gem_obj(struct drm_framebuffer *fb, unsigned int plane);    46     int drm_fb_cma_debugfs_show(struct seq_file *m, void *arg);    94     struct drm_fbdev_cma * to_fbdev_cma(struct drm_fb_helper *helper);    99     struct drm_fb_cma * to_fb_cma(struct drm_framebuffer *fb);   117     const char __kstrtab_drm_fb_cma_destroy[19U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'c', 'm', 'a', '_', 'd', 'e', 's', 't', 'r', 'o', 'y', '\x0' };   117     const struct kernel_symbol __ksymtab_drm_fb_cma_destroy;   117     const struct kernel_symbol __ksymtab_drm_fb_cma_destroy = { (unsigned long)(&drm_fb_cma_destroy), (const char *)(&__kstrtab_drm_fb_cma_destroy) };   127     const char __kstrtab_drm_fb_cma_create_handle[25U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'c', 'm', 'a', '_', 'c', 'r', 'e', 'a', 't', 'e', '_', 'h', 'a', 'n', 'd', 'l', 'e', '\x0' };   127     const struct kernel_symbol __ksymtab_drm_fb_cma_create_handle;   127     const struct kernel_symbol __ksymtab_drm_fb_cma_create_handle = { (unsigned long)(&drm_fb_cma_create_handle), (const char *)(&__kstrtab_drm_fb_cma_create_handle) };   129     struct drm_framebuffer_funcs drm_fb_cma_funcs = { &drm_fb_cma_destroy, &drm_fb_cma_create_handle, 0 };   134     struct drm_fb_cma * drm_fb_cma_alloc(struct drm_device *dev, const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_cma_object **obj, unsigned int num_planes, const struct drm_framebuffer_funcs *funcs);   223     const char __kstrtab_drm_fb_cma_create_with_funcs[29U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'c', 'm', 'a', '_', 'c', 'r', 'e', 'a', 't', 'e', '_', 'w', 'i', 't', 'h', '_', 'f', 'u', 'n', 'c', 's', '\x0' };   223     const struct kernel_symbol __ksymtab_drm_fb_cma_create_with_funcs;   223     const struct kernel_symbol __ksymtab_drm_fb_cma_create_with_funcs = { (unsigned long)(&drm_fb_cma_create_with_funcs), (const char *)(&__kstrtab_drm_fb_cma_create_with_funcs) };   238     const char __kstrtab_drm_fb_cma_create[18U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'c', 'm', 'a', '_', 'c', 'r', 'e', 'a', 't', 'e', '\x0' };   238     const struct kernel_symbol __ksymtab_drm_fb_cma_create;   238     const struct kernel_symbol __ksymtab_drm_fb_cma_create = { (unsigned long)(&drm_fb_cma_create), (const char *)(&__kstrtab_drm_fb_cma_create) };   259     const char __kstrtab_drm_fb_cma_get_gem_obj[23U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'c', 'm', 'a', '_', 'g', 'e', 't', '_', 'g', 'e', 'm', '_', 'o', 'b', 'j', '\x0' };   259     const struct kernel_symbol __ksymtab_drm_fb_cma_get_gem_obj;   259     const struct kernel_symbol __ksymtab_drm_fb_cma_get_gem_obj = { (unsigned long)(&drm_fb_cma_get_gem_obj), (const char *)(&__kstrtab_drm_fb_cma_get_gem_obj) };   266     void drm_fb_cma_describe(struct drm_framebuffer *fb, struct seq_file *m);   298     const char __kstrtab_drm_fb_cma_debugfs_show[24U] = { 'd', 'r', 'm', '_', 'f', 'b', '_', 'c', 'm', 'a', '_', 'd', 'e', 'b', 'u', 'g', 'f', 's', '_', 's', 'h', 'o', 'w', '\x0' };   298     const struct kernel_symbol __ksymtab_drm_fb_cma_debugfs_show;   298     const struct kernel_symbol __ksymtab_drm_fb_cma_debugfs_show = { (unsigned long)(&drm_fb_cma_debugfs_show), (const char *)(&__kstrtab_drm_fb_cma_debugfs_show) };   301     struct fb_ops drm_fbdev_cma_ops = { &__this_module, 0, 0, 0, 0, &drm_fb_helper_check_var, &drm_fb_helper_set_par, 0, &drm_fb_helper_setcmap, &drm_fb_helper_blank, &drm_fb_helper_pan_display, &drm_fb_helper_sys_fillrect, &drm_fb_helper_sys_copyarea, &drm_fb_helper_sys_imageblit, 0, 0, 0, 0, 0, 0, 0, 0, 0 };   313     int drm_fbdev_cma_deferred_io_mmap(struct fb_info *info, struct vm_area_struct *vma);   322     int drm_fbdev_cma_defio_init(struct fb_info *fbi, struct drm_gem_cma_object *cma_obj);   357     void drm_fbdev_cma_defio_fini(struct fb_info *fbi);   452     const char __kstrtab_drm_fbdev_cma_create_with_funcs[32U] = { 'd', 'r', 'm', '_', 'f', 'b', 'd', 'e', 'v', '_', 'c', 'm', 'a', '_', 'c', 'r', 'e', 'a', 't', 'e', '_', 'w', 'i', 't', 'h', '_', 'f', 'u', 'n', 'c', 's', '\x0' };   452     const struct kernel_symbol __ksymtab_drm_fbdev_cma_create_with_funcs;   452     const struct kernel_symbol __ksymtab_drm_fbdev_cma_create_with_funcs = { (unsigned long)(&drm_fbdev_cma_create_with_funcs), (const char *)(&__kstrtab_drm_fbdev_cma_create_with_funcs) };   454     int drm_fbdev_cma_create(struct drm_fb_helper *helper, struct drm_fb_helper_surface_size *sizes);   460     const struct drm_fb_helper_funcs drm_fb_cma_helper_funcs = { 0, 0, &drm_fbdev_cma_create, 0 };   520     const char __kstrtab_drm_fbdev_cma_init_with_funcs[30U] = { 'd', 'r', 'm', '_', 'f', 'b', 'd', 'e', 'v', '_', 'c', 'm', 'a', '_', 'i', 'n', 'i', 't', '_', 'w', 'i', 't', 'h', '_', 'f', 'u', 'n', 'c', 's', '\x0' };   520     const struct kernel_symbol __ksymtab_drm_fbdev_cma_init_with_funcs;   520     const struct kernel_symbol __ksymtab_drm_fbdev_cma_init_with_funcs = { (unsigned long)(&drm_fbdev_cma_init_with_funcs), (const char *)(&__kstrtab_drm_fbdev_cma_init_with_funcs) };   538     const char __kstrtab_drm_fbdev_cma_init[19U] = { 'd', 'r', 'm', '_', 'f', 'b', 'd', 'e', 'v', '_', 'c', 'm', 'a', '_', 'i', 'n', 'i', 't', '\x0' };   538     const struct kernel_symbol __ksymtab_drm_fbdev_cma_init;   538     const struct kernel_symbol __ksymtab_drm_fbdev_cma_init = { (unsigned long)(&drm_fbdev_cma_init), (const char *)(&__kstrtab_drm_fbdev_cma_init) };   558     const char __kstrtab_drm_fbdev_cma_fini[19U] = { 'd', 'r', 'm', '_', 'f', 'b', 'd', 'e', 'v', '_', 'c', 'm', 'a', '_', 'f', 'i', 'n', 'i', '\x0' };   558     const struct kernel_symbol __ksymtab_drm_fbdev_cma_fini;   558     const struct kernel_symbol __ksymtab_drm_fbdev_cma_fini = { (unsigned long)(&drm_fbdev_cma_fini), (const char *)(&__kstrtab_drm_fbdev_cma_fini) };   571     const char __kstrtab_drm_fbdev_cma_restore_mode[27U] = { 'd', 'r', 'm', '_', 'f', 'b', 'd', 'e', 'v', '_', 'c', 'm', 'a', '_', 'r', 'e', 's', 't', 'o', 'r', 'e', '_', 'm', 'o', 'd', 'e', '\x0' };   571     const struct kernel_symbol __ksymtab_drm_fbdev_cma_restore_mode;   571     const struct kernel_symbol __ksymtab_drm_fbdev_cma_restore_mode = { (unsigned long)(&drm_fbdev_cma_restore_mode), (const char *)(&__kstrtab_drm_fbdev_cma_restore_mode) };   585     const char __kstrtab_drm_fbdev_cma_hotplug_event[28U] = { 'd', 'r', 'm', '_', 'f', 'b', 'd', 'e', 'v', '_', 'c', 'm', 'a', '_', 'h', 'o', 't', 'p', 'l', 'u', 'g', '_', 'e', 'v', 'e', 'n', 't', '\x0' };   585     const struct kernel_symbol __ksymtab_drm_fbdev_cma_hotplug_event;   585     const struct kernel_symbol __ksymtab_drm_fbdev_cma_hotplug_event = { (unsigned long)(&drm_fbdev_cma_hotplug_event), (const char *)(&__kstrtab_drm_fbdev_cma_hotplug_event) };   624     void ldv_main10_sequence_infinite_withcheck_stateful();   314     int variable_test_bit(long nr, const volatile unsigned long *addr);   255     void __might_fault(const char *, int);   412     int sprintf(char *, const char *, ...);    11     void * ldv_create_class();    13     void ldv_unregister_class();    15     int ldv_register_chrdev(int major);    17     void ldv_unregister_chrdev_region();    10     extern struct task_struct *current_task;    12     struct task_struct * get_current();    14     void __cmpxchg_wrong_size();    24     int atomic_read___6(const atomic_t *v);    36     void atomic_set___0(atomic_t *v, int i);   101     void atomic_dec(atomic_t *v);   174     int atomic_cmpxchg(atomic_t *v, int old, int new);   208     int __atomic_add_unless(atomic_t *v, int a, int u);   445     int atomic_add_unless(atomic_t *v, int a, int u);   310     extern struct tss_struct cpu_tss;   469     unsigned long int current_top_of_stack();   167     struct thread_info * current_thread_info();    90     int test_ti_thread_flag(struct thread_info *ti, int flag);   209     void wake_up_atomic_t(atomic_t *);   213     int out_of_line_wait_on_atomic_t(atomic_t *, int (*)(atomic_t *), unsigned int);  1214     int wait_on_atomic_t(atomic_t *val, int (*action)(atomic_t *), unsigned int mode);   498     int debug_lockdep_rcu_enabled();    79     void * idr_find_slowpath(struct idr *, int);    82     int idr_alloc_cyclic(struct idr *, void *, int, int, gfp_t );    85     void * idr_get_next(struct idr *, int *);    87     void idr_remove(struct idr *, int);   115     void * idr_find(struct idr *idr, int id);    31     void kref_init___0(struct kref *kref);   134     int kref_get_unless_zero(struct kref *kref);   859     unsigned int iminor(const struct inode *inode);  2426     int __register_chrdev(unsigned int, unsigned int, unsigned int, const char *, const struct file_operations *);  2429     void __unregister_chrdev(unsigned int, unsigned int, unsigned int, const char *);  2434     int ldv_register_chrdev_71(unsigned int major, const char *name, const struct file_operations *fops);  2434     int register_chrdev(unsigned int major, const char *name, const struct file_operations *fops);  2444     void ldv_unregister_chrdev_72(unsigned int major, const char *name);  2444     void unregister_chrdev(unsigned int major, const char *name);  2797     loff_t  fixed_size_llseek(struct file *, loff_t , int, loff_t );   517     void class_destroy(struct class *);   520     void ldv_class_destroy_73(struct class *ldv_func_arg1);   524     void ldv_class_destroy_74(struct class *ldv_func_arg1);  1072     struct device * device_create(struct class *, struct device *, dev_t , void *, const char *, ...);  1080     void device_destroy(struct class *, dev_t );   440     void schedule();  3057     int test_tsk_thread_flag(struct task_struct *tsk, int flag);  3083     int signal_pending(struct task_struct *p);     5     void kasan_check_read(const void *, unsigned int);     6     void kasan_check_write(const void *, unsigned int);    49     void clac();    55     void stac();    45     bool  __chk_range_not_ok(unsigned long addr, unsigned long size, unsigned long limit);    21     unsigned long int copy_user_enhanced_fast_string(void *, const void *, unsigned int);    23     unsigned long int copy_user_generic_string(void *, const void *, unsigned int);    25     unsigned long int copy_user_generic_unrolled(void *, const void *, unsigned int);    28     unsigned long int copy_user_generic(void *to, const void *from, unsigned int len);    53     int __copy_from_user_nocheck(void *dst, const void *src, unsigned int size);   110     int __copy_from_user(void *dst, const void *src, unsigned int size);   118     int __copy_to_user_nocheck(void *dst, const void *src, unsigned int size);   177     int __copy_to_user(void *dst, const void *src, unsigned int size);    50     struct idr aux_idr = { 0, 0, 0, 0, { { { { { 0 } }, 3735899821U, 4294967295U, (void *)-1, { 0, { 0, 0 }, "aux_idr.lock", 0, 0UL } } } }, 0, 0 };    51     struct mutex aux_idr_mutex = { { 1 }, { { { { { 0 } }, 3735899821U, 4294967295U, (void *)-1, { 0, { 0, 0 }, "aux_idr_mutex.wait_lock", 0, 0UL } } } }, { &(aux_idr_mutex.wait_list), &(aux_idr_mutex.wait_list) }, 0, (void *)(&aux_idr_mutex), { 0, { 0, 0 }, "aux_idr_mutex", 0, 0UL } };    52     struct class *drm_dp_aux_dev_class = 0;    53     int drm_dev_major = -1;    55     struct drm_dp_aux_dev * drm_dp_aux_dev_get_by_minor(unsigned int index);    68     struct drm_dp_aux_dev * alloc_drm_dp_aux_dev(struct drm_dp_aux *aux);    93     void release_drm_dp_aux_dev(struct kref *ref);   101     ssize_t  name_show(struct device *dev, struct device_attribute *attr, char *buf);   116     struct device_attribute dev_attr_name = { { "name", 292U, (_Bool)0, 0, { { { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 } } } }, &name_show, 0 };   118     struct attribute *drm_dp_aux_attrs[2U] = { &(dev_attr_name.attr), (struct attribute *)0 };   122     const struct attribute_group drm_dp_aux_group = { 0, 0, 0, (struct attribute **)(&drm_dp_aux_attrs), 0 };   122     const struct attribute_group *drm_dp_aux_groups[2U] = { &drm_dp_aux_group, (const struct attribute_group *)0 };   124     int auxdev_open(struct inode *inode, struct file *file);   137     loff_t  auxdev_llseek(struct file *file, loff_t offset, int whence);   142     ssize_t  auxdev_read(struct file *file, char *buf, size_t count, loff_t *offset);   191     ssize_t  auxdev_write(struct file *file, const char *buf, size_t count, loff_t *offset);   242     int auxdev_release(struct inode *inode, struct file *file);   250     const struct file_operations auxdev_fops = { &__this_module, &auxdev_llseek, &auxdev_read, &auxdev_write, 0, 0, 0, 0, 0, 0, 0, 0, &auxdev_open, 0, &auxdev_release, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };   261     struct drm_dp_aux_dev * drm_dp_aux_dev_get_by_aux(struct drm_dp_aux *aux);   282     int auxdev_wait_atomic_t(atomic_t *p);   318     const char __kstrtab_drm_dp_aux_unregister_devnode[30U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'a', 'u', 'x', '_', 'u', 'n', 'r', 'e', 'g', 'i', 's', 't', 'e', 'r', '_', 'd', 'e', 'v', 'n', 'o', 'd', 'e', '\x0' };   318     const struct kernel_symbol __ksymtab_drm_dp_aux_unregister_devnode;   318     const struct kernel_symbol __ksymtab_drm_dp_aux_unregister_devnode = { (unsigned long)(&drm_dp_aux_unregister_devnode), (const char *)(&__kstrtab_drm_dp_aux_unregister_devnode) };   351     const char __kstrtab_drm_dp_aux_register_devnode[28U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'a', 'u', 'x', '_', 'r', 'e', 'g', 'i', 's', 't', 'e', 'r', '_', 'd', 'e', 'v', 'n', 'o', 'd', 'e', '\x0' };   351     const struct kernel_symbol __ksymtab_drm_dp_aux_register_devnode;   351     const struct kernel_symbol __ksymtab_drm_dp_aux_register_devnode = { (unsigned long)(&drm_dp_aux_register_devnode), (const char *)(&__kstrtab_drm_dp_aux_register_devnode) };   374     const char __kstrtab_drm_dp_aux_dev_init[20U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'a', 'u', 'x', '_', 'd', 'e', 'v', '_', 'i', 'n', 'i', 't', '\x0' };   374     const struct kernel_symbol __ksymtab_drm_dp_aux_dev_init;   374     const struct kernel_symbol __ksymtab_drm_dp_aux_dev_init = { (unsigned long)(&drm_dp_aux_dev_init), (const char *)(&__kstrtab_drm_dp_aux_dev_init) };   381     const char __kstrtab_drm_dp_aux_dev_exit[20U] = { 'd', 'r', 'm', '_', 'd', 'p', '_', 'a', 'u', 'x', '_', 'd', 'e', 'v', '_', 'e', 'x', 'i', 't', '\x0' };   381     const struct kernel_symbol __ksymtab_drm_dp_aux_dev_exit;   381     const struct kernel_symbol __ksymtab_drm_dp_aux_dev_exit = { (unsigned long)(&drm_dp_aux_dev_exit), (const char *)(&__kstrtab_drm_dp_aux_dev_exit) };   402     void ldv_check_return_value(int);   420     void ldv_main11_sequence_infinite_withcheck_stateful();    10     void ldv_error();    20     void ldv_stop();    25     int ldv_undef_int();    26     void * ldv_undef_ptr();    39     int ldv_undef_int_nonpositive();    28     int ldv_usb_gadget_class = 0;    31     int ldv_usb_gadget_chrdev = 0;    34     int ldv_usb_gadget = 0;    61     int ldv_register_class();   124     int ldv_register_chrdev_region();   158     int ldv_register_usb_gadget();   179     void ldv_unregister_usb_gadget();           return ;}         {   102     int tmp;   103     int tmp___0;   104     int tmp___1;   112     LDV_IN_INTERRUPT = 1;   121     ldv_initialize() { /* Function call is skipped due to function is undefined */}   127     ldv_handler_precall() { /* Function call is skipped due to function is undefined */}           {}    39       int ret;             {}   355         int res;   356         void *tmp;   357         long tmp___0;   358         _Bool tmp___1;               {    40           void *is_got;    43           is_got = ldv_undef_ptr() { /* Function call is skipped due to function is undefined */}}   357         drm_dp_aux_dev_class = (struct class *)tmp;   359         res = (int)tmp___0;   360         goto out;   370         out:;               {}    68           class_destroy(ldv_func_arg1) { /* Function call is skipped due to function is undefined */}                 {} } |       Source code     
     1 
    2 #include <linux/kernel.h>
    3 bool ldv_is_err(const void *ptr);
    4 bool ldv_is_err_or_null(const void *ptr);
    5 void* ldv_err_ptr(long error);
    6 long ldv_ptr_err(const void *ptr);
    7 
    8 
    9 // Provide model function prototypes before their usage.
   10 
   11 void *ldv_create_class(void);
   12 int ldv_register_class(void);
   13 void ldv_unregister_class(void);
   14 
   15 int ldv_register_chrdev(int major);
   16 int ldv_register_chrdev_region(void);
   17 void ldv_unregister_chrdev_region(void);
   18 
   19 int ldv_register_usb_gadget(void);
   20 void ldv_unregister_usb_gadget(void);
   21 #line 1 "/home/ubuntu/launches/work/current--X--drivers--X--defaultlinux-4.7-rc1.tar.xz--X--106_1a--X--cpachecker/linux-4.7-rc1.tar.xz/csd_deg_dscv/5249/dscv_tempdir/dscv/ri/106_1a/drivers/gpu/drm/drm_atomic_helper.c"
   22 /*
   23  * Copyright (C) 2014 Red Hat
   24  * Copyright (C) 2014 Intel Corp.
   25  *
   26  * Permission is hereby granted, free of charge, to any person obtaining a
   27  * copy of this software and associated documentation files (the "Software"),
   28  * to deal in the Software without restriction, including without limitation
   29  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   30  * and/or sell copies of the Software, and to permit persons to whom the
   31  * Software is furnished to do so, subject to the following conditions:
   32  *
   33  * The above copyright notice and this permission notice shall be included in
   34  * all copies or substantial portions of the Software.
   35  *
   36  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   37  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   38  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
   39  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
   40  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
   41  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
   42  * OTHER DEALINGS IN THE SOFTWARE.
   43  *
   44  * Authors:
   45  * Rob Clark <robdclark@gmail.com>
   46  * Daniel Vetter <daniel.vetter@ffwll.ch>
   47  */
   48 
   49 #include <drm/drmP.h>
   50 #include <drm/drm_atomic.h>
   51 #include <drm/drm_plane_helper.h>
   52 #include <drm/drm_crtc_helper.h>
   53 #include <drm/drm_atomic_helper.h>
   54 #include <linux/fence.h>
   55 
   56 /**
   57  * DOC: overview
   58  *
   59  * This helper library provides implementations of check and commit functions on
   60  * top of the CRTC modeset helper callbacks and the plane helper callbacks. It
   61  * also provides convenience implementations for the atomic state handling
   62  * callbacks for drivers which don't need to subclass the drm core structures to
   63  * add their own additional internal state.
   64  *
   65  * This library also provides default implementations for the check callback in
   66  * drm_atomic_helper_check() and for the commit callback with
   67  * drm_atomic_helper_commit(). But the individual stages and callbacks are
   68  * exposed to allow drivers to mix and match and e.g. use the plane helpers only
   69  * together with a driver private modeset implementation.
   70  *
   71  * This library also provides implementations for all the legacy driver
   72  * interfaces on top of the atomic interface. See drm_atomic_helper_set_config(),
   73  * drm_atomic_helper_disable_plane(), drm_atomic_helper_disable_plane() and the
   74  * various functions to implement set_property callbacks. New drivers must not
   75  * implement these functions themselves but must use the provided helpers.
   76  *
   77  * The atomic helper uses the same function table structures as all other
   78  * modesetting helpers. See the documentation for struct &drm_crtc_helper_funcs,
   79  * struct &drm_encoder_helper_funcs and struct &drm_connector_helper_funcs. It
   80  * also shares the struct &drm_plane_helper_funcs function table with the plane
   81  * helpers.
   82  */
   83 static void
   84 drm_atomic_helper_plane_changed(struct drm_atomic_state *state,
   85 				struct drm_plane_state *plane_state,
   86 				struct drm_plane *plane)
   87 {
   88 	struct drm_crtc_state *crtc_state;
   89 
   90 	if (plane->state->crtc) {
   91 		crtc_state = drm_atomic_get_existing_crtc_state(state,
   92 								plane->state->crtc);
   93 
   94 		if (WARN_ON(!crtc_state))
   95 			return;
   96 
   97 		crtc_state->planes_changed = true;
   98 	}
   99 
  100 	if (plane_state->crtc) {
  101 		crtc_state = drm_atomic_get_existing_crtc_state(state,
  102 								plane_state->crtc);
  103 
  104 		if (WARN_ON(!crtc_state))
  105 			return;
  106 
  107 		crtc_state->planes_changed = true;
  108 	}
  109 }
  110 
  111 static int handle_conflicting_encoders(struct drm_atomic_state *state,
  112 				       bool disable_conflicting_encoders)
  113 {
  114 	struct drm_connector_state *conn_state;
  115 	struct drm_connector *connector;
  116 	struct drm_encoder *encoder;
  117 	unsigned encoder_mask = 0;
  118 	int i, ret;
  119 
  120 	/*
  121 	 * First loop, find all newly assigned encoders from the connectors
  122 	 * part of the state. If the same encoder is assigned to multiple
  123 	 * connectors bail out.
  124 	 */
  125 	for_each_connector_in_state(state, connector, conn_state, i) {
  126 		const struct drm_connector_helper_funcs *funcs = connector->helper_private;
  127 		struct drm_encoder *new_encoder;
  128 
  129 		if (!conn_state->crtc)
  130 			continue;
  131 
  132 		if (funcs->atomic_best_encoder)
  133 			new_encoder = funcs->atomic_best_encoder(connector, conn_state);
  134 		else
  135 			new_encoder = funcs->best_encoder(connector);
  136 
  137 		if (new_encoder) {
  138 			if (encoder_mask & (1 << drm_encoder_index(new_encoder))) {
  139 				DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] on [CONNECTOR:%d:%s] already assigned\n",
  140 					new_encoder->base.id, new_encoder->name,
  141 					connector->base.id, connector->name);
  142 
  143 				return -EINVAL;
  144 			}
  145 
  146 			encoder_mask |= 1 << drm_encoder_index(new_encoder);
  147 		}
  148 	}
  149 
  150 	if (!encoder_mask)
  151 		return 0;
  152 
  153 	/*
  154 	 * Second loop, iterate over all connectors not part of the state.
  155 	 *
  156 	 * If a conflicting encoder is found and disable_conflicting_encoders
  157 	 * is not set, an error is returned. Userspace can provide a solution
  158 	 * through the atomic ioctl.
  159 	 *
  160 	 * If the flag is set conflicting connectors are removed from the crtc
  161 	 * and the crtc is disabled if no encoder is left. This preserves
  162 	 * compatibility with the legacy set_config behavior.
  163 	 */
  164 	drm_for_each_connector(connector, state->dev) {
  165 		struct drm_crtc_state *crtc_state;
  166 
  167 		if (drm_atomic_get_existing_connector_state(state, connector))
  168 			continue;
  169 
  170 		encoder = connector->state->best_encoder;
  171 		if (!encoder || !(encoder_mask & (1 << drm_encoder_index(encoder))))
  172 			continue;
  173 
  174 		if (!disable_conflicting_encoders) {
  175 			DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] in use on [CRTC:%d:%s] by [CONNECTOR:%d:%s]\n",
  176 					 encoder->base.id, encoder->name,
  177 					 connector->state->crtc->base.id,
  178 					 connector->state->crtc->name,
  179 					 connector->base.id, connector->name);
  180 			return -EINVAL;
  181 		}
  182 
  183 		conn_state = drm_atomic_get_connector_state(state, connector);
  184 		if (IS_ERR(conn_state))
  185 			return PTR_ERR(conn_state);
  186 
  187 		DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] in use on [CRTC:%d:%s], disabling [CONNECTOR:%d:%s]\n",
  188 				 encoder->base.id, encoder->name,
  189 				 conn_state->crtc->base.id, conn_state->crtc->name,
  190 				 connector->base.id, connector->name);
  191 
  192 		crtc_state = drm_atomic_get_existing_crtc_state(state, conn_state->crtc);
  193 
  194 		ret = drm_atomic_set_crtc_for_connector(conn_state, NULL);
  195 		if (ret)
  196 			return ret;
  197 
  198 		if (!crtc_state->connector_mask) {
  199 			ret = drm_atomic_set_mode_prop_for_crtc(crtc_state,
  200 								NULL);
  201 			if (ret < 0)
  202 				return ret;
  203 
  204 			crtc_state->active = false;
  205 		}
  206 	}
  207 
  208 	return 0;
  209 }
  210 
  211 static void
  212 set_best_encoder(struct drm_atomic_state *state,
  213 		 struct drm_connector_state *conn_state,
  214 		 struct drm_encoder *encoder)
  215 {
  216 	struct drm_crtc_state *crtc_state;
  217 	struct drm_crtc *crtc;
  218 
  219 	if (conn_state->best_encoder) {
  220 		/* Unset the encoder_mask in the old crtc state. */
  221 		crtc = conn_state->connector->state->crtc;
  222 
  223 		/* A NULL crtc is an error here because we should have
  224 		 *  duplicated a NULL best_encoder when crtc was NULL.
  225 		 * As an exception restoring duplicated atomic state
  226 		 * during resume is allowed, so don't warn when
  227 		 * best_encoder is equal to encoder we intend to set.
  228 		 */
  229 		WARN_ON(!crtc && encoder != conn_state->best_encoder);
  230 		if (crtc) {
  231 			crtc_state = drm_atomic_get_existing_crtc_state(state, crtc);
  232 
  233 			crtc_state->encoder_mask &=
  234 				~(1 << drm_encoder_index(conn_state->best_encoder));
  235 		}
  236 	}
  237 
  238 	if (encoder) {
  239 		crtc = conn_state->crtc;
  240 		WARN_ON(!crtc);
  241 		if (crtc) {
  242 			crtc_state = drm_atomic_get_existing_crtc_state(state, crtc);
  243 
  244 			crtc_state->encoder_mask |=
  245 				1 << drm_encoder_index(encoder);
  246 		}
  247 	}
  248 
  249 	conn_state->best_encoder = encoder;
  250 }
  251 
  252 static void
  253 steal_encoder(struct drm_atomic_state *state,
  254 	      struct drm_encoder *encoder)
  255 {
  256 	struct drm_crtc_state *crtc_state;
  257 	struct drm_connector *connector;
  258 	struct drm_connector_state *connector_state;
  259 	int i;
  260 
  261 	for_each_connector_in_state(state, connector, connector_state, i) {
  262 		struct drm_crtc *encoder_crtc;
  263 
  264 		if (connector_state->best_encoder != encoder)
  265 			continue;
  266 
  267 		encoder_crtc = connector->state->crtc;
  268 
  269 		DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] in use on [CRTC:%d:%s], stealing it\n",
  270 				 encoder->base.id, encoder->name,
  271 				 encoder_crtc->base.id, encoder_crtc->name);
  272 
  273 		set_best_encoder(state, connector_state, NULL);
  274 
  275 		crtc_state = drm_atomic_get_existing_crtc_state(state, encoder_crtc);
  276 		crtc_state->connectors_changed = true;
  277 
  278 		return;
  279 	}
  280 }
  281 
  282 static int
  283 update_connector_routing(struct drm_atomic_state *state,
  284 			 struct drm_connector *connector,
  285 			 struct drm_connector_state *connector_state)
  286 {
  287 	const struct drm_connector_helper_funcs *funcs;
  288 	struct drm_encoder *new_encoder;
  289 	struct drm_crtc_state *crtc_state;
  290 
  291 	DRM_DEBUG_ATOMIC("Updating routing for [CONNECTOR:%d:%s]\n",
  292 			 connector->base.id,
  293 			 connector->name);
  294 
  295 	if (connector->state->crtc != connector_state->crtc) {
  296 		if (connector->state->crtc) {
  297 			crtc_state = drm_atomic_get_existing_crtc_state(state, connector->state->crtc);
  298 			crtc_state->connectors_changed = true;
  299 		}
  300 
  301 		if (connector_state->crtc) {
  302 			crtc_state = drm_atomic_get_existing_crtc_state(state, connector_state->crtc);
  303 			crtc_state->connectors_changed = true;
  304 		}
  305 	}
  306 
  307 	if (!connector_state->crtc) {
  308 		DRM_DEBUG_ATOMIC("Disabling [CONNECTOR:%d:%s]\n",
  309 				connector->base.id,
  310 				connector->name);
  311 
  312 		set_best_encoder(state, connector_state, NULL);
  313 
  314 		return 0;
  315 	}
  316 
  317 	funcs = connector->helper_private;
  318 
  319 	if (funcs->atomic_best_encoder)
  320 		new_encoder = funcs->atomic_best_encoder(connector,
  321 							 connector_state);
  322 	else
  323 		new_encoder = funcs->best_encoder(connector);
  324 
  325 	if (!new_encoder) {
  326 		DRM_DEBUG_ATOMIC("No suitable encoder found for [CONNECTOR:%d:%s]\n",
  327 				 connector->base.id,
  328 				 connector->name);
  329 		return -EINVAL;
  330 	}
  331 
  332 	if (!drm_encoder_crtc_ok(new_encoder, connector_state->crtc)) {
  333 		DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] incompatible with [CRTC:%d]\n",
  334 				 new_encoder->base.id,
  335 				 new_encoder->name,
  336 				 connector_state->crtc->base.id);
  337 		return -EINVAL;
  338 	}
  339 
  340 	if (new_encoder == connector_state->best_encoder) {
  341 		set_best_encoder(state, connector_state, new_encoder);
  342 
  343 		DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] keeps [ENCODER:%d:%s], now on [CRTC:%d:%s]\n",
  344 				 connector->base.id,
  345 				 connector->name,
  346 				 new_encoder->base.id,
  347 				 new_encoder->name,
  348 				 connector_state->crtc->base.id,
  349 				 connector_state->crtc->name);
  350 
  351 		return 0;
  352 	}
  353 
  354 	steal_encoder(state, new_encoder);
  355 
  356 	set_best_encoder(state, connector_state, new_encoder);
  357 
  358 	crtc_state = drm_atomic_get_existing_crtc_state(state, connector_state->crtc);
  359 	crtc_state->connectors_changed = true;
  360 
  361 	DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] using [ENCODER:%d:%s] on [CRTC:%d:%s]\n",
  362 			 connector->base.id,
  363 			 connector->name,
  364 			 new_encoder->base.id,
  365 			 new_encoder->name,
  366 			 connector_state->crtc->base.id,
  367 			 connector_state->crtc->name);
  368 
  369 	return 0;
  370 }
  371 
  372 static int
  373 mode_fixup(struct drm_atomic_state *state)
  374 {
  375 	struct drm_crtc *crtc;
  376 	struct drm_crtc_state *crtc_state;
  377 	struct drm_connector *connector;
  378 	struct drm_connector_state *conn_state;
  379 	int i;
  380 	bool ret;
  381 
  382 	for_each_crtc_in_state(state, crtc, crtc_state, i) {
  383 		if (!crtc_state->mode_changed &&
  384 		    !crtc_state->connectors_changed)
  385 			continue;
  386 
  387 		drm_mode_copy(&crtc_state->adjusted_mode, &crtc_state->mode);
  388 	}
  389 
  390 	for_each_connector_in_state(state, connector, conn_state, i) {
  391 		const struct drm_encoder_helper_funcs *funcs;
  392 		struct drm_encoder *encoder;
  393 
  394 		WARN_ON(!!conn_state->best_encoder != !!conn_state->crtc);
  395 
  396 		if (!conn_state->crtc || !conn_state->best_encoder)
  397 			continue;
  398 
  399 		crtc_state = drm_atomic_get_existing_crtc_state(state,
  400 								conn_state->crtc);
  401 
  402 		/*
  403 		 * Each encoder has at most one connector (since we always steal
  404 		 * it away), so we won't call ->mode_fixup twice.
  405 		 */
  406 		encoder = conn_state->best_encoder;
  407 		funcs = encoder->helper_private;
  408 
  409 		ret = drm_bridge_mode_fixup(encoder->bridge, &crtc_state->mode,
  410 				&crtc_state->adjusted_mode);
  411 		if (!ret) {
  412 			DRM_DEBUG_ATOMIC("Bridge fixup failed\n");
  413 			return -EINVAL;
  414 		}
  415 
  416 		if (funcs && funcs->atomic_check) {
  417 			ret = funcs->atomic_check(encoder, crtc_state,
  418 						  conn_state);
  419 			if (ret) {
  420 				DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] check failed\n",
  421 						 encoder->base.id, encoder->name);
  422 				return ret;
  423 			}
  424 		} else if (funcs && funcs->mode_fixup) {
  425 			ret = funcs->mode_fixup(encoder, &crtc_state->mode,
  426 						&crtc_state->adjusted_mode);
  427 			if (!ret) {
  428 				DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] fixup failed\n",
  429 						 encoder->base.id, encoder->name);
  430 				return -EINVAL;
  431 			}
  432 		}
  433 	}
  434 
  435 	for_each_crtc_in_state(state, crtc, crtc_state, i) {
  436 		const struct drm_crtc_helper_funcs *funcs;
  437 
  438 		if (!crtc_state->mode_changed &&
  439 		    !crtc_state->connectors_changed)
  440 			continue;
  441 
  442 		funcs = crtc->helper_private;
  443 		if (!funcs->mode_fixup)
  444 			continue;
  445 
  446 		ret = funcs->mode_fixup(crtc, &crtc_state->mode,
  447 					&crtc_state->adjusted_mode);
  448 		if (!ret) {
  449 			DRM_DEBUG_ATOMIC("[CRTC:%d:%s] fixup failed\n",
  450 					 crtc->base.id, crtc->name);
  451 			return -EINVAL;
  452 		}
  453 	}
  454 
  455 	return 0;
  456 }
  457 
  458 /**
  459  * drm_atomic_helper_check_modeset - validate state object for modeset changes
  460  * @dev: DRM device
  461  * @state: the driver state object
  462  *
  463  * Check the state object to see if the requested state is physically possible.
  464  * This does all the crtc and connector related computations for an atomic
  465  * update and adds any additional connectors needed for full modesets and calls
  466  * down into ->mode_fixup functions of the driver backend.
  467  *
  468  * crtc_state->mode_changed is set when the input mode is changed.
  469  * crtc_state->connectors_changed is set when a connector is added or
  470  * removed from the crtc.
  471  * crtc_state->active_changed is set when crtc_state->active changes,
  472  * which is used for dpms.
  473  *
  474  * IMPORTANT:
  475  *
  476  * Drivers which update ->mode_changed (e.g. in their ->atomic_check hooks if a
  477  * plane update can't be done without a full modeset) _must_ call this function
  478  * afterwards after that change. It is permitted to call this function multiple
  479  * times for the same update, e.g. when the ->atomic_check functions depend upon
  480  * the adjusted dotclock for fifo space allocation and watermark computation.
  481  *
  482  * RETURNS
  483  * Zero for success or -errno
  484  */
  485 int
  486 drm_atomic_helper_check_modeset(struct drm_device *dev,
  487 				struct drm_atomic_state *state)
  488 {
  489 	struct drm_crtc *crtc;
  490 	struct drm_crtc_state *crtc_state;
  491 	struct drm_connector *connector;
  492 	struct drm_connector_state *connector_state;
  493 	int i, ret;
  494 
  495 	for_each_crtc_in_state(state, crtc, crtc_state, i) {
  496 		if (!drm_mode_equal(&crtc->state->mode, &crtc_state->mode)) {
  497 			DRM_DEBUG_ATOMIC("[CRTC:%d:%s] mode changed\n",
  498 					 crtc->base.id, crtc->name);
  499 			crtc_state->mode_changed = true;
  500 		}
  501 
  502 		if (crtc->state->enable != crtc_state->enable) {
  503 			DRM_DEBUG_ATOMIC("[CRTC:%d:%s] enable changed\n",
  504 					 crtc->base.id, crtc->name);
  505 
  506 			/*
  507 			 * For clarity this assignment is done here, but
  508 			 * enable == 0 is only true when there are no
  509 			 * connectors and a NULL mode.
  510 			 *
  511 			 * The other way around is true as well. enable != 0
  512 			 * iff connectors are attached and a mode is set.
  513 			 */
  514 			crtc_state->mode_changed = true;
  515 			crtc_state->connectors_changed = true;
  516 		}
  517 	}
  518 
  519 	ret = handle_conflicting_encoders(state, state->legacy_set_config);
  520 	if (ret)
  521 		return ret;
  522 
  523 	for_each_connector_in_state(state, connector, connector_state, i) {
  524 		/*
  525 		 * This only sets crtc->mode_changed for routing changes,
  526 		 * drivers must set crtc->mode_changed themselves when connector
  527 		 * properties need to be updated.
  528 		 */
  529 		ret = update_connector_routing(state, connector,
  530 					       connector_state);
  531 		if (ret)
  532 			return ret;
  533 	}
  534 
  535 	/*
  536 	 * After all the routing has been prepared we need to add in any
  537 	 * connector which is itself unchanged, but who's crtc changes it's
  538 	 * configuration. This must be done before calling mode_fixup in case a
  539 	 * crtc only changed its mode but has the same set of connectors.
  540 	 */
  541 	for_each_crtc_in_state(state, crtc, crtc_state, i) {
  542 		bool has_connectors =
  543 			!!crtc_state->connector_mask;
  544 
  545 		/*
  546 		 * We must set ->active_changed after walking connectors for
  547 		 * otherwise an update that only changes active would result in
  548 		 * a full modeset because update_connector_routing force that.
  549 		 */
  550 		if (crtc->state->active != crtc_state->active) {
  551 			DRM_DEBUG_ATOMIC("[CRTC:%d:%s] active changed\n",
  552 					 crtc->base.id, crtc->name);
  553 			crtc_state->active_changed = true;
  554 		}
  555 
  556 		if (!drm_atomic_crtc_needs_modeset(crtc_state))
  557 			continue;
  558 
  559 		DRM_DEBUG_ATOMIC("[CRTC:%d:%s] needs all connectors, enable: %c, active: %c\n",
  560 				 crtc->base.id, crtc->name,
  561 				 crtc_state->enable ? 'y' : 'n',
  562 				 crtc_state->active ? 'y' : 'n');
  563 
  564 		ret = drm_atomic_add_affected_connectors(state, crtc);
  565 		if (ret != 0)
  566 			return ret;
  567 
  568 		ret = drm_atomic_add_affected_planes(state, crtc);
  569 		if (ret != 0)
  570 			return ret;
  571 
  572 		if (crtc_state->enable != has_connectors) {
  573 			DRM_DEBUG_ATOMIC("[CRTC:%d:%s] enabled/connectors mismatch\n",
  574 					 crtc->base.id, crtc->name);
  575 
  576 			return -EINVAL;
  577 		}
  578 	}
  579 
  580 	return mode_fixup(state);
  581 }
  582 EXPORT_SYMBOL(drm_atomic_helper_check_modeset);
  583 
  584 /**
  585  * drm_atomic_helper_check_planes - validate state object for planes changes
  586  * @dev: DRM device
  587  * @state: the driver state object
  588  *
  589  * Check the state object to see if the requested state is physically possible.
  590  * This does all the plane update related checks using by calling into the
  591  * ->atomic_check hooks provided by the driver.
  592  *
  593  * It also sets crtc_state->planes_changed to indicate that a crtc has
  594  * updated planes.
  595  *
  596  * RETURNS
  597  * Zero for success or -errno
  598  */
  599 int
  600 drm_atomic_helper_check_planes(struct drm_device *dev,
  601 			       struct drm_atomic_state *state)
  602 {
  603 	struct drm_crtc *crtc;
  604 	struct drm_crtc_state *crtc_state;
  605 	struct drm_plane *plane;
  606 	struct drm_plane_state *plane_state;
  607 	int i, ret = 0;
  608 
  609 	for_each_plane_in_state(state, plane, plane_state, i) {
  610 		const struct drm_plane_helper_funcs *funcs;
  611 
  612 		funcs = plane->helper_private;
  613 
  614 		drm_atomic_helper_plane_changed(state, plane_state, plane);
  615 
  616 		if (!funcs || !funcs->atomic_check)
  617 			continue;
  618 
  619 		ret = funcs->atomic_check(plane, plane_state);
  620 		if (ret) {
  621 			DRM_DEBUG_ATOMIC("[PLANE:%d:%s] atomic driver check failed\n",
  622 					 plane->base.id, plane->name);
  623 			return ret;
  624 		}
  625 	}
  626 
  627 	for_each_crtc_in_state(state, crtc, crtc_state, i) {
  628 		const struct drm_crtc_helper_funcs *funcs;
  629 
  630 		funcs = crtc->helper_private;
  631 
  632 		if (!funcs || !funcs->atomic_check)
  633 			continue;
  634 
  635 		ret = funcs->atomic_check(crtc, state->crtc_states[i]);
  636 		if (ret) {
  637 			DRM_DEBUG_ATOMIC("[CRTC:%d:%s] atomic driver check failed\n",
  638 					 crtc->base.id, crtc->name);
  639 			return ret;
  640 		}
  641 	}
  642 
  643 	return ret;
  644 }
  645 EXPORT_SYMBOL(drm_atomic_helper_check_planes);
  646 
  647 /**
  648  * drm_atomic_helper_check - validate state object
  649  * @dev: DRM device
  650  * @state: the driver state object
  651  *
  652  * Check the state object to see if the requested state is physically possible.
  653  * Only crtcs and planes have check callbacks, so for any additional (global)
  654  * checking that a driver needs it can simply wrap that around this function.
  655  * Drivers without such needs can directly use this as their ->atomic_check()
  656  * callback.
  657  *
  658  * This just wraps the two parts of the state checking for planes and modeset
  659  * state in the default order: First it calls drm_atomic_helper_check_modeset()
  660  * and then drm_atomic_helper_check_planes(). The assumption is that the
  661  * ->atomic_check functions depend upon an updated adjusted_mode.clock to
  662  * e.g. properly compute watermarks.
  663  *
  664  * RETURNS
  665  * Zero for success or -errno
  666  */
  667 int drm_atomic_helper_check(struct drm_device *dev,
  668 			    struct drm_atomic_state *state)
  669 {
  670 	int ret;
  671 
  672 	ret = drm_atomic_helper_check_modeset(dev, state);
  673 	if (ret)
  674 		return ret;
  675 
  676 	ret = drm_atomic_helper_check_planes(dev, state);
  677 	if (ret)
  678 		return ret;
  679 
  680 	return ret;
  681 }
  682 EXPORT_SYMBOL(drm_atomic_helper_check);
  683 
  684 static void
  685 disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
  686 {
  687 	struct drm_connector *connector;
  688 	struct drm_connector_state *old_conn_state;
  689 	struct drm_crtc *crtc;
  690 	struct drm_crtc_state *old_crtc_state;
  691 	int i;
  692 
  693 	for_each_connector_in_state(old_state, connector, old_conn_state, i) {
  694 		const struct drm_encoder_helper_funcs *funcs;
  695 		struct drm_encoder *encoder;
  696 
  697 		/* Shut down everything that's in the changeset and currently
  698 		 * still on. So need to check the old, saved state. */
  699 		if (!old_conn_state->crtc)
  700 			continue;
  701 
  702 		old_crtc_state = drm_atomic_get_existing_crtc_state(old_state,
  703 								    old_conn_state->crtc);
  704 
  705 		if (!old_crtc_state->active ||
  706 		    !drm_atomic_crtc_needs_modeset(old_conn_state->crtc->state))
  707 			continue;
  708 
  709 		encoder = old_conn_state->best_encoder;
  710 
  711 		/* We shouldn't get this far if we didn't previously have
  712 		 * an encoder.. but WARN_ON() rather than explode.
  713 		 */
  714 		if (WARN_ON(!encoder))
  715 			continue;
  716 
  717 		funcs = encoder->helper_private;
  718 
  719 		DRM_DEBUG_ATOMIC("disabling [ENCODER:%d:%s]\n",
  720 				 encoder->base.id, encoder->name);
  721 
  722 		/*
  723 		 * Each encoder has at most one connector (since we always steal
  724 		 * it away), so we won't call disable hooks twice.
  725 		 */
  726 		drm_bridge_disable(encoder->bridge);
  727 
  728 		/* Right function depends upon target state. */
  729 		if (funcs) {
  730 			if (connector->state->crtc && funcs->prepare)
  731 				funcs->prepare(encoder);
  732 			else if (funcs->disable)
  733 				funcs->disable(encoder);
  734 			else if (funcs->dpms)
  735 				funcs->dpms(encoder, DRM_MODE_DPMS_OFF);
  736 		}
  737 
  738 		drm_bridge_post_disable(encoder->bridge);
  739 	}
  740 
  741 	for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
  742 		const struct drm_crtc_helper_funcs *funcs;
  743 
  744 		/* Shut down everything that needs a full modeset. */
  745 		if (!drm_atomic_crtc_needs_modeset(crtc->state))
  746 			continue;
  747 
  748 		if (!old_crtc_state->active)
  749 			continue;
  750 
  751 		funcs = crtc->helper_private;
  752 
  753 		DRM_DEBUG_ATOMIC("disabling [CRTC:%d:%s]\n",
  754 				 crtc->base.id, crtc->name);
  755 
  756 
  757 		/* Right function depends upon target state. */
  758 		if (crtc->state->enable && funcs->prepare)
  759 			funcs->prepare(crtc);
  760 		else if (funcs->disable)
  761 			funcs->disable(crtc);
  762 		else
  763 			funcs->dpms(crtc, DRM_MODE_DPMS_OFF);
  764 	}
  765 }
  766 
  767 /**
  768  * drm_atomic_helper_update_legacy_modeset_state - update legacy modeset state
  769  * @dev: DRM device
  770  * @old_state: atomic state object with old state structures
  771  *
  772  * This function updates all the various legacy modeset state pointers in
  773  * connectors, encoders and crtcs. It also updates the timestamping constants
  774  * used for precise vblank timestamps by calling
  775  * drm_calc_timestamping_constants().
  776  *
  777  * Drivers can use this for building their own atomic commit if they don't have
  778  * a pure helper-based modeset implementation.
  779  */
  780 void
  781 drm_atomic_helper_update_legacy_modeset_state(struct drm_device *dev,
  782 					      struct drm_atomic_state *old_state)
  783 {
  784 	struct drm_connector *connector;
  785 	struct drm_connector_state *old_conn_state;
  786 	struct drm_crtc *crtc;
  787 	struct drm_crtc_state *old_crtc_state;
  788 	int i;
  789 
  790 	/* clear out existing links and update dpms */
  791 	for_each_connector_in_state(old_state, connector, old_conn_state, i) {
  792 		if (connector->encoder) {
  793 			WARN_ON(!connector->encoder->crtc);
  794 
  795 			connector->encoder->crtc = NULL;
  796 			connector->encoder = NULL;
  797 		}
  798 
  799 		crtc = connector->state->crtc;
  800 		if ((!crtc && old_conn_state->crtc) ||
  801 		    (crtc && drm_atomic_crtc_needs_modeset(crtc->state))) {
  802 			struct drm_property *dpms_prop =
  803 				dev->mode_config.dpms_property;
  804 			int mode = DRM_MODE_DPMS_OFF;
  805 
  806 			if (crtc && crtc->state->active)
  807 				mode = DRM_MODE_DPMS_ON;
  808 
  809 			connector->dpms = mode;
  810 			drm_object_property_set_value(&connector->base,
  811 						      dpms_prop, mode);
  812 		}
  813 	}
  814 
  815 	/* set new links */
  816 	for_each_connector_in_state(old_state, connector, old_conn_state, i) {
  817 		if (!connector->state->crtc)
  818 			continue;
  819 
  820 		if (WARN_ON(!connector->state->best_encoder))
  821 			continue;
  822 
  823 		connector->encoder = connector->state->best_encoder;
  824 		connector->encoder->crtc = connector->state->crtc;
  825 	}
  826 
  827 	/* set legacy state in the crtc structure */
  828 	for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
  829 		struct drm_plane *primary = crtc->primary;
  830 
  831 		crtc->mode = crtc->state->mode;
  832 		crtc->enabled = crtc->state->enable;
  833 
  834 		if (drm_atomic_get_existing_plane_state(old_state, primary) &&
  835 		    primary->state->crtc == crtc) {
  836 			crtc->x = primary->state->src_x >> 16;
  837 			crtc->y = primary->state->src_y >> 16;
  838 		}
  839 
  840 		if (crtc->state->enable)
  841 			drm_calc_timestamping_constants(crtc,
  842 							&crtc->state->adjusted_mode);
  843 	}
  844 }
  845 EXPORT_SYMBOL(drm_atomic_helper_update_legacy_modeset_state);
  846 
  847 static void
  848 crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *old_state)
  849 {
  850 	struct drm_crtc *crtc;
  851 	struct drm_crtc_state *old_crtc_state;
  852 	struct drm_connector *connector;
  853 	struct drm_connector_state *old_conn_state;
  854 	int i;
  855 
  856 	for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
  857 		const struct drm_crtc_helper_funcs *funcs;
  858 
  859 		if (!crtc->state->mode_changed)
  860 			continue;
  861 
  862 		funcs = crtc->helper_private;
  863 
  864 		if (crtc->state->enable && funcs->mode_set_nofb) {
  865 			DRM_DEBUG_ATOMIC("modeset on [CRTC:%d:%s]\n",
  866 					 crtc->base.id, crtc->name);
  867 
  868 			funcs->mode_set_nofb(crtc);
  869 		}
  870 	}
  871 
  872 	for_each_connector_in_state(old_state, connector, old_conn_state, i) {
  873 		const struct drm_encoder_helper_funcs *funcs;
  874 		struct drm_crtc_state *new_crtc_state;
  875 		struct drm_encoder *encoder;
  876 		struct drm_display_mode *mode, *adjusted_mode;
  877 
  878 		if (!connector->state->best_encoder)
  879 			continue;
  880 
  881 		encoder = connector->state->best_encoder;
  882 		funcs = encoder->helper_private;
  883 		new_crtc_state = connector->state->crtc->state;
  884 		mode = &new_crtc_state->mode;
  885 		adjusted_mode = &new_crtc_state->adjusted_mode;
  886 
  887 		if (!new_crtc_state->mode_changed)
  888 			continue;
  889 
  890 		DRM_DEBUG_ATOMIC("modeset on [ENCODER:%d:%s]\n",
  891 				 encoder->base.id, encoder->name);
  892 
  893 		/*
  894 		 * Each encoder has at most one connector (since we always steal
  895 		 * it away), so we won't call mode_set hooks twice.
  896 		 */
  897 		if (funcs && funcs->mode_set)
  898 			funcs->mode_set(encoder, mode, adjusted_mode);
  899 
  900 		drm_bridge_mode_set(encoder->bridge, mode, adjusted_mode);
  901 	}
  902 }
  903 
  904 /**
  905  * drm_atomic_helper_commit_modeset_disables - modeset commit to disable outputs
  906  * @dev: DRM device
  907  * @old_state: atomic state object with old state structures
  908  *
  909  * This function shuts down all the outputs that need to be shut down and
  910  * prepares them (if required) with the new mode.
  911  *
  912  * For compatibility with legacy crtc helpers this should be called before
  913  * drm_atomic_helper_commit_planes(), which is what the default commit function
  914  * does. But drivers with different needs can group the modeset commits together
  915  * and do the plane commits at the end. This is useful for drivers doing runtime
  916  * PM since planes updates then only happen when the CRTC is actually enabled.
  917  */
  918 void drm_atomic_helper_commit_modeset_disables(struct drm_device *dev,
  919 					       struct drm_atomic_state *old_state)
  920 {
  921 	disable_outputs(dev, old_state);
  922 
  923 	drm_atomic_helper_update_legacy_modeset_state(dev, old_state);
  924 
  925 	crtc_set_mode(dev, old_state);
  926 }
  927 EXPORT_SYMBOL(drm_atomic_helper_commit_modeset_disables);
  928 
  929 /**
  930  * drm_atomic_helper_commit_modeset_enables - modeset commit to enable outputs
  931  * @dev: DRM device
  932  * @old_state: atomic state object with old state structures
  933  *
  934  * This function enables all the outputs with the new configuration which had to
  935  * be turned off for the update.
  936  *
  937  * For compatibility with legacy crtc helpers this should be called after
  938  * drm_atomic_helper_commit_planes(), which is what the default commit function
  939  * does. But drivers with different needs can group the modeset commits together
  940  * and do the plane commits at the end. This is useful for drivers doing runtime
  941  * PM since planes updates then only happen when the CRTC is actually enabled.
  942  */
  943 void drm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
  944 					      struct drm_atomic_state *old_state)
  945 {
  946 	struct drm_crtc *crtc;
  947 	struct drm_crtc_state *old_crtc_state;
  948 	struct drm_connector *connector;
  949 	struct drm_connector_state *old_conn_state;
  950 	int i;
  951 
  952 	for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
  953 		const struct drm_crtc_helper_funcs *funcs;
  954 
  955 		/* Need to filter out CRTCs where only planes change. */
  956 		if (!drm_atomic_crtc_needs_modeset(crtc->state))
  957 			continue;
  958 
  959 		if (!crtc->state->active)
  960 			continue;
  961 
  962 		funcs = crtc->helper_private;
  963 
  964 		if (crtc->state->enable) {
  965 			DRM_DEBUG_ATOMIC("enabling [CRTC:%d:%s]\n",
  966 					 crtc->base.id, crtc->name);
  967 
  968 			if (funcs->enable)
  969 				funcs->enable(crtc);
  970 			else
  971 				funcs->commit(crtc);
  972 		}
  973 	}
  974 
  975 	for_each_connector_in_state(old_state, connector, old_conn_state, i) {
  976 		const struct drm_encoder_helper_funcs *funcs;
  977 		struct drm_encoder *encoder;
  978 
  979 		if (!connector->state->best_encoder)
  980 			continue;
  981 
  982 		if (!connector->state->crtc->state->active ||
  983 		    !drm_atomic_crtc_needs_modeset(connector->state->crtc->state))
  984 			continue;
  985 
  986 		encoder = connector->state->best_encoder;
  987 		funcs = encoder->helper_private;
  988 
  989 		DRM_DEBUG_ATOMIC("enabling [ENCODER:%d:%s]\n",
  990 				 encoder->base.id, encoder->name);
  991 
  992 		/*
  993 		 * Each encoder has at most one connector (since we always steal
  994 		 * it away), so we won't call enable hooks twice.
  995 		 */
  996 		drm_bridge_pre_enable(encoder->bridge);
  997 
  998 		if (funcs) {
  999 			if (funcs->enable)
 1000 				funcs->enable(encoder);
 1001 			else if (funcs->commit)
 1002 				funcs->commit(encoder);
 1003 		}
 1004 
 1005 		drm_bridge_enable(encoder->bridge);
 1006 	}
 1007 }
 1008 EXPORT_SYMBOL(drm_atomic_helper_commit_modeset_enables);
 1009 
 1010 /**
 1011  * drm_atomic_helper_wait_for_fences - wait for fences stashed in plane state
 1012  * @dev: DRM device
 1013  * @state: atomic state object with old state structures
 1014  *
 1015  * For implicit sync, driver should fish the exclusive fence out from the
 1016  * incoming fb's and stash it in the drm_plane_state.  This is called after
 1017  * drm_atomic_helper_swap_state() so it uses the current plane state (and
 1018  * just uses the atomic state to find the changed planes)
 1019  */
 1020 void drm_atomic_helper_wait_for_fences(struct drm_device *dev,
 1021 			    struct drm_atomic_state *state)
 1022 {
 1023 	struct drm_plane *plane;
 1024 	struct drm_plane_state *plane_state;
 1025 	int i;
 1026 
 1027 	for_each_plane_in_state(state, plane, plane_state, i) {
 1028 		if (!plane->state->fence)
 1029 			continue;
 1030 
 1031 		WARN_ON(!plane->state->fb);
 1032 
 1033 		fence_wait(plane->state->fence, false);
 1034 		fence_put(plane->state->fence);
 1035 		plane->state->fence = NULL;
 1036 	}
 1037 }
 1038 EXPORT_SYMBOL(drm_atomic_helper_wait_for_fences);
 1039 
 1040 /**
 1041  * drm_atomic_helper_framebuffer_changed - check if framebuffer has changed
 1042  * @dev: DRM device
 1043  * @old_state: atomic state object with old state structures
 1044  * @crtc: DRM crtc
 1045  *
 1046  * Checks whether the framebuffer used for this CRTC changes as a result of
 1047  * the atomic update.  This is useful for drivers which cannot use
 1048  * drm_atomic_helper_wait_for_vblanks() and need to reimplement its
 1049  * functionality.
 1050  *
 1051  * Returns:
 1052  * true if the framebuffer changed.
 1053  */
 1054 bool drm_atomic_helper_framebuffer_changed(struct drm_device *dev,
 1055 					   struct drm_atomic_state *old_state,
 1056 					   struct drm_crtc *crtc)
 1057 {
 1058 	struct drm_plane *plane;
 1059 	struct drm_plane_state *old_plane_state;
 1060 	int i;
 1061 
 1062 	for_each_plane_in_state(old_state, plane, old_plane_state, i) {
 1063 		if (plane->state->crtc != crtc &&
 1064 		    old_plane_state->crtc != crtc)
 1065 			continue;
 1066 
 1067 		if (plane->state->fb != old_plane_state->fb)
 1068 			return true;
 1069 	}
 1070 
 1071 	return false;
 1072 }
 1073 EXPORT_SYMBOL(drm_atomic_helper_framebuffer_changed);
 1074 
 1075 /**
 1076  * drm_atomic_helper_wait_for_vblanks - wait for vblank on crtcs
 1077  * @dev: DRM device
 1078  * @old_state: atomic state object with old state structures
 1079  *
 1080  * Helper to, after atomic commit, wait for vblanks on all effected
 1081  * crtcs (ie. before cleaning up old framebuffers using
 1082  * drm_atomic_helper_cleanup_planes()). It will only wait on crtcs where the
 1083  * framebuffers have actually changed to optimize for the legacy cursor and
 1084  * plane update use-case.
 1085  */
 1086 void
 1087 drm_atomic_helper_wait_for_vblanks(struct drm_device *dev,
 1088 		struct drm_atomic_state *old_state)
 1089 {
 1090 	struct drm_crtc *crtc;
 1091 	struct drm_crtc_state *old_crtc_state;
 1092 	int i, ret;
 1093 
 1094 	for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
 1095 		/* No one cares about the old state, so abuse it for tracking
 1096 		 * and store whether we hold a vblank reference (and should do a
 1097 		 * vblank wait) in the ->enable boolean. */
 1098 		old_crtc_state->enable = false;
 1099 
 1100 		if (!crtc->state->enable)
 1101 			continue;
 1102 
 1103 		/* Legacy cursor ioctls are completely unsynced, and userspace
 1104 		 * relies on that (by doing tons of cursor updates). */
 1105 		if (old_state->legacy_cursor_update)
 1106 			continue;
 1107 
 1108 		if (!drm_atomic_helper_framebuffer_changed(dev,
 1109 				old_state, crtc))
 1110 			continue;
 1111 
 1112 		ret = drm_crtc_vblank_get(crtc);
 1113 		if (ret != 0)
 1114 			continue;
 1115 
 1116 		old_crtc_state->enable = true;
 1117 		old_crtc_state->last_vblank_count = drm_crtc_vblank_count(crtc);
 1118 	}
 1119 
 1120 	for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
 1121 		if (!old_crtc_state->enable)
 1122 			continue;
 1123 
 1124 		ret = wait_event_timeout(dev->vblank[i].queue,
 1125 				old_crtc_state->last_vblank_count !=
 1126 					drm_crtc_vblank_count(crtc),
 1127 				msecs_to_jiffies(50));
 1128 
 1129 		WARN(!ret, "[CRTC:%d] vblank wait timed out\n", crtc->base.id);
 1130 
 1131 		drm_crtc_vblank_put(crtc);
 1132 	}
 1133 }
 1134 EXPORT_SYMBOL(drm_atomic_helper_wait_for_vblanks);
 1135 
 1136 /**
 1137  * drm_atomic_helper_commit - commit validated state object
 1138  * @dev: DRM device
 1139  * @state: the driver state object
 1140  * @nonblocking: whether nonblocking behavior is requested.
 1141  *
 1142  * This function commits a with drm_atomic_helper_check() pre-validated state
 1143  * object. This can still fail when e.g. the framebuffer reservation fails. For
 1144  * now this doesn't implement nonblocking commits.
 1145  *
 1146  * Note that right now this function does not support nonblocking commits, hence
 1147  * driver writers must implement their own version for now. Also note that the
 1148  * default ordering of how the various stages are called is to match the legacy
 1149  * modeset helper library closest. One peculiarity of that is that it doesn't
 1150  * mesh well with runtime PM at all.
 1151  *
 1152  * For drivers supporting runtime PM the recommended sequence is
 1153  *
 1154  *     drm_atomic_helper_commit_modeset_disables(dev, state);
 1155  *
 1156  *     drm_atomic_helper_commit_modeset_enables(dev, state);
 1157  *
 1158  *     drm_atomic_helper_commit_planes(dev, state, true);
 1159  *
 1160  * See the kerneldoc entries for these three functions for more details.
 1161  *
 1162  * RETURNS
 1163  * Zero for success or -errno.
 1164  */
 1165 int drm_atomic_helper_commit(struct drm_device *dev,
 1166 			     struct drm_atomic_state *state,
 1167 			     bool nonblock)
 1168 {
 1169 	int ret;
 1170 
 1171 	if (nonblock)
 1172 		return -EBUSY;
 1173 
 1174 	ret = drm_atomic_helper_prepare_planes(dev, state);
 1175 	if (ret)
 1176 		return ret;
 1177 
 1178 	/*
 1179 	 * This is the point of no return - everything below never fails except
 1180 	 * when the hw goes bonghits. Which means we can commit the new state on
 1181 	 * the software side now.
 1182 	 */
 1183 
 1184 	drm_atomic_helper_swap_state(dev, state);
 1185 
 1186 	/*
 1187 	 * Everything below can be run asynchronously without the need to grab
 1188 	 * any modeset locks at all under one condition: It must be guaranteed
 1189 	 * that the asynchronous work has either been cancelled (if the driver
 1190 	 * supports it, which at least requires that the framebuffers get
 1191 	 * cleaned up with drm_atomic_helper_cleanup_planes()) or completed
 1192 	 * before the new state gets committed on the software side with
 1193 	 * drm_atomic_helper_swap_state().
 1194 	 *
 1195 	 * This scheme allows new atomic state updates to be prepared and
 1196 	 * checked in parallel to the asynchronous completion of the previous
 1197 	 * update. Which is important since compositors need to figure out the
 1198 	 * composition of the next frame right after having submitted the
 1199 	 * current layout.
 1200 	 */
 1201 
 1202 	drm_atomic_helper_wait_for_fences(dev, state);
 1203 
 1204 	drm_atomic_helper_commit_modeset_disables(dev, state);
 1205 
 1206 	drm_atomic_helper_commit_planes(dev, state, false);
 1207 
 1208 	drm_atomic_helper_commit_modeset_enables(dev, state);
 1209 
 1210 	drm_atomic_helper_wait_for_vblanks(dev, state);
 1211 
 1212 	drm_atomic_helper_cleanup_planes(dev, state);
 1213 
 1214 	drm_atomic_state_free(state);
 1215 
 1216 	return 0;
 1217 }
 1218 EXPORT_SYMBOL(drm_atomic_helper_commit);
 1219 
 1220 /**
 1221  * DOC: implementing nonblocking commit
 1222  *
 1223  * For now the atomic helpers don't support nonblocking commit directly. If
 1224  * there is real need it could be added though, using the dma-buf fence
 1225  * infrastructure for generic synchronization with outstanding rendering.
 1226  *
 1227  * For now drivers have to implement nonblocking commit themselves, with the
 1228  * following sequence being the recommended one:
 1229  *
 1230  * 1. Run drm_atomic_helper_prepare_planes() first. This is the only function
 1231  * which commit needs to call which can fail, so we want to run it first and
 1232  * synchronously.
 1233  *
 1234  * 2. Synchronize with any outstanding nonblocking commit worker threads which
 1235  * might be affected the new state update. This can be done by either cancelling
 1236  * or flushing the work items, depending upon whether the driver can deal with
 1237  * cancelled updates. Note that it is important to ensure that the framebuffer
 1238  * cleanup is still done when cancelling.
 1239  *
 1240  * For sufficient parallelism it is recommended to have a work item per crtc
 1241  * (for updates which don't touch global state) and a global one. Then we only
 1242  * need to synchronize with the crtc work items for changed crtcs and the global
 1243  * work item, which allows nice concurrent updates on disjoint sets of crtcs.
 1244  *
 1245  * 3. The software state is updated synchronously with
 1246  * drm_atomic_helper_swap_state(). Doing this under the protection of all modeset
 1247  * locks means concurrent callers never see inconsistent state. And doing this
 1248  * while it's guaranteed that no relevant nonblocking worker runs means that
 1249  * nonblocking workers do not need grab any locks. Actually they must not grab
 1250  * locks, for otherwise the work flushing will deadlock.
 1251  *
 1252  * 4. Schedule a work item to do all subsequent steps, using the split-out
 1253  * commit helpers: a) pre-plane commit b) plane commit c) post-plane commit and
 1254  * then cleaning up the framebuffers after the old framebuffer is no longer
 1255  * being displayed.
 1256  */
 1257 
 1258 /**
 1259  * drm_atomic_helper_prepare_planes - prepare plane resources before commit
 1260  * @dev: DRM device
 1261  * @state: atomic state object with new state structures
 1262  *
 1263  * This function prepares plane state, specifically framebuffers, for the new
 1264  * configuration. If any failure is encountered this function will call
 1265  * ->cleanup_fb on any already successfully prepared framebuffer.
 1266  *
 1267  * Returns:
 1268  * 0 on success, negative error code on failure.
 1269  */
 1270 int drm_atomic_helper_prepare_planes(struct drm_device *dev,
 1271 				     struct drm_atomic_state *state)
 1272 {
 1273 	int nplanes = dev->mode_config.num_total_plane;
 1274 	int ret, i;
 1275 
 1276 	for (i = 0; i < nplanes; i++) {
 1277 		const struct drm_plane_helper_funcs *funcs;
 1278 		struct drm_plane *plane = state->planes[i];
 1279 		struct drm_plane_state *plane_state = state->plane_states[i];
 1280 
 1281 		if (!plane)
 1282 			continue;
 1283 
 1284 		funcs = plane->helper_private;
 1285 
 1286 		if (funcs->prepare_fb) {
 1287 			ret = funcs->prepare_fb(plane, plane_state);
 1288 			if (ret)
 1289 				goto fail;
 1290 		}
 1291 	}
 1292 
 1293 	return 0;
 1294 
 1295 fail:
 1296 	for (i--; i >= 0; i--) {
 1297 		const struct drm_plane_helper_funcs *funcs;
 1298 		struct drm_plane *plane = state->planes[i];
 1299 		struct drm_plane_state *plane_state = state->plane_states[i];
 1300 
 1301 		if (!plane)
 1302 			continue;
 1303 
 1304 		funcs = plane->helper_private;
 1305 
 1306 		if (funcs->cleanup_fb)
 1307 			funcs->cleanup_fb(plane, plane_state);
 1308 
 1309 	}
 1310 
 1311 	return ret;
 1312 }
 1313 EXPORT_SYMBOL(drm_atomic_helper_prepare_planes);
 1314 
 1315 bool plane_crtc_active(struct drm_plane_state *state)
 1316 {
 1317 	return state->crtc && state->crtc->state->active;
 1318 }
 1319 
 1320 /**
 1321  * drm_atomic_helper_commit_planes - commit plane state
 1322  * @dev: DRM device
 1323  * @old_state: atomic state object with old state structures
 1324  * @active_only: Only commit on active CRTC if set
 1325  *
 1326  * This function commits the new plane state using the plane and atomic helper
 1327  * functions for planes and crtcs. It assumes that the atomic state has already
 1328  * been pushed into the relevant object state pointers, since this step can no
 1329  * longer fail.
 1330  *
 1331  * It still requires the global state object @old_state to know which planes and
 1332  * crtcs need to be updated though.
 1333  *
 1334  * Note that this function does all plane updates across all CRTCs in one step.
 1335  * If the hardware can't support this approach look at
 1336  * drm_atomic_helper_commit_planes_on_crtc() instead.
 1337  *
 1338  * Plane parameters can be updated by applications while the associated CRTC is
 1339  * disabled. The DRM/KMS core will store the parameters in the plane state,
 1340  * which will be available to the driver when the CRTC is turned on. As a result
 1341  * most drivers don't need to be immediately notified of plane updates for a
 1342  * disabled CRTC.
 1343  *
 1344  * Unless otherwise needed, drivers are advised to set the @active_only
 1345  * parameters to true in order not to receive plane update notifications related
 1346  * to a disabled CRTC. This avoids the need to manually ignore plane updates in
 1347  * driver code when the driver and/or hardware can't or just don't need to deal
 1348  * with updates on disabled CRTCs, for example when supporting runtime PM.
 1349  *
 1350  * The drm_atomic_helper_commit() default implementation only sets @active_only
 1351  * to false to most closely match the behaviour of the legacy helpers. This should
 1352  * not be copied blindly by drivers.
 1353  */
 1354 void drm_atomic_helper_commit_planes(struct drm_device *dev,
 1355 				     struct drm_atomic_state *old_state,
 1356 				     bool active_only)
 1357 {
 1358 	struct drm_crtc *crtc;
 1359 	struct drm_crtc_state *old_crtc_state;
 1360 	struct drm_plane *plane;
 1361 	struct drm_plane_state *old_plane_state;
 1362 	int i;
 1363 
 1364 	for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
 1365 		const struct drm_crtc_helper_funcs *funcs;
 1366 
 1367 		funcs = crtc->helper_private;
 1368 
 1369 		if (!funcs || !funcs->atomic_begin)
 1370 			continue;
 1371 
 1372 		if (active_only && !crtc->state->active)
 1373 			continue;
 1374 
 1375 		funcs->atomic_begin(crtc, old_crtc_state);
 1376 	}
 1377 
 1378 	for_each_plane_in_state(old_state, plane, old_plane_state, i) {
 1379 		const struct drm_plane_helper_funcs *funcs;
 1380 		bool disabling;
 1381 
 1382 		funcs = plane->helper_private;
 1383 
 1384 		if (!funcs)
 1385 			continue;
 1386 
 1387 		disabling = drm_atomic_plane_disabling(plane, old_plane_state);
 1388 
 1389 		if (active_only) {
 1390 			/*
 1391 			 * Skip planes related to inactive CRTCs. If the plane
 1392 			 * is enabled use the state of the current CRTC. If the
 1393 			 * plane is being disabled use the state of the old
 1394 			 * CRTC to avoid skipping planes being disabled on an
 1395 			 * active CRTC.
 1396 			 */
 1397 			if (!disabling && !plane_crtc_active(plane->state))
 1398 				continue;
 1399 			if (disabling && !plane_crtc_active(old_plane_state))
 1400 				continue;
 1401 		}
 1402 
 1403 		/*
 1404 		 * Special-case disabling the plane if drivers support it.
 1405 		 */
 1406 		if (disabling && funcs->atomic_disable)
 1407 			funcs->atomic_disable(plane, old_plane_state);
 1408 		else if (plane->state->crtc || disabling)
 1409 			funcs->atomic_update(plane, old_plane_state);
 1410 	}
 1411 
 1412 	for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
 1413 		const struct drm_crtc_helper_funcs *funcs;
 1414 
 1415 		funcs = crtc->helper_private;
 1416 
 1417 		if (!funcs || !funcs->atomic_flush)
 1418 			continue;
 1419 
 1420 		if (active_only && !crtc->state->active)
 1421 			continue;
 1422 
 1423 		funcs->atomic_flush(crtc, old_crtc_state);
 1424 	}
 1425 }
 1426 EXPORT_SYMBOL(drm_atomic_helper_commit_planes);
 1427 
 1428 /**
 1429  * drm_atomic_helper_commit_planes_on_crtc - commit plane state for a crtc
 1430  * @old_crtc_state: atomic state object with the old crtc state
 1431  *
 1432  * This function commits the new plane state using the plane and atomic helper
 1433  * functions for planes on the specific crtc. It assumes that the atomic state
 1434  * has already been pushed into the relevant object state pointers, since this
 1435  * step can no longer fail.
 1436  *
 1437  * This function is useful when plane updates should be done crtc-by-crtc
 1438  * instead of one global step like drm_atomic_helper_commit_planes() does.
 1439  *
 1440  * This function can only be savely used when planes are not allowed to move
 1441  * between different CRTCs because this function doesn't handle inter-CRTC
 1442  * depencies. Callers need to ensure that either no such depencies exist,
 1443  * resolve them through ordering of commit calls or through some other means.
 1444  */
 1445 void
 1446 drm_atomic_helper_commit_planes_on_crtc(struct drm_crtc_state *old_crtc_state)
 1447 {
 1448 	const struct drm_crtc_helper_funcs *crtc_funcs;
 1449 	struct drm_crtc *crtc = old_crtc_state->crtc;
 1450 	struct drm_atomic_state *old_state = old_crtc_state->state;
 1451 	struct drm_plane *plane;
 1452 	unsigned plane_mask;
 1453 
 1454 	plane_mask = old_crtc_state->plane_mask;
 1455 	plane_mask |= crtc->state->plane_mask;
 1456 
 1457 	crtc_funcs = crtc->helper_private;
 1458 	if (crtc_funcs && crtc_funcs->atomic_begin)
 1459 		crtc_funcs->atomic_begin(crtc, old_crtc_state);
 1460 
 1461 	drm_for_each_plane_mask(plane, crtc->dev, plane_mask) {
 1462 		struct drm_plane_state *old_plane_state =
 1463 			drm_atomic_get_existing_plane_state(old_state, plane);
 1464 		const struct drm_plane_helper_funcs *plane_funcs;
 1465 
 1466 		plane_funcs = plane->helper_private;
 1467 
 1468 		if (!old_plane_state || !plane_funcs)
 1469 			continue;
 1470 
 1471 		WARN_ON(plane->state->crtc && plane->state->crtc != crtc);
 1472 
 1473 		if (drm_atomic_plane_disabling(plane, old_plane_state) &&
 1474 		    plane_funcs->atomic_disable)
 1475 			plane_funcs->atomic_disable(plane, old_plane_state);
 1476 		else if (plane->state->crtc ||
 1477 			 drm_atomic_plane_disabling(plane, old_plane_state))
 1478 			plane_funcs->atomic_update(plane, old_plane_state);
 1479 	}
 1480 
 1481 	if (crtc_funcs && crtc_funcs->atomic_flush)
 1482 		crtc_funcs->atomic_flush(crtc, old_crtc_state);
 1483 }
 1484 EXPORT_SYMBOL(drm_atomic_helper_commit_planes_on_crtc);
 1485 
 1486 /**
 1487  * drm_atomic_helper_disable_planes_on_crtc - helper to disable CRTC's planes
 1488  * @crtc: CRTC
 1489  * @atomic: if set, synchronize with CRTC's atomic_begin/flush hooks
 1490  *
 1491  * Disables all planes associated with the given CRTC. This can be
 1492  * used for instance in the CRTC helper disable callback to disable
 1493  * all planes before shutting down the display pipeline.
 1494  *
 1495  * If the atomic-parameter is set the function calls the CRTC's
 1496  * atomic_begin hook before and atomic_flush hook after disabling the
 1497  * planes.
 1498  *
 1499  * It is a bug to call this function without having implemented the
 1500  * ->atomic_disable() plane hook.
 1501  */
 1502 void drm_atomic_helper_disable_planes_on_crtc(struct drm_crtc *crtc,
 1503 					      bool atomic)
 1504 {
 1505 	const struct drm_crtc_helper_funcs *crtc_funcs =
 1506 		crtc->helper_private;
 1507 	struct drm_plane *plane;
 1508 
 1509 	if (atomic && crtc_funcs && crtc_funcs->atomic_begin)
 1510 		crtc_funcs->atomic_begin(crtc, NULL);
 1511 
 1512 	drm_for_each_plane(plane, crtc->dev) {
 1513 		const struct drm_plane_helper_funcs *plane_funcs =
 1514 			plane->helper_private;
 1515 
 1516 		if (plane->state->crtc != crtc || !plane_funcs)
 1517 			continue;
 1518 
 1519 		WARN_ON(!plane_funcs->atomic_disable);
 1520 		if (plane_funcs->atomic_disable)
 1521 			plane_funcs->atomic_disable(plane, NULL);
 1522 	}
 1523 
 1524 	if (atomic && crtc_funcs && crtc_funcs->atomic_flush)
 1525 		crtc_funcs->atomic_flush(crtc, NULL);
 1526 }
 1527 EXPORT_SYMBOL(drm_atomic_helper_disable_planes_on_crtc);
 1528 
 1529 /**
 1530  * drm_atomic_helper_cleanup_planes - cleanup plane resources after commit
 1531  * @dev: DRM device
 1532  * @old_state: atomic state object with old state structures
 1533  *
 1534  * This function cleans up plane state, specifically framebuffers, from the old
 1535  * configuration. Hence the old configuration must be perserved in @old_state to
 1536  * be able to call this function.
 1537  *
 1538  * This function must also be called on the new state when the atomic update
 1539  * fails at any point after calling drm_atomic_helper_prepare_planes().
 1540  */
 1541 void drm_atomic_helper_cleanup_planes(struct drm_device *dev,
 1542 				      struct drm_atomic_state *old_state)
 1543 {
 1544 	struct drm_plane *plane;
 1545 	struct drm_plane_state *plane_state;
 1546 	int i;
 1547 
 1548 	for_each_plane_in_state(old_state, plane, plane_state, i) {
 1549 		const struct drm_plane_helper_funcs *funcs;
 1550 
 1551 		funcs = plane->helper_private;
 1552 
 1553 		if (funcs->cleanup_fb)
 1554 			funcs->cleanup_fb(plane, plane_state);
 1555 	}
 1556 }
 1557 EXPORT_SYMBOL(drm_atomic_helper_cleanup_planes);
 1558 
 1559 /**
 1560  * drm_atomic_helper_swap_state - store atomic state into current sw state
 1561  * @dev: DRM device
 1562  * @state: atomic state
 1563  *
 1564  * This function stores the atomic state into the current state pointers in all
 1565  * driver objects. It should be called after all failing steps have been done
 1566  * and succeeded, but before the actual hardware state is committed.
 1567  *
 1568  * For cleanup and error recovery the current state for all changed objects will
 1569  * be swaped into @state.
 1570  *
 1571  * With that sequence it fits perfectly into the plane prepare/cleanup sequence:
 1572  *
 1573  * 1. Call drm_atomic_helper_prepare_planes() with the staged atomic state.
 1574  *
 1575  * 2. Do any other steps that might fail.
 1576  *
 1577  * 3. Put the staged state into the current state pointers with this function.
 1578  *
 1579  * 4. Actually commit the hardware state.
 1580  *
 1581  * 5. Call drm_atomic_helper_cleanup_planes() with @state, which since step 3
 1582  * contains the old state. Also do any other cleanup required with that state.
 1583  */
 1584 void drm_atomic_helper_swap_state(struct drm_device *dev,
 1585 				  struct drm_atomic_state *state)
 1586 {
 1587 	int i;
 1588 
 1589 	for (i = 0; i < state->num_connector; i++) {
 1590 		struct drm_connector *connector = state->connectors[i];
 1591 
 1592 		if (!connector)
 1593 			continue;
 1594 
 1595 		connector->state->state = state;
 1596 		swap(state->connector_states[i], connector->state);
 1597 		connector->state->state = NULL;
 1598 	}
 1599 
 1600 	for (i = 0; i < dev->mode_config.num_crtc; i++) {
 1601 		struct drm_crtc *crtc = state->crtcs[i];
 1602 
 1603 		if (!crtc)
 1604 			continue;
 1605 
 1606 		crtc->state->state = state;
 1607 		swap(state->crtc_states[i], crtc->state);
 1608 		crtc->state->state = NULL;
 1609 	}
 1610 
 1611 	for (i = 0; i < dev->mode_config.num_total_plane; i++) {
 1612 		struct drm_plane *plane = state->planes[i];
 1613 
 1614 		if (!plane)
 1615 			continue;
 1616 
 1617 		plane->state->state = state;
 1618 		swap(state->plane_states[i], plane->state);
 1619 		plane->state->state = NULL;
 1620 	}
 1621 }
 1622 EXPORT_SYMBOL(drm_atomic_helper_swap_state);
 1623 
 1624 /**
 1625  * drm_atomic_helper_update_plane - Helper for primary plane update using atomic
 1626  * @plane: plane object to update
 1627  * @crtc: owning CRTC of owning plane
 1628  * @fb: framebuffer to flip onto plane
 1629  * @crtc_x: x offset of primary plane on crtc
 1630  * @crtc_y: y offset of primary plane on crtc
 1631  * @crtc_w: width of primary plane rectangle on crtc
 1632  * @crtc_h: height of primary plane rectangle on crtc
 1633  * @src_x: x offset of @fb for panning
 1634  * @src_y: y offset of @fb for panning
 1635  * @src_w: width of source rectangle in @fb
 1636  * @src_h: height of source rectangle in @fb
 1637  *
 1638  * Provides a default plane update handler using the atomic driver interface.
 1639  *
 1640  * RETURNS:
 1641  * Zero on success, error code on failure
 1642  */
 1643 int drm_atomic_helper_update_plane(struct drm_plane *plane,
 1644 				   struct drm_crtc *crtc,
 1645 				   struct drm_framebuffer *fb,
 1646 				   int crtc_x, int crtc_y,
 1647 				   unsigned int crtc_w, unsigned int crtc_h,
 1648 				   uint32_t src_x, uint32_t src_y,
 1649 				   uint32_t src_w, uint32_t src_h)
 1650 {
 1651 	struct drm_atomic_state *state;
 1652 	struct drm_plane_state *plane_state;
 1653 	int ret = 0;
 1654 
 1655 	state = drm_atomic_state_alloc(plane->dev);
 1656 	if (!state)
 1657 		return -ENOMEM;
 1658 
 1659 	state->acquire_ctx = drm_modeset_legacy_acquire_ctx(crtc);
 1660 retry:
 1661 	plane_state = drm_atomic_get_plane_state(state, plane);
 1662 	if (IS_ERR(plane_state)) {
 1663 		ret = PTR_ERR(plane_state);
 1664 		goto fail;
 1665 	}
 1666 
 1667 	ret = drm_atomic_set_crtc_for_plane(plane_state, crtc);
 1668 	if (ret != 0)
 1669 		goto fail;
 1670 	drm_atomic_set_fb_for_plane(plane_state, fb);
 1671 	plane_state->crtc_x = crtc_x;
 1672 	plane_state->crtc_y = crtc_y;
 1673 	plane_state->crtc_w = crtc_w;
 1674 	plane_state->crtc_h = crtc_h;
 1675 	plane_state->src_x = src_x;
 1676 	plane_state->src_y = src_y;
 1677 	plane_state->src_w = src_w;
 1678 	plane_state->src_h = src_h;
 1679 
 1680 	if (plane == crtc->cursor)
 1681 		state->legacy_cursor_update = true;
 1682 
 1683 	ret = drm_atomic_commit(state);
 1684 	if (ret != 0)
 1685 		goto fail;
 1686 
 1687 	/* Driver takes ownership of state on successful commit. */
 1688 	return 0;
 1689 fail:
 1690 	if (ret == -EDEADLK)
 1691 		goto backoff;
 1692 
 1693 	drm_atomic_state_free(state);
 1694 
 1695 	return ret;
 1696 backoff:
 1697 	drm_atomic_state_clear(state);
 1698 	drm_atomic_legacy_backoff(state);
 1699 
 1700 	/*
 1701 	 * Someone might have exchanged the framebuffer while we dropped locks
 1702 	 * in the backoff code. We need to fix up the fb refcount tracking the
 1703 	 * core does for us.
 1704 	 */
 1705 	plane->old_fb = plane->fb;
 1706 
 1707 	goto retry;
 1708 }
 1709 EXPORT_SYMBOL(drm_atomic_helper_update_plane);
 1710 
 1711 /**
 1712  * drm_atomic_helper_disable_plane - Helper for primary plane disable using * atomic
 1713  * @plane: plane to disable
 1714  *
 1715  * Provides a default plane disable handler using the atomic driver interface.
 1716  *
 1717  * RETURNS:
 1718  * Zero on success, error code on failure
 1719  */
 1720 int drm_atomic_helper_disable_plane(struct drm_plane *plane)
 1721 {
 1722 	struct drm_atomic_state *state;
 1723 	struct drm_plane_state *plane_state;
 1724 	int ret = 0;
 1725 
 1726 	/*
 1727 	 * FIXME: Without plane->crtc set we can't get at the implicit legacy
 1728 	 * acquire context. The real fix will be to wire the acquire ctx through
 1729 	 * everywhere we need it, but meanwhile prevent chaos by just skipping
 1730 	 * this noop. The critical case is the cursor ioctls which a) only grab
 1731 	 * crtc/cursor-plane locks (so we need the crtc to get at the right
 1732 	 * acquire context) and b) can try to disable the plane multiple times.
 1733 	 */
 1734 	if (!plane->crtc)
 1735 		return 0;
 1736 
 1737 	state = drm_atomic_state_alloc(plane->dev);
 1738 	if (!state)
 1739 		return -ENOMEM;
 1740 
 1741 	state->acquire_ctx = drm_modeset_legacy_acquire_ctx(plane->crtc);
 1742 retry:
 1743 	plane_state = drm_atomic_get_plane_state(state, plane);
 1744 	if (IS_ERR(plane_state)) {
 1745 		ret = PTR_ERR(plane_state);
 1746 		goto fail;
 1747 	}
 1748 
 1749 	if (plane_state->crtc && (plane == plane->crtc->cursor))
 1750 		plane_state->state->legacy_cursor_update = true;
 1751 
 1752 	ret = __drm_atomic_helper_disable_plane(plane, plane_state);
 1753 	if (ret != 0)
 1754 		goto fail;
 1755 
 1756 	ret = drm_atomic_commit(state);
 1757 	if (ret != 0)
 1758 		goto fail;
 1759 
 1760 	/* Driver takes ownership of state on successful commit. */
 1761 	return 0;
 1762 fail:
 1763 	if (ret == -EDEADLK)
 1764 		goto backoff;
 1765 
 1766 	drm_atomic_state_free(state);
 1767 
 1768 	return ret;
 1769 backoff:
 1770 	drm_atomic_state_clear(state);
 1771 	drm_atomic_legacy_backoff(state);
 1772 
 1773 	/*
 1774 	 * Someone might have exchanged the framebuffer while we dropped locks
 1775 	 * in the backoff code. We need to fix up the fb refcount tracking the
 1776 	 * core does for us.
 1777 	 */
 1778 	plane->old_fb = plane->fb;
 1779 
 1780 	goto retry;
 1781 }
 1782 EXPORT_SYMBOL(drm_atomic_helper_disable_plane);
 1783 
 1784 /* just used from fb-helper and atomic-helper: */
 1785 int __drm_atomic_helper_disable_plane(struct drm_plane *plane,
 1786 		struct drm_plane_state *plane_state)
 1787 {
 1788 	int ret;
 1789 
 1790 	ret = drm_atomic_set_crtc_for_plane(plane_state, NULL);
 1791 	if (ret != 0)
 1792 		return ret;
 1793 
 1794 	drm_atomic_set_fb_for_plane(plane_state, NULL);
 1795 	plane_state->crtc_x = 0;
 1796 	plane_state->crtc_y = 0;
 1797 	plane_state->crtc_w = 0;
 1798 	plane_state->crtc_h = 0;
 1799 	plane_state->src_x = 0;
 1800 	plane_state->src_y = 0;
 1801 	plane_state->src_w = 0;
 1802 	plane_state->src_h = 0;
 1803 
 1804 	return 0;
 1805 }
 1806 
 1807 static int update_output_state(struct drm_atomic_state *state,
 1808 			       struct drm_mode_set *set)
 1809 {
 1810 	struct drm_device *dev = set->crtc->dev;
 1811 	struct drm_crtc *crtc;
 1812 	struct drm_crtc_state *crtc_state;
 1813 	struct drm_connector *connector;
 1814 	struct drm_connector_state *conn_state;
 1815 	int ret, i;
 1816 
 1817 	ret = drm_modeset_lock(&dev->mode_config.connection_mutex,
 1818 			       state->acquire_ctx);
 1819 	if (ret)
 1820 		return ret;
 1821 
 1822 	/* First disable all connectors on the target crtc. */
 1823 	ret = drm_atomic_add_affected_connectors(state, set->crtc);
 1824 	if (ret)
 1825 		return ret;
 1826 
 1827 	for_each_connector_in_state(state, connector, conn_state, i) {
 1828 		if (conn_state->crtc == set->crtc) {
 1829 			ret = drm_atomic_set_crtc_for_connector(conn_state,
 1830 								NULL);
 1831 			if (ret)
 1832 				return ret;
 1833 		}
 1834 	}
 1835 
 1836 	/* Then set all connectors from set->connectors on the target crtc */
 1837 	for (i = 0; i < set->num_connectors; i++) {
 1838 		conn_state = drm_atomic_get_connector_state(state,
 1839 							    set->connectors[i]);
 1840 		if (IS_ERR(conn_state))
 1841 			return PTR_ERR(conn_state);
 1842 
 1843 		ret = drm_atomic_set_crtc_for_connector(conn_state,
 1844 							set->crtc);
 1845 		if (ret)
 1846 			return ret;
 1847 	}
 1848 
 1849 	for_each_crtc_in_state(state, crtc, crtc_state, i) {
 1850 		/* Don't update ->enable for the CRTC in the set_config request,
 1851 		 * since a mismatch would indicate a bug in the upper layers.
 1852 		 * The actual modeset code later on will catch any
 1853 		 * inconsistencies here. */
 1854 		if (crtc == set->crtc)
 1855 			continue;
 1856 
 1857 		if (!crtc_state->connector_mask) {
 1858 			ret = drm_atomic_set_mode_prop_for_crtc(crtc_state,
 1859 								NULL);
 1860 			if (ret < 0)
 1861 				return ret;
 1862 
 1863 			crtc_state->active = false;
 1864 		}
 1865 	}
 1866 
 1867 	return 0;
 1868 }
 1869 
 1870 /**
 1871  * drm_atomic_helper_set_config - set a new config from userspace
 1872  * @set: mode set configuration
 1873  *
 1874  * Provides a default crtc set_config handler using the atomic driver interface.
 1875  *
 1876  * Returns:
 1877  * Returns 0 on success, negative errno numbers on failure.
 1878  */
 1879 int drm_atomic_helper_set_config(struct drm_mode_set *set)
 1880 {
 1881 	struct drm_atomic_state *state;
 1882 	struct drm_crtc *crtc = set->crtc;
 1883 	int ret = 0;
 1884 
 1885 	state = drm_atomic_state_alloc(crtc->dev);
 1886 	if (!state)
 1887 		return -ENOMEM;
 1888 
 1889 	state->legacy_set_config = true;
 1890 	state->acquire_ctx = drm_modeset_legacy_acquire_ctx(crtc);
 1891 retry:
 1892 	ret = __drm_atomic_helper_set_config(set, state);
 1893 	if (ret != 0)
 1894 		goto fail;
 1895 
 1896 	ret = drm_atomic_commit(state);
 1897 	if (ret != 0)
 1898 		goto fail;
 1899 
 1900 	/* Driver takes ownership of state on successful commit. */
 1901 	return 0;
 1902 fail:
 1903 	if (ret == -EDEADLK)
 1904 		goto backoff;
 1905 
 1906 	drm_atomic_state_free(state);
 1907 
 1908 	return ret;
 1909 backoff:
 1910 	drm_atomic_state_clear(state);
 1911 	drm_atomic_legacy_backoff(state);
 1912 
 1913 	/*
 1914 	 * Someone might have exchanged the framebuffer while we dropped locks
 1915 	 * in the backoff code. We need to fix up the fb refcount tracking the
 1916 	 * core does for us.
 1917 	 */
 1918 	crtc->primary->old_fb = crtc->primary->fb;
 1919 
 1920 	goto retry;
 1921 }
 1922 EXPORT_SYMBOL(drm_atomic_helper_set_config);
 1923 
 1924 /* just used from fb-helper and atomic-helper: */
 1925 int __drm_atomic_helper_set_config(struct drm_mode_set *set,
 1926 		struct drm_atomic_state *state)
 1927 {
 1928 	struct drm_crtc_state *crtc_state;
 1929 	struct drm_plane_state *primary_state;
 1930 	struct drm_crtc *crtc = set->crtc;
 1931 	int hdisplay, vdisplay;
 1932 	int ret;
 1933 
 1934 	crtc_state = drm_atomic_get_crtc_state(state, crtc);
 1935 	if (IS_ERR(crtc_state))
 1936 		return PTR_ERR(crtc_state);
 1937 
 1938 	primary_state = drm_atomic_get_plane_state(state, crtc->primary);
 1939 	if (IS_ERR(primary_state))
 1940 		return PTR_ERR(primary_state);
 1941 
 1942 	if (!set->mode) {
 1943 		WARN_ON(set->fb);
 1944 		WARN_ON(set->num_connectors);
 1945 
 1946 		ret = drm_atomic_set_mode_for_crtc(crtc_state, NULL);
 1947 		if (ret != 0)
 1948 			return ret;
 1949 
 1950 		crtc_state->active = false;
 1951 
 1952 		ret = drm_atomic_set_crtc_for_plane(primary_state, NULL);
 1953 		if (ret != 0)
 1954 			return ret;
 1955 
 1956 		drm_atomic_set_fb_for_plane(primary_state, NULL);
 1957 
 1958 		goto commit;
 1959 	}
 1960 
 1961 	WARN_ON(!set->fb);
 1962 	WARN_ON(!set->num_connectors);
 1963 
 1964 	ret = drm_atomic_set_mode_for_crtc(crtc_state, set->mode);
 1965 	if (ret != 0)
 1966 		return ret;
 1967 
 1968 	crtc_state->active = true;
 1969 
 1970 	ret = drm_atomic_set_crtc_for_plane(primary_state, crtc);
 1971 	if (ret != 0)
 1972 		return ret;
 1973 
 1974 	drm_crtc_get_hv_timing(set->mode, &hdisplay, &vdisplay);
 1975 
 1976 	drm_atomic_set_fb_for_plane(primary_state, set->fb);
 1977 	primary_state->crtc_x = 0;
 1978 	primary_state->crtc_y = 0;
 1979 	primary_state->crtc_w = hdisplay;
 1980 	primary_state->crtc_h = vdisplay;
 1981 	primary_state->src_x = set->x << 16;
 1982 	primary_state->src_y = set->y << 16;
 1983 	if (primary_state->rotation & (BIT(DRM_ROTATE_90) | BIT(DRM_ROTATE_270))) {
 1984 		primary_state->src_w = vdisplay << 16;
 1985 		primary_state->src_h = hdisplay << 16;
 1986 	} else {
 1987 		primary_state->src_w = hdisplay << 16;
 1988 		primary_state->src_h = vdisplay << 16;
 1989 	}
 1990 
 1991 commit:
 1992 	ret = update_output_state(state, set);
 1993 	if (ret)
 1994 		return ret;
 1995 
 1996 	return 0;
 1997 }
 1998 
 1999 /**
 2000  * drm_atomic_helper_disable_all - disable all currently active outputs
 2001  * @dev: DRM device
 2002  * @ctx: lock acquisition context
 2003  *
 2004  * Loops through all connectors, finding those that aren't turned off and then
 2005  * turns them off by setting their DPMS mode to OFF and deactivating the CRTC
 2006  * that they are connected to.
 2007  *
 2008  * This is used for example in suspend/resume to disable all currently active
 2009  * functions when suspending.
 2010  *
 2011  * Note that if callers haven't already acquired all modeset locks this might
 2012  * return -EDEADLK, which must be handled by calling drm_modeset_backoff().
 2013  *
 2014  * Returns:
 2015  * 0 on success or a negative error code on failure.
 2016  *
 2017  * See also:
 2018  * drm_atomic_helper_suspend(), drm_atomic_helper_resume()
 2019  */
 2020 int drm_atomic_helper_disable_all(struct drm_device *dev,
 2021 				  struct drm_modeset_acquire_ctx *ctx)
 2022 {
 2023 	struct drm_atomic_state *state;
 2024 	struct drm_connector *conn;
 2025 	int err;
 2026 
 2027 	state = drm_atomic_state_alloc(dev);
 2028 	if (!state)
 2029 		return -ENOMEM;
 2030 
 2031 	state->acquire_ctx = ctx;
 2032 
 2033 	drm_for_each_connector(conn, dev) {
 2034 		struct drm_crtc *crtc = conn->state->crtc;
 2035 		struct drm_crtc_state *crtc_state;
 2036 
 2037 		if (!crtc || conn->dpms != DRM_MODE_DPMS_ON)
 2038 			continue;
 2039 
 2040 		crtc_state = drm_atomic_get_crtc_state(state, crtc);
 2041 		if (IS_ERR(crtc_state)) {
 2042 			err = PTR_ERR(crtc_state);
 2043 			goto free;
 2044 		}
 2045 
 2046 		crtc_state->active = false;
 2047 	}
 2048 
 2049 	err = drm_atomic_commit(state);
 2050 
 2051 free:
 2052 	if (err < 0)
 2053 		drm_atomic_state_free(state);
 2054 
 2055 	return err;
 2056 }
 2057 EXPORT_SYMBOL(drm_atomic_helper_disable_all);
 2058 
 2059 /**
 2060  * drm_atomic_helper_suspend - subsystem-level suspend helper
 2061  * @dev: DRM device
 2062  *
 2063  * Duplicates the current atomic state, disables all active outputs and then
 2064  * returns a pointer to the original atomic state to the caller. Drivers can
 2065  * pass this pointer to the drm_atomic_helper_resume() helper upon resume to
 2066  * restore the output configuration that was active at the time the system
 2067  * entered suspend.
 2068  *
 2069  * Note that it is potentially unsafe to use this. The atomic state object
 2070  * returned by this function is assumed to be persistent. Drivers must ensure
 2071  * that this holds true. Before calling this function, drivers must make sure
 2072  * to suspend fbdev emulation so that nothing can be using the device.
 2073  *
 2074  * Returns:
 2075  * A pointer to a copy of the state before suspend on success or an ERR_PTR()-
 2076  * encoded error code on failure. Drivers should store the returned atomic
 2077  * state object and pass it to the drm_atomic_helper_resume() helper upon
 2078  * resume.
 2079  *
 2080  * See also:
 2081  * drm_atomic_helper_duplicate_state(), drm_atomic_helper_disable_all(),
 2082  * drm_atomic_helper_resume()
 2083  */
 2084 struct drm_atomic_state *drm_atomic_helper_suspend(struct drm_device *dev)
 2085 {
 2086 	struct drm_modeset_acquire_ctx ctx;
 2087 	struct drm_atomic_state *state;
 2088 	int err;
 2089 
 2090 	drm_modeset_acquire_init(&ctx, 0);
 2091 
 2092 retry:
 2093 	err = drm_modeset_lock_all_ctx(dev, &ctx);
 2094 	if (err < 0) {
 2095 		state = ERR_PTR(err);
 2096 		goto unlock;
 2097 	}
 2098 
 2099 	state = drm_atomic_helper_duplicate_state(dev, &ctx);
 2100 	if (IS_ERR(state))
 2101 		goto unlock;
 2102 
 2103 	err = drm_atomic_helper_disable_all(dev, &ctx);
 2104 	if (err < 0) {
 2105 		drm_atomic_state_free(state);
 2106 		state = ERR_PTR(err);
 2107 		goto unlock;
 2108 	}
 2109 
 2110 unlock:
 2111 	if (PTR_ERR(state) == -EDEADLK) {
 2112 		drm_modeset_backoff(&ctx);
 2113 		goto retry;
 2114 	}
 2115 
 2116 	drm_modeset_drop_locks(&ctx);
 2117 	drm_modeset_acquire_fini(&ctx);
 2118 	return state;
 2119 }
 2120 EXPORT_SYMBOL(drm_atomic_helper_suspend);
 2121 
 2122 /**
 2123  * drm_atomic_helper_resume - subsystem-level resume helper
 2124  * @dev: DRM device
 2125  * @state: atomic state to resume to
 2126  *
 2127  * Calls drm_mode_config_reset() to synchronize hardware and software states,
 2128  * grabs all modeset locks and commits the atomic state object. This can be
 2129  * used in conjunction with the drm_atomic_helper_suspend() helper to
 2130  * implement suspend/resume for drivers that support atomic mode-setting.
 2131  *
 2132  * Returns:
 2133  * 0 on success or a negative error code on failure.
 2134  *
 2135  * See also:
 2136  * drm_atomic_helper_suspend()
 2137  */
 2138 int drm_atomic_helper_resume(struct drm_device *dev,
 2139 			     struct drm_atomic_state *state)
 2140 {
 2141 	struct drm_mode_config *config = &dev->mode_config;
 2142 	int err;
 2143 
 2144 	drm_mode_config_reset(dev);
 2145 	drm_modeset_lock_all(dev);
 2146 	state->acquire_ctx = config->acquire_ctx;
 2147 	err = drm_atomic_commit(state);
 2148 	drm_modeset_unlock_all(dev);
 2149 
 2150 	return err;
 2151 }
 2152 EXPORT_SYMBOL(drm_atomic_helper_resume);
 2153 
 2154 /**
 2155  * drm_atomic_helper_crtc_set_property - helper for crtc properties
 2156  * @crtc: DRM crtc
 2157  * @property: DRM property
 2158  * @val: value of property
 2159  *
 2160  * Provides a default crtc set_property handler using the atomic driver
 2161  * interface.
 2162  *
 2163  * RETURNS:
 2164  * Zero on success, error code on failure
 2165  */
 2166 int
 2167 drm_atomic_helper_crtc_set_property(struct drm_crtc *crtc,
 2168 				    struct drm_property *property,
 2169 				    uint64_t val)
 2170 {
 2171 	struct drm_atomic_state *state;
 2172 	struct drm_crtc_state *crtc_state;
 2173 	int ret = 0;
 2174 
 2175 	state = drm_atomic_state_alloc(crtc->dev);
 2176 	if (!state)
 2177 		return -ENOMEM;
 2178 
 2179 	/* ->set_property is always called with all locks held. */
 2180 	state->acquire_ctx = crtc->dev->mode_config.acquire_ctx;
 2181 retry:
 2182 	crtc_state = drm_atomic_get_crtc_state(state, crtc);
 2183 	if (IS_ERR(crtc_state)) {
 2184 		ret = PTR_ERR(crtc_state);
 2185 		goto fail;
 2186 	}
 2187 
 2188 	ret = drm_atomic_crtc_set_property(crtc, crtc_state,
 2189 			property, val);
 2190 	if (ret)
 2191 		goto fail;
 2192 
 2193 	ret = drm_atomic_commit(state);
 2194 	if (ret != 0)
 2195 		goto fail;
 2196 
 2197 	/* Driver takes ownership of state on successful commit. */
 2198 	return 0;
 2199 fail:
 2200 	if (ret == -EDEADLK)
 2201 		goto backoff;
 2202 
 2203 	drm_atomic_state_free(state);
 2204 
 2205 	return ret;
 2206 backoff:
 2207 	drm_atomic_state_clear(state);
 2208 	drm_atomic_legacy_backoff(state);
 2209 
 2210 	goto retry;
 2211 }
 2212 EXPORT_SYMBOL(drm_atomic_helper_crtc_set_property);
 2213 
 2214 /**
 2215  * drm_atomic_helper_plane_set_property - helper for plane properties
 2216  * @plane: DRM plane
 2217  * @property: DRM property
 2218  * @val: value of property
 2219  *
 2220  * Provides a default plane set_property handler using the atomic driver
 2221  * interface.
 2222  *
 2223  * RETURNS:
 2224  * Zero on success, error code on failure
 2225  */
 2226 int
 2227 drm_atomic_helper_plane_set_property(struct drm_plane *plane,
 2228 				    struct drm_property *property,
 2229 				    uint64_t val)
 2230 {
 2231 	struct drm_atomic_state *state;
 2232 	struct drm_plane_state *plane_state;
 2233 	int ret = 0;
 2234 
 2235 	state = drm_atomic_state_alloc(plane->dev);
 2236 	if (!state)
 2237 		return -ENOMEM;
 2238 
 2239 	/* ->set_property is always called with all locks held. */
 2240 	state->acquire_ctx = plane->dev->mode_config.acquire_ctx;
 2241 retry:
 2242 	plane_state = drm_atomic_get_plane_state(state, plane);
 2243 	if (IS_ERR(plane_state)) {
 2244 		ret = PTR_ERR(plane_state);
 2245 		goto fail;
 2246 	}
 2247 
 2248 	ret = drm_atomic_plane_set_property(plane, plane_state,
 2249 			property, val);
 2250 	if (ret)
 2251 		goto fail;
 2252 
 2253 	ret = drm_atomic_commit(state);
 2254 	if (ret != 0)
 2255 		goto fail;
 2256 
 2257 	/* Driver takes ownership of state on successful commit. */
 2258 	return 0;
 2259 fail:
 2260 	if (ret == -EDEADLK)
 2261 		goto backoff;
 2262 
 2263 	drm_atomic_state_free(state);
 2264 
 2265 	return ret;
 2266 backoff:
 2267 	drm_atomic_state_clear(state);
 2268 	drm_atomic_legacy_backoff(state);
 2269 
 2270 	goto retry;
 2271 }
 2272 EXPORT_SYMBOL(drm_atomic_helper_plane_set_property);
 2273 
 2274 /**
 2275  * drm_atomic_helper_connector_set_property - helper for connector properties
 2276  * @connector: DRM connector
 2277  * @property: DRM property
 2278  * @val: value of property
 2279  *
 2280  * Provides a default connector set_property handler using the atomic driver
 2281  * interface.
 2282  *
 2283  * RETURNS:
 2284  * Zero on success, error code on failure
 2285  */
 2286 int
 2287 drm_atomic_helper_connector_set_property(struct drm_connector *connector,
 2288 				    struct drm_property *property,
 2289 				    uint64_t val)
 2290 {
 2291 	struct drm_atomic_state *state;
 2292 	struct drm_connector_state *connector_state;
 2293 	int ret = 0;
 2294 
 2295 	state = drm_atomic_state_alloc(connector->dev);
 2296 	if (!state)
 2297 		return -ENOMEM;
 2298 
 2299 	/* ->set_property is always called with all locks held. */
 2300 	state->acquire_ctx = connector->dev->mode_config.acquire_ctx;
 2301 retry:
 2302 	connector_state = drm_atomic_get_connector_state(state, connector);
 2303 	if (IS_ERR(connector_state)) {
 2304 		ret = PTR_ERR(connector_state);
 2305 		goto fail;
 2306 	}
 2307 
 2308 	ret = drm_atomic_connector_set_property(connector, connector_state,
 2309 			property, val);
 2310 	if (ret)
 2311 		goto fail;
 2312 
 2313 	ret = drm_atomic_commit(state);
 2314 	if (ret != 0)
 2315 		goto fail;
 2316 
 2317 	/* Driver takes ownership of state on successful commit. */
 2318 	return 0;
 2319 fail:
 2320 	if (ret == -EDEADLK)
 2321 		goto backoff;
 2322 
 2323 	drm_atomic_state_free(state);
 2324 
 2325 	return ret;
 2326 backoff:
 2327 	drm_atomic_state_clear(state);
 2328 	drm_atomic_legacy_backoff(state);
 2329 
 2330 	goto retry;
 2331 }
 2332 EXPORT_SYMBOL(drm_atomic_helper_connector_set_property);
 2333 
 2334 /**
 2335  * drm_atomic_helper_page_flip - execute a legacy page flip
 2336  * @crtc: DRM crtc
 2337  * @fb: DRM framebuffer
 2338  * @event: optional DRM event to signal upon completion
 2339  * @flags: flip flags for non-vblank sync'ed updates
 2340  *
 2341  * Provides a default page flip implementation using the atomic driver interface.
 2342  *
 2343  * Note that for now so called async page flips (i.e. updates which are not
 2344  * synchronized to vblank) are not supported, since the atomic interfaces have
 2345  * no provisions for this yet.
 2346  *
 2347  * Returns:
 2348  * Returns 0 on success, negative errno numbers on failure.
 2349  */
 2350 int drm_atomic_helper_page_flip(struct drm_crtc *crtc,
 2351 				struct drm_framebuffer *fb,
 2352 				struct drm_pending_vblank_event *event,
 2353 				uint32_t flags)
 2354 {
 2355 	struct drm_plane *plane = crtc->primary;
 2356 	struct drm_atomic_state *state;
 2357 	struct drm_plane_state *plane_state;
 2358 	struct drm_crtc_state *crtc_state;
 2359 	int ret = 0;
 2360 
 2361 	if (flags & DRM_MODE_PAGE_FLIP_ASYNC)
 2362 		return -EINVAL;
 2363 
 2364 	state = drm_atomic_state_alloc(plane->dev);
 2365 	if (!state)
 2366 		return -ENOMEM;
 2367 
 2368 	state->acquire_ctx = drm_modeset_legacy_acquire_ctx(crtc);
 2369 retry:
 2370 	crtc_state = drm_atomic_get_crtc_state(state, crtc);
 2371 	if (IS_ERR(crtc_state)) {
 2372 		ret = PTR_ERR(crtc_state);
 2373 		goto fail;
 2374 	}
 2375 	crtc_state->event = event;
 2376 
 2377 	plane_state = drm_atomic_get_plane_state(state, plane);
 2378 	if (IS_ERR(plane_state)) {
 2379 		ret = PTR_ERR(plane_state);
 2380 		goto fail;
 2381 	}
 2382 
 2383 	ret = drm_atomic_set_crtc_for_plane(plane_state, crtc);
 2384 	if (ret != 0)
 2385 		goto fail;
 2386 	drm_atomic_set_fb_for_plane(plane_state, fb);
 2387 
 2388 	/* Make sure we don't accidentally do a full modeset. */
 2389 	state->allow_modeset = false;
 2390 	if (!crtc_state->active) {
 2391 		DRM_DEBUG_ATOMIC("[CRTC:%d] disabled, rejecting legacy flip\n",
 2392 				 crtc->base.id);
 2393 		ret = -EINVAL;
 2394 		goto fail;
 2395 	}
 2396 
 2397 	ret = drm_atomic_nonblocking_commit(state);
 2398 	if (ret != 0)
 2399 		goto fail;
 2400 
 2401 	/* Driver takes ownership of state on successful commit. */
 2402 	return 0;
 2403 fail:
 2404 	if (ret == -EDEADLK)
 2405 		goto backoff;
 2406 
 2407 	drm_atomic_state_free(state);
 2408 
 2409 	return ret;
 2410 backoff:
 2411 	drm_atomic_state_clear(state);
 2412 	drm_atomic_legacy_backoff(state);
 2413 
 2414 	/*
 2415 	 * Someone might have exchanged the framebuffer while we dropped locks
 2416 	 * in the backoff code. We need to fix up the fb refcount tracking the
 2417 	 * core does for us.
 2418 	 */
 2419 	plane->old_fb = plane->fb;
 2420 
 2421 	goto retry;
 2422 }
 2423 EXPORT_SYMBOL(drm_atomic_helper_page_flip);
 2424 
 2425 /**
 2426  * drm_atomic_helper_connector_dpms() - connector dpms helper implementation
 2427  * @connector: affected connector
 2428  * @mode: DPMS mode
 2429  *
 2430  * This is the main helper function provided by the atomic helper framework for
 2431  * implementing the legacy DPMS connector interface. It computes the new desired
 2432  * ->active state for the corresponding CRTC (if the connector is enabled) and
 2433  *  updates it.
 2434  *
 2435  * Returns:
 2436  * Returns 0 on success, negative errno numbers on failure.
 2437  */
 2438 int drm_atomic_helper_connector_dpms(struct drm_connector *connector,
 2439 				     int mode)
 2440 {
 2441 	struct drm_mode_config *config = &connector->dev->mode_config;
 2442 	struct drm_atomic_state *state;
 2443 	struct drm_crtc_state *crtc_state;
 2444 	struct drm_crtc *crtc;
 2445 	struct drm_connector *tmp_connector;
 2446 	int ret;
 2447 	bool active = false;
 2448 	int old_mode = connector->dpms;
 2449 
 2450 	if (mode != DRM_MODE_DPMS_ON)
 2451 		mode = DRM_MODE_DPMS_OFF;
 2452 
 2453 	connector->dpms = mode;
 2454 	crtc = connector->state->crtc;
 2455 
 2456 	if (!crtc)
 2457 		return 0;
 2458 
 2459 	state = drm_atomic_state_alloc(connector->dev);
 2460 	if (!state)
 2461 		return -ENOMEM;
 2462 
 2463 	state->acquire_ctx = drm_modeset_legacy_acquire_ctx(crtc);
 2464 retry:
 2465 	crtc_state = drm_atomic_get_crtc_state(state, crtc);
 2466 	if (IS_ERR(crtc_state)) {
 2467 		ret = PTR_ERR(crtc_state);
 2468 		goto fail;
 2469 	}
 2470 
 2471 	WARN_ON(!drm_modeset_is_locked(&config->connection_mutex));
 2472 
 2473 	drm_for_each_connector(tmp_connector, connector->dev) {
 2474 		if (tmp_connector->state->crtc != crtc)
 2475 			continue;
 2476 
 2477 		if (tmp_connector->dpms == DRM_MODE_DPMS_ON) {
 2478 			active = true;
 2479 			break;
 2480 		}
 2481 	}
 2482 	crtc_state->active = active;
 2483 
 2484 	ret = drm_atomic_commit(state);
 2485 	if (ret != 0)
 2486 		goto fail;
 2487 
 2488 	/* Driver takes ownership of state on successful commit. */
 2489 	return 0;
 2490 fail:
 2491 	if (ret == -EDEADLK)
 2492 		goto backoff;
 2493 
 2494 	connector->dpms = old_mode;
 2495 	drm_atomic_state_free(state);
 2496 
 2497 	return ret;
 2498 backoff:
 2499 	drm_atomic_state_clear(state);
 2500 	drm_atomic_legacy_backoff(state);
 2501 
 2502 	goto retry;
 2503 }
 2504 EXPORT_SYMBOL(drm_atomic_helper_connector_dpms);
 2505 
 2506 /**
 2507  * drm_atomic_helper_best_encoder - Helper for &drm_connector_helper_funcs
 2508  *                                  ->best_encoder callback
 2509  * @connector: Connector control structure
 2510  *
 2511  * This is a &drm_connector_helper_funcs ->best_encoder callback helper for
 2512  * connectors that support exactly 1 encoder, statically determined at driver
 2513  * init time.
 2514  */
 2515 struct drm_encoder *
 2516 drm_atomic_helper_best_encoder(struct drm_connector *connector)
 2517 {
 2518 	WARN_ON(connector->encoder_ids[1]);
 2519 	return drm_encoder_find(connector->dev, connector->encoder_ids[0]);
 2520 }
 2521 EXPORT_SYMBOL(drm_atomic_helper_best_encoder);
 2522 
 2523 /**
 2524  * DOC: atomic state reset and initialization
 2525  *
 2526  * Both the drm core and the atomic helpers assume that there is always the full
 2527  * and correct atomic software state for all connectors, CRTCs and planes
 2528  * available. Which is a bit a problem on driver load and also after system
 2529  * suspend. One way to solve this is to have a hardware state read-out
 2530  * infrastructure which reconstructs the full software state (e.g. the i915
 2531  * driver).
 2532  *
 2533  * The simpler solution is to just reset the software state to everything off,
 2534  * which is easiest to do by calling drm_mode_config_reset(). To facilitate this
 2535  * the atomic helpers provide default reset implementations for all hooks.
 2536  *
 2537  * On the upside the precise state tracking of atomic simplifies system suspend
 2538  * and resume a lot. For drivers using drm_mode_config_reset() a complete recipe
 2539  * is implemented in drm_atomic_helper_suspend() and drm_atomic_helper_resume().
 2540  * For other drivers the building blocks are split out, see the documentation
 2541  * for these functions.
 2542  */
 2543 
 2544 /**
 2545  * drm_atomic_helper_crtc_reset - default ->reset hook for CRTCs
 2546  * @crtc: drm CRTC
 2547  *
 2548  * Resets the atomic state for @crtc by freeing the state pointer (which might
 2549  * be NULL, e.g. at driver load time) and allocating a new empty state object.
 2550  */
 2551 void drm_atomic_helper_crtc_reset(struct drm_crtc *crtc)
 2552 {
 2553 	if (crtc->state)
 2554 		__drm_atomic_helper_crtc_destroy_state(crtc->state);
 2555 
 2556 	kfree(crtc->state);
 2557 	crtc->state = kzalloc(sizeof(*crtc->state), GFP_KERNEL);
 2558 
 2559 	if (crtc->state)
 2560 		crtc->state->crtc = crtc;
 2561 }
 2562 EXPORT_SYMBOL(drm_atomic_helper_crtc_reset);
 2563 
 2564 /**
 2565  * __drm_atomic_helper_crtc_duplicate_state - copy atomic CRTC state
 2566  * @crtc: CRTC object
 2567  * @state: atomic CRTC state
 2568  *
 2569  * Copies atomic state from a CRTC's current state and resets inferred values.
 2570  * This is useful for drivers that subclass the CRTC state.
 2571  */
 2572 void __drm_atomic_helper_crtc_duplicate_state(struct drm_crtc *crtc,
 2573 					      struct drm_crtc_state *state)
 2574 {
 2575 	memcpy(state, crtc->state, sizeof(*state));
 2576 
 2577 	if (state->mode_blob)
 2578 		drm_property_reference_blob(state->mode_blob);
 2579 	if (state->degamma_lut)
 2580 		drm_property_reference_blob(state->degamma_lut);
 2581 	if (state->ctm)
 2582 		drm_property_reference_blob(state->ctm);
 2583 	if (state->gamma_lut)
 2584 		drm_property_reference_blob(state->gamma_lut);
 2585 	state->mode_changed = false;
 2586 	state->active_changed = false;
 2587 	state->planes_changed = false;
 2588 	state->connectors_changed = false;
 2589 	state->color_mgmt_changed = false;
 2590 	state->event = NULL;
 2591 }
 2592 EXPORT_SYMBOL(__drm_atomic_helper_crtc_duplicate_state);
 2593 
 2594 /**
 2595  * drm_atomic_helper_crtc_duplicate_state - default state duplicate hook
 2596  * @crtc: drm CRTC
 2597  *
 2598  * Default CRTC state duplicate hook for drivers which don't have their own
 2599  * subclassed CRTC state structure.
 2600  */
 2601 struct drm_crtc_state *
 2602 drm_atomic_helper_crtc_duplicate_state(struct drm_crtc *crtc)
 2603 {
 2604 	struct drm_crtc_state *state;
 2605 
 2606 	if (WARN_ON(!crtc->state))
 2607 		return NULL;
 2608 
 2609 	state = kmalloc(sizeof(*state), GFP_KERNEL);
 2610 	if (state)
 2611 		__drm_atomic_helper_crtc_duplicate_state(crtc, state);
 2612 
 2613 	return state;
 2614 }
 2615 EXPORT_SYMBOL(drm_atomic_helper_crtc_duplicate_state);
 2616 
 2617 /**
 2618  * __drm_atomic_helper_crtc_destroy_state - release CRTC state
 2619  * @state: CRTC state object to release
 2620  *
 2621  * Releases all resources stored in the CRTC state without actually freeing
 2622  * the memory of the CRTC state. This is useful for drivers that subclass the
 2623  * CRTC state.
 2624  */
 2625 void __drm_atomic_helper_crtc_destroy_state(struct drm_crtc_state *state)
 2626 {
 2627 	drm_property_unreference_blob(state->mode_blob);
 2628 	drm_property_unreference_blob(state->degamma_lut);
 2629 	drm_property_unreference_blob(state->ctm);
 2630 	drm_property_unreference_blob(state->gamma_lut);
 2631 }
 2632 EXPORT_SYMBOL(__drm_atomic_helper_crtc_destroy_state);
 2633 
 2634 /**
 2635  * drm_atomic_helper_crtc_destroy_state - default state destroy hook
 2636  * @crtc: drm CRTC
 2637  * @state: CRTC state object to release
 2638  *
 2639  * Default CRTC state destroy hook for drivers which don't have their own
 2640  * subclassed CRTC state structure.
 2641  */
 2642 void drm_atomic_helper_crtc_destroy_state(struct drm_crtc *crtc,
 2643 					  struct drm_crtc_state *state)
 2644 {
 2645 	__drm_atomic_helper_crtc_destroy_state(state);
 2646 	kfree(state);
 2647 }
 2648 EXPORT_SYMBOL(drm_atomic_helper_crtc_destroy_state);
 2649 
 2650 /**
 2651  * drm_atomic_helper_plane_reset - default ->reset hook for planes
 2652  * @plane: drm plane
 2653  *
 2654  * Resets the atomic state for @plane by freeing the state pointer (which might
 2655  * be NULL, e.g. at driver load time) and allocating a new empty state object.
 2656  */
 2657 void drm_atomic_helper_plane_reset(struct drm_plane *plane)
 2658 {
 2659 	if (plane->state)
 2660 		__drm_atomic_helper_plane_destroy_state(plane->state);
 2661 
 2662 	kfree(plane->state);
 2663 	plane->state = kzalloc(sizeof(*plane->state), GFP_KERNEL);
 2664 
 2665 	if (plane->state) {
 2666 		plane->state->plane = plane;
 2667 		plane->state->rotation = BIT(DRM_ROTATE_0);
 2668 	}
 2669 }
 2670 EXPORT_SYMBOL(drm_atomic_helper_plane_reset);
 2671 
 2672 /**
 2673  * __drm_atomic_helper_plane_duplicate_state - copy atomic plane state
 2674  * @plane: plane object
 2675  * @state: atomic plane state
 2676  *
 2677  * Copies atomic state from a plane's current state. This is useful for
 2678  * drivers that subclass the plane state.
 2679  */
 2680 void __drm_atomic_helper_plane_duplicate_state(struct drm_plane *plane,
 2681 					       struct drm_plane_state *state)
 2682 {
 2683 	memcpy(state, plane->state, sizeof(*state));
 2684 
 2685 	if (state->fb)
 2686 		drm_framebuffer_reference(state->fb);
 2687 }
 2688 EXPORT_SYMBOL(__drm_atomic_helper_plane_duplicate_state);
 2689 
 2690 /**
 2691  * drm_atomic_helper_plane_duplicate_state - default state duplicate hook
 2692  * @plane: drm plane
 2693  *
 2694  * Default plane state duplicate hook for drivers which don't have their own
 2695  * subclassed plane state structure.
 2696  */
 2697 struct drm_plane_state *
 2698 drm_atomic_helper_plane_duplicate_state(struct drm_plane *plane)
 2699 {
 2700 	struct drm_plane_state *state;
 2701 
 2702 	if (WARN_ON(!plane->state))
 2703 		return NULL;
 2704 
 2705 	state = kmalloc(sizeof(*state), GFP_KERNEL);
 2706 	if (state)
 2707 		__drm_atomic_helper_plane_duplicate_state(plane, state);
 2708 
 2709 	return state;
 2710 }
 2711 EXPORT_SYMBOL(drm_atomic_helper_plane_duplicate_state);
 2712 
 2713 /**
 2714  * __drm_atomic_helper_plane_destroy_state - release plane state
 2715  * @state: plane state object to release
 2716  *
 2717  * Releases all resources stored in the plane state without actually freeing
 2718  * the memory of the plane state. This is useful for drivers that subclass the
 2719  * plane state.
 2720  */
 2721 void __drm_atomic_helper_plane_destroy_state(struct drm_plane_state *state)
 2722 {
 2723 	if (state->fb)
 2724 		drm_framebuffer_unreference(state->fb);
 2725 }
 2726 EXPORT_SYMBOL(__drm_atomic_helper_plane_destroy_state);
 2727 
 2728 /**
 2729  * drm_atomic_helper_plane_destroy_state - default state destroy hook
 2730  * @plane: drm plane
 2731  * @state: plane state object to release
 2732  *
 2733  * Default plane state destroy hook for drivers which don't have their own
 2734  * subclassed plane state structure.
 2735  */
 2736 void drm_atomic_helper_plane_destroy_state(struct drm_plane *plane,
 2737 					   struct drm_plane_state *state)
 2738 {
 2739 	__drm_atomic_helper_plane_destroy_state(state);
 2740 	kfree(state);
 2741 }
 2742 EXPORT_SYMBOL(drm_atomic_helper_plane_destroy_state);
 2743 
 2744 /**
 2745  * __drm_atomic_helper_connector_reset - reset state on connector
 2746  * @connector: drm connector
 2747  * @conn_state: connector state to assign
 2748  *
 2749  * Initializes the newly allocated @conn_state and assigns it to
 2750  * #connector ->state, usually required when initializing the drivers
 2751  * or when called from the ->reset hook.
 2752  *
 2753  * This is useful for drivers that subclass the connector state.
 2754  */
 2755 void
 2756 __drm_atomic_helper_connector_reset(struct drm_connector *connector,
 2757 				    struct drm_connector_state *conn_state)
 2758 {
 2759 	if (conn_state)
 2760 		conn_state->connector = connector;
 2761 
 2762 	connector->state = conn_state;
 2763 }
 2764 EXPORT_SYMBOL(__drm_atomic_helper_connector_reset);
 2765 
 2766 /**
 2767  * drm_atomic_helper_connector_reset - default ->reset hook for connectors
 2768  * @connector: drm connector
 2769  *
 2770  * Resets the atomic state for @connector by freeing the state pointer (which
 2771  * might be NULL, e.g. at driver load time) and allocating a new empty state
 2772  * object.
 2773  */
 2774 void drm_atomic_helper_connector_reset(struct drm_connector *connector)
 2775 {
 2776 	struct drm_connector_state *conn_state =
 2777 		kzalloc(sizeof(*conn_state), GFP_KERNEL);
 2778 
 2779 	if (connector->state)
 2780 		__drm_atomic_helper_connector_destroy_state(connector->state);
 2781 
 2782 	kfree(connector->state);
 2783 	__drm_atomic_helper_connector_reset(connector, conn_state);
 2784 }
 2785 EXPORT_SYMBOL(drm_atomic_helper_connector_reset);
 2786 
 2787 /**
 2788  * __drm_atomic_helper_connector_duplicate_state - copy atomic connector state
 2789  * @connector: connector object
 2790  * @state: atomic connector state
 2791  *
 2792  * Copies atomic state from a connector's current state. This is useful for
 2793  * drivers that subclass the connector state.
 2794  */
 2795 void
 2796 __drm_atomic_helper_connector_duplicate_state(struct drm_connector *connector,
 2797 					    struct drm_connector_state *state)
 2798 {
 2799 	memcpy(state, connector->state, sizeof(*state));
 2800 	if (state->crtc)
 2801 		drm_connector_reference(connector);
 2802 }
 2803 EXPORT_SYMBOL(__drm_atomic_helper_connector_duplicate_state);
 2804 
 2805 /**
 2806  * drm_atomic_helper_connector_duplicate_state - default state duplicate hook
 2807  * @connector: drm connector
 2808  *
 2809  * Default connector state duplicate hook for drivers which don't have their own
 2810  * subclassed connector state structure.
 2811  */
 2812 struct drm_connector_state *
 2813 drm_atomic_helper_connector_duplicate_state(struct drm_connector *connector)
 2814 {
 2815 	struct drm_connector_state *state;
 2816 
 2817 	if (WARN_ON(!connector->state))
 2818 		return NULL;
 2819 
 2820 	state = kmalloc(sizeof(*state), GFP_KERNEL);
 2821 	if (state)
 2822 		__drm_atomic_helper_connector_duplicate_state(connector, state);
 2823 
 2824 	return state;
 2825 }
 2826 EXPORT_SYMBOL(drm_atomic_helper_connector_duplicate_state);
 2827 
 2828 /**
 2829  * drm_atomic_helper_duplicate_state - duplicate an atomic state object
 2830  * @dev: DRM device
 2831  * @ctx: lock acquisition context
 2832  *
 2833  * Makes a copy of the current atomic state by looping over all objects and
 2834  * duplicating their respective states. This is used for example by suspend/
 2835  * resume support code to save the state prior to suspend such that it can
 2836  * be restored upon resume.
 2837  *
 2838  * Note that this treats atomic state as persistent between save and restore.
 2839  * Drivers must make sure that this is possible and won't result in confusion
 2840  * or erroneous behaviour.
 2841  *
 2842  * Note that if callers haven't already acquired all modeset locks this might
 2843  * return -EDEADLK, which must be handled by calling drm_modeset_backoff().
 2844  *
 2845  * Returns:
 2846  * A pointer to the copy of the atomic state object on success or an
 2847  * ERR_PTR()-encoded error code on failure.
 2848  *
 2849  * See also:
 2850  * drm_atomic_helper_suspend(), drm_atomic_helper_resume()
 2851  */
 2852 struct drm_atomic_state *
 2853 drm_atomic_helper_duplicate_state(struct drm_device *dev,
 2854 				  struct drm_modeset_acquire_ctx *ctx)
 2855 {
 2856 	struct drm_atomic_state *state;
 2857 	struct drm_connector *conn;
 2858 	struct drm_plane *plane;
 2859 	struct drm_crtc *crtc;
 2860 	int err = 0;
 2861 
 2862 	state = drm_atomic_state_alloc(dev);
 2863 	if (!state)
 2864 		return ERR_PTR(-ENOMEM);
 2865 
 2866 	state->acquire_ctx = ctx;
 2867 
 2868 	drm_for_each_crtc(crtc, dev) {
 2869 		struct drm_crtc_state *crtc_state;
 2870 
 2871 		crtc_state = drm_atomic_get_crtc_state(state, crtc);
 2872 		if (IS_ERR(crtc_state)) {
 2873 			err = PTR_ERR(crtc_state);
 2874 			goto free;
 2875 		}
 2876 	}
 2877 
 2878 	drm_for_each_plane(plane, dev) {
 2879 		struct drm_plane_state *plane_state;
 2880 
 2881 		plane_state = drm_atomic_get_plane_state(state, plane);
 2882 		if (IS_ERR(plane_state)) {
 2883 			err = PTR_ERR(plane_state);
 2884 			goto free;
 2885 		}
 2886 	}
 2887 
 2888 	drm_for_each_connector(conn, dev) {
 2889 		struct drm_connector_state *conn_state;
 2890 
 2891 		conn_state = drm_atomic_get_connector_state(state, conn);
 2892 		if (IS_ERR(conn_state)) {
 2893 			err = PTR_ERR(conn_state);
 2894 			goto free;
 2895 		}
 2896 	}
 2897 
 2898 	/* clear the acquire context so that it isn't accidentally reused */
 2899 	state->acquire_ctx = NULL;
 2900 
 2901 free:
 2902 	if (err < 0) {
 2903 		drm_atomic_state_free(state);
 2904 		state = ERR_PTR(err);
 2905 	}
 2906 
 2907 	return state;
 2908 }
 2909 EXPORT_SYMBOL(drm_atomic_helper_duplicate_state);
 2910 
 2911 /**
 2912  * __drm_atomic_helper_connector_destroy_state - release connector state
 2913  * @state: connector state object to release
 2914  *
 2915  * Releases all resources stored in the connector state without actually
 2916  * freeing the memory of the connector state. This is useful for drivers that
 2917  * subclass the connector state.
 2918  */
 2919 void
 2920 __drm_atomic_helper_connector_destroy_state(struct drm_connector_state *state)
 2921 {
 2922 	/*
 2923 	 * This is currently a placeholder so that drivers that subclass the
 2924 	 * state will automatically do the right thing if code is ever added
 2925 	 * to this function.
 2926 	 */
 2927 	if (state->crtc)
 2928 		drm_connector_unreference(state->connector);
 2929 }
 2930 EXPORT_SYMBOL(__drm_atomic_helper_connector_destroy_state);
 2931 
 2932 /**
 2933  * drm_atomic_helper_connector_destroy_state - default state destroy hook
 2934  * @connector: drm connector
 2935  * @state: connector state object to release
 2936  *
 2937  * Default connector state destroy hook for drivers which don't have their own
 2938  * subclassed connector state structure.
 2939  */
 2940 void drm_atomic_helper_connector_destroy_state(struct drm_connector *connector,
 2941 					  struct drm_connector_state *state)
 2942 {
 2943 	__drm_atomic_helper_connector_destroy_state(state);
 2944 	kfree(state);
 2945 }
 2946 EXPORT_SYMBOL(drm_atomic_helper_connector_destroy_state);
 2947 
 2948 /**
 2949  * drm_atomic_helper_legacy_gamma_set - set the legacy gamma correction table
 2950  * @crtc: CRTC object
 2951  * @red: red correction table
 2952  * @green: green correction table
 2953  * @blue: green correction table
 2954  * @start:
 2955  * @size: size of the tables
 2956  *
 2957  * Implements support for legacy gamma correction table for drivers
 2958  * that support color management through the DEGAMMA_LUT/GAMMA_LUT
 2959  * properties.
 2960  */
 2961 void drm_atomic_helper_legacy_gamma_set(struct drm_crtc *crtc,
 2962 					u16 *red, u16 *green, u16 *blue,
 2963 					uint32_t start, uint32_t size)
 2964 {
 2965 	struct drm_device *dev = crtc->dev;
 2966 	struct drm_mode_config *config = &dev->mode_config;
 2967 	struct drm_atomic_state *state;
 2968 	struct drm_crtc_state *crtc_state;
 2969 	struct drm_property_blob *blob = NULL;
 2970 	struct drm_color_lut *blob_data;
 2971 	int i, ret = 0;
 2972 
 2973 	state = drm_atomic_state_alloc(crtc->dev);
 2974 	if (!state)
 2975 		return;
 2976 
 2977 	blob = drm_property_create_blob(dev,
 2978 					sizeof(struct drm_color_lut) * size,
 2979 					NULL);
 2980 	if (IS_ERR(blob)) {
 2981 		ret = PTR_ERR(blob);
 2982 		blob = NULL;
 2983 		goto fail;
 2984 	}
 2985 
 2986 	/* Prepare GAMMA_LUT with the legacy values. */
 2987 	blob_data = (struct drm_color_lut *) blob->data;
 2988 	for (i = 0; i < size; i++) {
 2989 		blob_data[i].red = red[i];
 2990 		blob_data[i].green = green[i];
 2991 		blob_data[i].blue = blue[i];
 2992 	}
 2993 
 2994 	state->acquire_ctx = crtc->dev->mode_config.acquire_ctx;
 2995 retry:
 2996 	crtc_state = drm_atomic_get_crtc_state(state, crtc);
 2997 	if (IS_ERR(crtc_state)) {
 2998 		ret = PTR_ERR(crtc_state);
 2999 		goto fail;
 3000 	}
 3001 
 3002 	/* Reset DEGAMMA_LUT and CTM properties. */
 3003 	ret = drm_atomic_crtc_set_property(crtc, crtc_state,
 3004 			config->degamma_lut_property, 0);
 3005 	if (ret)
 3006 		goto fail;
 3007 
 3008 	ret = drm_atomic_crtc_set_property(crtc, crtc_state,
 3009 			config->ctm_property, 0);
 3010 	if (ret)
 3011 		goto fail;
 3012 
 3013 	ret = drm_atomic_crtc_set_property(crtc, crtc_state,
 3014 			config->gamma_lut_property, blob->base.id);
 3015 	if (ret)
 3016 		goto fail;
 3017 
 3018 	ret = drm_atomic_commit(state);
 3019 	if (ret)
 3020 		goto fail;
 3021 
 3022 	/* Driver takes ownership of state on successful commit. */
 3023 
 3024 	drm_property_unreference_blob(blob);
 3025 
 3026 	return;
 3027 fail:
 3028 	if (ret == -EDEADLK)
 3029 		goto backoff;
 3030 
 3031 	drm_atomic_state_free(state);
 3032 	drm_property_unreference_blob(blob);
 3033 
 3034 	return;
 3035 backoff:
 3036 	drm_atomic_state_clear(state);
 3037 	drm_atomic_legacy_backoff(state);
 3038 
 3039 	goto retry;
 3040 }
 3041 EXPORT_SYMBOL(drm_atomic_helper_legacy_gamma_set);
 3042 
 3043 #line 21 "/home/ubuntu/launches/work/current--X--drivers--X--defaultlinux-4.7-rc1.tar.xz--X--106_1a--X--cpachecker/linux-4.7-rc1.tar.xz/csd_deg_dscv/5249/dscv_tempdir/dscv/ri/106_1a/drivers/gpu/drm/drm_atomic_helper.o.c.prepared"           1 
    2 /*
    3  * Copyright © 2015 Intel Corporation
    4  *
    5  * Permission is hereby granted, free of charge, to any person obtaining a
    6  * copy of this software and associated documentation files (the "Software"),
    7  * to deal in the Software without restriction, including without limitation
    8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
    9  * and/or sell copies of the Software, and to permit persons to whom the
   10  * Software is furnished to do so, subject to the following conditions:
   11  *
   12  * The above copyright notice and this permission notice (including the next
   13  * paragraph) shall be included in all copies or substantial portions of the
   14  * Software.
   15  *
   16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
   19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
   20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
   21  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
   22  * IN THE SOFTWARE.
   23  *
   24  * Authors:
   25  *    Rafael Antognolli <rafael.antognolli@intel.com>
   26  *
   27  */
   28 
   29 #include <linux/device.h>
   30 #include <linux/fs.h>
   31 #include <linux/slab.h>
   32 #include <linux/init.h>
   33 #include <linux/kernel.h>
   34 #include <linux/module.h>
   35 #include <linux/uaccess.h>
   36 #include <drm/drm_dp_helper.h>
   37 #include <drm/drm_crtc.h>
   38 #include <drm/drmP.h>
   39 
   40 struct drm_dp_aux_dev {
   41 	unsigned index;
   42 	struct drm_dp_aux *aux;
   43 	struct device *dev;
   44 	struct kref refcount;
   45 	atomic_t usecount;
   46 };
   47 
   48 #define DRM_AUX_MINORS	256
   49 #define AUX_MAX_OFFSET	(1 << 20)
   50 static DEFINE_IDR(aux_idr);
   51 static DEFINE_MUTEX(aux_idr_mutex);
   52 static struct class *drm_dp_aux_dev_class;
   53 static int drm_dev_major = -1;
   54 
   55 static struct drm_dp_aux_dev *drm_dp_aux_dev_get_by_minor(unsigned index)
   56 {
   57 	struct drm_dp_aux_dev *aux_dev = NULL;
   58 
   59 	mutex_lock(&aux_idr_mutex);
   60 	aux_dev = idr_find(&aux_idr, index);
   61 	if (!kref_get_unless_zero(&aux_dev->refcount))
   62 		aux_dev = NULL;
   63 	mutex_unlock(&aux_idr_mutex);
   64 
   65 	return aux_dev;
   66 }
   67 
   68 static struct drm_dp_aux_dev *alloc_drm_dp_aux_dev(struct drm_dp_aux *aux)
   69 {
   70 	struct drm_dp_aux_dev *aux_dev;
   71 	int index;
   72 
   73 	aux_dev = kzalloc(sizeof(*aux_dev), GFP_KERNEL);
   74 	if (!aux_dev)
   75 		return ERR_PTR(-ENOMEM);
   76 	aux_dev->aux = aux;
   77 	atomic_set(&aux_dev->usecount, 1);
   78 	kref_init(&aux_dev->refcount);
   79 
   80 	mutex_lock(&aux_idr_mutex);
   81 	index = idr_alloc_cyclic(&aux_idr, aux_dev, 0, DRM_AUX_MINORS,
   82 				 GFP_KERNEL);
   83 	mutex_unlock(&aux_idr_mutex);
   84 	if (index < 0) {
   85 		kfree(aux_dev);
   86 		return ERR_PTR(index);
   87 	}
   88 	aux_dev->index = index;
   89 
   90 	return aux_dev;
   91 }
   92 
   93 static void release_drm_dp_aux_dev(struct kref *ref)
   94 {
   95 	struct drm_dp_aux_dev *aux_dev =
   96 		container_of(ref, struct drm_dp_aux_dev, refcount);
   97 
   98 	kfree(aux_dev);
   99 }
  100 
  101 static ssize_t name_show(struct device *dev,
  102 			 struct device_attribute *attr, char *buf)
  103 {
  104 	ssize_t res;
  105 	struct drm_dp_aux_dev *aux_dev =
  106 		drm_dp_aux_dev_get_by_minor(MINOR(dev->devt));
  107 
  108 	if (!aux_dev)
  109 		return -ENODEV;
  110 
  111 	res = sprintf(buf, "%s\n", aux_dev->aux->name);
  112 	kref_put(&aux_dev->refcount, release_drm_dp_aux_dev);
  113 
  114 	return res;
  115 }
  116 static DEVICE_ATTR_RO(name);
  117 
  118 static struct attribute *drm_dp_aux_attrs[] = {
  119 	&dev_attr_name.attr,
  120 	NULL,
  121 };
  122 ATTRIBUTE_GROUPS(drm_dp_aux);
  123 
  124 static int auxdev_open(struct inode *inode, struct file *file)
  125 {
  126 	unsigned int minor = iminor(inode);
  127 	struct drm_dp_aux_dev *aux_dev;
  128 
  129 	aux_dev = drm_dp_aux_dev_get_by_minor(minor);
  130 	if (!aux_dev)
  131 		return -ENODEV;
  132 
  133 	file->private_data = aux_dev;
  134 	return 0;
  135 }
  136 
  137 static loff_t auxdev_llseek(struct file *file, loff_t offset, int whence)
  138 {
  139 	return fixed_size_llseek(file, offset, whence, AUX_MAX_OFFSET);
  140 }
  141 
  142 static ssize_t auxdev_read(struct file *file, char __user *buf, size_t count,
  143 			   loff_t *offset)
  144 {
  145 	size_t bytes_pending, num_bytes_processed = 0;
  146 	struct drm_dp_aux_dev *aux_dev = file->private_data;
  147 	ssize_t res = 0;
  148 
  149 	if (!atomic_inc_not_zero(&aux_dev->usecount))
  150 		return -ENODEV;
  151 
  152 	bytes_pending = min((loff_t)count, AUX_MAX_OFFSET - (*offset));
  153 
  154 	if (!access_ok(VERIFY_WRITE, buf, bytes_pending)) {
  155 		res = -EFAULT;
  156 		goto out;
  157 	}
  158 
  159 	while (bytes_pending > 0) {
  160 		uint8_t localbuf[DP_AUX_MAX_PAYLOAD_BYTES];
  161 		ssize_t todo = min_t(size_t, bytes_pending, sizeof(localbuf));
  162 
  163 		if (signal_pending(current)) {
  164 			res = num_bytes_processed ?
  165 				num_bytes_processed : -ERESTARTSYS;
  166 			goto out;
  167 		}
  168 
  169 		res = drm_dp_dpcd_read(aux_dev->aux, *offset, localbuf, todo);
  170 		if (res <= 0) {
  171 			res = num_bytes_processed ? num_bytes_processed : res;
  172 			goto out;
  173 		}
  174 		if (__copy_to_user(buf + num_bytes_processed, localbuf, res)) {
  175 			res = num_bytes_processed ?
  176 				num_bytes_processed : -EFAULT;
  177 			goto out;
  178 		}
  179 		bytes_pending -= res;
  180 		*offset += res;
  181 		num_bytes_processed += res;
  182 		res = num_bytes_processed;
  183 	}
  184 
  185 out:
  186 	atomic_dec(&aux_dev->usecount);
  187 	wake_up_atomic_t(&aux_dev->usecount);
  188 	return res;
  189 }
  190 
  191 static ssize_t auxdev_write(struct file *file, const char __user *buf,
  192 			    size_t count, loff_t *offset)
  193 {
  194 	size_t bytes_pending, num_bytes_processed = 0;
  195 	struct drm_dp_aux_dev *aux_dev = file->private_data;
  196 	ssize_t res = 0;
  197 
  198 	if (!atomic_inc_not_zero(&aux_dev->usecount))
  199 		return -ENODEV;
  200 
  201 	bytes_pending = min((loff_t)count, AUX_MAX_OFFSET - *offset);
  202 
  203 	if (!access_ok(VERIFY_READ, buf, bytes_pending)) {
  204 		res = -EFAULT;
  205 		goto out;
  206 	}
  207 
  208 	while (bytes_pending > 0) {
  209 		uint8_t localbuf[DP_AUX_MAX_PAYLOAD_BYTES];
  210 		ssize_t todo = min_t(size_t, bytes_pending, sizeof(localbuf));
  211 
  212 		if (signal_pending(current)) {
  213 			res = num_bytes_processed ?
  214 				num_bytes_processed : -ERESTARTSYS;
  215 			goto out;
  216 		}
  217 
  218 		if (__copy_from_user(localbuf,
  219 				     buf + num_bytes_processed, todo)) {
  220 			res = num_bytes_processed ?
  221 				num_bytes_processed : -EFAULT;
  222 			goto out;
  223 		}
  224 
  225 		res = drm_dp_dpcd_write(aux_dev->aux, *offset, localbuf, todo);
  226 		if (res <= 0) {
  227 			res = num_bytes_processed ? num_bytes_processed : res;
  228 			goto out;
  229 		}
  230 		bytes_pending -= res;
  231 		*offset += res;
  232 		num_bytes_processed += res;
  233 		res = num_bytes_processed;
  234 	}
  235 
  236 out:
  237 	atomic_dec(&aux_dev->usecount);
  238 	wake_up_atomic_t(&aux_dev->usecount);
  239 	return res;
  240 }
  241 
  242 static int auxdev_release(struct inode *inode, struct file *file)
  243 {
  244 	struct drm_dp_aux_dev *aux_dev = file->private_data;
  245 
  246 	kref_put(&aux_dev->refcount, release_drm_dp_aux_dev);
  247 	return 0;
  248 }
  249 
  250 static const struct file_operations auxdev_fops = {
  251 	.owner		= THIS_MODULE,
  252 	.llseek		= auxdev_llseek,
  253 	.read		= auxdev_read,
  254 	.write		= auxdev_write,
  255 	.open		= auxdev_open,
  256 	.release	= auxdev_release,
  257 };
  258 
  259 #define to_auxdev(d) container_of(d, struct drm_dp_aux_dev, aux)
  260 
  261 static struct drm_dp_aux_dev *drm_dp_aux_dev_get_by_aux(struct drm_dp_aux *aux)
  262 {
  263 	struct drm_dp_aux_dev *iter, *aux_dev = NULL;
  264 	int id;
  265 
  266 	/* don't increase kref count here because this function should only be
  267 	 * used by drm_dp_aux_unregister_devnode. Thus, it will always have at
  268 	 * least one reference - the one that drm_dp_aux_register_devnode
  269 	 * created
  270 	 */
  271 	mutex_lock(&aux_idr_mutex);
  272 	idr_for_each_entry(&aux_idr, iter, id) {
  273 		if (iter->aux == aux) {
  274 			aux_dev = iter;
  275 			break;
  276 		}
  277 	}
  278 	mutex_unlock(&aux_idr_mutex);
  279 	return aux_dev;
  280 }
  281 
  282 static int auxdev_wait_atomic_t(atomic_t *p)
  283 {
  284 	schedule();
  285 	return 0;
  286 }
  287 /**
  288  * drm_dp_aux_unregister_devnode() - unregister a devnode for this aux channel
  289  * @aux: DisplayPort AUX channel
  290  *
  291  * Returns 0 on success or a negative error code on failure.
  292  */
  293 void drm_dp_aux_unregister_devnode(struct drm_dp_aux *aux)
  294 {
  295 	struct drm_dp_aux_dev *aux_dev;
  296 	unsigned int minor;
  297 
  298 	aux_dev = drm_dp_aux_dev_get_by_aux(aux);
  299 	if (!aux_dev) /* attach must have failed */
  300 		return;
  301 
  302 	mutex_lock(&aux_idr_mutex);
  303 	idr_remove(&aux_idr, aux_dev->index);
  304 	mutex_unlock(&aux_idr_mutex);
  305 
  306 	atomic_dec(&aux_dev->usecount);
  307 	wait_on_atomic_t(&aux_dev->usecount, auxdev_wait_atomic_t,
  308 			 TASK_UNINTERRUPTIBLE);
  309 
  310 	minor = aux_dev->index;
  311 	if (aux_dev->dev)
  312 		device_destroy(drm_dp_aux_dev_class,
  313 			       MKDEV(drm_dev_major, minor));
  314 
  315 	DRM_DEBUG("drm_dp_aux_dev: aux [%s] unregistering\n", aux->name);
  316 	kref_put(&aux_dev->refcount, release_drm_dp_aux_dev);
  317 }
  318 EXPORT_SYMBOL(drm_dp_aux_unregister_devnode);
  319 
  320 /**
  321  * drm_dp_aux_register_devnode() - register a devnode for this aux channel
  322  * @aux: DisplayPort AUX channel
  323  *
  324  * Returns 0 on success or a negative error code on failure.
  325  */
  326 int drm_dp_aux_register_devnode(struct drm_dp_aux *aux)
  327 {
  328 	struct drm_dp_aux_dev *aux_dev;
  329 	int res;
  330 
  331 	aux_dev = alloc_drm_dp_aux_dev(aux);
  332 	if (IS_ERR(aux_dev))
  333 		return PTR_ERR(aux_dev);
  334 
  335 	aux_dev->dev = device_create(drm_dp_aux_dev_class, aux->dev,
  336 				     MKDEV(drm_dev_major, aux_dev->index), NULL,
  337 				     "drm_dp_aux%d", aux_dev->index);
  338 	if (IS_ERR(aux_dev->dev)) {
  339 		res = PTR_ERR(aux_dev->dev);
  340 		aux_dev->dev = NULL;
  341 		goto error;
  342 	}
  343 
  344 	DRM_DEBUG("drm_dp_aux_dev: aux [%s] registered as minor %d\n",
  345 		  aux->name, aux_dev->index);
  346 	return 0;
  347 error:
  348 	drm_dp_aux_unregister_devnode(aux);
  349 	return res;
  350 }
  351 EXPORT_SYMBOL(drm_dp_aux_register_devnode);
  352 
  353 int drm_dp_aux_dev_init(void)
  354 {
  355 	int res;
  356 
  357 	drm_dp_aux_dev_class = class_create(THIS_MODULE, "drm_dp_aux_dev");
  358 	if (IS_ERR(drm_dp_aux_dev_class)) {
  359 		res = PTR_ERR(drm_dp_aux_dev_class);
  360 		goto out;
  361 	}
  362 	drm_dp_aux_dev_class->dev_groups = drm_dp_aux_groups;
  363 
  364 	res = register_chrdev(0, "aux", &auxdev_fops);
  365 	if (res < 0)
  366 		goto out;
  367 	drm_dev_major = res;
  368 
  369 	return 0;
  370 out:
  371 	class_destroy(drm_dp_aux_dev_class);
  372 	return res;
  373 }
  374 EXPORT_SYMBOL(drm_dp_aux_dev_init);
  375 
  376 void drm_dp_aux_dev_exit(void)
  377 {
  378 	unregister_chrdev(drm_dev_major, "aux");
  379 	class_destroy(drm_dp_aux_dev_class);
  380 }
  381 EXPORT_SYMBOL(drm_dp_aux_dev_exit);
  382 
  383 
  384 
  385 
  386 
  387 /* LDV_COMMENT_BEGIN_MAIN */
  388 #ifdef LDV_MAIN11_sequence_infinite_withcheck_stateful
  389 
  390 /*###########################################################################*/
  391 
  392 /*############## Driver Environment Generator 0.2 output ####################*/
  393 
  394 /*###########################################################################*/
  395 
  396 
  397 
  398 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Test if all kernel resources are correctly released by driver before driver will be unloaded. */
  399 void ldv_check_final_state(void);
  400 
  401 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Test correct return result. */
  402 void ldv_check_return_value(int res);
  403 
  404 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Test correct return result of probe() function. */
  405 void ldv_check_return_value_probe(int res);
  406 
  407 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Initializes the model. */
  408 void ldv_initialize(void);
  409 
  410 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Reinitializes the model between distinct model function calls. */
  411 void ldv_handler_precall(void);
  412 
  413 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Returns arbitrary interger value. */
  414 int nondet_int(void);
  415 
  416 /* LDV_COMMENT_VAR_DECLARE_LDV Special variable for LDV verifier. */
  417 int LDV_IN_INTERRUPT;
  418 
  419 /* LDV_COMMENT_FUNCTION_MAIN Main function for LDV verifier. */
  420 void ldv_main11_sequence_infinite_withcheck_stateful(void) {
  421 
  422 
  423 
  424 	/* LDV_COMMENT_BEGIN_VARIABLE_DECLARATION_PART */
  425 	/*============================= VARIABLE DECLARATION PART   =============================*/
  426 	/** STRUCT: struct type: file_operations, struct name: auxdev_fops **/
  427 	/* content: static loff_t auxdev_llseek(struct file *file, loff_t offset, int whence)*/
  428 	/* LDV_COMMENT_BEGIN_PREP */
  429 	#define DRM_AUX_MINORS	256
  430 	#define AUX_MAX_OFFSET	(1 << 20)
  431 	/* LDV_COMMENT_END_PREP */
  432 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "auxdev_llseek" */
  433 	struct file * var_group1;
  434 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "auxdev_llseek" */
  435 	loff_t  var_auxdev_llseek_5_p1;
  436 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "auxdev_llseek" */
  437 	int  var_auxdev_llseek_5_p2;
  438 	/* LDV_COMMENT_BEGIN_PREP */
  439 	#define to_auxdev(d) container_of(d, struct drm_dp_aux_dev, aux)
  440 	/* LDV_COMMENT_END_PREP */
  441 	/* content: static ssize_t auxdev_read(struct file *file, char __user *buf, size_t count, loff_t *offset)*/
  442 	/* LDV_COMMENT_BEGIN_PREP */
  443 	#define DRM_AUX_MINORS	256
  444 	#define AUX_MAX_OFFSET	(1 << 20)
  445 	/* LDV_COMMENT_END_PREP */
  446 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "auxdev_read" */
  447 	char __user * var_auxdev_read_6_p1;
  448 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "auxdev_read" */
  449 	size_t  var_auxdev_read_6_p2;
  450 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "auxdev_read" */
  451 	loff_t * var_auxdev_read_6_p3;
  452 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for test return result from function call "auxdev_read" */
  453 	static ssize_t res_auxdev_read_6;
  454 	/* LDV_COMMENT_BEGIN_PREP */
  455 	#define to_auxdev(d) container_of(d, struct drm_dp_aux_dev, aux)
  456 	/* LDV_COMMENT_END_PREP */
  457 	/* content: static ssize_t auxdev_write(struct file *file, const char __user *buf, size_t count, loff_t *offset)*/
  458 	/* LDV_COMMENT_BEGIN_PREP */
  459 	#define DRM_AUX_MINORS	256
  460 	#define AUX_MAX_OFFSET	(1 << 20)
  461 	/* LDV_COMMENT_END_PREP */
  462 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "auxdev_write" */
  463 	const char __user * var_auxdev_write_7_p1;
  464 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "auxdev_write" */
  465 	size_t  var_auxdev_write_7_p2;
  466 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "auxdev_write" */
  467 	loff_t * var_auxdev_write_7_p3;
  468 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for test return result from function call "auxdev_write" */
  469 	static ssize_t res_auxdev_write_7;
  470 	/* LDV_COMMENT_BEGIN_PREP */
  471 	#define to_auxdev(d) container_of(d, struct drm_dp_aux_dev, aux)
  472 	/* LDV_COMMENT_END_PREP */
  473 	/* content: static int auxdev_open(struct inode *inode, struct file *file)*/
  474 	/* LDV_COMMENT_BEGIN_PREP */
  475 	#define DRM_AUX_MINORS	256
  476 	#define AUX_MAX_OFFSET	(1 << 20)
  477 	/* LDV_COMMENT_END_PREP */
  478 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "auxdev_open" */
  479 	struct inode * var_group2;
  480 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for test return result from function call "auxdev_open" */
  481 	static int res_auxdev_open_4;
  482 	/* LDV_COMMENT_BEGIN_PREP */
  483 	#define to_auxdev(d) container_of(d, struct drm_dp_aux_dev, aux)
  484 	/* LDV_COMMENT_END_PREP */
  485 	/* content: static int auxdev_release(struct inode *inode, struct file *file)*/
  486 	/* LDV_COMMENT_BEGIN_PREP */
  487 	#define DRM_AUX_MINORS	256
  488 	#define AUX_MAX_OFFSET	(1 << 20)
  489 	/* LDV_COMMENT_END_PREP */
  490 	/* LDV_COMMENT_BEGIN_PREP */
  491 	#define to_auxdev(d) container_of(d, struct drm_dp_aux_dev, aux)
  492 	/* LDV_COMMENT_END_PREP */
  493 
  494 
  495 
  496 
  497 	/* LDV_COMMENT_END_VARIABLE_DECLARATION_PART */
  498 	/* LDV_COMMENT_BEGIN_VARIABLE_INITIALIZING_PART */
  499 	/*============================= VARIABLE INITIALIZING PART  =============================*/
  500 	LDV_IN_INTERRUPT=1;
  501 
  502 
  503 
  504 
  505 	/* LDV_COMMENT_END_VARIABLE_INITIALIZING_PART */
  506 	/* LDV_COMMENT_BEGIN_FUNCTION_CALL_SECTION */
  507 	/*============================= FUNCTION CALL SECTION       =============================*/
  508 	/* LDV_COMMENT_FUNCTION_CALL Initialize LDV model. */
  509 	ldv_initialize();
  510 	int ldv_s_auxdev_fops_file_operations = 0;
  511 
  512 
  513 	while(  nondet_int()
  514 		|| !(ldv_s_auxdev_fops_file_operations == 0)
  515 	) {
  516 
  517 		switch(nondet_int()) {
  518 
  519 			case 0: {
  520 
  521 				/** STRUCT: struct type: file_operations, struct name: auxdev_fops **/
  522 				if(ldv_s_auxdev_fops_file_operations==0) {
  523 
  524 				/* content: static int auxdev_open(struct inode *inode, struct file *file)*/
  525 				/* LDV_COMMENT_BEGIN_PREP */
  526 				#define DRM_AUX_MINORS	256
  527 				#define AUX_MAX_OFFSET	(1 << 20)
  528 				/* LDV_COMMENT_END_PREP */
  529 				/* LDV_COMMENT_FUNCTION_CALL Function from field "open" from driver structure with callbacks "auxdev_fops". Standart function test for correct return result. */
  530 				ldv_handler_precall();
  531 				res_auxdev_open_4 = auxdev_open( var_group2, var_group1);
  532 				 ldv_check_return_value(res_auxdev_open_4);
  533 				 if(res_auxdev_open_4) 
  534 					goto ldv_module_exit;
  535 				/* LDV_COMMENT_BEGIN_PREP */
  536 				#define to_auxdev(d) container_of(d, struct drm_dp_aux_dev, aux)
  537 				/* LDV_COMMENT_END_PREP */
  538 				ldv_s_auxdev_fops_file_operations++;
  539 
  540 				}
  541 
  542 			}
  543 
  544 			break;
  545 			case 1: {
  546 
  547 				/** STRUCT: struct type: file_operations, struct name: auxdev_fops **/
  548 				if(ldv_s_auxdev_fops_file_operations==1) {
  549 
  550 				/* content: static ssize_t auxdev_read(struct file *file, char __user *buf, size_t count, loff_t *offset)*/
  551 				/* LDV_COMMENT_BEGIN_PREP */
  552 				#define DRM_AUX_MINORS	256
  553 				#define AUX_MAX_OFFSET	(1 << 20)
  554 				/* LDV_COMMENT_END_PREP */
  555 				/* LDV_COMMENT_FUNCTION_CALL Function from field "read" from driver structure with callbacks "auxdev_fops". Standart function test for correct return result. */
  556 				ldv_handler_precall();
  557 				res_auxdev_read_6 = auxdev_read( var_group1, var_auxdev_read_6_p1, var_auxdev_read_6_p2, var_auxdev_read_6_p3);
  558 				 ldv_check_return_value(res_auxdev_read_6);
  559 				 if(res_auxdev_read_6 < 0) 
  560 					goto ldv_module_exit;
  561 				/* LDV_COMMENT_BEGIN_PREP */
  562 				#define to_auxdev(d) container_of(d, struct drm_dp_aux_dev, aux)
  563 				/* LDV_COMMENT_END_PREP */
  564 				ldv_s_auxdev_fops_file_operations++;
  565 
  566 				}
  567 
  568 			}
  569 
  570 			break;
  571 			case 2: {
  572 
  573 				/** STRUCT: struct type: file_operations, struct name: auxdev_fops **/
  574 				if(ldv_s_auxdev_fops_file_operations==2) {
  575 
  576 				/* content: static ssize_t auxdev_write(struct file *file, const char __user *buf, size_t count, loff_t *offset)*/
  577 				/* LDV_COMMENT_BEGIN_PREP */
  578 				#define DRM_AUX_MINORS	256
  579 				#define AUX_MAX_OFFSET	(1 << 20)
  580 				/* LDV_COMMENT_END_PREP */
  581 				/* LDV_COMMENT_FUNCTION_CALL Function from field "write" from driver structure with callbacks "auxdev_fops". Standart function test for correct return result. */
  582 				ldv_handler_precall();
  583 				res_auxdev_write_7 = auxdev_write( var_group1, var_auxdev_write_7_p1, var_auxdev_write_7_p2, var_auxdev_write_7_p3);
  584 				 ldv_check_return_value(res_auxdev_write_7);
  585 				 if(res_auxdev_write_7 < 0) 
  586 					goto ldv_module_exit;
  587 				/* LDV_COMMENT_BEGIN_PREP */
  588 				#define to_auxdev(d) container_of(d, struct drm_dp_aux_dev, aux)
  589 				/* LDV_COMMENT_END_PREP */
  590 				ldv_s_auxdev_fops_file_operations++;
  591 
  592 				}
  593 
  594 			}
  595 
  596 			break;
  597 			case 3: {
  598 
  599 				/** STRUCT: struct type: file_operations, struct name: auxdev_fops **/
  600 				if(ldv_s_auxdev_fops_file_operations==3) {
  601 
  602 				/* content: static loff_t auxdev_llseek(struct file *file, loff_t offset, int whence)*/
  603 				/* LDV_COMMENT_BEGIN_PREP */
  604 				#define DRM_AUX_MINORS	256
  605 				#define AUX_MAX_OFFSET	(1 << 20)
  606 				/* LDV_COMMENT_END_PREP */
  607 				/* LDV_COMMENT_FUNCTION_CALL Function from field "llseek" from driver structure with callbacks "auxdev_fops" */
  608 				ldv_handler_precall();
  609 				auxdev_llseek( var_group1, var_auxdev_llseek_5_p1, var_auxdev_llseek_5_p2);
  610 				/* LDV_COMMENT_BEGIN_PREP */
  611 				#define to_auxdev(d) container_of(d, struct drm_dp_aux_dev, aux)
  612 				/* LDV_COMMENT_END_PREP */
  613 				ldv_s_auxdev_fops_file_operations++;
  614 
  615 				}
  616 
  617 			}
  618 
  619 			break;
  620 			case 4: {
  621 
  622 				/** STRUCT: struct type: file_operations, struct name: auxdev_fops **/
  623 				if(ldv_s_auxdev_fops_file_operations==4) {
  624 
  625 				/* content: static int auxdev_release(struct inode *inode, struct file *file)*/
  626 				/* LDV_COMMENT_BEGIN_PREP */
  627 				#define DRM_AUX_MINORS	256
  628 				#define AUX_MAX_OFFSET	(1 << 20)
  629 				/* LDV_COMMENT_END_PREP */
  630 				/* LDV_COMMENT_FUNCTION_CALL Function from field "release" from driver structure with callbacks "auxdev_fops" */
  631 				ldv_handler_precall();
  632 				auxdev_release( var_group2, var_group1);
  633 				/* LDV_COMMENT_BEGIN_PREP */
  634 				#define to_auxdev(d) container_of(d, struct drm_dp_aux_dev, aux)
  635 				/* LDV_COMMENT_END_PREP */
  636 				ldv_s_auxdev_fops_file_operations=0;
  637 
  638 				}
  639 
  640 			}
  641 
  642 			break;
  643 			default: break;
  644 
  645 		}
  646 
  647 	}
  648 
  649 	ldv_module_exit: 
  650 
  651 	/* LDV_COMMENT_FUNCTION_CALL Checks that all resources and locks are correctly released before the driver will be unloaded. */
  652 	ldv_final: ldv_check_final_state();
  653 
  654 	/* LDV_COMMENT_END_FUNCTION_CALL_SECTION */
  655 	return;
  656 
  657 }
  658 #endif
  659 
  660 /* LDV_COMMENT_END_MAIN */           1 
    2 #include <linux/kernel.h>
    3 bool ldv_is_err(const void *ptr);
    4 bool ldv_is_err_or_null(const void *ptr);
    5 void* ldv_err_ptr(long error);
    6 long ldv_ptr_err(const void *ptr);
    7 
    8 
    9 // Provide model function prototypes before their usage.
   10 
   11 void *ldv_create_class(void);
   12 int ldv_register_class(void);
   13 void ldv_unregister_class(void);
   14 
   15 int ldv_register_chrdev(int major);
   16 int ldv_register_chrdev_region(void);
   17 void ldv_unregister_chrdev_region(void);
   18 
   19 int ldv_register_usb_gadget(void);
   20 void ldv_unregister_usb_gadget(void);
   21 #line 1 "/home/ubuntu/launches/work/current--X--drivers--X--defaultlinux-4.7-rc1.tar.xz--X--106_1a--X--cpachecker/linux-4.7-rc1.tar.xz/csd_deg_dscv/5249/dscv_tempdir/dscv/ri/106_1a/drivers/gpu/drm/drm_dp_aux_dev.c"
   22 
   23 /*
   24  * Copyright © 2015 Intel Corporation
   25  *
   26  * Permission is hereby granted, free of charge, to any person obtaining a
   27  * copy of this software and associated documentation files (the "Software"),
   28  * to deal in the Software without restriction, including without limitation
   29  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   30  * and/or sell copies of the Software, and to permit persons to whom the
   31  * Software is furnished to do so, subject to the following conditions:
   32  *
   33  * The above copyright notice and this permission notice (including the next
   34  * paragraph) shall be included in all copies or substantial portions of the
   35  * Software.
   36  *
   37  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   38  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   39  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
   40  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
   41  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
   42  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
   43  * IN THE SOFTWARE.
   44  *
   45  * Authors:
   46  *    Rafael Antognolli <rafael.antognolli@intel.com>
   47  *
   48  */
   49 
   50 #include <linux/device.h>
   51 #include <linux/fs.h>
   52 #include <linux/slab.h>
   53 #include <linux/init.h>
   54 #include <linux/kernel.h>
   55 #include <linux/module.h>
   56 #include <linux/uaccess.h>
   57 #include <drm/drm_dp_helper.h>
   58 #include <drm/drm_crtc.h>
   59 #include <drm/drmP.h>
   60 
   61 struct drm_dp_aux_dev {
   62 	unsigned index;
   63 	struct drm_dp_aux *aux;
   64 	struct device *dev;
   65 	struct kref refcount;
   66 	atomic_t usecount;
   67 };
   68 
   69 #define DRM_AUX_MINORS	256
   70 #define AUX_MAX_OFFSET	(1 << 20)
   71 static DEFINE_IDR(aux_idr);
   72 static DEFINE_MUTEX(aux_idr_mutex);
   73 static struct class *drm_dp_aux_dev_class;
   74 static int drm_dev_major = -1;
   75 
   76 static struct drm_dp_aux_dev *drm_dp_aux_dev_get_by_minor(unsigned index)
   77 {
   78 	struct drm_dp_aux_dev *aux_dev = NULL;
   79 
   80 	mutex_lock(&aux_idr_mutex);
   81 	aux_dev = idr_find(&aux_idr, index);
   82 	if (!kref_get_unless_zero(&aux_dev->refcount))
   83 		aux_dev = NULL;
   84 	mutex_unlock(&aux_idr_mutex);
   85 
   86 	return aux_dev;
   87 }
   88 
   89 static struct drm_dp_aux_dev *alloc_drm_dp_aux_dev(struct drm_dp_aux *aux)
   90 {
   91 	struct drm_dp_aux_dev *aux_dev;
   92 	int index;
   93 
   94 	aux_dev = kzalloc(sizeof(*aux_dev), GFP_KERNEL);
   95 	if (!aux_dev)
   96 		return ERR_PTR(-ENOMEM);
   97 	aux_dev->aux = aux;
   98 	atomic_set(&aux_dev->usecount, 1);
   99 	kref_init(&aux_dev->refcount);
  100 
  101 	mutex_lock(&aux_idr_mutex);
  102 	index = idr_alloc_cyclic(&aux_idr, aux_dev, 0, DRM_AUX_MINORS,
  103 				 GFP_KERNEL);
  104 	mutex_unlock(&aux_idr_mutex);
  105 	if (index < 0) {
  106 		kfree(aux_dev);
  107 		return ERR_PTR(index);
  108 	}
  109 	aux_dev->index = index;
  110 
  111 	return aux_dev;
  112 }
  113 
  114 static void release_drm_dp_aux_dev(struct kref *ref)
  115 {
  116 	struct drm_dp_aux_dev *aux_dev =
  117 		container_of(ref, struct drm_dp_aux_dev, refcount);
  118 
  119 	kfree(aux_dev);
  120 }
  121 
  122 static ssize_t name_show(struct device *dev,
  123 			 struct device_attribute *attr, char *buf)
  124 {
  125 	ssize_t res;
  126 	struct drm_dp_aux_dev *aux_dev =
  127 		drm_dp_aux_dev_get_by_minor(MINOR(dev->devt));
  128 
  129 	if (!aux_dev)
  130 		return -ENODEV;
  131 
  132 	res = sprintf(buf, "%s\n", aux_dev->aux->name);
  133 	kref_put(&aux_dev->refcount, release_drm_dp_aux_dev);
  134 
  135 	return res;
  136 }
  137 static DEVICE_ATTR_RO(name);
  138 
  139 static struct attribute *drm_dp_aux_attrs[] = {
  140 	&dev_attr_name.attr,
  141 	NULL,
  142 };
  143 ATTRIBUTE_GROUPS(drm_dp_aux);
  144 
  145 static int auxdev_open(struct inode *inode, struct file *file)
  146 {
  147 	unsigned int minor = iminor(inode);
  148 	struct drm_dp_aux_dev *aux_dev;
  149 
  150 	aux_dev = drm_dp_aux_dev_get_by_minor(minor);
  151 	if (!aux_dev)
  152 		return -ENODEV;
  153 
  154 	file->private_data = aux_dev;
  155 	return 0;
  156 }
  157 
  158 static loff_t auxdev_llseek(struct file *file, loff_t offset, int whence)
  159 {
  160 	return fixed_size_llseek(file, offset, whence, AUX_MAX_OFFSET);
  161 }
  162 
  163 static ssize_t auxdev_read(struct file *file, char __user *buf, size_t count,
  164 			   loff_t *offset)
  165 {
  166 	size_t bytes_pending, num_bytes_processed = 0;
  167 	struct drm_dp_aux_dev *aux_dev = file->private_data;
  168 	ssize_t res = 0;
  169 
  170 	if (!atomic_inc_not_zero(&aux_dev->usecount))
  171 		return -ENODEV;
  172 
  173 	bytes_pending = min((loff_t)count, AUX_MAX_OFFSET - (*offset));
  174 
  175 	if (!access_ok(VERIFY_WRITE, buf, bytes_pending)) {
  176 		res = -EFAULT;
  177 		goto out;
  178 	}
  179 
  180 	while (bytes_pending > 0) {
  181 		uint8_t localbuf[DP_AUX_MAX_PAYLOAD_BYTES];
  182 		ssize_t todo = min_t(size_t, bytes_pending, sizeof(localbuf));
  183 
  184 		if (signal_pending(current)) {
  185 			res = num_bytes_processed ?
  186 				num_bytes_processed : -ERESTARTSYS;
  187 			goto out;
  188 		}
  189 
  190 		res = drm_dp_dpcd_read(aux_dev->aux, *offset, localbuf, todo);
  191 		if (res <= 0) {
  192 			res = num_bytes_processed ? num_bytes_processed : res;
  193 			goto out;
  194 		}
  195 		if (__copy_to_user(buf + num_bytes_processed, localbuf, res)) {
  196 			res = num_bytes_processed ?
  197 				num_bytes_processed : -EFAULT;
  198 			goto out;
  199 		}
  200 		bytes_pending -= res;
  201 		*offset += res;
  202 		num_bytes_processed += res;
  203 		res = num_bytes_processed;
  204 	}
  205 
  206 out:
  207 	atomic_dec(&aux_dev->usecount);
  208 	wake_up_atomic_t(&aux_dev->usecount);
  209 	return res;
  210 }
  211 
  212 static ssize_t auxdev_write(struct file *file, const char __user *buf,
  213 			    size_t count, loff_t *offset)
  214 {
  215 	size_t bytes_pending, num_bytes_processed = 0;
  216 	struct drm_dp_aux_dev *aux_dev = file->private_data;
  217 	ssize_t res = 0;
  218 
  219 	if (!atomic_inc_not_zero(&aux_dev->usecount))
  220 		return -ENODEV;
  221 
  222 	bytes_pending = min((loff_t)count, AUX_MAX_OFFSET - *offset);
  223 
  224 	if (!access_ok(VERIFY_READ, buf, bytes_pending)) {
  225 		res = -EFAULT;
  226 		goto out;
  227 	}
  228 
  229 	while (bytes_pending > 0) {
  230 		uint8_t localbuf[DP_AUX_MAX_PAYLOAD_BYTES];
  231 		ssize_t todo = min_t(size_t, bytes_pending, sizeof(localbuf));
  232 
  233 		if (signal_pending(current)) {
  234 			res = num_bytes_processed ?
  235 				num_bytes_processed : -ERESTARTSYS;
  236 			goto out;
  237 		}
  238 
  239 		if (__copy_from_user(localbuf,
  240 				     buf + num_bytes_processed, todo)) {
  241 			res = num_bytes_processed ?
  242 				num_bytes_processed : -EFAULT;
  243 			goto out;
  244 		}
  245 
  246 		res = drm_dp_dpcd_write(aux_dev->aux, *offset, localbuf, todo);
  247 		if (res <= 0) {
  248 			res = num_bytes_processed ? num_bytes_processed : res;
  249 			goto out;
  250 		}
  251 		bytes_pending -= res;
  252 		*offset += res;
  253 		num_bytes_processed += res;
  254 		res = num_bytes_processed;
  255 	}
  256 
  257 out:
  258 	atomic_dec(&aux_dev->usecount);
  259 	wake_up_atomic_t(&aux_dev->usecount);
  260 	return res;
  261 }
  262 
  263 static int auxdev_release(struct inode *inode, struct file *file)
  264 {
  265 	struct drm_dp_aux_dev *aux_dev = file->private_data;
  266 
  267 	kref_put(&aux_dev->refcount, release_drm_dp_aux_dev);
  268 	return 0;
  269 }
  270 
  271 static const struct file_operations auxdev_fops = {
  272 	.owner		= THIS_MODULE,
  273 	.llseek		= auxdev_llseek,
  274 	.read		= auxdev_read,
  275 	.write		= auxdev_write,
  276 	.open		= auxdev_open,
  277 	.release	= auxdev_release,
  278 };
  279 
  280 #define to_auxdev(d) container_of(d, struct drm_dp_aux_dev, aux)
  281 
  282 static struct drm_dp_aux_dev *drm_dp_aux_dev_get_by_aux(struct drm_dp_aux *aux)
  283 {
  284 	struct drm_dp_aux_dev *iter, *aux_dev = NULL;
  285 	int id;
  286 
  287 	/* don't increase kref count here because this function should only be
  288 	 * used by drm_dp_aux_unregister_devnode. Thus, it will always have at
  289 	 * least one reference - the one that drm_dp_aux_register_devnode
  290 	 * created
  291 	 */
  292 	mutex_lock(&aux_idr_mutex);
  293 	idr_for_each_entry(&aux_idr, iter, id) {
  294 		if (iter->aux == aux) {
  295 			aux_dev = iter;
  296 			break;
  297 		}
  298 	}
  299 	mutex_unlock(&aux_idr_mutex);
  300 	return aux_dev;
  301 }
  302 
  303 static int auxdev_wait_atomic_t(atomic_t *p)
  304 {
  305 	schedule();
  306 	return 0;
  307 }
  308 /**
  309  * drm_dp_aux_unregister_devnode() - unregister a devnode for this aux channel
  310  * @aux: DisplayPort AUX channel
  311  *
  312  * Returns 0 on success or a negative error code on failure.
  313  */
  314 void drm_dp_aux_unregister_devnode(struct drm_dp_aux *aux)
  315 {
  316 	struct drm_dp_aux_dev *aux_dev;
  317 	unsigned int minor;
  318 
  319 	aux_dev = drm_dp_aux_dev_get_by_aux(aux);
  320 	if (!aux_dev) /* attach must have failed */
  321 		return;
  322 
  323 	mutex_lock(&aux_idr_mutex);
  324 	idr_remove(&aux_idr, aux_dev->index);
  325 	mutex_unlock(&aux_idr_mutex);
  326 
  327 	atomic_dec(&aux_dev->usecount);
  328 	wait_on_atomic_t(&aux_dev->usecount, auxdev_wait_atomic_t,
  329 			 TASK_UNINTERRUPTIBLE);
  330 
  331 	minor = aux_dev->index;
  332 	if (aux_dev->dev)
  333 		device_destroy(drm_dp_aux_dev_class,
  334 			       MKDEV(drm_dev_major, minor));
  335 
  336 	DRM_DEBUG("drm_dp_aux_dev: aux [%s] unregistering\n", aux->name);
  337 	kref_put(&aux_dev->refcount, release_drm_dp_aux_dev);
  338 }
  339 EXPORT_SYMBOL(drm_dp_aux_unregister_devnode);
  340 
  341 /**
  342  * drm_dp_aux_register_devnode() - register a devnode for this aux channel
  343  * @aux: DisplayPort AUX channel
  344  *
  345  * Returns 0 on success or a negative error code on failure.
  346  */
  347 int drm_dp_aux_register_devnode(struct drm_dp_aux *aux)
  348 {
  349 	struct drm_dp_aux_dev *aux_dev;
  350 	int res;
  351 
  352 	aux_dev = alloc_drm_dp_aux_dev(aux);
  353 	if (IS_ERR(aux_dev))
  354 		return PTR_ERR(aux_dev);
  355 
  356 	aux_dev->dev = device_create(drm_dp_aux_dev_class, aux->dev,
  357 				     MKDEV(drm_dev_major, aux_dev->index), NULL,
  358 				     "drm_dp_aux%d", aux_dev->index);
  359 	if (IS_ERR(aux_dev->dev)) {
  360 		res = PTR_ERR(aux_dev->dev);
  361 		aux_dev->dev = NULL;
  362 		goto error;
  363 	}
  364 
  365 	DRM_DEBUG("drm_dp_aux_dev: aux [%s] registered as minor %d\n",
  366 		  aux->name, aux_dev->index);
  367 	return 0;
  368 error:
  369 	drm_dp_aux_unregister_devnode(aux);
  370 	return res;
  371 }
  372 EXPORT_SYMBOL(drm_dp_aux_register_devnode);
  373 
  374 int drm_dp_aux_dev_init(void)
  375 {
  376 	int res;
  377 
  378 	drm_dp_aux_dev_class = class_create(THIS_MODULE, "drm_dp_aux_dev");
  379 	if (IS_ERR(drm_dp_aux_dev_class)) {
  380 		res = PTR_ERR(drm_dp_aux_dev_class);
  381 		goto out;
  382 	}
  383 	drm_dp_aux_dev_class->dev_groups = drm_dp_aux_groups;
  384 
  385 	res = register_chrdev(0, "aux", &auxdev_fops);
  386 	if (res < 0)
  387 		goto out;
  388 	drm_dev_major = res;
  389 
  390 	return 0;
  391 out:
  392 	class_destroy(drm_dp_aux_dev_class);
  393 	return res;
  394 }
  395 EXPORT_SYMBOL(drm_dp_aux_dev_init);
  396 
  397 void drm_dp_aux_dev_exit(void)
  398 {
  399 	unregister_chrdev(drm_dev_major, "aux");
  400 	class_destroy(drm_dp_aux_dev_class);
  401 }
  402 EXPORT_SYMBOL(drm_dp_aux_dev_exit);
  403 
  404 
  405 
  406 
  407 
  408 /* LDV_COMMENT_BEGIN_MAIN */
  409 #ifdef LDV_MAIN11_sequence_infinite_withcheck_stateful
  410 
  411 /*###########################################################################*/
  412 
  413 /*############## Driver Environment Generator 0.2 output ####################*/
  414 
  415 /*###########################################################################*/
  416 
  417 
  418 
  419 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Test if all kernel resources are correctly released by driver before driver will be unloaded. */
  420 void ldv_check_final_state(void);
  421 
  422 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Test correct return result. */
  423 void ldv_check_return_value(int res);
  424 
  425 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Test correct return result of probe() function. */
  426 void ldv_check_return_value_probe(int res);
  427 
  428 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Initializes the model. */
  429 void ldv_initialize(void);
  430 
  431 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Reinitializes the model between distinct model function calls. */
  432 void ldv_handler_precall(void);
  433 
  434 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Returns arbitrary interger value. */
  435 int nondet_int(void);
  436 
  437 /* LDV_COMMENT_VAR_DECLARE_LDV Special variable for LDV verifier. */
  438 int LDV_IN_INTERRUPT;
  439 
  440 /* LDV_COMMENT_FUNCTION_MAIN Main function for LDV verifier. */
  441 void ldv_main11_sequence_infinite_withcheck_stateful(void) {
  442 
  443 
  444 
  445 	/* LDV_COMMENT_BEGIN_VARIABLE_DECLARATION_PART */
  446 	/*============================= VARIABLE DECLARATION PART   =============================*/
  447 	/** STRUCT: struct type: file_operations, struct name: auxdev_fops **/
  448 	/* content: static loff_t auxdev_llseek(struct file *file, loff_t offset, int whence)*/
  449 	/* LDV_COMMENT_BEGIN_PREP */
  450 	#define DRM_AUX_MINORS	256
  451 	#define AUX_MAX_OFFSET	(1 << 20)
  452 	/* LDV_COMMENT_END_PREP */
  453 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "auxdev_llseek" */
  454 	struct file * var_group1;
  455 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "auxdev_llseek" */
  456 	loff_t  var_auxdev_llseek_5_p1;
  457 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "auxdev_llseek" */
  458 	int  var_auxdev_llseek_5_p2;
  459 	/* LDV_COMMENT_BEGIN_PREP */
  460 	#define to_auxdev(d) container_of(d, struct drm_dp_aux_dev, aux)
  461 	/* LDV_COMMENT_END_PREP */
  462 	/* content: static ssize_t auxdev_read(struct file *file, char __user *buf, size_t count, loff_t *offset)*/
  463 	/* LDV_COMMENT_BEGIN_PREP */
  464 	#define DRM_AUX_MINORS	256
  465 	#define AUX_MAX_OFFSET	(1 << 20)
  466 	/* LDV_COMMENT_END_PREP */
  467 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "auxdev_read" */
  468 	char __user * var_auxdev_read_6_p1;
  469 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "auxdev_read" */
  470 	size_t  var_auxdev_read_6_p2;
  471 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "auxdev_read" */
  472 	loff_t * var_auxdev_read_6_p3;
  473 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for test return result from function call "auxdev_read" */
  474 	static ssize_t res_auxdev_read_6;
  475 	/* LDV_COMMENT_BEGIN_PREP */
  476 	#define to_auxdev(d) container_of(d, struct drm_dp_aux_dev, aux)
  477 	/* LDV_COMMENT_END_PREP */
  478 	/* content: static ssize_t auxdev_write(struct file *file, const char __user *buf, size_t count, loff_t *offset)*/
  479 	/* LDV_COMMENT_BEGIN_PREP */
  480 	#define DRM_AUX_MINORS	256
  481 	#define AUX_MAX_OFFSET	(1 << 20)
  482 	/* LDV_COMMENT_END_PREP */
  483 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "auxdev_write" */
  484 	const char __user * var_auxdev_write_7_p1;
  485 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "auxdev_write" */
  486 	size_t  var_auxdev_write_7_p2;
  487 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "auxdev_write" */
  488 	loff_t * var_auxdev_write_7_p3;
  489 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for test return result from function call "auxdev_write" */
  490 	static ssize_t res_auxdev_write_7;
  491 	/* LDV_COMMENT_BEGIN_PREP */
  492 	#define to_auxdev(d) container_of(d, struct drm_dp_aux_dev, aux)
  493 	/* LDV_COMMENT_END_PREP */
  494 	/* content: static int auxdev_open(struct inode *inode, struct file *file)*/
  495 	/* LDV_COMMENT_BEGIN_PREP */
  496 	#define DRM_AUX_MINORS	256
  497 	#define AUX_MAX_OFFSET	(1 << 20)
  498 	/* LDV_COMMENT_END_PREP */
  499 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "auxdev_open" */
  500 	struct inode * var_group2;
  501 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for test return result from function call "auxdev_open" */
  502 	static int res_auxdev_open_4;
  503 	/* LDV_COMMENT_BEGIN_PREP */
  504 	#define to_auxdev(d) container_of(d, struct drm_dp_aux_dev, aux)
  505 	/* LDV_COMMENT_END_PREP */
  506 	/* content: static int auxdev_release(struct inode *inode, struct file *file)*/
  507 	/* LDV_COMMENT_BEGIN_PREP */
  508 	#define DRM_AUX_MINORS	256
  509 	#define AUX_MAX_OFFSET	(1 << 20)
  510 	/* LDV_COMMENT_END_PREP */
  511 	/* LDV_COMMENT_BEGIN_PREP */
  512 	#define to_auxdev(d) container_of(d, struct drm_dp_aux_dev, aux)
  513 	/* LDV_COMMENT_END_PREP */
  514 
  515 
  516 
  517 
  518 	/* LDV_COMMENT_END_VARIABLE_DECLARATION_PART */
  519 	/* LDV_COMMENT_BEGIN_VARIABLE_INITIALIZING_PART */
  520 	/*============================= VARIABLE INITIALIZING PART  =============================*/
  521 	LDV_IN_INTERRUPT=1;
  522 
  523 
  524 
  525 
  526 	/* LDV_COMMENT_END_VARIABLE_INITIALIZING_PART */
  527 	/* LDV_COMMENT_BEGIN_FUNCTION_CALL_SECTION */
  528 	/*============================= FUNCTION CALL SECTION       =============================*/
  529 	/* LDV_COMMENT_FUNCTION_CALL Initialize LDV model. */
  530 	ldv_initialize();
  531 	int ldv_s_auxdev_fops_file_operations = 0;
  532 
  533 
  534 	while(  nondet_int()
  535 		|| !(ldv_s_auxdev_fops_file_operations == 0)
  536 	) {
  537 
  538 		switch(nondet_int()) {
  539 
  540 			case 0: {
  541 
  542 				/** STRUCT: struct type: file_operations, struct name: auxdev_fops **/
  543 				if(ldv_s_auxdev_fops_file_operations==0) {
  544 
  545 				/* content: static int auxdev_open(struct inode *inode, struct file *file)*/
  546 				/* LDV_COMMENT_BEGIN_PREP */
  547 				#define DRM_AUX_MINORS	256
  548 				#define AUX_MAX_OFFSET	(1 << 20)
  549 				/* LDV_COMMENT_END_PREP */
  550 				/* LDV_COMMENT_FUNCTION_CALL Function from field "open" from driver structure with callbacks "auxdev_fops". Standart function test for correct return result. */
  551 				ldv_handler_precall();
  552 				res_auxdev_open_4 = auxdev_open( var_group2, var_group1);
  553 				 ldv_check_return_value(res_auxdev_open_4);
  554 				 if(res_auxdev_open_4) 
  555 					goto ldv_module_exit;
  556 				/* LDV_COMMENT_BEGIN_PREP */
  557 				#define to_auxdev(d) container_of(d, struct drm_dp_aux_dev, aux)
  558 				/* LDV_COMMENT_END_PREP */
  559 				ldv_s_auxdev_fops_file_operations++;
  560 
  561 				}
  562 
  563 			}
  564 
  565 			break;
  566 			case 1: {
  567 
  568 				/** STRUCT: struct type: file_operations, struct name: auxdev_fops **/
  569 				if(ldv_s_auxdev_fops_file_operations==1) {
  570 
  571 				/* content: static ssize_t auxdev_read(struct file *file, char __user *buf, size_t count, loff_t *offset)*/
  572 				/* LDV_COMMENT_BEGIN_PREP */
  573 				#define DRM_AUX_MINORS	256
  574 				#define AUX_MAX_OFFSET	(1 << 20)
  575 				/* LDV_COMMENT_END_PREP */
  576 				/* LDV_COMMENT_FUNCTION_CALL Function from field "read" from driver structure with callbacks "auxdev_fops". Standart function test for correct return result. */
  577 				ldv_handler_precall();
  578 				res_auxdev_read_6 = auxdev_read( var_group1, var_auxdev_read_6_p1, var_auxdev_read_6_p2, var_auxdev_read_6_p3);
  579 				 ldv_check_return_value(res_auxdev_read_6);
  580 				 if(res_auxdev_read_6 < 0) 
  581 					goto ldv_module_exit;
  582 				/* LDV_COMMENT_BEGIN_PREP */
  583 				#define to_auxdev(d) container_of(d, struct drm_dp_aux_dev, aux)
  584 				/* LDV_COMMENT_END_PREP */
  585 				ldv_s_auxdev_fops_file_operations++;
  586 
  587 				}
  588 
  589 			}
  590 
  591 			break;
  592 			case 2: {
  593 
  594 				/** STRUCT: struct type: file_operations, struct name: auxdev_fops **/
  595 				if(ldv_s_auxdev_fops_file_operations==2) {
  596 
  597 				/* content: static ssize_t auxdev_write(struct file *file, const char __user *buf, size_t count, loff_t *offset)*/
  598 				/* LDV_COMMENT_BEGIN_PREP */
  599 				#define DRM_AUX_MINORS	256
  600 				#define AUX_MAX_OFFSET	(1 << 20)
  601 				/* LDV_COMMENT_END_PREP */
  602 				/* LDV_COMMENT_FUNCTION_CALL Function from field "write" from driver structure with callbacks "auxdev_fops". Standart function test for correct return result. */
  603 				ldv_handler_precall();
  604 				res_auxdev_write_7 = auxdev_write( var_group1, var_auxdev_write_7_p1, var_auxdev_write_7_p2, var_auxdev_write_7_p3);
  605 				 ldv_check_return_value(res_auxdev_write_7);
  606 				 if(res_auxdev_write_7 < 0) 
  607 					goto ldv_module_exit;
  608 				/* LDV_COMMENT_BEGIN_PREP */
  609 				#define to_auxdev(d) container_of(d, struct drm_dp_aux_dev, aux)
  610 				/* LDV_COMMENT_END_PREP */
  611 				ldv_s_auxdev_fops_file_operations++;
  612 
  613 				}
  614 
  615 			}
  616 
  617 			break;
  618 			case 3: {
  619 
  620 				/** STRUCT: struct type: file_operations, struct name: auxdev_fops **/
  621 				if(ldv_s_auxdev_fops_file_operations==3) {
  622 
  623 				/* content: static loff_t auxdev_llseek(struct file *file, loff_t offset, int whence)*/
  624 				/* LDV_COMMENT_BEGIN_PREP */
  625 				#define DRM_AUX_MINORS	256
  626 				#define AUX_MAX_OFFSET	(1 << 20)
  627 				/* LDV_COMMENT_END_PREP */
  628 				/* LDV_COMMENT_FUNCTION_CALL Function from field "llseek" from driver structure with callbacks "auxdev_fops" */
  629 				ldv_handler_precall();
  630 				auxdev_llseek( var_group1, var_auxdev_llseek_5_p1, var_auxdev_llseek_5_p2);
  631 				/* LDV_COMMENT_BEGIN_PREP */
  632 				#define to_auxdev(d) container_of(d, struct drm_dp_aux_dev, aux)
  633 				/* LDV_COMMENT_END_PREP */
  634 				ldv_s_auxdev_fops_file_operations++;
  635 
  636 				}
  637 
  638 			}
  639 
  640 			break;
  641 			case 4: {
  642 
  643 				/** STRUCT: struct type: file_operations, struct name: auxdev_fops **/
  644 				if(ldv_s_auxdev_fops_file_operations==4) {
  645 
  646 				/* content: static int auxdev_release(struct inode *inode, struct file *file)*/
  647 				/* LDV_COMMENT_BEGIN_PREP */
  648 				#define DRM_AUX_MINORS	256
  649 				#define AUX_MAX_OFFSET	(1 << 20)
  650 				/* LDV_COMMENT_END_PREP */
  651 				/* LDV_COMMENT_FUNCTION_CALL Function from field "release" from driver structure with callbacks "auxdev_fops" */
  652 				ldv_handler_precall();
  653 				auxdev_release( var_group2, var_group1);
  654 				/* LDV_COMMENT_BEGIN_PREP */
  655 				#define to_auxdev(d) container_of(d, struct drm_dp_aux_dev, aux)
  656 				/* LDV_COMMENT_END_PREP */
  657 				ldv_s_auxdev_fops_file_operations=0;
  658 
  659 				}
  660 
  661 			}
  662 
  663 			break;
  664 			default: break;
  665 
  666 		}
  667 
  668 	}
  669 
  670 	ldv_module_exit: 
  671 
  672 	/* LDV_COMMENT_FUNCTION_CALL Checks that all resources and locks are correctly released before the driver will be unloaded. */
  673 	ldv_final: ldv_check_final_state();
  674 
  675 	/* LDV_COMMENT_END_FUNCTION_CALL_SECTION */
  676 	return;
  677 
  678 }
  679 #endif
  680 
  681 /* LDV_COMMENT_END_MAIN */
  682 
  683 #line 21 "/home/ubuntu/launches/work/current--X--drivers--X--defaultlinux-4.7-rc1.tar.xz--X--106_1a--X--cpachecker/linux-4.7-rc1.tar.xz/csd_deg_dscv/5249/dscv_tempdir/dscv/ri/106_1a/drivers/gpu/drm/drm_dp_aux_dev.o.c.prepared"           1 
    2 /*
    3  * Copyright (c) 2006-2009 Red Hat Inc.
    4  * Copyright (c) 2006-2008 Intel Corporation
    5  * Copyright (c) 2007 Dave Airlie <airlied@linux.ie>
    6  *
    7  * DRM framebuffer helper functions
    8  *
    9  * Permission to use, copy, modify, distribute, and sell this software and its
   10  * documentation for any purpose is hereby granted without fee, provided that
   11  * the above copyright notice appear in all copies and that both that copyright
   12  * notice and this permission notice appear in supporting documentation, and
   13  * that the name of the copyright holders not be used in advertising or
   14  * publicity pertaining to distribution of the software without specific,
   15  * written prior permission.  The copyright holders make no representations
   16  * about the suitability of this software for any purpose.  It is provided "as
   17  * is" without express or implied warranty.
   18  *
   19  * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
   20  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
   21  * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
   22  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
   23  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
   24  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
   25  * OF THIS SOFTWARE.
   26  *
   27  * Authors:
   28  *      Dave Airlie <airlied@linux.ie>
   29  *      Jesse Barnes <jesse.barnes@intel.com>
   30  */
   31 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
   32 
   33 #include <linux/kernel.h>
   34 #include <linux/sysrq.h>
   35 #include <linux/slab.h>
   36 #include <linux/fb.h>
   37 #include <linux/module.h>
   38 #include <drm/drmP.h>
   39 #include <drm/drm_crtc.h>
   40 #include <drm/drm_fb_helper.h>
   41 #include <drm/drm_crtc_helper.h>
   42 #include <drm/drm_atomic.h>
   43 #include <drm/drm_atomic_helper.h>
   44 
   45 static bool drm_fbdev_emulation = true;
   46 module_param_named(fbdev_emulation, drm_fbdev_emulation, bool, 0600);
   47 MODULE_PARM_DESC(fbdev_emulation,
   48 		 "Enable legacy fbdev emulation [default=true]");
   49 
   50 static LIST_HEAD(kernel_fb_helper_list);
   51 
   52 /**
   53  * DOC: fbdev helpers
   54  *
   55  * The fb helper functions are useful to provide an fbdev on top of a drm kernel
   56  * mode setting driver. They can be used mostly independently from the crtc
   57  * helper functions used by many drivers to implement the kernel mode setting
   58  * interfaces.
   59  *
   60  * Initialization is done as a four-step process with drm_fb_helper_prepare(),
   61  * drm_fb_helper_init(), drm_fb_helper_single_add_all_connectors() and
   62  * drm_fb_helper_initial_config(). Drivers with fancier requirements than the
   63  * default behaviour can override the third step with their own code.
   64  * Teardown is done with drm_fb_helper_fini().
   65  *
   66  * At runtime drivers should restore the fbdev console by calling
   67  * drm_fb_helper_restore_fbdev_mode_unlocked() from their ->lastclose callback.
   68  * They should also notify the fb helper code from updates to the output
   69  * configuration by calling drm_fb_helper_hotplug_event(). For easier
   70  * integration with the output polling code in drm_crtc_helper.c the modeset
   71  * code provides a ->output_poll_changed callback.
   72  *
   73  * All other functions exported by the fb helper library can be used to
   74  * implement the fbdev driver interface by the driver.
   75  *
   76  * It is possible, though perhaps somewhat tricky, to implement race-free
   77  * hotplug detection using the fbdev helpers. The drm_fb_helper_prepare()
   78  * helper must be called first to initialize the minimum required to make
   79  * hotplug detection work. Drivers also need to make sure to properly set up
   80  * the dev->mode_config.funcs member. After calling drm_kms_helper_poll_init()
   81  * it is safe to enable interrupts and start processing hotplug events. At the
   82  * same time, drivers should initialize all modeset objects such as CRTCs,
   83  * encoders and connectors. To finish up the fbdev helper initialization, the
   84  * drm_fb_helper_init() function is called. To probe for all attached displays
   85  * and set up an initial configuration using the detected hardware, drivers
   86  * should call drm_fb_helper_single_add_all_connectors() followed by
   87  * drm_fb_helper_initial_config().
   88  *
   89  * If &drm_framebuffer_funcs ->dirty is set, the
   90  * drm_fb_helper_{cfb,sys}_{write,fillrect,copyarea,imageblit} functions will
   91  * accumulate changes and schedule &drm_fb_helper ->dirty_work to run right
   92  * away. This worker then calls the dirty() function ensuring that it will
   93  * always run in process context since the fb_*() function could be running in
   94  * atomic context. If drm_fb_helper_deferred_io() is used as the deferred_io
   95  * callback it will also schedule dirty_work with the damage collected from the
   96  * mmap page writes.
   97  */
   98 
   99 /**
  100  * drm_fb_helper_single_add_all_connectors() - add all connectors to fbdev
  101  * 					       emulation helper
  102  * @fb_helper: fbdev initialized with drm_fb_helper_init
  103  *
  104  * This functions adds all the available connectors for use with the given
  105  * fb_helper. This is a separate step to allow drivers to freely assign
  106  * connectors to the fbdev, e.g. if some are reserved for special purposes or
  107  * not adequate to be used for the fbcon.
  108  *
  109  * This function is protected against concurrent connector hotadds/removals
  110  * using drm_fb_helper_add_one_connector() and
  111  * drm_fb_helper_remove_one_connector().
  112  */
  113 int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper)
  114 {
  115 	struct drm_device *dev = fb_helper->dev;
  116 	struct drm_connector *connector;
  117 	int i, ret;
  118 
  119 	if (!drm_fbdev_emulation)
  120 		return 0;
  121 
  122 	mutex_lock(&dev->mode_config.mutex);
  123 	drm_for_each_connector(connector, dev) {
  124 		ret = drm_fb_helper_add_one_connector(fb_helper, connector);
  125 
  126 		if (ret)
  127 			goto fail;
  128 	}
  129 	mutex_unlock(&dev->mode_config.mutex);
  130 	return 0;
  131 fail:
  132 	for (i = 0; i < fb_helper->connector_count; i++) {
  133 		kfree(fb_helper->connector_info[i]);
  134 		fb_helper->connector_info[i] = NULL;
  135 	}
  136 	fb_helper->connector_count = 0;
  137 	mutex_unlock(&dev->mode_config.mutex);
  138 
  139 	return ret;
  140 }
  141 EXPORT_SYMBOL(drm_fb_helper_single_add_all_connectors);
  142 
  143 int drm_fb_helper_add_one_connector(struct drm_fb_helper *fb_helper, struct drm_connector *connector)
  144 {
  145 	struct drm_fb_helper_connector **temp;
  146 	struct drm_fb_helper_connector *fb_helper_connector;
  147 
  148 	if (!drm_fbdev_emulation)
  149 		return 0;
  150 
  151 	WARN_ON(!mutex_is_locked(&fb_helper->dev->mode_config.mutex));
  152 	if (fb_helper->connector_count + 1 > fb_helper->connector_info_alloc_count) {
  153 		temp = krealloc(fb_helper->connector_info, sizeof(struct drm_fb_helper_connector *) * (fb_helper->connector_count + 1), GFP_KERNEL);
  154 		if (!temp)
  155 			return -ENOMEM;
  156 
  157 		fb_helper->connector_info_alloc_count = fb_helper->connector_count + 1;
  158 		fb_helper->connector_info = temp;
  159 	}
  160 
  161 
  162 	fb_helper_connector = kzalloc(sizeof(struct drm_fb_helper_connector), GFP_KERNEL);
  163 	if (!fb_helper_connector)
  164 		return -ENOMEM;
  165 
  166 	drm_connector_reference(connector);
  167 	fb_helper_connector->connector = connector;
  168 	fb_helper->connector_info[fb_helper->connector_count++] = fb_helper_connector;
  169 	return 0;
  170 }
  171 EXPORT_SYMBOL(drm_fb_helper_add_one_connector);
  172 
  173 int drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper,
  174 				       struct drm_connector *connector)
  175 {
  176 	struct drm_fb_helper_connector *fb_helper_connector;
  177 	int i, j;
  178 
  179 	if (!drm_fbdev_emulation)
  180 		return 0;
  181 
  182 	WARN_ON(!mutex_is_locked(&fb_helper->dev->mode_config.mutex));
  183 
  184 	for (i = 0; i < fb_helper->connector_count; i++) {
  185 		if (fb_helper->connector_info[i]->connector == connector)
  186 			break;
  187 	}
  188 
  189 	if (i == fb_helper->connector_count)
  190 		return -EINVAL;
  191 	fb_helper_connector = fb_helper->connector_info[i];
  192 	drm_connector_unreference(fb_helper_connector->connector);
  193 
  194 	for (j = i + 1; j < fb_helper->connector_count; j++) {
  195 		fb_helper->connector_info[j - 1] = fb_helper->connector_info[j];
  196 	}
  197 	fb_helper->connector_count--;
  198 	kfree(fb_helper_connector);
  199 
  200 	return 0;
  201 }
  202 EXPORT_SYMBOL(drm_fb_helper_remove_one_connector);
  203 
  204 static void drm_fb_helper_save_lut_atomic(struct drm_crtc *crtc, struct drm_fb_helper *helper)
  205 {
  206 	uint16_t *r_base, *g_base, *b_base;
  207 	int i;
  208 
  209 	if (helper->funcs->gamma_get == NULL)
  210 		return;
  211 
  212 	r_base = crtc->gamma_store;
  213 	g_base = r_base + crtc->gamma_size;
  214 	b_base = g_base + crtc->gamma_size;
  215 
  216 	for (i = 0; i < crtc->gamma_size; i++)
  217 		helper->funcs->gamma_get(crtc, &r_base[i], &g_base[i], &b_base[i], i);
  218 }
  219 
  220 static void drm_fb_helper_restore_lut_atomic(struct drm_crtc *crtc)
  221 {
  222 	uint16_t *r_base, *g_base, *b_base;
  223 
  224 	if (crtc->funcs->gamma_set == NULL)
  225 		return;
  226 
  227 	r_base = crtc->gamma_store;
  228 	g_base = r_base + crtc->gamma_size;
  229 	b_base = g_base + crtc->gamma_size;
  230 
  231 	crtc->funcs->gamma_set(crtc, r_base, g_base, b_base, 0, crtc->gamma_size);
  232 }
  233 
  234 /**
  235  * drm_fb_helper_debug_enter - implementation for ->fb_debug_enter
  236  * @info: fbdev registered by the helper
  237  */
  238 int drm_fb_helper_debug_enter(struct fb_info *info)
  239 {
  240 	struct drm_fb_helper *helper = info->par;
  241 	const struct drm_crtc_helper_funcs *funcs;
  242 	int i;
  243 
  244 	list_for_each_entry(helper, &kernel_fb_helper_list, kernel_fb_list) {
  245 		for (i = 0; i < helper->crtc_count; i++) {
  246 			struct drm_mode_set *mode_set =
  247 				&helper->crtc_info[i].mode_set;
  248 
  249 			if (!mode_set->crtc->enabled)
  250 				continue;
  251 
  252 			funcs =	mode_set->crtc->helper_private;
  253 			drm_fb_helper_save_lut_atomic(mode_set->crtc, helper);
  254 			funcs->mode_set_base_atomic(mode_set->crtc,
  255 						    mode_set->fb,
  256 						    mode_set->x,
  257 						    mode_set->y,
  258 						    ENTER_ATOMIC_MODE_SET);
  259 		}
  260 	}
  261 
  262 	return 0;
  263 }
  264 EXPORT_SYMBOL(drm_fb_helper_debug_enter);
  265 
  266 /* Find the real fb for a given fb helper CRTC */
  267 static struct drm_framebuffer *drm_mode_config_fb(struct drm_crtc *crtc)
  268 {
  269 	struct drm_device *dev = crtc->dev;
  270 	struct drm_crtc *c;
  271 
  272 	drm_for_each_crtc(c, dev) {
  273 		if (crtc->base.id == c->base.id)
  274 			return c->primary->fb;
  275 	}
  276 
  277 	return NULL;
  278 }
  279 
  280 /**
  281  * drm_fb_helper_debug_leave - implementation for ->fb_debug_leave
  282  * @info: fbdev registered by the helper
  283  */
  284 int drm_fb_helper_debug_leave(struct fb_info *info)
  285 {
  286 	struct drm_fb_helper *helper = info->par;
  287 	struct drm_crtc *crtc;
  288 	const struct drm_crtc_helper_funcs *funcs;
  289 	struct drm_framebuffer *fb;
  290 	int i;
  291 
  292 	for (i = 0; i < helper->crtc_count; i++) {
  293 		struct drm_mode_set *mode_set = &helper->crtc_info[i].mode_set;
  294 		crtc = mode_set->crtc;
  295 		funcs = crtc->helper_private;
  296 		fb = drm_mode_config_fb(crtc);
  297 
  298 		if (!crtc->enabled)
  299 			continue;
  300 
  301 		if (!fb) {
  302 			DRM_ERROR("no fb to restore??\n");
  303 			continue;
  304 		}
  305 
  306 		drm_fb_helper_restore_lut_atomic(mode_set->crtc);
  307 		funcs->mode_set_base_atomic(mode_set->crtc, fb, crtc->x,
  308 					    crtc->y, LEAVE_ATOMIC_MODE_SET);
  309 	}
  310 
  311 	return 0;
  312 }
  313 EXPORT_SYMBOL(drm_fb_helper_debug_leave);
  314 
  315 static int restore_fbdev_mode_atomic(struct drm_fb_helper *fb_helper)
  316 {
  317 	struct drm_device *dev = fb_helper->dev;
  318 	struct drm_plane *plane;
  319 	struct drm_atomic_state *state;
  320 	int i, ret;
  321 	unsigned plane_mask;
  322 
  323 	state = drm_atomic_state_alloc(dev);
  324 	if (!state)
  325 		return -ENOMEM;
  326 
  327 	state->acquire_ctx = dev->mode_config.acquire_ctx;
  328 retry:
  329 	plane_mask = 0;
  330 	drm_for_each_plane(plane, dev) {
  331 		struct drm_plane_state *plane_state;
  332 
  333 		plane_state = drm_atomic_get_plane_state(state, plane);
  334 		if (IS_ERR(plane_state)) {
  335 			ret = PTR_ERR(plane_state);
  336 			goto fail;
  337 		}
  338 
  339 		plane_state->rotation = BIT(DRM_ROTATE_0);
  340 
  341 		plane->old_fb = plane->fb;
  342 		plane_mask |= 1 << drm_plane_index(plane);
  343 
  344 		/* disable non-primary: */
  345 		if (plane->type == DRM_PLANE_TYPE_PRIMARY)
  346 			continue;
  347 
  348 		ret = __drm_atomic_helper_disable_plane(plane, plane_state);
  349 		if (ret != 0)
  350 			goto fail;
  351 	}
  352 
  353 	for(i = 0; i < fb_helper->crtc_count; i++) {
  354 		struct drm_mode_set *mode_set = &fb_helper->crtc_info[i].mode_set;
  355 
  356 		ret = __drm_atomic_helper_set_config(mode_set, state);
  357 		if (ret != 0)
  358 			goto fail;
  359 	}
  360 
  361 	ret = drm_atomic_commit(state);
  362 
  363 fail:
  364 	drm_atomic_clean_old_fb(dev, plane_mask, ret);
  365 
  366 	if (ret == -EDEADLK)
  367 		goto backoff;
  368 
  369 	if (ret != 0)
  370 		drm_atomic_state_free(state);
  371 
  372 	return ret;
  373 
  374 backoff:
  375 	drm_atomic_state_clear(state);
  376 	drm_atomic_legacy_backoff(state);
  377 
  378 	goto retry;
  379 }
  380 
  381 static int restore_fbdev_mode(struct drm_fb_helper *fb_helper)
  382 {
  383 	struct drm_device *dev = fb_helper->dev;
  384 	struct drm_plane *plane;
  385 	int i;
  386 
  387 	drm_warn_on_modeset_not_all_locked(dev);
  388 
  389 	if (fb_helper->atomic)
  390 		return restore_fbdev_mode_atomic(fb_helper);
  391 
  392 	drm_for_each_plane(plane, dev) {
  393 		if (plane->type != DRM_PLANE_TYPE_PRIMARY)
  394 			drm_plane_force_disable(plane);
  395 
  396 		if (dev->mode_config.rotation_property) {
  397 			drm_mode_plane_set_obj_prop(plane,
  398 						    dev->mode_config.rotation_property,
  399 						    BIT(DRM_ROTATE_0));
  400 		}
  401 	}
  402 
  403 	for (i = 0; i < fb_helper->crtc_count; i++) {
  404 		struct drm_mode_set *mode_set = &fb_helper->crtc_info[i].mode_set;
  405 		struct drm_crtc *crtc = mode_set->crtc;
  406 		int ret;
  407 
  408 		if (crtc->funcs->cursor_set2) {
  409 			ret = crtc->funcs->cursor_set2(crtc, NULL, 0, 0, 0, 0, 0);
  410 			if (ret)
  411 				return ret;
  412 		} else if (crtc->funcs->cursor_set) {
  413 			ret = crtc->funcs->cursor_set(crtc, NULL, 0, 0, 0);
  414 			if (ret)
  415 				return ret;
  416 		}
  417 
  418 		ret = drm_mode_set_config_internal(mode_set);
  419 		if (ret)
  420 			return ret;
  421 	}
  422 
  423 	return 0;
  424 }
  425 
  426 /**
  427  * drm_fb_helper_restore_fbdev_mode_unlocked - restore fbdev configuration
  428  * @fb_helper: fbcon to restore
  429  *
  430  * This should be called from driver's drm ->lastclose callback
  431  * when implementing an fbcon on top of kms using this helper. This ensures that
  432  * the user isn't greeted with a black screen when e.g. X dies.
  433  *
  434  * RETURNS:
  435  * Zero if everything went ok, negative error code otherwise.
  436  */
  437 int drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper)
  438 {
  439 	struct drm_device *dev = fb_helper->dev;
  440 	bool do_delayed;
  441 	int ret;
  442 
  443 	if (!drm_fbdev_emulation)
  444 		return -ENODEV;
  445 
  446 	drm_modeset_lock_all(dev);
  447 	ret = restore_fbdev_mode(fb_helper);
  448 
  449 	do_delayed = fb_helper->delayed_hotplug;
  450 	if (do_delayed)
  451 		fb_helper->delayed_hotplug = false;
  452 	drm_modeset_unlock_all(dev);
  453 
  454 	if (do_delayed)
  455 		drm_fb_helper_hotplug_event(fb_helper);
  456 	return ret;
  457 }
  458 EXPORT_SYMBOL(drm_fb_helper_restore_fbdev_mode_unlocked);
  459 
  460 static bool drm_fb_helper_is_bound(struct drm_fb_helper *fb_helper)
  461 {
  462 	struct drm_device *dev = fb_helper->dev;
  463 	struct drm_crtc *crtc;
  464 	int bound = 0, crtcs_bound = 0;
  465 
  466 	/* Sometimes user space wants everything disabled, so don't steal the
  467 	 * display if there's a master. */
  468 	if (dev->primary->master)
  469 		return false;
  470 
  471 	drm_for_each_crtc(crtc, dev) {
  472 		if (crtc->primary->fb)
  473 			crtcs_bound++;
  474 		if (crtc->primary->fb == fb_helper->fb)
  475 			bound++;
  476 	}
  477 
  478 	if (bound < crtcs_bound)
  479 		return false;
  480 
  481 	return true;
  482 }
  483 
  484 #ifdef CONFIG_MAGIC_SYSRQ
  485 /*
  486  * restore fbcon display for all kms driver's using this helper, used for sysrq
  487  * and panic handling.
  488  */
  489 static bool drm_fb_helper_force_kernel_mode(void)
  490 {
  491 	bool ret, error = false;
  492 	struct drm_fb_helper *helper;
  493 
  494 	if (list_empty(&kernel_fb_helper_list))
  495 		return false;
  496 
  497 	list_for_each_entry(helper, &kernel_fb_helper_list, kernel_fb_list) {
  498 		struct drm_device *dev = helper->dev;
  499 
  500 		if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
  501 			continue;
  502 
  503 		drm_modeset_lock_all(dev);
  504 		ret = restore_fbdev_mode(helper);
  505 		if (ret)
  506 			error = true;
  507 		drm_modeset_unlock_all(dev);
  508 	}
  509 	return error;
  510 }
  511 
  512 static void drm_fb_helper_restore_work_fn(struct work_struct *ignored)
  513 {
  514 	bool ret;
  515 	ret = drm_fb_helper_force_kernel_mode();
  516 	if (ret == true)
  517 		DRM_ERROR("Failed to restore crtc configuration\n");
  518 }
  519 static DECLARE_WORK(drm_fb_helper_restore_work, drm_fb_helper_restore_work_fn);
  520 
  521 static void drm_fb_helper_sysrq(int dummy1)
  522 {
  523 	schedule_work(&drm_fb_helper_restore_work);
  524 }
  525 
  526 static struct sysrq_key_op sysrq_drm_fb_helper_restore_op = {
  527 	.handler = drm_fb_helper_sysrq,
  528 	.help_msg = "force-fb(V)",
  529 	.action_msg = "Restore framebuffer console",
  530 };
  531 #else
  532 static struct sysrq_key_op sysrq_drm_fb_helper_restore_op = { };
  533 #endif
  534 
  535 static void drm_fb_helper_dpms(struct fb_info *info, int dpms_mode)
  536 {
  537 	struct drm_fb_helper *fb_helper = info->par;
  538 	struct drm_device *dev = fb_helper->dev;
  539 	struct drm_crtc *crtc;
  540 	struct drm_connector *connector;
  541 	int i, j;
  542 
  543 	/*
  544 	 * For each CRTC in this fb, turn the connectors on/off.
  545 	 */
  546 	drm_modeset_lock_all(dev);
  547 	if (!drm_fb_helper_is_bound(fb_helper)) {
  548 		drm_modeset_unlock_all(dev);
  549 		return;
  550 	}
  551 
  552 	for (i = 0; i < fb_helper->crtc_count; i++) {
  553 		crtc = fb_helper->crtc_info[i].mode_set.crtc;
  554 
  555 		if (!crtc->enabled)
  556 			continue;
  557 
  558 		/* Walk the connectors & encoders on this fb turning them on/off */
  559 		for (j = 0; j < fb_helper->connector_count; j++) {
  560 			connector = fb_helper->connector_info[j]->connector;
  561 			connector->funcs->dpms(connector, dpms_mode);
  562 			drm_object_property_set_value(&connector->base,
  563 				dev->mode_config.dpms_property, dpms_mode);
  564 		}
  565 	}
  566 	drm_modeset_unlock_all(dev);
  567 }
  568 
  569 /**
  570  * drm_fb_helper_blank - implementation for ->fb_blank
  571  * @blank: desired blanking state
  572  * @info: fbdev registered by the helper
  573  */
  574 int drm_fb_helper_blank(int blank, struct fb_info *info)
  575 {
  576 	if (oops_in_progress)
  577 		return -EBUSY;
  578 
  579 	switch (blank) {
  580 	/* Display: On; HSync: On, VSync: On */
  581 	case FB_BLANK_UNBLANK:
  582 		drm_fb_helper_dpms(info, DRM_MODE_DPMS_ON);
  583 		break;
  584 	/* Display: Off; HSync: On, VSync: On */
  585 	case FB_BLANK_NORMAL:
  586 		drm_fb_helper_dpms(info, DRM_MODE_DPMS_STANDBY);
  587 		break;
  588 	/* Display: Off; HSync: Off, VSync: On */
  589 	case FB_BLANK_HSYNC_SUSPEND:
  590 		drm_fb_helper_dpms(info, DRM_MODE_DPMS_STANDBY);
  591 		break;
  592 	/* Display: Off; HSync: On, VSync: Off */
  593 	case FB_BLANK_VSYNC_SUSPEND:
  594 		drm_fb_helper_dpms(info, DRM_MODE_DPMS_SUSPEND);
  595 		break;
  596 	/* Display: Off; HSync: Off, VSync: Off */
  597 	case FB_BLANK_POWERDOWN:
  598 		drm_fb_helper_dpms(info, DRM_MODE_DPMS_OFF);
  599 		break;
  600 	}
  601 	return 0;
  602 }
  603 EXPORT_SYMBOL(drm_fb_helper_blank);
  604 
  605 static void drm_fb_helper_crtc_free(struct drm_fb_helper *helper)
  606 {
  607 	int i;
  608 
  609 	for (i = 0; i < helper->connector_count; i++) {
  610 		drm_connector_unreference(helper->connector_info[i]->connector);
  611 		kfree(helper->connector_info[i]);
  612 	}
  613 	kfree(helper->connector_info);
  614 	for (i = 0; i < helper->crtc_count; i++) {
  615 		kfree(helper->crtc_info[i].mode_set.connectors);
  616 		if (helper->crtc_info[i].mode_set.mode)
  617 			drm_mode_destroy(helper->dev, helper->crtc_info[i].mode_set.mode);
  618 	}
  619 	kfree(helper->crtc_info);
  620 }
  621 
  622 static void drm_fb_helper_dirty_work(struct work_struct *work)
  623 {
  624 	struct drm_fb_helper *helper = container_of(work, struct drm_fb_helper,
  625 						    dirty_work);
  626 	struct drm_clip_rect *clip = &helper->dirty_clip;
  627 	struct drm_clip_rect clip_copy;
  628 	unsigned long flags;
  629 
  630 	spin_lock_irqsave(&helper->dirty_lock, flags);
  631 	clip_copy = *clip;
  632 	clip->x1 = clip->y1 = ~0;
  633 	clip->x2 = clip->y2 = 0;
  634 	spin_unlock_irqrestore(&helper->dirty_lock, flags);
  635 
  636 	helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, &clip_copy, 1);
  637 }
  638 
  639 /**
  640  * drm_fb_helper_prepare - setup a drm_fb_helper structure
  641  * @dev: DRM device
  642  * @helper: driver-allocated fbdev helper structure to set up
  643  * @funcs: pointer to structure of functions associate with this helper
  644  *
  645  * Sets up the bare minimum to make the framebuffer helper usable. This is
  646  * useful to implement race-free initialization of the polling helpers.
  647  */
  648 void drm_fb_helper_prepare(struct drm_device *dev, struct drm_fb_helper *helper,
  649 			   const struct drm_fb_helper_funcs *funcs)
  650 {
  651 	INIT_LIST_HEAD(&helper->kernel_fb_list);
  652 	spin_lock_init(&helper->dirty_lock);
  653 	INIT_WORK(&helper->dirty_work, drm_fb_helper_dirty_work);
  654 	helper->dirty_clip.x1 = helper->dirty_clip.y1 = ~0;
  655 	helper->funcs = funcs;
  656 	helper->dev = dev;
  657 }
  658 EXPORT_SYMBOL(drm_fb_helper_prepare);
  659 
  660 /**
  661  * drm_fb_helper_init - initialize a drm_fb_helper structure
  662  * @dev: drm device
  663  * @fb_helper: driver-allocated fbdev helper structure to initialize
  664  * @crtc_count: maximum number of crtcs to support in this fbdev emulation
  665  * @max_conn_count: max connector count
  666  *
  667  * This allocates the structures for the fbdev helper with the given limits.
  668  * Note that this won't yet touch the hardware (through the driver interfaces)
  669  * nor register the fbdev. This is only done in drm_fb_helper_initial_config()
  670  * to allow driver writes more control over the exact init sequence.
  671  *
  672  * Drivers must call drm_fb_helper_prepare() before calling this function.
  673  *
  674  * RETURNS:
  675  * Zero if everything went ok, nonzero otherwise.
  676  */
  677 int drm_fb_helper_init(struct drm_device *dev,
  678 		       struct drm_fb_helper *fb_helper,
  679 		       int crtc_count, int max_conn_count)
  680 {
  681 	struct drm_crtc *crtc;
  682 	int i;
  683 
  684 	if (!drm_fbdev_emulation)
  685 		return 0;
  686 
  687 	if (!max_conn_count)
  688 		return -EINVAL;
  689 
  690 	fb_helper->crtc_info = kcalloc(crtc_count, sizeof(struct drm_fb_helper_crtc), GFP_KERNEL);
  691 	if (!fb_helper->crtc_info)
  692 		return -ENOMEM;
  693 
  694 	fb_helper->crtc_count = crtc_count;
  695 	fb_helper->connector_info = kcalloc(dev->mode_config.num_connector, sizeof(struct drm_fb_helper_connector *), GFP_KERNEL);
  696 	if (!fb_helper->connector_info) {
  697 		kfree(fb_helper->crtc_info);
  698 		return -ENOMEM;
  699 	}
  700 	fb_helper->connector_info_alloc_count = dev->mode_config.num_connector;
  701 	fb_helper->connector_count = 0;
  702 
  703 	for (i = 0; i < crtc_count; i++) {
  704 		fb_helper->crtc_info[i].mode_set.connectors =
  705 			kcalloc(max_conn_count,
  706 				sizeof(struct drm_connector *),
  707 				GFP_KERNEL);
  708 
  709 		if (!fb_helper->crtc_info[i].mode_set.connectors)
  710 			goto out_free;
  711 		fb_helper->crtc_info[i].mode_set.num_connectors = 0;
  712 	}
  713 
  714 	i = 0;
  715 	drm_for_each_crtc(crtc, dev) {
  716 		fb_helper->crtc_info[i].mode_set.crtc = crtc;
  717 		i++;
  718 	}
  719 
  720 	fb_helper->atomic = !!drm_core_check_feature(dev, DRIVER_ATOMIC);
  721 
  722 	return 0;
  723 out_free:
  724 	drm_fb_helper_crtc_free(fb_helper);
  725 	return -ENOMEM;
  726 }
  727 EXPORT_SYMBOL(drm_fb_helper_init);
  728 
  729 /**
  730  * drm_fb_helper_alloc_fbi - allocate fb_info and some of its members
  731  * @fb_helper: driver-allocated fbdev helper
  732  *
  733  * A helper to alloc fb_info and the members cmap and apertures. Called
  734  * by the driver within the fb_probe fb_helper callback function.
  735  *
  736  * RETURNS:
  737  * fb_info pointer if things went okay, pointer containing error code
  738  * otherwise
  739  */
  740 struct fb_info *drm_fb_helper_alloc_fbi(struct drm_fb_helper *fb_helper)
  741 {
  742 	struct device *dev = fb_helper->dev->dev;
  743 	struct fb_info *info;
  744 	int ret;
  745 
  746 	info = framebuffer_alloc(0, dev);
  747 	if (!info)
  748 		return ERR_PTR(-ENOMEM);
  749 
  750 	ret = fb_alloc_cmap(&info->cmap, 256, 0);
  751 	if (ret)
  752 		goto err_release;
  753 
  754 	info->apertures = alloc_apertures(1);
  755 	if (!info->apertures) {
  756 		ret = -ENOMEM;
  757 		goto err_free_cmap;
  758 	}
  759 
  760 	fb_helper->fbdev = info;
  761 
  762 	return info;
  763 
  764 err_free_cmap:
  765 	fb_dealloc_cmap(&info->cmap);
  766 err_release:
  767 	framebuffer_release(info);
  768 	return ERR_PTR(ret);
  769 }
  770 EXPORT_SYMBOL(drm_fb_helper_alloc_fbi);
  771 
  772 /**
  773  * drm_fb_helper_unregister_fbi - unregister fb_info framebuffer device
  774  * @fb_helper: driver-allocated fbdev helper
  775  *
  776  * A wrapper around unregister_framebuffer, to release the fb_info
  777  * framebuffer device
  778  */
  779 void drm_fb_helper_unregister_fbi(struct drm_fb_helper *fb_helper)
  780 {
  781 	if (fb_helper && fb_helper->fbdev)
  782 		unregister_framebuffer(fb_helper->fbdev);
  783 }
  784 EXPORT_SYMBOL(drm_fb_helper_unregister_fbi);
  785 
  786 /**
  787  * drm_fb_helper_release_fbi - dealloc fb_info and its members
  788  * @fb_helper: driver-allocated fbdev helper
  789  *
  790  * A helper to free memory taken by fb_info and the members cmap and
  791  * apertures
  792  */
  793 void drm_fb_helper_release_fbi(struct drm_fb_helper *fb_helper)
  794 {
  795 	if (fb_helper) {
  796 		struct fb_info *info = fb_helper->fbdev;
  797 
  798 		if (info) {
  799 			if (info->cmap.len)
  800 				fb_dealloc_cmap(&info->cmap);
  801 			framebuffer_release(info);
  802 		}
  803 
  804 		fb_helper->fbdev = NULL;
  805 	}
  806 }
  807 EXPORT_SYMBOL(drm_fb_helper_release_fbi);
  808 
  809 void drm_fb_helper_fini(struct drm_fb_helper *fb_helper)
  810 {
  811 	if (!drm_fbdev_emulation)
  812 		return;
  813 
  814 	if (!list_empty(&fb_helper->kernel_fb_list)) {
  815 		list_del(&fb_helper->kernel_fb_list);
  816 		if (list_empty(&kernel_fb_helper_list)) {
  817 			unregister_sysrq_key('v', &sysrq_drm_fb_helper_restore_op);
  818 		}
  819 	}
  820 
  821 	drm_fb_helper_crtc_free(fb_helper);
  822 
  823 }
  824 EXPORT_SYMBOL(drm_fb_helper_fini);
  825 
  826 /**
  827  * drm_fb_helper_unlink_fbi - wrapper around unlink_framebuffer
  828  * @fb_helper: driver-allocated fbdev helper
  829  *
  830  * A wrapper around unlink_framebuffer implemented by fbdev core
  831  */
  832 void drm_fb_helper_unlink_fbi(struct drm_fb_helper *fb_helper)
  833 {
  834 	if (fb_helper && fb_helper->fbdev)
  835 		unlink_framebuffer(fb_helper->fbdev);
  836 }
  837 EXPORT_SYMBOL(drm_fb_helper_unlink_fbi);
  838 
  839 static void drm_fb_helper_dirty(struct fb_info *info, u32 x, u32 y,
  840 				u32 width, u32 height)
  841 {
  842 	struct drm_fb_helper *helper = info->par;
  843 	struct drm_clip_rect *clip = &helper->dirty_clip;
  844 	unsigned long flags;
  845 
  846 	if (!helper->fb->funcs->dirty)
  847 		return;
  848 
  849 	spin_lock_irqsave(&helper->dirty_lock, flags);
  850 	clip->x1 = min_t(u32, clip->x1, x);
  851 	clip->y1 = min_t(u32, clip->y1, y);
  852 	clip->x2 = max_t(u32, clip->x2, x + width);
  853 	clip->y2 = max_t(u32, clip->y2, y + height);
  854 	spin_unlock_irqrestore(&helper->dirty_lock, flags);
  855 
  856 	schedule_work(&helper->dirty_work);
  857 }
  858 
  859 /**
  860  * drm_fb_helper_deferred_io() - fbdev deferred_io callback function
  861  * @info: fb_info struct pointer
  862  * @pagelist: list of dirty mmap framebuffer pages
  863  *
  864  * This function is used as the &fb_deferred_io ->deferred_io
  865  * callback function for flushing the fbdev mmap writes.
  866  */
  867 void drm_fb_helper_deferred_io(struct fb_info *info,
  868 			       struct list_head *pagelist)
  869 {
  870 	unsigned long start, end, min, max;
  871 	struct page *page;
  872 	u32 y1, y2;
  873 
  874 	min = ULONG_MAX;
  875 	max = 0;
  876 	list_for_each_entry(page, pagelist, lru) {
  877 		start = page->index << PAGE_SHIFT;
  878 		end = start + PAGE_SIZE - 1;
  879 		min = min(min, start);
  880 		max = max(max, end);
  881 	}
  882 
  883 	if (min < max) {
  884 		y1 = min / info->fix.line_length;
  885 		y2 = min_t(u32, DIV_ROUND_UP(max, info->fix.line_length),
  886 			   info->var.yres);
  887 		drm_fb_helper_dirty(info, 0, y1, info->var.xres, y2 - y1);
  888 	}
  889 }
  890 EXPORT_SYMBOL(drm_fb_helper_deferred_io);
  891 
  892 /**
  893  * drm_fb_helper_sys_read - wrapper around fb_sys_read
  894  * @info: fb_info struct pointer
  895  * @buf: userspace buffer to read from framebuffer memory
  896  * @count: number of bytes to read from framebuffer memory
  897  * @ppos: read offset within framebuffer memory
  898  *
  899  * A wrapper around fb_sys_read implemented by fbdev core
  900  */
  901 ssize_t drm_fb_helper_sys_read(struct fb_info *info, char __user *buf,
  902 			       size_t count, loff_t *ppos)
  903 {
  904 	return fb_sys_read(info, buf, count, ppos);
  905 }
  906 EXPORT_SYMBOL(drm_fb_helper_sys_read);
  907 
  908 /**
  909  * drm_fb_helper_sys_write - wrapper around fb_sys_write
  910  * @info: fb_info struct pointer
  911  * @buf: userspace buffer to write to framebuffer memory
  912  * @count: number of bytes to write to framebuffer memory
  913  * @ppos: write offset within framebuffer memory
  914  *
  915  * A wrapper around fb_sys_write implemented by fbdev core
  916  */
  917 ssize_t drm_fb_helper_sys_write(struct fb_info *info, const char __user *buf,
  918 				size_t count, loff_t *ppos)
  919 {
  920 	ssize_t ret;
  921 
  922 	ret = fb_sys_write(info, buf, count, ppos);
  923 	if (ret > 0)
  924 		drm_fb_helper_dirty(info, 0, 0, info->var.xres,
  925 				    info->var.yres);
  926 
  927 	return ret;
  928 }
  929 EXPORT_SYMBOL(drm_fb_helper_sys_write);
  930 
  931 /**
  932  * drm_fb_helper_sys_fillrect - wrapper around sys_fillrect
  933  * @info: fbdev registered by the helper
  934  * @rect: info about rectangle to fill
  935  *
  936  * A wrapper around sys_fillrect implemented by fbdev core
  937  */
  938 void drm_fb_helper_sys_fillrect(struct fb_info *info,
  939 				const struct fb_fillrect *rect)
  940 {
  941 	sys_fillrect(info, rect);
  942 	drm_fb_helper_dirty(info, rect->dx, rect->dy,
  943 			    rect->width, rect->height);
  944 }
  945 EXPORT_SYMBOL(drm_fb_helper_sys_fillrect);
  946 
  947 /**
  948  * drm_fb_helper_sys_copyarea - wrapper around sys_copyarea
  949  * @info: fbdev registered by the helper
  950  * @area: info about area to copy
  951  *
  952  * A wrapper around sys_copyarea implemented by fbdev core
  953  */
  954 void drm_fb_helper_sys_copyarea(struct fb_info *info,
  955 				const struct fb_copyarea *area)
  956 {
  957 	sys_copyarea(info, area);
  958 	drm_fb_helper_dirty(info, area->dx, area->dy,
  959 			    area->width, area->height);
  960 }
  961 EXPORT_SYMBOL(drm_fb_helper_sys_copyarea);
  962 
  963 /**
  964  * drm_fb_helper_sys_imageblit - wrapper around sys_imageblit
  965  * @info: fbdev registered by the helper
  966  * @image: info about image to blit
  967  *
  968  * A wrapper around sys_imageblit implemented by fbdev core
  969  */
  970 void drm_fb_helper_sys_imageblit(struct fb_info *info,
  971 				 const struct fb_image *image)
  972 {
  973 	sys_imageblit(info, image);
  974 	drm_fb_helper_dirty(info, image->dx, image->dy,
  975 			    image->width, image->height);
  976 }
  977 EXPORT_SYMBOL(drm_fb_helper_sys_imageblit);
  978 
  979 /**
  980  * drm_fb_helper_cfb_fillrect - wrapper around cfb_fillrect
  981  * @info: fbdev registered by the helper
  982  * @rect: info about rectangle to fill
  983  *
  984  * A wrapper around cfb_imageblit implemented by fbdev core
  985  */
  986 void drm_fb_helper_cfb_fillrect(struct fb_info *info,
  987 				const struct fb_fillrect *rect)
  988 {
  989 	cfb_fillrect(info, rect);
  990 	drm_fb_helper_dirty(info, rect->dx, rect->dy,
  991 			    rect->width, rect->height);
  992 }
  993 EXPORT_SYMBOL(drm_fb_helper_cfb_fillrect);
  994 
  995 /**
  996  * drm_fb_helper_cfb_copyarea - wrapper around cfb_copyarea
  997  * @info: fbdev registered by the helper
  998  * @area: info about area to copy
  999  *
 1000  * A wrapper around cfb_copyarea implemented by fbdev core
 1001  */
 1002 void drm_fb_helper_cfb_copyarea(struct fb_info *info,
 1003 				const struct fb_copyarea *area)
 1004 {
 1005 	cfb_copyarea(info, area);
 1006 	drm_fb_helper_dirty(info, area->dx, area->dy,
 1007 			    area->width, area->height);
 1008 }
 1009 EXPORT_SYMBOL(drm_fb_helper_cfb_copyarea);
 1010 
 1011 /**
 1012  * drm_fb_helper_cfb_imageblit - wrapper around cfb_imageblit
 1013  * @info: fbdev registered by the helper
 1014  * @image: info about image to blit
 1015  *
 1016  * A wrapper around cfb_imageblit implemented by fbdev core
 1017  */
 1018 void drm_fb_helper_cfb_imageblit(struct fb_info *info,
 1019 				 const struct fb_image *image)
 1020 {
 1021 	cfb_imageblit(info, image);
 1022 	drm_fb_helper_dirty(info, image->dx, image->dy,
 1023 			    image->width, image->height);
 1024 }
 1025 EXPORT_SYMBOL(drm_fb_helper_cfb_imageblit);
 1026 
 1027 /**
 1028  * drm_fb_helper_set_suspend - wrapper around fb_set_suspend
 1029  * @fb_helper: driver-allocated fbdev helper
 1030  * @state: desired state, zero to resume, non-zero to suspend
 1031  *
 1032  * A wrapper around fb_set_suspend implemented by fbdev core
 1033  */
 1034 void drm_fb_helper_set_suspend(struct drm_fb_helper *fb_helper, int state)
 1035 {
 1036 	if (fb_helper && fb_helper->fbdev)
 1037 		fb_set_suspend(fb_helper->fbdev, state);
 1038 }
 1039 EXPORT_SYMBOL(drm_fb_helper_set_suspend);
 1040 
 1041 static int setcolreg(struct drm_crtc *crtc, u16 red, u16 green,
 1042 		     u16 blue, u16 regno, struct fb_info *info)
 1043 {
 1044 	struct drm_fb_helper *fb_helper = info->par;
 1045 	struct drm_framebuffer *fb = fb_helper->fb;
 1046 	int pindex;
 1047 
 1048 	if (info->fix.visual == FB_VISUAL_TRUECOLOR) {
 1049 		u32 *palette;
 1050 		u32 value;
 1051 		/* place color in psuedopalette */
 1052 		if (regno > 16)
 1053 			return -EINVAL;
 1054 		palette = (u32 *)info->pseudo_palette;
 1055 		red >>= (16 - info->var.red.length);
 1056 		green >>= (16 - info->var.green.length);
 1057 		blue >>= (16 - info->var.blue.length);
 1058 		value = (red << info->var.red.offset) |
 1059 			(green << info->var.green.offset) |
 1060 			(blue << info->var.blue.offset);
 1061 		if (info->var.transp.length > 0) {
 1062 			u32 mask = (1 << info->var.transp.length) - 1;
 1063 			mask <<= info->var.transp.offset;
 1064 			value |= mask;
 1065 		}
 1066 		palette[regno] = value;
 1067 		return 0;
 1068 	}
 1069 
 1070 	/*
 1071 	 * The driver really shouldn't advertise pseudo/directcolor
 1072 	 * visuals if it can't deal with the palette.
 1073 	 */
 1074 	if (WARN_ON(!fb_helper->funcs->gamma_set ||
 1075 		    !fb_helper->funcs->gamma_get))
 1076 		return -EINVAL;
 1077 
 1078 	pindex = regno;
 1079 
 1080 	if (fb->bits_per_pixel == 16) {
 1081 		pindex = regno << 3;
 1082 
 1083 		if (fb->depth == 16 && regno > 63)
 1084 			return -EINVAL;
 1085 		if (fb->depth == 15 && regno > 31)
 1086 			return -EINVAL;
 1087 
 1088 		if (fb->depth == 16) {
 1089 			u16 r, g, b;
 1090 			int i;
 1091 			if (regno < 32) {
 1092 				for (i = 0; i < 8; i++)
 1093 					fb_helper->funcs->gamma_set(crtc, red,
 1094 						green, blue, pindex + i);
 1095 			}
 1096 
 1097 			fb_helper->funcs->gamma_get(crtc, &r,
 1098 						    &g, &b,
 1099 						    pindex >> 1);
 1100 
 1101 			for (i = 0; i < 4; i++)
 1102 				fb_helper->funcs->gamma_set(crtc, r,
 1103 							    green, b,
 1104 							    (pindex >> 1) + i);
 1105 		}
 1106 	}
 1107 
 1108 	if (fb->depth != 16)
 1109 		fb_helper->funcs->gamma_set(crtc, red, green, blue, pindex);
 1110 	return 0;
 1111 }
 1112 
 1113 /**
 1114  * drm_fb_helper_setcmap - implementation for ->fb_setcmap
 1115  * @cmap: cmap to set
 1116  * @info: fbdev registered by the helper
 1117  */
 1118 int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info)
 1119 {
 1120 	struct drm_fb_helper *fb_helper = info->par;
 1121 	struct drm_device *dev = fb_helper->dev;
 1122 	const struct drm_crtc_helper_funcs *crtc_funcs;
 1123 	u16 *red, *green, *blue, *transp;
 1124 	struct drm_crtc *crtc;
 1125 	int i, j, rc = 0;
 1126 	int start;
 1127 
 1128 	if (oops_in_progress)
 1129 		return -EBUSY;
 1130 
 1131 	drm_modeset_lock_all(dev);
 1132 	if (!drm_fb_helper_is_bound(fb_helper)) {
 1133 		drm_modeset_unlock_all(dev);
 1134 		return -EBUSY;
 1135 	}
 1136 
 1137 	for (i = 0; i < fb_helper->crtc_count; i++) {
 1138 		crtc = fb_helper->crtc_info[i].mode_set.crtc;
 1139 		crtc_funcs = crtc->helper_private;
 1140 
 1141 		red = cmap->red;
 1142 		green = cmap->green;
 1143 		blue = cmap->blue;
 1144 		transp = cmap->transp;
 1145 		start = cmap->start;
 1146 
 1147 		for (j = 0; j < cmap->len; j++) {
 1148 			u16 hred, hgreen, hblue, htransp = 0xffff;
 1149 
 1150 			hred = *red++;
 1151 			hgreen = *green++;
 1152 			hblue = *blue++;
 1153 
 1154 			if (transp)
 1155 				htransp = *transp++;
 1156 
 1157 			rc = setcolreg(crtc, hred, hgreen, hblue, start++, info);
 1158 			if (rc)
 1159 				goto out;
 1160 		}
 1161 		if (crtc_funcs->load_lut)
 1162 			crtc_funcs->load_lut(crtc);
 1163 	}
 1164  out:
 1165 	drm_modeset_unlock_all(dev);
 1166 	return rc;
 1167 }
 1168 EXPORT_SYMBOL(drm_fb_helper_setcmap);
 1169 
 1170 /**
 1171  * drm_fb_helper_check_var - implementation for ->fb_check_var
 1172  * @var: screeninfo to check
 1173  * @info: fbdev registered by the helper
 1174  */
 1175 int drm_fb_helper_check_var(struct fb_var_screeninfo *var,
 1176 			    struct fb_info *info)
 1177 {
 1178 	struct drm_fb_helper *fb_helper = info->par;
 1179 	struct drm_framebuffer *fb = fb_helper->fb;
 1180 	int depth;
 1181 
 1182 	if (var->pixclock != 0 || in_dbg_master())
 1183 		return -EINVAL;
 1184 
 1185 	/* Need to resize the fb object !!! */
 1186 	if (var->bits_per_pixel > fb->bits_per_pixel ||
 1187 	    var->xres > fb->width || var->yres > fb->height ||
 1188 	    var->xres_virtual > fb->width || var->yres_virtual > fb->height) {
 1189 		DRM_DEBUG("fb userspace requested width/height/bpp is greater than current fb "
 1190 			  "request %dx%d-%d (virtual %dx%d) > %dx%d-%d\n",
 1191 			  var->xres, var->yres, var->bits_per_pixel,
 1192 			  var->xres_virtual, var->yres_virtual,
 1193 			  fb->width, fb->height, fb->bits_per_pixel);
 1194 		return -EINVAL;
 1195 	}
 1196 
 1197 	switch (var->bits_per_pixel) {
 1198 	case 16:
 1199 		depth = (var->green.length == 6) ? 16 : 15;
 1200 		break;
 1201 	case 32:
 1202 		depth = (var->transp.length > 0) ? 32 : 24;
 1203 		break;
 1204 	default:
 1205 		depth = var->bits_per_pixel;
 1206 		break;
 1207 	}
 1208 
 1209 	switch (depth) {
 1210 	case 8:
 1211 		var->red.offset = 0;
 1212 		var->green.offset = 0;
 1213 		var->blue.offset = 0;
 1214 		var->red.length = 8;
 1215 		var->green.length = 8;
 1216 		var->blue.length = 8;
 1217 		var->transp.length = 0;
 1218 		var->transp.offset = 0;
 1219 		break;
 1220 	case 15:
 1221 		var->red.offset = 10;
 1222 		var->green.offset = 5;
 1223 		var->blue.offset = 0;
 1224 		var->red.length = 5;
 1225 		var->green.length = 5;
 1226 		var->blue.length = 5;
 1227 		var->transp.length = 1;
 1228 		var->transp.offset = 15;
 1229 		break;
 1230 	case 16:
 1231 		var->red.offset = 11;
 1232 		var->green.offset = 5;
 1233 		var->blue.offset = 0;
 1234 		var->red.length = 5;
 1235 		var->green.length = 6;
 1236 		var->blue.length = 5;
 1237 		var->transp.length = 0;
 1238 		var->transp.offset = 0;
 1239 		break;
 1240 	case 24:
 1241 		var->red.offset = 16;
 1242 		var->green.offset = 8;
 1243 		var->blue.offset = 0;
 1244 		var->red.length = 8;
 1245 		var->green.length = 8;
 1246 		var->blue.length = 8;
 1247 		var->transp.length = 0;
 1248 		var->transp.offset = 0;
 1249 		break;
 1250 	case 32:
 1251 		var->red.offset = 16;
 1252 		var->green.offset = 8;
 1253 		var->blue.offset = 0;
 1254 		var->red.length = 8;
 1255 		var->green.length = 8;
 1256 		var->blue.length = 8;
 1257 		var->transp.length = 8;
 1258 		var->transp.offset = 24;
 1259 		break;
 1260 	default:
 1261 		return -EINVAL;
 1262 	}
 1263 	return 0;
 1264 }
 1265 EXPORT_SYMBOL(drm_fb_helper_check_var);
 1266 
 1267 /**
 1268  * drm_fb_helper_set_par - implementation for ->fb_set_par
 1269  * @info: fbdev registered by the helper
 1270  *
 1271  * This will let fbcon do the mode init and is called at initialization time by
 1272  * the fbdev core when registering the driver, and later on through the hotplug
 1273  * callback.
 1274  */
 1275 int drm_fb_helper_set_par(struct fb_info *info)
 1276 {
 1277 	struct drm_fb_helper *fb_helper = info->par;
 1278 	struct fb_var_screeninfo *var = &info->var;
 1279 
 1280 	if (oops_in_progress)
 1281 		return -EBUSY;
 1282 
 1283 	if (var->pixclock != 0) {
 1284 		DRM_ERROR("PIXEL CLOCK SET\n");
 1285 		return -EINVAL;
 1286 	}
 1287 
 1288 	drm_fb_helper_restore_fbdev_mode_unlocked(fb_helper);
 1289 
 1290 	return 0;
 1291 }
 1292 EXPORT_SYMBOL(drm_fb_helper_set_par);
 1293 
 1294 static int pan_display_atomic(struct fb_var_screeninfo *var,
 1295 			      struct fb_info *info)
 1296 {
 1297 	struct drm_fb_helper *fb_helper = info->par;
 1298 	struct drm_device *dev = fb_helper->dev;
 1299 	struct drm_atomic_state *state;
 1300 	struct drm_plane *plane;
 1301 	int i, ret;
 1302 	unsigned plane_mask;
 1303 
 1304 	state = drm_atomic_state_alloc(dev);
 1305 	if (!state)
 1306 		return -ENOMEM;
 1307 
 1308 	state->acquire_ctx = dev->mode_config.acquire_ctx;
 1309 retry:
 1310 	plane_mask = 0;
 1311 	for(i = 0; i < fb_helper->crtc_count; i++) {
 1312 		struct drm_mode_set *mode_set;
 1313 
 1314 		mode_set = &fb_helper->crtc_info[i].mode_set;
 1315 
 1316 		mode_set->x = var->xoffset;
 1317 		mode_set->y = var->yoffset;
 1318 
 1319 		ret = __drm_atomic_helper_set_config(mode_set, state);
 1320 		if (ret != 0)
 1321 			goto fail;
 1322 
 1323 		plane = mode_set->crtc->primary;
 1324 		plane_mask |= (1 << drm_plane_index(plane));
 1325 		plane->old_fb = plane->fb;
 1326 	}
 1327 
 1328 	ret = drm_atomic_commit(state);
 1329 	if (ret != 0)
 1330 		goto fail;
 1331 
 1332 	info->var.xoffset = var->xoffset;
 1333 	info->var.yoffset = var->yoffset;
 1334 
 1335 
 1336 fail:
 1337 	drm_atomic_clean_old_fb(dev, plane_mask, ret);
 1338 
 1339 	if (ret == -EDEADLK)
 1340 		goto backoff;
 1341 
 1342 	if (ret != 0)
 1343 		drm_atomic_state_free(state);
 1344 
 1345 	return ret;
 1346 
 1347 backoff:
 1348 	drm_atomic_state_clear(state);
 1349 	drm_atomic_legacy_backoff(state);
 1350 
 1351 	goto retry;
 1352 }
 1353 
 1354 /**
 1355  * drm_fb_helper_pan_display - implementation for ->fb_pan_display
 1356  * @var: updated screen information
 1357  * @info: fbdev registered by the helper
 1358  */
 1359 int drm_fb_helper_pan_display(struct fb_var_screeninfo *var,
 1360 			      struct fb_info *info)
 1361 {
 1362 	struct drm_fb_helper *fb_helper = info->par;
 1363 	struct drm_device *dev = fb_helper->dev;
 1364 	struct drm_mode_set *modeset;
 1365 	int ret = 0;
 1366 	int i;
 1367 
 1368 	if (oops_in_progress)
 1369 		return -EBUSY;
 1370 
 1371 	drm_modeset_lock_all(dev);
 1372 	if (!drm_fb_helper_is_bound(fb_helper)) {
 1373 		drm_modeset_unlock_all(dev);
 1374 		return -EBUSY;
 1375 	}
 1376 
 1377 	if (fb_helper->atomic) {
 1378 		ret = pan_display_atomic(var, info);
 1379 		goto unlock;
 1380 	}
 1381 
 1382 	for (i = 0; i < fb_helper->crtc_count; i++) {
 1383 		modeset = &fb_helper->crtc_info[i].mode_set;
 1384 
 1385 		modeset->x = var->xoffset;
 1386 		modeset->y = var->yoffset;
 1387 
 1388 		if (modeset->num_connectors) {
 1389 			ret = drm_mode_set_config_internal(modeset);
 1390 			if (!ret) {
 1391 				info->var.xoffset = var->xoffset;
 1392 				info->var.yoffset = var->yoffset;
 1393 			}
 1394 		}
 1395 	}
 1396 unlock:
 1397 	drm_modeset_unlock_all(dev);
 1398 	return ret;
 1399 }
 1400 EXPORT_SYMBOL(drm_fb_helper_pan_display);
 1401 
 1402 /*
 1403  * Allocates the backing storage and sets up the fbdev info structure through
 1404  * the ->fb_probe callback and then registers the fbdev and sets up the panic
 1405  * notifier.
 1406  */
 1407 static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper,
 1408 					 int preferred_bpp)
 1409 {
 1410 	int ret = 0;
 1411 	int crtc_count = 0;
 1412 	int i;
 1413 	struct fb_info *info;
 1414 	struct drm_fb_helper_surface_size sizes;
 1415 	int gamma_size = 0;
 1416 
 1417 	memset(&sizes, 0, sizeof(struct drm_fb_helper_surface_size));
 1418 	sizes.surface_depth = 24;
 1419 	sizes.surface_bpp = 32;
 1420 	sizes.fb_width = (unsigned)-1;
 1421 	sizes.fb_height = (unsigned)-1;
 1422 
 1423 	/* if driver picks 8 or 16 by default use that
 1424 	   for both depth/bpp */
 1425 	if (preferred_bpp != sizes.surface_bpp)
 1426 		sizes.surface_depth = sizes.surface_bpp = preferred_bpp;
 1427 
 1428 	/* first up get a count of crtcs now in use and new min/maxes width/heights */
 1429 	for (i = 0; i < fb_helper->connector_count; i++) {
 1430 		struct drm_fb_helper_connector *fb_helper_conn = fb_helper->connector_info[i];
 1431 		struct drm_cmdline_mode *cmdline_mode;
 1432 
 1433 		cmdline_mode = &fb_helper_conn->connector->cmdline_mode;
 1434 
 1435 		if (cmdline_mode->bpp_specified) {
 1436 			switch (cmdline_mode->bpp) {
 1437 			case 8:
 1438 				sizes.surface_depth = sizes.surface_bpp = 8;
 1439 				break;
 1440 			case 15:
 1441 				sizes.surface_depth = 15;
 1442 				sizes.surface_bpp = 16;
 1443 				break;
 1444 			case 16:
 1445 				sizes.surface_depth = sizes.surface_bpp = 16;
 1446 				break;
 1447 			case 24:
 1448 				sizes.surface_depth = sizes.surface_bpp = 24;
 1449 				break;
 1450 			case 32:
 1451 				sizes.surface_depth = 24;
 1452 				sizes.surface_bpp = 32;
 1453 				break;
 1454 			}
 1455 			break;
 1456 		}
 1457 	}
 1458 
 1459 	crtc_count = 0;
 1460 	for (i = 0; i < fb_helper->crtc_count; i++) {
 1461 		struct drm_display_mode *desired_mode;
 1462 		struct drm_mode_set *mode_set;
 1463 		int x, y, j;
 1464 		/* in case of tile group, are we the last tile vert or horiz?
 1465 		 * If no tile group you are always the last one both vertically
 1466 		 * and horizontally
 1467 		 */
 1468 		bool lastv = true, lasth = true;
 1469 
 1470 		desired_mode = fb_helper->crtc_info[i].desired_mode;
 1471 		mode_set = &fb_helper->crtc_info[i].mode_set;
 1472 
 1473 		if (!desired_mode)
 1474 			continue;
 1475 
 1476 		crtc_count++;
 1477 
 1478 		x = fb_helper->crtc_info[i].x;
 1479 		y = fb_helper->crtc_info[i].y;
 1480 
 1481 		if (gamma_size == 0)
 1482 			gamma_size = fb_helper->crtc_info[i].mode_set.crtc->gamma_size;
 1483 
 1484 		sizes.surface_width  = max_t(u32, desired_mode->hdisplay + x, sizes.surface_width);
 1485 		sizes.surface_height = max_t(u32, desired_mode->vdisplay + y, sizes.surface_height);
 1486 
 1487 		for (j = 0; j < mode_set->num_connectors; j++) {
 1488 			struct drm_connector *connector = mode_set->connectors[j];
 1489 			if (connector->has_tile) {
 1490 				lasth = (connector->tile_h_loc == (connector->num_h_tile - 1));
 1491 				lastv = (connector->tile_v_loc == (connector->num_v_tile - 1));
 1492 				/* cloning to multiple tiles is just crazy-talk, so: */
 1493 				break;
 1494 			}
 1495 		}
 1496 
 1497 		if (lasth)
 1498 			sizes.fb_width  = min_t(u32, desired_mode->hdisplay + x, sizes.fb_width);
 1499 		if (lastv)
 1500 			sizes.fb_height = min_t(u32, desired_mode->vdisplay + y, sizes.fb_height);
 1501 	}
 1502 
 1503 	if (crtc_count == 0 || sizes.fb_width == -1 || sizes.fb_height == -1) {
 1504 		/* hmm everyone went away - assume VGA cable just fell out
 1505 		   and will come back later. */
 1506 		DRM_INFO("Cannot find any crtc or sizes - going 1024x768\n");
 1507 		sizes.fb_width = sizes.surface_width = 1024;
 1508 		sizes.fb_height = sizes.surface_height = 768;
 1509 	}
 1510 
 1511 	/* push down into drivers */
 1512 	ret = (*fb_helper->funcs->fb_probe)(fb_helper, &sizes);
 1513 	if (ret < 0)
 1514 		return ret;
 1515 
 1516 	info = fb_helper->fbdev;
 1517 
 1518 	/*
 1519 	 * Set the fb pointer - usually drm_setup_crtcs does this for hotplug
 1520 	 * events, but at init time drm_setup_crtcs needs to be called before
 1521 	 * the fb is allocated (since we need to figure out the desired size of
 1522 	 * the fb before we can allocate it ...). Hence we need to fix things up
 1523 	 * here again.
 1524 	 */
 1525 	for (i = 0; i < fb_helper->crtc_count; i++)
 1526 		if (fb_helper->crtc_info[i].mode_set.num_connectors)
 1527 			fb_helper->crtc_info[i].mode_set.fb = fb_helper->fb;
 1528 
 1529 
 1530 	info->var.pixclock = 0;
 1531 	if (register_framebuffer(info) < 0)
 1532 		return -EINVAL;
 1533 
 1534 	dev_info(fb_helper->dev->dev, "fb%d: %s frame buffer device\n",
 1535 			info->node, info->fix.id);
 1536 
 1537 	if (list_empty(&kernel_fb_helper_list)) {
 1538 		register_sysrq_key('v', &sysrq_drm_fb_helper_restore_op);
 1539 	}
 1540 
 1541 	list_add(&fb_helper->kernel_fb_list, &kernel_fb_helper_list);
 1542 
 1543 	return 0;
 1544 }
 1545 
 1546 /**
 1547  * drm_fb_helper_fill_fix - initializes fixed fbdev information
 1548  * @info: fbdev registered by the helper
 1549  * @pitch: desired pitch
 1550  * @depth: desired depth
 1551  *
 1552  * Helper to fill in the fixed fbdev information useful for a non-accelerated
 1553  * fbdev emulations. Drivers which support acceleration methods which impose
 1554  * additional constraints need to set up their own limits.
 1555  *
 1556  * Drivers should call this (or their equivalent setup code) from their
 1557  * ->fb_probe callback.
 1558  */
 1559 void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch,
 1560 			    uint32_t depth)
 1561 {
 1562 	info->fix.type = FB_TYPE_PACKED_PIXELS;
 1563 	info->fix.visual = depth == 8 ? FB_VISUAL_PSEUDOCOLOR :
 1564 		FB_VISUAL_TRUECOLOR;
 1565 	info->fix.mmio_start = 0;
 1566 	info->fix.mmio_len = 0;
 1567 	info->fix.type_aux = 0;
 1568 	info->fix.xpanstep = 1; /* doing it in hw */
 1569 	info->fix.ypanstep = 1; /* doing it in hw */
 1570 	info->fix.ywrapstep = 0;
 1571 	info->fix.accel = FB_ACCEL_NONE;
 1572 
 1573 	info->fix.line_length = pitch;
 1574 	return;
 1575 }
 1576 EXPORT_SYMBOL(drm_fb_helper_fill_fix);
 1577 
 1578 /**
 1579  * drm_fb_helper_fill_var - initalizes variable fbdev information
 1580  * @info: fbdev instance to set up
 1581  * @fb_helper: fb helper instance to use as template
 1582  * @fb_width: desired fb width
 1583  * @fb_height: desired fb height
 1584  *
 1585  * Sets up the variable fbdev metainformation from the given fb helper instance
 1586  * and the drm framebuffer allocated in fb_helper->fb.
 1587  *
 1588  * Drivers should call this (or their equivalent setup code) from their
 1589  * ->fb_probe callback after having allocated the fbdev backing
 1590  * storage framebuffer.
 1591  */
 1592 void drm_fb_helper_fill_var(struct fb_info *info, struct drm_fb_helper *fb_helper,
 1593 			    uint32_t fb_width, uint32_t fb_height)
 1594 {
 1595 	struct drm_framebuffer *fb = fb_helper->fb;
 1596 	info->pseudo_palette = fb_helper->pseudo_palette;
 1597 	info->var.xres_virtual = fb->width;
 1598 	info->var.yres_virtual = fb->height;
 1599 	info->var.bits_per_pixel = fb->bits_per_pixel;
 1600 	info->var.accel_flags = FB_ACCELF_TEXT;
 1601 	info->var.xoffset = 0;
 1602 	info->var.yoffset = 0;
 1603 	info->var.activate = FB_ACTIVATE_NOW;
 1604 	info->var.height = -1;
 1605 	info->var.width = -1;
 1606 
 1607 	switch (fb->depth) {
 1608 	case 8:
 1609 		info->var.red.offset = 0;
 1610 		info->var.green.offset = 0;
 1611 		info->var.blue.offset = 0;
 1612 		info->var.red.length = 8; /* 8bit DAC */
 1613 		info->var.green.length = 8;
 1614 		info->var.blue.length = 8;
 1615 		info->var.transp.offset = 0;
 1616 		info->var.transp.length = 0;
 1617 		break;
 1618 	case 15:
 1619 		info->var.red.offset = 10;
 1620 		info->var.green.offset = 5;
 1621 		info->var.blue.offset = 0;
 1622 		info->var.red.length = 5;
 1623 		info->var.green.length = 5;
 1624 		info->var.blue.length = 5;
 1625 		info->var.transp.offset = 15;
 1626 		info->var.transp.length = 1;
 1627 		break;
 1628 	case 16:
 1629 		info->var.red.offset = 11;
 1630 		info->var.green.offset = 5;
 1631 		info->var.blue.offset = 0;
 1632 		info->var.red.length = 5;
 1633 		info->var.green.length = 6;
 1634 		info->var.blue.length = 5;
 1635 		info->var.transp.offset = 0;
 1636 		break;
 1637 	case 24:
 1638 		info->var.red.offset = 16;
 1639 		info->var.green.offset = 8;
 1640 		info->var.blue.offset = 0;
 1641 		info->var.red.length = 8;
 1642 		info->var.green.length = 8;
 1643 		info->var.blue.length = 8;
 1644 		info->var.transp.offset = 0;
 1645 		info->var.transp.length = 0;
 1646 		break;
 1647 	case 32:
 1648 		info->var.red.offset = 16;
 1649 		info->var.green.offset = 8;
 1650 		info->var.blue.offset = 0;
 1651 		info->var.red.length = 8;
 1652 		info->var.green.length = 8;
 1653 		info->var.blue.length = 8;
 1654 		info->var.transp.offset = 24;
 1655 		info->var.transp.length = 8;
 1656 		break;
 1657 	default:
 1658 		break;
 1659 	}
 1660 
 1661 	info->var.xres = fb_width;
 1662 	info->var.yres = fb_height;
 1663 }
 1664 EXPORT_SYMBOL(drm_fb_helper_fill_var);
 1665 
 1666 static int drm_fb_helper_probe_connector_modes(struct drm_fb_helper *fb_helper,
 1667 					       uint32_t maxX,
 1668 					       uint32_t maxY)
 1669 {
 1670 	struct drm_connector *connector;
 1671 	int count = 0;
 1672 	int i;
 1673 
 1674 	for (i = 0; i < fb_helper->connector_count; i++) {
 1675 		connector = fb_helper->connector_info[i]->connector;
 1676 		count += connector->funcs->fill_modes(connector, maxX, maxY);
 1677 	}
 1678 
 1679 	return count;
 1680 }
 1681 
 1682 struct drm_display_mode *drm_has_preferred_mode(struct drm_fb_helper_connector *fb_connector, int width, int height)
 1683 {
 1684 	struct drm_display_mode *mode;
 1685 
 1686 	list_for_each_entry(mode, &fb_connector->connector->modes, head) {
 1687 		if (mode->hdisplay > width ||
 1688 		    mode->vdisplay > height)
 1689 			continue;
 1690 		if (mode->type & DRM_MODE_TYPE_PREFERRED)
 1691 			return mode;
 1692 	}
 1693 	return NULL;
 1694 }
 1695 EXPORT_SYMBOL(drm_has_preferred_mode);
 1696 
 1697 static bool drm_has_cmdline_mode(struct drm_fb_helper_connector *fb_connector)
 1698 {
 1699 	return fb_connector->connector->cmdline_mode.specified;
 1700 }
 1701 
 1702 struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_connector *fb_helper_conn,
 1703 						      int width, int height)
 1704 {
 1705 	struct drm_cmdline_mode *cmdline_mode;
 1706 	struct drm_display_mode *mode;
 1707 	bool prefer_non_interlace;
 1708 
 1709 	cmdline_mode = &fb_helper_conn->connector->cmdline_mode;
 1710 	if (cmdline_mode->specified == false)
 1711 		return NULL;
 1712 
 1713 	/* attempt to find a matching mode in the list of modes
 1714 	 *  we have gotten so far, if not add a CVT mode that conforms
 1715 	 */
 1716 	if (cmdline_mode->rb || cmdline_mode->margins)
 1717 		goto create_mode;
 1718 
 1719 	prefer_non_interlace = !cmdline_mode->interlace;
 1720 again:
 1721 	list_for_each_entry(mode, &fb_helper_conn->connector->modes, head) {
 1722 		/* check width/height */
 1723 		if (mode->hdisplay != cmdline_mode->xres ||
 1724 		    mode->vdisplay != cmdline_mode->yres)
 1725 			continue;
 1726 
 1727 		if (cmdline_mode->refresh_specified) {
 1728 			if (mode->vrefresh != cmdline_mode->refresh)
 1729 				continue;
 1730 		}
 1731 
 1732 		if (cmdline_mode->interlace) {
 1733 			if (!(mode->flags & DRM_MODE_FLAG_INTERLACE))
 1734 				continue;
 1735 		} else if (prefer_non_interlace) {
 1736 			if (mode->flags & DRM_MODE_FLAG_INTERLACE)
 1737 				continue;
 1738 		}
 1739 		return mode;
 1740 	}
 1741 
 1742 	if (prefer_non_interlace) {
 1743 		prefer_non_interlace = false;
 1744 		goto again;
 1745 	}
 1746 
 1747 create_mode:
 1748 	mode = drm_mode_create_from_cmdline_mode(fb_helper_conn->connector->dev,
 1749 						 cmdline_mode);
 1750 	list_add(&mode->head, &fb_helper_conn->connector->modes);
 1751 	return mode;
 1752 }
 1753 EXPORT_SYMBOL(drm_pick_cmdline_mode);
 1754 
 1755 static bool drm_connector_enabled(struct drm_connector *connector, bool strict)
 1756 {
 1757 	bool enable;
 1758 
 1759 	if (strict)
 1760 		enable = connector->status == connector_status_connected;
 1761 	else
 1762 		enable = connector->status != connector_status_disconnected;
 1763 
 1764 	return enable;
 1765 }
 1766 
 1767 static void drm_enable_connectors(struct drm_fb_helper *fb_helper,
 1768 				  bool *enabled)
 1769 {
 1770 	bool any_enabled = false;
 1771 	struct drm_connector *connector;
 1772 	int i = 0;
 1773 
 1774 	for (i = 0; i < fb_helper->connector_count; i++) {
 1775 		connector = fb_helper->connector_info[i]->connector;
 1776 		enabled[i] = drm_connector_enabled(connector, true);
 1777 		DRM_DEBUG_KMS("connector %d enabled? %s\n", connector->base.id,
 1778 			  enabled[i] ? "yes" : "no");
 1779 		any_enabled |= enabled[i];
 1780 	}
 1781 
 1782 	if (any_enabled)
 1783 		return;
 1784 
 1785 	for (i = 0; i < fb_helper->connector_count; i++) {
 1786 		connector = fb_helper->connector_info[i]->connector;
 1787 		enabled[i] = drm_connector_enabled(connector, false);
 1788 	}
 1789 }
 1790 
 1791 static bool drm_target_cloned(struct drm_fb_helper *fb_helper,
 1792 			      struct drm_display_mode **modes,
 1793 			      struct drm_fb_offset *offsets,
 1794 			      bool *enabled, int width, int height)
 1795 {
 1796 	int count, i, j;
 1797 	bool can_clone = false;
 1798 	struct drm_fb_helper_connector *fb_helper_conn;
 1799 	struct drm_display_mode *dmt_mode, *mode;
 1800 
 1801 	/* only contemplate cloning in the single crtc case */
 1802 	if (fb_helper->crtc_count > 1)
 1803 		return false;
 1804 
 1805 	count = 0;
 1806 	for (i = 0; i < fb_helper->connector_count; i++) {
 1807 		if (enabled[i])
 1808 			count++;
 1809 	}
 1810 
 1811 	/* only contemplate cloning if more than one connector is enabled */
 1812 	if (count <= 1)
 1813 		return false;
 1814 
 1815 	/* check the command line or if nothing common pick 1024x768 */
 1816 	can_clone = true;
 1817 	for (i = 0; i < fb_helper->connector_count; i++) {
 1818 		if (!enabled[i])
 1819 			continue;
 1820 		fb_helper_conn = fb_helper->connector_info[i];
 1821 		modes[i] = drm_pick_cmdline_mode(fb_helper_conn, width, height);
 1822 		if (!modes[i]) {
 1823 			can_clone = false;
 1824 			break;
 1825 		}
 1826 		for (j = 0; j < i; j++) {
 1827 			if (!enabled[j])
 1828 				continue;
 1829 			if (!drm_mode_equal(modes[j], modes[i]))
 1830 				can_clone = false;
 1831 		}
 1832 	}
 1833 
 1834 	if (can_clone) {
 1835 		DRM_DEBUG_KMS("can clone using command line\n");
 1836 		return true;
 1837 	}
 1838 
 1839 	/* try and find a 1024x768 mode on each connector */
 1840 	can_clone = true;
 1841 	dmt_mode = drm_mode_find_dmt(fb_helper->dev, 1024, 768, 60, false);
 1842 
 1843 	for (i = 0; i < fb_helper->connector_count; i++) {
 1844 
 1845 		if (!enabled[i])
 1846 			continue;
 1847 
 1848 		fb_helper_conn = fb_helper->connector_info[i];
 1849 		list_for_each_entry(mode, &fb_helper_conn->connector->modes, head) {
 1850 			if (drm_mode_equal(mode, dmt_mode))
 1851 				modes[i] = mode;
 1852 		}
 1853 		if (!modes[i])
 1854 			can_clone = false;
 1855 	}
 1856 
 1857 	if (can_clone) {
 1858 		DRM_DEBUG_KMS("can clone using 1024x768\n");
 1859 		return true;
 1860 	}
 1861 	DRM_INFO("kms: can't enable cloning when we probably wanted to.\n");
 1862 	return false;
 1863 }
 1864 
 1865 static int drm_get_tile_offsets(struct drm_fb_helper *fb_helper,
 1866 				struct drm_display_mode **modes,
 1867 				struct drm_fb_offset *offsets,
 1868 				int idx,
 1869 				int h_idx, int v_idx)
 1870 {
 1871 	struct drm_fb_helper_connector *fb_helper_conn;
 1872 	int i;
 1873 	int hoffset = 0, voffset = 0;
 1874 
 1875 	for (i = 0; i < fb_helper->connector_count; i++) {
 1876 		fb_helper_conn = fb_helper->connector_info[i];
 1877 		if (!fb_helper_conn->connector->has_tile)
 1878 			continue;
 1879 
 1880 		if (!modes[i] && (h_idx || v_idx)) {
 1881 			DRM_DEBUG_KMS("no modes for connector tiled %d %d\n", i,
 1882 				      fb_helper_conn->connector->base.id);
 1883 			continue;
 1884 		}
 1885 		if (fb_helper_conn->connector->tile_h_loc < h_idx)
 1886 			hoffset += modes[i]->hdisplay;
 1887 
 1888 		if (fb_helper_conn->connector->tile_v_loc < v_idx)
 1889 			voffset += modes[i]->vdisplay;
 1890 	}
 1891 	offsets[idx].x = hoffset;
 1892 	offsets[idx].y = voffset;
 1893 	DRM_DEBUG_KMS("returned %d %d for %d %d\n", hoffset, voffset, h_idx, v_idx);
 1894 	return 0;
 1895 }
 1896 
 1897 static bool drm_target_preferred(struct drm_fb_helper *fb_helper,
 1898 				 struct drm_display_mode **modes,
 1899 				 struct drm_fb_offset *offsets,
 1900 				 bool *enabled, int width, int height)
 1901 {
 1902 	struct drm_fb_helper_connector *fb_helper_conn;
 1903 	int i;
 1904 	uint64_t conn_configured = 0, mask;
 1905 	int tile_pass = 0;
 1906 	mask = (1 << fb_helper->connector_count) - 1;
 1907 retry:
 1908 	for (i = 0; i < fb_helper->connector_count; i++) {
 1909 		fb_helper_conn = fb_helper->connector_info[i];
 1910 
 1911 		if (conn_configured & (1 << i))
 1912 			continue;
 1913 
 1914 		if (enabled[i] == false) {
 1915 			conn_configured |= (1 << i);
 1916 			continue;
 1917 		}
 1918 
 1919 		/* first pass over all the untiled connectors */
 1920 		if (tile_pass == 0 && fb_helper_conn->connector->has_tile)
 1921 			continue;
 1922 
 1923 		if (tile_pass == 1) {
 1924 			if (fb_helper_conn->connector->tile_h_loc != 0 ||
 1925 			    fb_helper_conn->connector->tile_v_loc != 0)
 1926 				continue;
 1927 
 1928 		} else {
 1929 			if (fb_helper_conn->connector->tile_h_loc != tile_pass -1 &&
 1930 			    fb_helper_conn->connector->tile_v_loc != tile_pass - 1)
 1931 			/* if this tile_pass doesn't cover any of the tiles - keep going */
 1932 				continue;
 1933 
 1934 			/* find the tile offsets for this pass - need
 1935 			   to find all tiles left and above */
 1936 			drm_get_tile_offsets(fb_helper, modes, offsets,
 1937 					     i, fb_helper_conn->connector->tile_h_loc, fb_helper_conn->connector->tile_v_loc);
 1938 		}
 1939 		DRM_DEBUG_KMS("looking for cmdline mode on connector %d\n",
 1940 			      fb_helper_conn->connector->base.id);
 1941 
 1942 		/* got for command line mode first */
 1943 		modes[i] = drm_pick_cmdline_mode(fb_helper_conn, width, height);
 1944 		if (!modes[i]) {
 1945 			DRM_DEBUG_KMS("looking for preferred mode on connector %d %d\n",
 1946 				      fb_helper_conn->connector->base.id, fb_helper_conn->connector->tile_group ? fb_helper_conn->connector->tile_group->id : 0);
 1947 			modes[i] = drm_has_preferred_mode(fb_helper_conn, width, height);
 1948 		}
 1949 		/* No preferred modes, pick one off the list */
 1950 		if (!modes[i] && !list_empty(&fb_helper_conn->connector->modes)) {
 1951 			list_for_each_entry(modes[i], &fb_helper_conn->connector->modes, head)
 1952 				break;
 1953 		}
 1954 		DRM_DEBUG_KMS("found mode %s\n", modes[i] ? modes[i]->name :
 1955 			  "none");
 1956 		conn_configured |= (1 << i);
 1957 	}
 1958 
 1959 	if ((conn_configured & mask) != mask) {
 1960 		tile_pass++;
 1961 		goto retry;
 1962 	}
 1963 	return true;
 1964 }
 1965 
 1966 static int drm_pick_crtcs(struct drm_fb_helper *fb_helper,
 1967 			  struct drm_fb_helper_crtc **best_crtcs,
 1968 			  struct drm_display_mode **modes,
 1969 			  int n, int width, int height)
 1970 {
 1971 	int c, o;
 1972 	struct drm_connector *connector;
 1973 	const struct drm_connector_helper_funcs *connector_funcs;
 1974 	struct drm_encoder *encoder;
 1975 	int my_score, best_score, score;
 1976 	struct drm_fb_helper_crtc **crtcs, *crtc;
 1977 	struct drm_fb_helper_connector *fb_helper_conn;
 1978 
 1979 	if (n == fb_helper->connector_count)
 1980 		return 0;
 1981 
 1982 	fb_helper_conn = fb_helper->connector_info[n];
 1983 	connector = fb_helper_conn->connector;
 1984 
 1985 	best_crtcs[n] = NULL;
 1986 	best_score = drm_pick_crtcs(fb_helper, best_crtcs, modes, n+1, width, height);
 1987 	if (modes[n] == NULL)
 1988 		return best_score;
 1989 
 1990 	crtcs = kzalloc(fb_helper->connector_count *
 1991 			sizeof(struct drm_fb_helper_crtc *), GFP_KERNEL);
 1992 	if (!crtcs)
 1993 		return best_score;
 1994 
 1995 	my_score = 1;
 1996 	if (connector->status == connector_status_connected)
 1997 		my_score++;
 1998 	if (drm_has_cmdline_mode(fb_helper_conn))
 1999 		my_score++;
 2000 	if (drm_has_preferred_mode(fb_helper_conn, width, height))
 2001 		my_score++;
 2002 
 2003 	connector_funcs = connector->helper_private;
 2004 	encoder = connector_funcs->best_encoder(connector);
 2005 	if (!encoder)
 2006 		goto out;
 2007 
 2008 	/* select a crtc for this connector and then attempt to configure
 2009 	   remaining connectors */
 2010 	for (c = 0; c < fb_helper->crtc_count; c++) {
 2011 		crtc = &fb_helper->crtc_info[c];
 2012 
 2013 		if ((encoder->possible_crtcs & (1 << c)) == 0)
 2014 			continue;
 2015 
 2016 		for (o = 0; o < n; o++)
 2017 			if (best_crtcs[o] == crtc)
 2018 				break;
 2019 
 2020 		if (o < n) {
 2021 			/* ignore cloning unless only a single crtc */
 2022 			if (fb_helper->crtc_count > 1)
 2023 				continue;
 2024 
 2025 			if (!drm_mode_equal(modes[o], modes[n]))
 2026 				continue;
 2027 		}
 2028 
 2029 		crtcs[n] = crtc;
 2030 		memcpy(crtcs, best_crtcs, n * sizeof(struct drm_fb_helper_crtc *));
 2031 		score = my_score + drm_pick_crtcs(fb_helper, crtcs, modes, n + 1,
 2032 						  width, height);
 2033 		if (score > best_score) {
 2034 			best_score = score;
 2035 			memcpy(best_crtcs, crtcs,
 2036 			       fb_helper->connector_count *
 2037 			       sizeof(struct drm_fb_helper_crtc *));
 2038 		}
 2039 	}
 2040 out:
 2041 	kfree(crtcs);
 2042 	return best_score;
 2043 }
 2044 
 2045 static void drm_setup_crtcs(struct drm_fb_helper *fb_helper)
 2046 {
 2047 	struct drm_device *dev = fb_helper->dev;
 2048 	struct drm_fb_helper_crtc **crtcs;
 2049 	struct drm_display_mode **modes;
 2050 	struct drm_fb_offset *offsets;
 2051 	struct drm_mode_set *modeset;
 2052 	bool *enabled;
 2053 	int width, height;
 2054 	int i;
 2055 
 2056 	DRM_DEBUG_KMS("\n");
 2057 
 2058 	width = dev->mode_config.max_width;
 2059 	height = dev->mode_config.max_height;
 2060 
 2061 	crtcs = kcalloc(fb_helper->connector_count,
 2062 			sizeof(struct drm_fb_helper_crtc *), GFP_KERNEL);
 2063 	modes = kcalloc(fb_helper->connector_count,
 2064 			sizeof(struct drm_display_mode *), GFP_KERNEL);
 2065 	offsets = kcalloc(fb_helper->connector_count,
 2066 			  sizeof(struct drm_fb_offset), GFP_KERNEL);
 2067 	enabled = kcalloc(fb_helper->connector_count,
 2068 			  sizeof(bool), GFP_KERNEL);
 2069 	if (!crtcs || !modes || !enabled || !offsets) {
 2070 		DRM_ERROR("Memory allocation failed\n");
 2071 		goto out;
 2072 	}
 2073 
 2074 
 2075 	drm_enable_connectors(fb_helper, enabled);
 2076 
 2077 	if (!(fb_helper->funcs->initial_config &&
 2078 	      fb_helper->funcs->initial_config(fb_helper, crtcs, modes,
 2079 					       offsets,
 2080 					       enabled, width, height))) {
 2081 		memset(modes, 0, fb_helper->connector_count*sizeof(modes[0]));
 2082 		memset(crtcs, 0, fb_helper->connector_count*sizeof(crtcs[0]));
 2083 		memset(offsets, 0, fb_helper->connector_count*sizeof(offsets[0]));
 2084 
 2085 		if (!drm_target_cloned(fb_helper, modes, offsets,
 2086 				       enabled, width, height) &&
 2087 		    !drm_target_preferred(fb_helper, modes, offsets,
 2088 					  enabled, width, height))
 2089 			DRM_ERROR("Unable to find initial modes\n");
 2090 
 2091 		DRM_DEBUG_KMS("picking CRTCs for %dx%d config\n",
 2092 			      width, height);
 2093 
 2094 		drm_pick_crtcs(fb_helper, crtcs, modes, 0, width, height);
 2095 	}
 2096 
 2097 	/* need to set the modesets up here for use later */
 2098 	/* fill out the connector<->crtc mappings into the modesets */
 2099 	for (i = 0; i < fb_helper->crtc_count; i++) {
 2100 		modeset = &fb_helper->crtc_info[i].mode_set;
 2101 		modeset->num_connectors = 0;
 2102 		modeset->fb = NULL;
 2103 	}
 2104 
 2105 	for (i = 0; i < fb_helper->connector_count; i++) {
 2106 		struct drm_display_mode *mode = modes[i];
 2107 		struct drm_fb_helper_crtc *fb_crtc = crtcs[i];
 2108 		struct drm_fb_offset *offset = &offsets[i];
 2109 		modeset = &fb_crtc->mode_set;
 2110 
 2111 		if (mode && fb_crtc) {
 2112 			DRM_DEBUG_KMS("desired mode %s set on crtc %d (%d,%d)\n",
 2113 				      mode->name, fb_crtc->mode_set.crtc->base.id, offset->x, offset->y);
 2114 			fb_crtc->desired_mode = mode;
 2115 			fb_crtc->x = offset->x;
 2116 			fb_crtc->y = offset->y;
 2117 			if (modeset->mode)
 2118 				drm_mode_destroy(dev, modeset->mode);
 2119 			modeset->mode = drm_mode_duplicate(dev,
 2120 							   fb_crtc->desired_mode);
 2121 			modeset->connectors[modeset->num_connectors++] = fb_helper->connector_info[i]->connector;
 2122 			modeset->fb = fb_helper->fb;
 2123 			modeset->x = offset->x;
 2124 			modeset->y = offset->y;
 2125 		}
 2126 	}
 2127 
 2128 	/* Clear out any old modes if there are no more connected outputs. */
 2129 	for (i = 0; i < fb_helper->crtc_count; i++) {
 2130 		modeset = &fb_helper->crtc_info[i].mode_set;
 2131 		if (modeset->num_connectors == 0) {
 2132 			BUG_ON(modeset->fb);
 2133 			if (modeset->mode)
 2134 				drm_mode_destroy(dev, modeset->mode);
 2135 			modeset->mode = NULL;
 2136 		}
 2137 	}
 2138 out:
 2139 	kfree(crtcs);
 2140 	kfree(modes);
 2141 	kfree(offsets);
 2142 	kfree(enabled);
 2143 }
 2144 
 2145 /**
 2146  * drm_fb_helper_initial_config - setup a sane initial connector configuration
 2147  * @fb_helper: fb_helper device struct
 2148  * @bpp_sel: bpp value to use for the framebuffer configuration
 2149  *
 2150  * Scans the CRTCs and connectors and tries to put together an initial setup.
 2151  * At the moment, this is a cloned configuration across all heads with
 2152  * a new framebuffer object as the backing store.
 2153  *
 2154  * Note that this also registers the fbdev and so allows userspace to call into
 2155  * the driver through the fbdev interfaces.
 2156  *
 2157  * This function will call down into the ->fb_probe callback to let
 2158  * the driver allocate and initialize the fbdev info structure and the drm
 2159  * framebuffer used to back the fbdev. drm_fb_helper_fill_var() and
 2160  * drm_fb_helper_fill_fix() are provided as helpers to setup simple default
 2161  * values for the fbdev info structure.
 2162  *
 2163  * HANG DEBUGGING:
 2164  *
 2165  * When you have fbcon support built-in or already loaded, this function will do
 2166  * a full modeset to setup the fbdev console. Due to locking misdesign in the
 2167  * VT/fbdev subsystem that entire modeset sequence has to be done while holding
 2168  * console_lock. Until console_unlock is called no dmesg lines will be sent out
 2169  * to consoles, not even serial console. This means when your driver crashes,
 2170  * you will see absolutely nothing else but a system stuck in this function,
 2171  * with no further output. Any kind of printk() you place within your own driver
 2172  * or in the drm core modeset code will also never show up.
 2173  *
 2174  * Standard debug practice is to run the fbcon setup without taking the
 2175  * console_lock as a hack, to be able to see backtraces and crashes on the
 2176  * serial line. This can be done by setting the fb.lockless_register_fb=1 kernel
 2177  * cmdline option.
 2178  *
 2179  * The other option is to just disable fbdev emulation since very likely the
 2180  * first modeset from userspace will crash in the same way, and is even easier
 2181  * to debug. This can be done by setting the drm_kms_helper.fbdev_emulation=0
 2182  * kernel cmdline option.
 2183  *
 2184  * RETURNS:
 2185  * Zero if everything went ok, nonzero otherwise.
 2186  */
 2187 int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel)
 2188 {
 2189 	struct drm_device *dev = fb_helper->dev;
 2190 	int count = 0;
 2191 
 2192 	if (!drm_fbdev_emulation)
 2193 		return 0;
 2194 
 2195 	mutex_lock(&dev->mode_config.mutex);
 2196 	count = drm_fb_helper_probe_connector_modes(fb_helper,
 2197 						    dev->mode_config.max_width,
 2198 						    dev->mode_config.max_height);
 2199 	mutex_unlock(&dev->mode_config.mutex);
 2200 	/*
 2201 	 * we shouldn't end up with no modes here.
 2202 	 */
 2203 	if (count == 0)
 2204 		dev_info(fb_helper->dev->dev, "No connectors reported connected with modes\n");
 2205 
 2206 	drm_setup_crtcs(fb_helper);
 2207 
 2208 	return drm_fb_helper_single_fb_probe(fb_helper, bpp_sel);
 2209 }
 2210 EXPORT_SYMBOL(drm_fb_helper_initial_config);
 2211 
 2212 /**
 2213  * drm_fb_helper_hotplug_event - respond to a hotplug notification by
 2214  *                               probing all the outputs attached to the fb
 2215  * @fb_helper: the drm_fb_helper
 2216  *
 2217  * Scan the connectors attached to the fb_helper and try to put together a
 2218  * setup after *notification of a change in output configuration.
 2219  *
 2220  * Called at runtime, takes the mode config locks to be able to check/change the
 2221  * modeset configuration. Must be run from process context (which usually means
 2222  * either the output polling work or a work item launched from the driver's
 2223  * hotplug interrupt).
 2224  *
 2225  * Note that drivers may call this even before calling
 2226  * drm_fb_helper_initial_config but only after drm_fb_helper_init. This allows
 2227  * for a race-free fbcon setup and will make sure that the fbdev emulation will
 2228  * not miss any hotplug events.
 2229  *
 2230  * RETURNS:
 2231  * 0 on success and a non-zero error code otherwise.
 2232  */
 2233 int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper)
 2234 {
 2235 	struct drm_device *dev = fb_helper->dev;
 2236 	u32 max_width, max_height;
 2237 
 2238 	if (!drm_fbdev_emulation)
 2239 		return 0;
 2240 
 2241 	mutex_lock(&fb_helper->dev->mode_config.mutex);
 2242 	if (!fb_helper->fb || !drm_fb_helper_is_bound(fb_helper)) {
 2243 		fb_helper->delayed_hotplug = true;
 2244 		mutex_unlock(&fb_helper->dev->mode_config.mutex);
 2245 		return 0;
 2246 	}
 2247 	DRM_DEBUG_KMS("\n");
 2248 
 2249 	max_width = fb_helper->fb->width;
 2250 	max_height = fb_helper->fb->height;
 2251 
 2252 	drm_fb_helper_probe_connector_modes(fb_helper, max_width, max_height);
 2253 	mutex_unlock(&fb_helper->dev->mode_config.mutex);
 2254 
 2255 	drm_modeset_lock_all(dev);
 2256 	drm_setup_crtcs(fb_helper);
 2257 	drm_modeset_unlock_all(dev);
 2258 	drm_fb_helper_set_par(fb_helper->fbdev);
 2259 
 2260 	return 0;
 2261 }
 2262 EXPORT_SYMBOL(drm_fb_helper_hotplug_event);
 2263 
 2264 /* The Kconfig DRM_KMS_HELPER selects FRAMEBUFFER_CONSOLE (if !EXPERT)
 2265  * but the module doesn't depend on any fb console symbols.  At least
 2266  * attempt to load fbcon to avoid leaving the system without a usable console.
 2267  */
 2268 int __init drm_fb_helper_modinit(void)
 2269 {
 2270 #if defined(CONFIG_FRAMEBUFFER_CONSOLE_MODULE) && !defined(CONFIG_EXPERT)
 2271 	const char *name = "fbcon";
 2272 	struct module *fbcon;
 2273 
 2274 	mutex_lock(&module_mutex);
 2275 	fbcon = find_module(name);
 2276 	mutex_unlock(&module_mutex);
 2277 
 2278 	if (!fbcon)
 2279 		request_module_nowait(name);
 2280 #endif
 2281 	return 0;
 2282 }
 2283 EXPORT_SYMBOL(drm_fb_helper_modinit);
 2284 
 2285 
 2286 
 2287 
 2288 
 2289 /* LDV_COMMENT_BEGIN_MAIN */
 2290 #ifdef LDV_MAIN9_sequence_infinite_withcheck_stateful
 2291 
 2292 /*###########################################################################*/
 2293 
 2294 /*############## Driver Environment Generator 0.2 output ####################*/
 2295 
 2296 /*###########################################################################*/
 2297 
 2298 
 2299 
 2300 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Test if all kernel resources are correctly released by driver before driver will be unloaded. */
 2301 void ldv_check_final_state(void);
 2302 
 2303 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Test correct return result. */
 2304 void ldv_check_return_value(int res);
 2305 
 2306 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Test correct return result of probe() function. */
 2307 void ldv_check_return_value_probe(int res);
 2308 
 2309 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Initializes the model. */
 2310 void ldv_initialize(void);
 2311 
 2312 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Reinitializes the model between distinct model function calls. */
 2313 void ldv_handler_precall(void);
 2314 
 2315 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Returns arbitrary interger value. */
 2316 int nondet_int(void);
 2317 
 2318 /* LDV_COMMENT_VAR_DECLARE_LDV Special variable for LDV verifier. */
 2319 int LDV_IN_INTERRUPT;
 2320 
 2321 /* LDV_COMMENT_FUNCTION_MAIN Main function for LDV verifier. */
 2322 void ldv_main9_sequence_infinite_withcheck_stateful(void) {
 2323 
 2324 
 2325 
 2326 	/* LDV_COMMENT_BEGIN_VARIABLE_DECLARATION_PART */
 2327 	/*============================= VARIABLE DECLARATION PART   =============================*/
 2328 	/** STRUCT: struct type: sysrq_key_op, struct name: sysrq_drm_fb_helper_restore_op **/
 2329 	/* content: static void drm_fb_helper_sysrq(int dummy1)*/
 2330 	/* LDV_COMMENT_BEGIN_PREP */
 2331 	#ifdef CONFIG_MAGIC_SYSRQ
 2332 	/* LDV_COMMENT_END_PREP */
 2333 	/* LDV_COMMENT_VAR_DECLARE Variable declaration for function "drm_fb_helper_sysrq" */
 2334 	int  var_drm_fb_helper_sysrq_14_p0;
 2335 	/* LDV_COMMENT_BEGIN_PREP */
 2336 	#else
 2337 	#endif
 2338 	#if defined(CONFIG_FRAMEBUFFER_CONSOLE_MODULE) && !defined(CONFIG_EXPERT)
 2339 	#endif
 2340 	/* LDV_COMMENT_END_PREP */
 2341 
 2342 
 2343 
 2344 
 2345 	/* LDV_COMMENT_END_VARIABLE_DECLARATION_PART */
 2346 	/* LDV_COMMENT_BEGIN_VARIABLE_INITIALIZING_PART */
 2347 	/*============================= VARIABLE INITIALIZING PART  =============================*/
 2348 	LDV_IN_INTERRUPT=1;
 2349 
 2350 
 2351 
 2352 
 2353 	/* LDV_COMMENT_END_VARIABLE_INITIALIZING_PART */
 2354 	/* LDV_COMMENT_BEGIN_FUNCTION_CALL_SECTION */
 2355 	/*============================= FUNCTION CALL SECTION       =============================*/
 2356 	/* LDV_COMMENT_FUNCTION_CALL Initialize LDV model. */
 2357 	ldv_initialize();
 2358 	
 2359 
 2360 
 2361 	while(  nondet_int()
 2362 	) {
 2363 
 2364 		switch(nondet_int()) {
 2365 
 2366 			case 0: {
 2367 
 2368 				/** STRUCT: struct type: sysrq_key_op, struct name: sysrq_drm_fb_helper_restore_op **/
 2369 				
 2370 
 2371 				/* content: static void drm_fb_helper_sysrq(int dummy1)*/
 2372 				/* LDV_COMMENT_BEGIN_PREP */
 2373 				#ifdef CONFIG_MAGIC_SYSRQ
 2374 				/* LDV_COMMENT_END_PREP */
 2375 				/* LDV_COMMENT_FUNCTION_CALL Function from field "handler" from driver structure with callbacks "sysrq_drm_fb_helper_restore_op" */
 2376 				ldv_handler_precall();
 2377 				drm_fb_helper_sysrq( var_drm_fb_helper_sysrq_14_p0);
 2378 				/* LDV_COMMENT_BEGIN_PREP */
 2379 				#else
 2380 				#endif
 2381 				#if defined(CONFIG_FRAMEBUFFER_CONSOLE_MODULE) && !defined(CONFIG_EXPERT)
 2382 				#endif
 2383 				/* LDV_COMMENT_END_PREP */
 2384 				
 2385 
 2386 				
 2387 
 2388 			}
 2389 
 2390 			break;
 2391 			default: break;
 2392 
 2393 		}
 2394 
 2395 	}
 2396 
 2397 	ldv_module_exit: 
 2398 
 2399 	/* LDV_COMMENT_FUNCTION_CALL Checks that all resources and locks are correctly released before the driver will be unloaded. */
 2400 	ldv_final: ldv_check_final_state();
 2401 
 2402 	/* LDV_COMMENT_END_FUNCTION_CALL_SECTION */
 2403 	return;
 2404 
 2405 }
 2406 #endif
 2407 
 2408 /* LDV_COMMENT_END_MAIN */           1 
    2 /*
    3  * Copyright © 2015 Intel Corporation
    4  *
    5  * Permission is hereby granted, free of charge, to any person obtaining a
    6  * copy of this software and associated documentation files (the "Software"),
    7  * to deal in the Software without restriction, including without limitation
    8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
    9  * and/or sell copies of the Software, and to permit persons to whom the
   10  * Software is furnished to do so, subject to the following conditions:
   11  *
   12  * The above copyright notice and this permission notice (including the next
   13  * paragraph) shall be included in all copies or substantial portions of the
   14  * Software.
   15  *
   16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
   19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
   20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
   21  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
   22  * IN THE SOFTWARE.
   23  *
   24  * Authors:
   25  *    Rafael Antognolli <rafael.antognolli@intel.com>
   26  *
   27  */
   28 
   29 #include <drm/drmP.h>
   30 #include <drm/drm_fb_helper.h>
   31 #include <drm/drm_dp_aux_dev.h>
   32 
   33 MODULE_AUTHOR("David Airlie, Jesse Barnes");
   34 MODULE_DESCRIPTION("DRM KMS helper");
   35 MODULE_LICENSE("GPL and additional rights");
   36 
   37 static int __init drm_kms_helper_init(void)
   38 {
   39 	int ret;
   40 
   41 	/* Call init functions from specific kms helpers here */
   42 	ret = drm_fb_helper_modinit();
   43 	if (ret < 0)
   44 		goto out;
   45 
   46 	ret = drm_dp_aux_dev_init();
   47 	if (ret < 0)
   48 		goto out;
   49 
   50 out:
   51 	return ret;
   52 }
   53 
   54 static void __exit drm_kms_helper_exit(void)
   55 {
   56 	/* Call exit functions from specific kms helpers here */
   57 	drm_dp_aux_dev_exit();
   58 }
   59 
   60 module_init(drm_kms_helper_init);
   61 module_exit(drm_kms_helper_exit);
   62 
   63 
   64 
   65 
   66 
   67 /* LDV_COMMENT_BEGIN_MAIN */
   68 #ifdef LDV_MAIN6_sequence_infinite_withcheck_stateful
   69 
   70 /*###########################################################################*/
   71 
   72 /*############## Driver Environment Generator 0.2 output ####################*/
   73 
   74 /*###########################################################################*/
   75 
   76 
   77 
   78 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Test if all kernel resources are correctly released by driver before driver will be unloaded. */
   79 void ldv_check_final_state(void);
   80 
   81 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Test correct return result. */
   82 void ldv_check_return_value(int res);
   83 
   84 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Test correct return result of probe() function. */
   85 void ldv_check_return_value_probe(int res);
   86 
   87 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Initializes the model. */
   88 void ldv_initialize(void);
   89 
   90 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Reinitializes the model between distinct model function calls. */
   91 void ldv_handler_precall(void);
   92 
   93 /* LDV_COMMENT_FUNCTION_DECLARE_LDV Special function for LDV verifier. Returns arbitrary interger value. */
   94 int nondet_int(void);
   95 
   96 /* LDV_COMMENT_VAR_DECLARE_LDV Special variable for LDV verifier. */
   97 int LDV_IN_INTERRUPT;
   98 
   99 /* LDV_COMMENT_FUNCTION_MAIN Main function for LDV verifier. */
  100 void ldv_main6_sequence_infinite_withcheck_stateful(void) {
  101 
  102 
  103 
  104 	/* LDV_COMMENT_BEGIN_VARIABLE_DECLARATION_PART */
  105 	/*============================= VARIABLE DECLARATION PART   =============================*/
  106 
  107 
  108 
  109 	/* LDV_COMMENT_END_VARIABLE_DECLARATION_PART */
  110 	/* LDV_COMMENT_BEGIN_VARIABLE_INITIALIZING_PART */
  111 	/*============================= VARIABLE INITIALIZING PART  =============================*/
  112 	LDV_IN_INTERRUPT=1;
  113 
  114 
  115 
  116 
  117 	/* LDV_COMMENT_END_VARIABLE_INITIALIZING_PART */
  118 	/* LDV_COMMENT_BEGIN_FUNCTION_CALL_SECTION */
  119 	/*============================= FUNCTION CALL SECTION       =============================*/
  120 	/* LDV_COMMENT_FUNCTION_CALL Initialize LDV model. */
  121 	ldv_initialize();
  122 
  123 	/** INIT: init_type: ST_MODULE_INIT **/
  124 	/* content: static int __init drm_kms_helper_init(void)*/
  125 	/* LDV_COMMENT_END_PREP */
  126 	/* LDV_COMMENT_FUNCTION_CALL Kernel calls driver init function after driver loading to kernel. This function declared as "MODULE_INIT(function name)". */
  127 	ldv_handler_precall();
  128 	 if(drm_kms_helper_init()) 
  129 		goto ldv_final;
  130 
  131 	while(  nondet_int()
  132 	) {
  133 
  134 		switch(nondet_int()) {
  135 
  136 			default: break;
  137 
  138 		}
  139 
  140 	}
  141 
  142 	ldv_module_exit: 
  143 
  144 	/** INIT: init_type: ST_MODULE_EXIT **/
  145 	/* content: static void __exit drm_kms_helper_exit(void)*/
  146 	/* LDV_COMMENT_END_PREP */
  147 	/* LDV_COMMENT_FUNCTION_CALL Kernel calls driver release function before driver will be uploaded from kernel. This function declared as "MODULE_EXIT(function name)". */
  148 	ldv_handler_precall();
  149 	drm_kms_helper_exit();
  150 
  151 	/* LDV_COMMENT_FUNCTION_CALL Checks that all resources and locks are correctly released before the driver will be unloaded. */
  152 	ldv_final: ldv_check_final_state();
  153 
  154 	/* LDV_COMMENT_END_FUNCTION_CALL_SECTION */
  155 	return;
  156 
  157 }
  158 #endif
  159 
  160 /* LDV_COMMENT_END_MAIN */           1 
    2 
    3 #include <verifier/rcv.h>
    4 #include <kernel-model/ERR.inc>
    5 
    6 // There are 2 possible states of usb gadget class registration.
    7 enum
    8 {
    9  LDV_USB_GADGET_CLASS_ZERO_STATE, // Usb gadget class is not registered.
   10  LDV_USB_GADGET_CLASS_REGISTERED // Usb gadget class is registered.
   11 };
   12 
   13 // There are 2 possible states of char device region registration.
   14 enum
   15 {
   16  LDV_USB_GADGET_CHRDEV_ZERO_STATE, // Char device region is not registered for usb gadget.
   17  LDV_USB_GADGET_CHRDEV_REGISTERED // Char device region is registered for usb gadget.
   18 };
   19 
   20 // There are 2 possible states of usb gadget registration.
   21 enum
   22 {
   23  LDV_USB_GADGET_ZERO_STATE, // Usb gadget is not registered.
   24  LDV_USB_GADGET_REGISTERED // Usb gadget is registered.
   25 };
   26 
   27 /* LDV_COMMENT_CHANGE_STATE Usb gadget class is not registered at the beginning. */
   28 int ldv_usb_gadget_class = LDV_USB_GADGET_CLASS_ZERO_STATE;
   29 
   30 /* LDV_COMMENT_CHANGE_STATE Char device region is not registered at the beginning. */
   31 int ldv_usb_gadget_chrdev = LDV_USB_GADGET_CHRDEV_ZERO_STATE;
   32 
   33 /* LDV_COMMENT_CHANGE_STATE Usb gadget is not registered at the beginning. */
   34 int ldv_usb_gadget = LDV_USB_GADGET_ZERO_STATE;
   35 
   36 
   37 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_create_class') Check that usb gadget class was not registered. Then create and register class for it. */
   38 void *ldv_create_class(void)
   39 {
   40  void *is_got;
   41 
   42  /* LDV_COMMENT_OTHER Get blk request in the nondeterministic way. */
   43  is_got = ldv_undef_ptr();
   44 
   45  /* LDV_COMMENT_ASSERT Get blk request just in case when an error did not happen. */
   46  if (is_got <= LDV_PTR_MAX)
   47  {
   48   /* LDV_COMMENT_ASSERT Registring usb gadget class is only allowed if usb gadget is not registered. */
   49   ldv_assert(ldv_usb_gadget == LDV_USB_GADGET_ZERO_STATE);
   50   /* LDV_COMMENT_ASSERT Check that usb gadget class is unregistered. */
   51   ldv_assert(ldv_usb_gadget_class == LDV_USB_GADGET_CLASS_ZERO_STATE);
   52   /* LDV_COMMENT_CHANGE_STATE Register class for usb gadget. */
   53   ldv_usb_gadget_class = LDV_USB_GADGET_CLASS_REGISTERED;
   54  }
   55 
   56  /* LDV_COMMENT_RETURN Return obtained blk request. */
   57  return is_got;
   58 }
   59 
   60 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_register_class') Check that usb gadget class was not registered and register class for it. */
   61 int ldv_register_class(void)
   62 {
   63  int is_reg;
   64 
   65  /* LDV_COMMENT_OTHER Register gadget class in the nondeterministic way. */
   66  is_reg = ldv_undef_int_nonpositive();
   67 
   68  /* LDV_COMMENT_ASSERT Get blk request just in case when an error did not happen. */
   69  if (!is_reg)
   70  {
   71   /* LDV_COMMENT_ASSERT Registering usb gadget class is only allowed if usb gadget is not registered. */
   72   ldv_assert(ldv_usb_gadget == LDV_USB_GADGET_ZERO_STATE);
   73   /* LDV_COMMENT_ASSERT Check that usb gadget class is unregistered. */
   74   ldv_assert(ldv_usb_gadget_class == LDV_USB_GADGET_CLASS_ZERO_STATE);
   75   /* LDV_COMMENT_CHANGE_STATE Register class for usb gadget. */
   76   ldv_usb_gadget_class = LDV_USB_GADGET_CLASS_REGISTERED;
   77  }
   78 
   79  /* LDV_COMMENT_RETURN Return registration status (0 is success). */
   80  return is_reg;
   81 }
   82 
   83 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_unregister_class') Check that usb gadget class was registered and unregister it. */
   84 void ldv_unregister_class(void)
   85 {
   86  /* LDV_COMMENT_ASSERT Unregistering usb gadget class is only allowed if usb gadget is not registered. */
   87  ldv_assert(ldv_usb_gadget == LDV_USB_GADGET_ZERO_STATE);
   88  /* LDV_COMMENT_ASSERT Check that usb gadget class is registered. */
   89  ldv_assert(ldv_usb_gadget_class == LDV_USB_GADGET_CLASS_REGISTERED);
   90  /* LDV_COMMENT_CHANGE_STATE Unregister class for usb gadget. */
   91  ldv_usb_gadget_class = LDV_USB_GADGET_CLASS_ZERO_STATE;
   92 }
   93 
   94 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_register_chrdev') Check that chrdev region was not registered and register it. */
   95 int ldv_register_chrdev(int major)
   96 {
   97  int is_reg;
   98 
   99  /* LDV_COMMENT_OTHER Register chrdev in the nondeterministic way. */
  100  is_reg = ldv_undef_int_nonpositive();
  101 
  102  /* LDV_COMMENT_ASSERT Register chrdev just in case when an error did not happen. */
  103  if (!is_reg)
  104  {
  105   /* LDV_COMMENT_ASSERT Usb gadget should be unregistered at this point. */
  106   ldv_assert(ldv_usb_gadget == LDV_USB_GADGET_ZERO_STATE);
  107   /* LDV_COMMENT_ASSERT Check that chrdev region is unregistered. */
  108   ldv_assert(ldv_usb_gadget_chrdev == LDV_USB_GADGET_CHRDEV_ZERO_STATE);
  109   /* LDV_COMMENT_CHANGE_STATE Register chrdev region for usb gadget. */
  110   ldv_usb_gadget_chrdev = LDV_USB_GADGET_CHRDEV_REGISTERED;
  111   if (major == 0)
  112   {
  113    /* LDV_COMMENT_OTHER Function returns allocated major number. */
  114    is_reg = ldv_undef_int();
  115    ldv_assume (is_reg > 0);
  116   }
  117  }
  118 
  119  /* LDV_COMMENT_RETURN Return registration status (0 is success). */
  120  return is_reg;
  121 }
  122 
  123 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_register_chrdev_region') Check that chrdev region was not registered and register it. */
  124 int ldv_register_chrdev_region(void)
  125 {
  126  int is_reg;
  127 
  128  /* LDV_COMMENT_OTHER Register chrdev in the nondeterministic way. */
  129  is_reg = ldv_undef_int_nonpositive();
  130 
  131  /* LDV_COMMENT_ASSERT Register chrdev just in case when an error did not happen. */
  132  if (!is_reg)
  133  {
  134   /* LDV_COMMENT_ASSERT Usb gadget should be unregistered at this point. */
  135   ldv_assert(ldv_usb_gadget == LDV_USB_GADGET_ZERO_STATE);
  136   /* LDV_COMMENT_ASSERT Check that chrdev region is unregistered. */
  137   ldv_assert(ldv_usb_gadget_chrdev == LDV_USB_GADGET_CHRDEV_ZERO_STATE);
  138   /* LDV_COMMENT_CHANGE_STATE Register chrdev region for usb gadget. */
  139   ldv_usb_gadget_chrdev = LDV_USB_GADGET_CHRDEV_REGISTERED;
  140  }
  141 
  142  /* LDV_COMMENT_RETURN Return registration status (0 is success). */
  143  return is_reg;
  144 }
  145 
  146 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_unregister_chrdev_region') Check that chrdev region was registered and unregister it. */
  147 void ldv_unregister_chrdev_region(void)
  148 {
  149  /* LDV_COMMENT_ASSERT Usb gadget should not be registered at this point. */
  150  ldv_assert(ldv_usb_gadget == LDV_USB_GADGET_ZERO_STATE);
  151  /* LDV_COMMENT_ASSERT Check that chrdev region is registered. */
  152  ldv_assert(ldv_usb_gadget_chrdev == LDV_USB_GADGET_CHRDEV_REGISTERED);
  153  /* LDV_COMMENT_CHANGE_STATE Unregister chrdev. */
  154  ldv_usb_gadget_chrdev = LDV_USB_GADGET_CHRDEV_ZERO_STATE;
  155 }
  156 
  157 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_register_usb_gadget') Check that usb gadget was not registered and register it. */
  158 int ldv_register_usb_gadget(void)
  159 {
  160  int is_reg;
  161 
  162  /* LDV_COMMENT_OTHER Register usb gadget in the nondeterministic way. */
  163  is_reg = ldv_undef_int_nonpositive();
  164 
  165  /* LDV_COMMENT_ASSERT Register usb gadget just in case when an error did not happen. */
  166  if (!is_reg)
  167  {
  168   /* LDV_COMMENT_ASSERT Gadget should not be registered at this point. */
  169   ldv_assert(ldv_usb_gadget == LDV_USB_GADGET_ZERO_STATE);
  170   /* LDV_COMMENT_CHANGE_STATE Register usb gadget. */
  171   ldv_usb_gadget = LDV_USB_GADGET_REGISTERED;
  172  }
  173 
  174  /* LDV_COMMENT_RETURN Return registration status (0 is success). */
  175  return is_reg;
  176 }
  177 
  178 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_unregister_usb_gadget') Check that usb gadget was registered and unregister it. */
  179 void ldv_unregister_usb_gadget(void)
  180 {
  181  /* LDV_COMMENT_ASSERT Usb gadget should be registered at this point. */
  182  ldv_assert(ldv_usb_gadget == LDV_USB_GADGET_REGISTERED);
  183  /* LDV_COMMENT_CHANGE_STATE Unregister usb gadget. */
  184  ldv_usb_gadget = LDV_USB_GADGET_ZERO_STATE;
  185 }
  186 
  187 /* LDV_COMMENT_MODEL_FUNCTION_DEFINITION(name='ldv_check_final_state') Check that usb gadget is fully unregistered at the end. */
  188 void ldv_check_final_state(void)
  189 {
  190  /* LDV_COMMENT_ASSERT Usb gadget class should be unregistered at the end. */
  191  ldv_assert(ldv_usb_gadget_class == LDV_USB_GADGET_CLASS_ZERO_STATE);
  192  /* LDV_COMMENT_ASSERT Chrdev region should be unregistered at the end. */
  193  ldv_assert(ldv_usb_gadget_chrdev == LDV_USB_GADGET_CHRDEV_ZERO_STATE);
  194  /* LDV_COMMENT_ASSERT Usb gadget should be unregistered at the end. */
  195  ldv_assert(ldv_usb_gadget == LDV_USB_GADGET_ZERO_STATE);
  196 }           1 #ifndef _LDV_ERR_
    2 #define _LDV_ERR_
    3 
    4 #include <linux/kernel.h>
    5 
    6 /* LDV_COMMENT_MODEL_FUNCTION_DEFENITION(name='ldv_is_err') This function return result of checking if pointer is impossible. */
    7 bool ldv_is_err(const void *ptr)
    8 {
    9 /*LDV_COMMENT_RETURN Return value of function ldv_is_err_val().*/
   10 	return ((unsigned long)ptr > LDV_PTR_MAX);
   11 }
   12 
   13 /* LDV_COMMENT_MODEL_FUNCTION_DEFENITION(name='ldv_err_ptr') This function return pointer. */
   14 void* ldv_err_ptr(long error)
   15 {
   16 /*LDV_COMMENT_RETURN Return error pointer.*/
   17 	return (void *)(LDV_PTR_MAX - error);
   18 }
   19 
   20 /* LDV_COMMENT_MODEL_FUNCTION_DEFENITION(name='ldv_ptr_err') This function return error if pointer is impossible. */
   21 long ldv_ptr_err(const void *ptr)
   22 {
   23 /*LDV_COMMENT_RETURN Return error code.*/
   24 	return (long)(LDV_PTR_MAX - (unsigned long)ptr);
   25 }
   26 
   27 /* LDV_COMMENT_MODEL_FUNCTION_DEFENITION(name='ldv_is_err_or_null') This function check if pointer is impossible or null. */
   28 bool ldv_is_err_or_null(const void *ptr)
   29 {
   30 /*LDV_COMMENT_RETURN Return 0 if pointer is possible and not zero, and 1 in other cases*/
   31 	return !ptr || ldv_is_err((unsigned long)ptr);
   32 }
   33 
   34 #endif /* _LDV_ERR_ */           1 #ifndef _LDV_RCV_H_
    2 #define _LDV_RCV_H_
    3 
    4 /* If expr evaluates to zero, ldv_assert() causes a program to reach the error
    5    label like the standard assert(). */
    6 #define ldv_assert(expr) ((expr) ? 0 : ldv_error())
    7 
    8 /* The error label wrapper. It is used because of some static verifiers (like
    9    BLAST) don't accept multiple error labels through a program. */
   10 static inline void ldv_error(void)
   11 {
   12   LDV_ERROR: goto LDV_ERROR;
   13 }
   14 
   15 /* If expr evaluates to zero, ldv_assume() causes an infinite loop that is
   16    avoided by verifiers. */
   17 #define ldv_assume(expr) ((expr) ? 0 : ldv_stop())
   18 
   19 /* Infinite loop, that causes verifiers to skip such paths. */
   20 static inline void ldv_stop(void) {
   21   LDV_STOP: goto LDV_STOP;
   22 }
   23 
   24 /* Special nondeterministic functions. */
   25 int ldv_undef_int(void);
   26 void *ldv_undef_ptr(void);
   27 unsigned long ldv_undef_ulong(void);
   28 long ldv_undef_long(void);
   29 /* Return nondeterministic negative integer number. */
   30 static inline int ldv_undef_int_negative(void)
   31 {
   32   int ret = ldv_undef_int();
   33 
   34   ldv_assume(ret < 0);
   35 
   36   return ret;
   37 }
   38 /* Return nondeterministic nonpositive integer number. */
   39 static inline int ldv_undef_int_nonpositive(void)
   40 {
   41   int ret = ldv_undef_int();
   42 
   43   ldv_assume(ret <= 0);
   44 
   45   return ret;
   46 }
   47 
   48 /* Add explicit model for __builin_expect GCC function. Without the model a
   49    return value will be treated as nondetermined by verifiers. */
   50 static inline long __builtin_expect(long exp, long c)
   51 {
   52   return exp;
   53 }
   54 
   55 /* This function causes the program to exit abnormally. GCC implements this
   56 function by using a target-dependent mechanism (such as intentionally executing
   57 an illegal instruction) or by calling abort. The mechanism used may vary from
   58 release to release so you should not rely on any particular implementation.
   59 http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html */
   60 static inline void __builtin_trap(void)
   61 {
   62   ldv_assert(0);
   63 }
   64 
   65 /* The constant is for simulating an error of ldv_undef_ptr() function. */
   66 #define LDV_PTR_MAX 2012
   67 
   68 #endif /* _LDV_RCV_H_ */       | 
Here is an explanation of a rule violation arisen while checking your driver against a corresponding kernel.
Note that it may be false positive, i.e. there isn't a real error indeed. Please analyze a given error trace and related source code to understand whether there is an error in your driver.
Error trace column contains a path on which the given rule is violated. You can expand/collapse some entity classes by clicking on corresponding checkboxes in a main menu or in an advanced Others menu. Also you can expand/collapse each particular entity by clicking on +/-. In hovering on some entities you can see some tips. Also the error trace is bound with related source code. Line numbers may be shown as links on the left. You can click on them to open corresponding lines in source code.
Source code column contains a content of files related with the error trace. There is source code of your driver (note that there are some LDV modifications at the end), kernel headers and rule model. Tabs show a currently opened file and other available files. In hovering on them you can see full file names. On clicking a corresponding file content will be shown.
| Kernel | Module | Rule | Verifier | Verdict | Status | Timestamp | Bug report | 
| linux-4.7-rc1.tar.xz | drivers/gpu/drm/drm_kms_helper.ko | 106_1a | CPAchecker | Bug | Fixed | 2016-06-30 00:51:47 | L0237 | 
Comment
Reported: 30 Jun 2016
[Home]
