Hi Christian,

I love your patch! Perhaps something to improve:

[auto build test WARNING on drm/drm-next]
[also build test WARNING on v4.15-rc3 next-20171215]
[if your patch is applied to the wrong git tree, please drop us a note to help 
improve the system]

url:    
https://github.com/0day-ci/linux/commits/Samuel-Li/drm-prime-forward-begin_cpu_access-callback-to-drivers/20171216-125056
base:   git://people.freedesktop.org/~airlied/linux.git drm-next
config: i386-randconfig-x016-201750 (attached as .config)
compiler: gcc-7 (Debian 7.2.0-12) 7.2.1 20171025
reproduce:
        # save the attached .config to linux build tree
        make ARCH=i386 

All warnings (new ones prefixed by >>):

   In file included from drivers/gpu/drm/drm_drv.c:36:0:
>> include/drm/drm_drv.h:494:14: warning: 'enum dma_data_direction' declared 
>> inside parameter list will not be visible outside of this definition or 
>> declaration
            enum dma_data_direction direction);
                 ^~~~~~~~~~~~~~~~~~

vim +494 include/drm/drm_drv.h

    59  
    60  /**
    61   * struct drm_driver - DRM driver structure
    62   *
    63   * This structure represent the common code for a family of cards. 
There will
    64   * one drm_device for each card present in this family. It contains 
lots of
    65   * vfunc entries, and a pile of those probably should be moved to more
    66   * appropriate places like &drm_mode_config_funcs or into a new 
operations
    67   * structure for GEM drivers.
    68   */
    69  struct drm_driver {
    70          /**
    71           * @load:
    72           *
    73           * Backward-compatible driver callback to complete
    74           * initialization steps after the driver is registered.  For
    75           * this reason, may suffer from race conditions and its use is
    76           * deprecated for new drivers.  It is therefore only supported
    77           * for existing drivers not yet converted to the new scheme.
    78           * See drm_dev_init() and drm_dev_register() for proper and
    79           * race-free way to set up a &struct drm_device.
    80           *
    81           * This is deprecated, do not use!
    82           *
    83           * Returns:
    84           *
    85           * Zero on success, non-zero value on failure.
    86           */
    87          int (*load) (struct drm_device *, unsigned long flags);
    88  
    89          /**
    90           * @open:
    91           *
    92           * Driver callback when a new &struct drm_file is opened. 
Useful for
    93           * setting up driver-private data structures like buffer 
allocators,
    94           * execution contexts or similar things. Such driver-private 
resources
    95           * must be released again in @postclose.
    96           *
    97           * Since the display/modeset side of DRM can only be owned by 
exactly
    98           * one &struct drm_file (see &drm_file.is_master and 
&drm_device.master)
    99           * there should never be a need to set up any modeset related 
resources
   100           * in this callback. Doing so would be a driver design bug.
   101           *
   102           * Returns:
   103           *
   104           * 0 on success, a negative error code on failure, which will be
   105           * promoted to userspace as the result of the open() system 
call.
   106           */
   107          int (*open) (struct drm_device *, struct drm_file *);
   108  
   109          /**
   110           * @postclose:
   111           *
   112           * One of the driver callbacks when a new &struct drm_file is 
closed.
   113           * Useful for tearing down driver-private data structures 
allocated in
   114           * @open like buffer allocators, execution contexts or similar 
things.
   115           *
   116           * Since the display/modeset side of DRM can only be owned by 
exactly
   117           * one &struct drm_file (see &drm_file.is_master and 
&drm_device.master)
   118           * there should never be a need to tear down any modeset related
   119           * resources in this callback. Doing so would be a driver 
design bug.
   120           */
   121          void (*postclose) (struct drm_device *, struct drm_file *);
   122  
   123          /**
   124           * @lastclose:
   125           *
   126           * Called when the last &struct drm_file has been closed and 
there's
   127           * currently no userspace client for the &struct drm_device.
   128           *
   129           * Modern drivers should only use this to force-restore the 
fbdev
   130           * framebuffer using 
drm_fb_helper_restore_fbdev_mode_unlocked().
   131           * Anything else would indicate there's something seriously 
wrong.
   132           * Modern drivers can also use this to execute delayed power 
switching
   133           * state changes, e.g. in conjunction with the 
:ref:`vga_switcheroo`
   134           * infrastructure.
   135           *
   136           * This is called after @postclose hook has been called.
   137           *
   138           * NOTE:
   139           *
   140           * All legacy drivers use this callback to de-initialize the 
hardware.
   141           * This is purely because of the shadow-attach model, where the 
DRM
   142           * kernel driver does not really own the hardware. Instead 
ownershipe is
   143           * handled with the help of userspace through an inheritedly 
racy dance
   144           * to set/unset the VT into raw mode.
   145           *
   146           * Legacy drivers initialize the hardware in the @firstopen 
callback,
   147           * which isn't even called for modern drivers.
   148           */
   149          void (*lastclose) (struct drm_device *);
   150  
   151          /**
   152           * @unload:
   153           *
   154           * Reverse the effects of the driver load callback.  Ideally,
   155           * the clean up performed by the driver should happen in the
   156           * reverse order of the initialization.  Similarly to the load
   157           * hook, this handler is deprecated and its usage should be
   158           * dropped in favor of an open-coded teardown function at the
   159           * driver layer.  See drm_dev_unregister() and drm_dev_put()
   160           * for the proper way to remove a &struct drm_device.
   161           *
   162           * The unload() hook is called right after unregistering
   163           * the device.
   164           *
   165           */
   166          void (*unload) (struct drm_device *);
   167  
   168          /**
   169           * @release:
   170           *
   171           * Optional callback for destroying device data after the final
   172           * reference is released, i.e. the device is being destroyed. 
Drivers
   173           * using this callback are responsible for calling 
drm_dev_fini()
   174           * to finalize the device and then freeing the struct 
themselves.
   175           */
   176          void (*release) (struct drm_device *);
   177  
   178          /**
   179           * @get_vblank_counter:
   180           *
   181           * Driver callback for fetching a raw hardware vblank counter 
for the
   182           * CRTC specified with the pipe argument.  If a device doesn't 
have a
   183           * hardware counter, the driver can simply leave the hook as 
NULL.
   184           * The DRM core will account for missed vblank events while 
interrupts
   185           * where disabled based on system timestamps.
   186           *
   187           * Wraparound handling and loss of events due to modesetting is 
dealt
   188           * with in the DRM core code, as long as drivers call
   189           * drm_crtc_vblank_off() and drm_crtc_vblank_on() when 
disabling or
   190           * enabling a CRTC.
   191           *
   192           * This is deprecated and should not be used by new drivers.
   193           * Use &drm_crtc_funcs.get_vblank_counter instead.
   194           *
   195           * Returns:
   196           *
   197           * Raw vblank counter value.
   198           */
   199          u32 (*get_vblank_counter) (struct drm_device *dev, unsigned int 
pipe);
   200  
   201          /**
   202           * @enable_vblank:
   203           *
   204           * Enable vblank interrupts for the CRTC specified with the pipe
   205           * argument.
   206           *
   207           * This is deprecated and should not be used by new drivers.
   208           * Use &drm_crtc_funcs.enable_vblank instead.
   209           *
   210           * Returns:
   211           *
   212           * Zero on success, appropriate errno if the given @crtc's 
vblank
   213           * interrupt cannot be enabled.
   214           */
   215          int (*enable_vblank) (struct drm_device *dev, unsigned int 
pipe);
   216  
   217          /**
   218           * @disable_vblank:
   219           *
   220           * Disable vblank interrupts for the CRTC specified with the 
pipe
   221           * argument.
   222           *
   223           * This is deprecated and should not be used by new drivers.
   224           * Use &drm_crtc_funcs.disable_vblank instead.
   225           */
   226          void (*disable_vblank) (struct drm_device *dev, unsigned int 
pipe);
   227  
   228          /**
   229           * @get_scanout_position:
   230           *
   231           * Called by vblank timestamping code.
   232           *
   233           * Returns the current display scanout position from a crtc, 
and an
   234           * optional accurate ktime_get() timestamp of when position was
   235           * measured. Note that this is a helper callback which is only 
used if a
   236           * driver uses drm_calc_vbltimestamp_from_scanoutpos() for the
   237           * @get_vblank_timestamp callback.
   238           *
   239           * Parameters:
   240           *
   241           * dev:
   242           *     DRM device.
   243           * pipe:
   244           *     Id of the crtc to query.
   245           * in_vblank_irq:
   246           *     True when called from drm_crtc_handle_vblank().  Some 
drivers
   247           *     need to apply some workarounds for gpu-specific vblank 
irq quirks
   248           *     if flag is set.
   249           * vpos:
   250           *     Target location for current vertical scanout position.
   251           * hpos:
   252           *     Target location for current horizontal scanout position.
   253           * stime:
   254           *     Target location for timestamp taken immediately before
   255           *     scanout position query. Can be NULL to skip timestamp.
   256           * etime:
   257           *     Target location for timestamp taken immediately after
   258           *     scanout position query. Can be NULL to skip timestamp.
   259           * mode:
   260           *     Current display timings.
   261           *
   262           * Returns vpos as a positive number while in active scanout 
area.
   263           * Returns vpos as a negative number inside vblank, counting 
the number
   264           * of scanlines to go until end of vblank, e.g., -1 means "one 
scanline
   265           * until start of active scanout / end of vblank."
   266           *
   267           * Returns:
   268           *
   269           * True on success, false if a reliable scanout position 
counter could
   270           * not be read out.
   271           *
   272           * FIXME:
   273           *
   274           * Since this is a helper to implement @get_vblank_timestamp, 
we should
   275           * move it to &struct drm_crtc_helper_funcs, like all the other
   276           * helper-internal hooks.
   277           */
   278          bool (*get_scanout_position) (struct drm_device *dev, unsigned 
int pipe,
   279                                        bool in_vblank_irq, int *vpos, 
int *hpos,
   280                                        ktime_t *stime, ktime_t *etime,
   281                                        const struct drm_display_mode 
*mode);
   282  
   283          /**
   284           * @get_vblank_timestamp:
   285           *
   286           * Called by drm_get_last_vbltimestamp(). Should return a 
precise
   287           * timestamp when the most recent VBLANK interval ended or will 
end.
   288           *
   289           * Specifically, the timestamp in @vblank_time should 
correspond as
   290           * closely as possible to the time when the first video 
scanline of
   291           * the video frame after the end of VBLANK will start scanning 
out,
   292           * the time immediately after end of the VBLANK interval. If the
   293           * @crtc is currently inside VBLANK, this will be a time in the 
future.
   294           * If the @crtc is currently scanning out a frame, this will be 
the
   295           * past start time of the current scanout. This is meant to 
adhere
   296           * to the OpenML OML_sync_control extension specification.
   297           *
   298           * Paramters:
   299           *
   300           * dev:
   301           *     dev DRM device handle.
   302           * pipe:
   303           *     crtc for which timestamp should be returned.
   304           * max_error:
   305           *     Maximum allowable timestamp error in nanoseconds.
   306           *     Implementation should strive to provide timestamp
   307           *     with an error of at most max_error nanoseconds.
   308           *     Returns true upper bound on error for timestamp.
   309           * vblank_time:
   310           *     Target location for returned vblank timestamp.
   311           * in_vblank_irq:
   312           *     True when called from drm_crtc_handle_vblank().  Some 
drivers
   313           *     need to apply some workarounds for gpu-specific vblank 
irq quirks
   314           *     if flag is set.
   315           *
   316           * Returns:
   317           *
   318           * True on success, false on failure, which means the core 
should
   319           * fallback to a simple timestamp taken in 
drm_crtc_handle_vblank().
   320           *
   321           * FIXME:
   322           *
   323           * We should move this hook to &struct drm_crtc_funcs like all 
the other
   324           * vblank hooks.
   325           */
   326          bool (*get_vblank_timestamp) (struct drm_device *dev, unsigned 
int pipe,
   327                                       int *max_error,
   328                                       ktime_t *vblank_time,
   329                                       bool in_vblank_irq);
   330  
   331          /**
   332           * @irq_handler:
   333           *
   334           * Interrupt handler called when using drm_irq_install(). Not 
used by
   335           * drivers which implement their own interrupt handling.
   336           */
   337          irqreturn_t(*irq_handler) (int irq, void *arg);
   338  
   339          /**
   340           * @irq_preinstall:
   341           *
   342           * Optional callback used by drm_irq_install() which is called 
before
   343           * the interrupt handler is registered. This should be used to 
clear out
   344           * any pending interrupts (from e.g. firmware based drives) and 
reset
   345           * the interrupt handling registers.
   346           */
   347          void (*irq_preinstall) (struct drm_device *dev);
   348  
   349          /**
   350           * @irq_postinstall:
   351           *
   352           * Optional callback used by drm_irq_install() which is called 
after
   353           * the interrupt handler is registered. This should be used to 
enable
   354           * interrupt generation in the hardware.
   355           */
   356          int (*irq_postinstall) (struct drm_device *dev);
   357  
   358          /**
   359           * @irq_uninstall:
   360           *
   361           * Optional callback used by drm_irq_uninstall() which is 
called before
   362           * the interrupt handler is unregistered. This should be used 
to disable
   363           * interrupt generation in the hardware.
   364           */
   365          void (*irq_uninstall) (struct drm_device *dev);
   366  
   367          /**
   368           * @master_create:
   369           *
   370           * Called whenever a new master is created. Only used by vmwgfx.
   371           */
   372          int (*master_create)(struct drm_device *dev, struct drm_master 
*master);
   373  
   374          /**
   375           * @master_destroy:
   376           *
   377           * Called whenever a master is destroyed. Only used by vmwgfx.
   378           */
   379          void (*master_destroy)(struct drm_device *dev, struct 
drm_master *master);
   380  
   381          /**
   382           * @master_set:
   383           *
   384           * Called whenever the minor master is set. Only used by vmwgfx.
   385           */
   386          int (*master_set)(struct drm_device *dev, struct drm_file 
*file_priv,
   387                            bool from_open);
   388          /**
   389           * @master_drop:
   390           *
   391           * Called whenever the minor master is dropped. Only used by 
vmwgfx.
   392           */
   393          void (*master_drop)(struct drm_device *dev, struct drm_file 
*file_priv);
   394  
   395          /**
   396           * @debugfs_init:
   397           *
   398           * Allows drivers to create driver-specific debugfs files.
   399           */
   400          int (*debugfs_init)(struct drm_minor *minor);
   401  
   402          /**
   403           * @gem_free_object: deconstructor for drm_gem_objects
   404           *
   405           * This is deprecated and should not be used by new drivers. Use
   406           * @gem_free_object_unlocked instead.
   407           */
   408          void (*gem_free_object) (struct drm_gem_object *obj);
   409  
   410          /**
   411           * @gem_free_object_unlocked: deconstructor for drm_gem_objects
   412           *
   413           * This is for drivers which are not encumbered with 
&drm_device.struct_mutex
   414           * legacy locking schemes. Use this hook instead of 
@gem_free_object.
   415           */
   416          void (*gem_free_object_unlocked) (struct drm_gem_object *obj);
   417  
   418          /**
   419           * @gem_open_object:
   420           *
   421           * Driver hook called upon gem handle creation
   422           */
   423          int (*gem_open_object) (struct drm_gem_object *, struct 
drm_file *);
   424  
   425          /**
   426           * @gem_close_object:
   427           *
   428           * Driver hook called upon gem handle release
   429           */
   430          void (*gem_close_object) (struct drm_gem_object *, struct 
drm_file *);
   431  
   432          /**
   433           * @gem_print_info:
   434           *
   435           * If driver subclasses struct &drm_gem_object, it can 
implement this
   436           * optional hook for printing additional driver specific info.
   437           *
   438           * drm_printf_indent() should be used in the callback passing 
it the
   439           * indent argument.
   440           *
   441           * This callback is called from drm_gem_print_info().
   442           */
   443          void (*gem_print_info)(struct drm_printer *p, unsigned int 
indent,
   444                                 const struct drm_gem_object *obj);
   445  
   446          /**
   447           * @gem_create_object: constructor for gem objects
   448           *
   449           * Hook for allocating the GEM object struct, for use by core
   450           * helpers.
   451           */
   452          struct drm_gem_object *(*gem_create_object)(struct drm_device 
*dev,
   453                                                      size_t size);
   454  
   455          /* prime: */
   456          /**
   457           * @prime_handle_to_fd:
   458           *
   459           * export handle -> fd (see drm_gem_prime_handle_to_fd() helper)
   460           */
   461          int (*prime_handle_to_fd)(struct drm_device *dev, struct 
drm_file *file_priv,
   462                                  uint32_t handle, uint32_t flags, int 
*prime_fd);
   463          /**
   464           * @prime_fd_to_handle:
   465           *
   466           * import fd -> handle (see drm_gem_prime_fd_to_handle() helper)
   467           */
   468          int (*prime_fd_to_handle)(struct drm_device *dev, struct 
drm_file *file_priv,
   469                                  int prime_fd, uint32_t *handle);
   470          /**
   471           * @gem_prime_export:
   472           *
   473           * export GEM -> dmabuf
   474           */
   475          struct dma_buf * (*gem_prime_export)(struct drm_device *dev,
   476                                  struct drm_gem_object *obj, int flags);
   477          /**
   478           * @gem_prime_import:
   479           *
   480           * import dmabuf -> GEM
   481           */
   482          struct drm_gem_object * (*gem_prime_import)(struct drm_device 
*dev,
   483                                  struct dma_buf *dma_buf);
   484          int (*gem_prime_pin)(struct drm_gem_object *obj);
   485          void (*gem_prime_unpin)(struct drm_gem_object *obj);
   486          struct reservation_object * (*gem_prime_res_obj)(
   487                                  struct drm_gem_object *obj);
   488          struct sg_table *(*gem_prime_get_sg_table)(struct 
drm_gem_object *obj);
   489          struct drm_gem_object *(*gem_prime_import_sg_table)(
   490                                  struct drm_device *dev,
   491                                  struct dma_buf_attachment *attach,
   492                                  struct sg_table *sgt);
   493          int (*gem_prime_begin_cpu_access)(struct drm_gem_object *obj,
 > 494                                             enum dma_data_direction 
 > direction);
   495          void *(*gem_prime_vmap)(struct drm_gem_object *obj);
   496          void (*gem_prime_vunmap)(struct drm_gem_object *obj, void 
*vaddr);
   497          int (*gem_prime_mmap)(struct drm_gem_object *obj,
   498                                  struct vm_area_struct *vma);
   499  
   500          /**
   501           * @dumb_create:
   502           *
   503           * This creates a new dumb buffer in the driver's backing 
storage manager (GEM,
   504           * TTM or something else entirely) and returns the resulting 
buffer handle. This
   505           * handle can then be wrapped up into a framebuffer modeset 
object.
   506           *
   507           * Note that userspace is not allowed to use such objects for 
render
   508           * acceleration - drivers must create their own private ioctls 
for such a use
   509           * case.
   510           *
   511           * Width, height and depth are specified in the 
&drm_mode_create_dumb
   512           * argument. The callback needs to fill the handle, pitch and 
size for
   513           * the created buffer.
   514           *
   515           * Called by the user via ioctl.
   516           *
   517           * Returns:
   518           *
   519           * Zero on success, negative errno on failure.
   520           */
   521          int (*dumb_create)(struct drm_file *file_priv,
   522                             struct drm_device *dev,
   523                             struct drm_mode_create_dumb *args);
   524          /**
   525           * @dumb_map_offset:
   526           *
   527           * Allocate an offset in the drm device node's address space to 
be able to
   528           * memory map a dumb buffer. GEM-based drivers must use
   529           * drm_gem_create_mmap_offset() to implement this.
   530           *
   531           * Called by the user via ioctl.
   532           *
   533           * Returns:
   534           *
   535           * Zero on success, negative errno on failure.
   536           */
   537          int (*dumb_map_offset)(struct drm_file *file_priv,
   538                                 struct drm_device *dev, uint32_t handle,
   539                                 uint64_t *offset);
   540          /**
   541           * @dumb_destroy:
   542           *
   543           * This destroys the userspace handle for the given dumb 
backing storage buffer.
   544           * Since buffer objects must be reference counted in the kernel 
a buffer object
   545           * won't be immediately freed if a framebuffer modeset object 
still uses it.
   546           *
   547           * Called by the user via ioctl.
   548           *
   549           * Returns:
   550           *
   551           * Zero on success, negative errno on failure.
   552           */
   553          int (*dumb_destroy)(struct drm_file *file_priv,
   554                              struct drm_device *dev,
   555                              uint32_t handle);
   556  
   557          /**
   558           * @gem_vm_ops: Driver private ops for this object
   559           */
   560          const struct vm_operations_struct *gem_vm_ops;
   561  
   562          /** @major: driver major number */
   563          int major;
   564          /** @minor: driver minor number */
   565          int minor;
   566          /** @patchlevel: driver patch level */
   567          int patchlevel;
   568          /** @name: driver name */
   569          char *name;
   570          /** @desc: driver description */
   571          char *desc;
   572          /** @date: driver date */
   573          char *date;
   574  
   575          /** @driver_features: driver features */
   576          u32 driver_features;
   577  
   578          /**
   579           * @ioctls:
   580           *
   581           * Array of driver-private IOCTL description entries. See the 
chapter on
   582           * :ref:`IOCTL support in the userland interfaces
   583           * chapter<drm_driver_ioctl>` for the full details.
   584           */
   585  
   586          const struct drm_ioctl_desc *ioctls;
   587          /** @num_ioctls: Number of entries in @ioctls. */
   588          int num_ioctls;
   589  
   590          /**
   591           * @fops:
   592           *
   593           * File operations for the DRM device node. See the discussion 
in
   594           * :ref:`file operations<drm_driver_fops>` for in-depth 
coverage and
   595           * some examples.
   596           */
   597          const struct file_operations *fops;
   598  
   599          /* Everything below here is for legacy driver, never use! */
   600          /* private: */
   601  
   602          /* List of devices hanging off this driver with stealth attach. 
*/
   603          struct list_head legacy_dev_list;
   604          int (*firstopen) (struct drm_device *);
   605          void (*preclose) (struct drm_device *, struct drm_file 
*file_priv);
   606          int (*dma_ioctl) (struct drm_device *dev, void *data, struct 
drm_file *file_priv);
   607          int (*dma_quiescent) (struct drm_device *);
   608          int (*context_dtor) (struct drm_device *dev, int context);
   609          int dev_priv_size;
   610  };
   611  

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

Attachment: .config.gz
Description: application/gzip

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to