2013-09-09 10:02:56 +10:00
/*
* Copyright ( C ) 2015 Red Hat , Inc .
* All Rights Reserved .
*
* Authors :
* Dave Airlie < airlied @ redhat . com >
* Gerd Hoffmann < kraxel @ redhat . com >
*
* Permission is hereby granted , free of charge , to any person obtaining a
* copy of this software and associated documentation files ( the " Software " ) ,
* to deal in the Software without restriction , including without limitation
* the rights to use , copy , modify , merge , publish , distribute , sublicense ,
* and / or sell copies of the Software , and to permit persons to whom the
* Software is furnished to do so , subject to the following conditions :
*
* The above copyright notice and this permission notice ( including the next
* paragraph ) shall be included in all copies or substantial portions of the
* Software .
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL
* VA LINUX SYSTEMS AND / OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM , DAMAGES OR
* OTHER LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE ,
* ARISING FROM , OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE .
*/
# include <linux/module.h>
# include <linux/console.h>
# include <linux/pci.h>
2017-04-24 13:50:34 +09:00
# include <drm/drmP.h>
# include <drm/drm.h>
2013-09-09 10:02:56 +10:00
# include "virtgpu_drv.h"
static struct drm_driver driver ;
static int virtio_gpu_modeset = - 1 ;
MODULE_PARM_DESC ( modeset , " Disable/Enable modesetting " ) ;
module_param_named ( modeset , virtio_gpu_modeset , int , 0400 ) ;
static int virtio_gpu_probe ( struct virtio_device * vdev )
{
if ( vgacon_text_force ( ) & & virtio_gpu_modeset = = - 1 )
return - EINVAL ;
if ( virtio_gpu_modeset = = 0 )
return - EINVAL ;
return drm_virtio_init ( & driver , vdev ) ;
}
static void virtio_gpu_remove ( struct virtio_device * vdev )
{
struct drm_device * dev = vdev - > priv ;
drm_put_dev ( dev ) ;
}
static void virtio_gpu_config_changed ( struct virtio_device * vdev )
{
struct drm_device * dev = vdev - > priv ;
struct virtio_gpu_device * vgdev = dev - > dev_private ;
schedule_work ( & vgdev - > config_changed_work ) ;
}
static struct virtio_device_id id_table [ ] = {
{ VIRTIO_ID_GPU , VIRTIO_DEV_ANY_ID } ,
{ 0 } ,
} ;
static unsigned int features [ ] = {
2014-10-28 12:48:00 +01:00
# ifdef __LITTLE_ENDIAN
/*
* Gallium command stream send by virgl is native endian .
* Because of that we only support little endian guests on
* little endian hosts .
*/
VIRTIO_GPU_F_VIRGL ,
# endif
2013-09-09 10:02:56 +10:00
} ;
static struct virtio_driver virtio_gpu_driver = {
. feature_table = features ,
. feature_table_size = ARRAY_SIZE ( features ) ,
. driver . name = KBUILD_MODNAME ,
. driver . owner = THIS_MODULE ,
. id_table = id_table ,
. probe = virtio_gpu_probe ,
. remove = virtio_gpu_remove ,
. config_changed = virtio_gpu_config_changed
} ;
module_virtio_driver ( virtio_gpu_driver ) ;
MODULE_DEVICE_TABLE ( virtio , id_table ) ;
MODULE_DESCRIPTION ( " Virtio GPU driver " ) ;
MODULE_LICENSE ( " GPL and additional rights " ) ;
MODULE_AUTHOR ( " Dave Airlie <airlied@redhat.com> " ) ;
MODULE_AUTHOR ( " Gerd Hoffmann <kraxel@redhat.com> " ) ;
MODULE_AUTHOR ( " Alon Levy " ) ;
static const struct file_operations virtio_gpu_driver_fops = {
. owner = THIS_MODULE ,
. open = drm_open ,
. mmap = virtio_gpu_mmap ,
. poll = drm_poll ,
. read = drm_read ,
. unlocked_ioctl = drm_ioctl ,
. release = drm_release ,
. compat_ioctl = drm_compat_ioctl ,
. llseek = noop_llseek ,
} ;
static struct drm_driver driver = {
2016-01-13 15:52:10 -06:00
. driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME | DRIVER_RENDER | DRIVER_ATOMIC ,
2013-09-09 10:02:56 +10:00
. load = virtio_gpu_driver_load ,
. unload = virtio_gpu_driver_unload ,
2014-10-28 12:48:00 +01:00
. open = virtio_gpu_driver_open ,
. postclose = virtio_gpu_driver_postclose ,
2013-09-09 10:02:56 +10:00
. dumb_create = virtio_gpu_mode_dumb_create ,
. dumb_map_offset = virtio_gpu_mode_dumb_mmap ,
# if defined(CONFIG_DEBUG_FS)
. debugfs_init = virtio_gpu_debugfs_init ,
# endif
2015-01-23 13:04:11 +10:00
. prime_handle_to_fd = drm_gem_prime_handle_to_fd ,
. prime_fd_to_handle = drm_gem_prime_fd_to_handle ,
. gem_prime_export = drm_gem_prime_export ,
. gem_prime_import = drm_gem_prime_import ,
. gem_prime_pin = virtgpu_gem_prime_pin ,
. gem_prime_unpin = virtgpu_gem_prime_unpin ,
. gem_prime_get_sg_table = virtgpu_gem_prime_get_sg_table ,
. gem_prime_import_sg_table = virtgpu_gem_prime_import_sg_table ,
. gem_prime_vmap = virtgpu_gem_prime_vmap ,
. gem_prime_vunmap = virtgpu_gem_prime_vunmap ,
. gem_prime_mmap = virtgpu_gem_prime_mmap ,
2013-09-09 10:02:56 +10:00
2016-05-30 19:53:09 +02:00
. gem_free_object_unlocked = virtio_gpu_gem_free_object ,
2014-10-28 12:48:00 +01:00
. gem_open_object = virtio_gpu_gem_object_open ,
. gem_close_object = virtio_gpu_gem_object_close ,
2013-09-09 10:02:56 +10:00
. fops = & virtio_gpu_driver_fops ,
2014-10-28 12:48:00 +01:00
. ioctls = virtio_gpu_ioctls ,
. num_ioctls = DRM_VIRTIO_NUM_IOCTLS ,
2013-09-09 10:02:56 +10:00
. name = DRIVER_NAME ,
. desc = DRIVER_DESC ,
. date = DRIVER_DATE ,
. major = DRIVER_MAJOR ,
. minor = DRIVER_MINOR ,
. patchlevel = DRIVER_PATCHLEVEL ,
} ;