Skip to content

Commit 7846b12

Browse files
committed
Merge branch 'drm-vmwgfx-next' of git://people.freedesktop.org/~syeh/repos_linux into drm-next
vmwgfx add fence fd support. * 'drm-vmwgfx-next' of git://people.freedesktop.org/~syeh/repos_linux: drm/vmwgfx: Bump the version for fence FD support drm/vmwgfx: Add export fence to file descriptor support drm/vmwgfx: Add support for imported Fence File Descriptor drm/vmwgfx: Prepare to support fence fd drm/vmwgfx: Fix incorrect command header offset at restart drm/vmwgfx: Support the NOP_ERROR command drm/vmwgfx: Restart command buffers after errors drm/vmwgfx: Move irq bottom half processing to threads drm/vmwgfx: Don't use drm_irq_[un]install
2 parents 7ebdb0d + d78acfe commit 7846b12

File tree

9 files changed

+511
-161
lines changed

9 files changed

+511
-161
lines changed

drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c

Lines changed: 178 additions & 64 deletions
Large diffs are not rendered by default.

drivers/gpu/drm/vmwgfx/vmwgfx_drv.c

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
#include <drm/ttm/ttm_module.h>
3737
#include <linux/dma_remapping.h>
3838

39-
#define VMWGFX_DRIVER_NAME "vmwgfx"
4039
#define VMWGFX_DRIVER_DESC "Linux drm driver for VMware graphics devices"
4140
#define VMWGFX_CHIP_SVGAII 0
4241
#define VMW_FB_RESERVATION 0
@@ -825,7 +824,7 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
825824
}
826825

827826
if (dev_priv->capabilities & SVGA_CAP_IRQMASK) {
828-
ret = drm_irq_install(dev, dev->pdev->irq);
827+
ret = vmw_irq_install(dev, dev->pdev->irq);
829828
if (ret != 0) {
830829
DRM_ERROR("Failed installing irq: %d\n", ret);
831830
goto out_no_irq;
@@ -937,7 +936,7 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
937936
vmw_fence_manager_takedown(dev_priv->fman);
938937
out_no_fman:
939938
if (dev_priv->capabilities & SVGA_CAP_IRQMASK)
940-
drm_irq_uninstall(dev_priv->dev);
939+
vmw_irq_uninstall(dev_priv->dev);
941940
out_no_irq:
942941
if (dev_priv->stealth)
943942
pci_release_region(dev->pdev, 2);
@@ -990,7 +989,7 @@ static void vmw_driver_unload(struct drm_device *dev)
990989
vmw_release_device_late(dev_priv);
991990
vmw_fence_manager_takedown(dev_priv->fman);
992991
if (dev_priv->capabilities & SVGA_CAP_IRQMASK)
993-
drm_irq_uninstall(dev_priv->dev);
992+
vmw_irq_uninstall(dev_priv->dev);
994993
if (dev_priv->stealth)
995994
pci_release_region(dev->pdev, 2);
996995
else
@@ -1516,10 +1515,6 @@ static struct drm_driver driver = {
15161515
.load = vmw_driver_load,
15171516
.unload = vmw_driver_unload,
15181517
.lastclose = vmw_lastclose,
1519-
.irq_preinstall = vmw_irq_preinstall,
1520-
.irq_postinstall = vmw_irq_postinstall,
1521-
.irq_uninstall = vmw_irq_uninstall,
1522-
.irq_handler = vmw_irq_handler,
15231518
.get_vblank_counter = vmw_get_vblank_counter,
15241519
.enable_vblank = vmw_enable_vblank,
15251520
.disable_vblank = vmw_disable_vblank,

drivers/gpu/drm/vmwgfx/vmwgfx_drv.h

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,12 @@
4040
#include <drm/ttm/ttm_execbuf_util.h>
4141
#include <drm/ttm/ttm_module.h>
4242
#include "vmwgfx_fence.h"
43+
#include <linux/sync_file.h>
4344

44-
#define VMWGFX_DRIVER_DATE "20170607"
45+
#define VMWGFX_DRIVER_NAME "vmwgfx"
46+
#define VMWGFX_DRIVER_DATE "20170612"
4547
#define VMWGFX_DRIVER_MAJOR 2
46-
#define VMWGFX_DRIVER_MINOR 13
48+
#define VMWGFX_DRIVER_MINOR 14
4749
#define VMWGFX_DRIVER_PATCHLEVEL 0
4850
#define VMWGFX_FILE_PAGE_OFFSET 0x00100000
4951
#define VMWGFX_FIFO_STATIC_SIZE (1024*1024)
@@ -351,6 +353,12 @@ struct vmw_otable_batch {
351353
struct ttm_buffer_object *otable_bo;
352354
};
353355

356+
enum {
357+
VMW_IRQTHREAD_FENCE,
358+
VMW_IRQTHREAD_CMDBUF,
359+
VMW_IRQTHREAD_MAX
360+
};
361+
354362
struct vmw_private {
355363
struct ttm_bo_device bdev;
356364
struct ttm_bo_global_ref bo_global_ref;
@@ -529,6 +537,7 @@ struct vmw_private {
529537
struct vmw_otable_batch otable_batch;
530538

531539
struct vmw_cmdbuf_man *cman;
540+
DECLARE_BITMAP(irqthread_pending, VMW_IRQTHREAD_MAX);
532541
};
533542

534543
static inline struct vmw_surface *vmw_res_to_srf(struct vmw_resource *res)
@@ -561,24 +570,21 @@ static inline struct vmw_master *vmw_master(struct drm_master *master)
561570
static inline void vmw_write(struct vmw_private *dev_priv,
562571
unsigned int offset, uint32_t value)
563572
{
564-
unsigned long irq_flags;
565-
566-
spin_lock_irqsave(&dev_priv->hw_lock, irq_flags);
573+
spin_lock(&dev_priv->hw_lock);
567574
outl(offset, dev_priv->io_start + VMWGFX_INDEX_PORT);
568575
outl(value, dev_priv->io_start + VMWGFX_VALUE_PORT);
569-
spin_unlock_irqrestore(&dev_priv->hw_lock, irq_flags);
576+
spin_unlock(&dev_priv->hw_lock);
570577
}
571578

572579
static inline uint32_t vmw_read(struct vmw_private *dev_priv,
573580
unsigned int offset)
574581
{
575-
unsigned long irq_flags;
576582
u32 val;
577583

578-
spin_lock_irqsave(&dev_priv->hw_lock, irq_flags);
584+
spin_lock(&dev_priv->hw_lock);
579585
outl(offset, dev_priv->io_start + VMWGFX_INDEX_PORT);
580586
val = inl(dev_priv->io_start + VMWGFX_VALUE_PORT);
581-
spin_unlock_irqrestore(&dev_priv->hw_lock, irq_flags);
587+
spin_unlock(&dev_priv->hw_lock);
582588

583589
return val;
584590
}
@@ -821,7 +827,8 @@ extern int vmw_execbuf_process(struct drm_file *file_priv,
821827
uint32_t dx_context_handle,
822828
struct drm_vmw_fence_rep __user
823829
*user_fence_rep,
824-
struct vmw_fence_obj **out_fence);
830+
struct vmw_fence_obj **out_fence,
831+
uint32_t flags);
825832
extern void __vmw_execbuf_release_pinned_bo(struct vmw_private *dev_priv,
826833
struct vmw_fence_obj *fence);
827834
extern void vmw_execbuf_release_pinned_bo(struct vmw_private *dev_priv);
@@ -836,23 +843,23 @@ extern void vmw_execbuf_copy_fence_user(struct vmw_private *dev_priv,
836843
struct drm_vmw_fence_rep __user
837844
*user_fence_rep,
838845
struct vmw_fence_obj *fence,
839-
uint32_t fence_handle);
846+
uint32_t fence_handle,
847+
int32_t out_fence_fd,
848+
struct sync_file *sync_file);
840849
extern int vmw_validate_single_buffer(struct vmw_private *dev_priv,
841850
struct ttm_buffer_object *bo,
842851
bool interruptible,
843852
bool validate_as_mob);
844-
853+
bool vmw_cmd_describe(const void *buf, u32 *size, char const **cmd);
845854

846855
/**
847856
* IRQs and wating - vmwgfx_irq.c
848857
*/
849858

850-
extern irqreturn_t vmw_irq_handler(int irq, void *arg);
851859
extern int vmw_wait_seqno(struct vmw_private *dev_priv, bool lazy,
852860
uint32_t seqno, bool interruptible,
853861
unsigned long timeout);
854-
extern void vmw_irq_preinstall(struct drm_device *dev);
855-
extern int vmw_irq_postinstall(struct drm_device *dev);
862+
extern int vmw_irq_install(struct drm_device *dev, int irq);
856863
extern void vmw_irq_uninstall(struct drm_device *dev);
857864
extern bool vmw_seqno_passed(struct vmw_private *dev_priv,
858865
uint32_t seqno);
@@ -1150,13 +1157,13 @@ extern void *vmw_cmdbuf_reserve(struct vmw_cmdbuf_man *man, size_t size,
11501157
extern void vmw_cmdbuf_commit(struct vmw_cmdbuf_man *man, size_t size,
11511158
struct vmw_cmdbuf_header *header,
11521159
bool flush);
1153-
extern void vmw_cmdbuf_tasklet_schedule(struct vmw_cmdbuf_man *man);
11541160
extern void *vmw_cmdbuf_alloc(struct vmw_cmdbuf_man *man,
11551161
size_t size, bool interruptible,
11561162
struct vmw_cmdbuf_header **p_header);
11571163
extern void vmw_cmdbuf_header_free(struct vmw_cmdbuf_header *header);
11581164
extern int vmw_cmdbuf_cur_flush(struct vmw_cmdbuf_man *man,
11591165
bool interruptible);
1166+
extern void vmw_cmdbuf_irqthread(struct vmw_cmdbuf_man *man);
11601167

11611168

11621169
/**

0 commit comments

Comments
 (0)