0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028 #ifndef _VMWGFX_DRV_H_
0029 #define _VMWGFX_DRV_H_
0030
0031 #include <linux/suspend.h>
0032 #include <linux/sync_file.h>
0033
0034 #include <drm/drm_auth.h>
0035 #include <drm/drm_device.h>
0036 #include <drm/drm_file.h>
0037 #include <drm/drm_rect.h>
0038
0039 #include <drm/ttm/ttm_bo_driver.h>
0040 #include <drm/ttm/ttm_execbuf_util.h>
0041
0042 #include "ttm_object.h"
0043
0044 #include "vmwgfx_fence.h"
0045 #include "vmwgfx_hashtab.h"
0046 #include "vmwgfx_reg.h"
0047 #include "vmwgfx_validation.h"
0048
0049
0050
0051
0052
0053 #include <drm/vmwgfx_drm.h>
0054
0055
0056 #define VMWGFX_DRIVER_NAME "vmwgfx"
0057 #define VMWGFX_DRIVER_DATE "20211206"
0058 #define VMWGFX_DRIVER_MAJOR 2
0059 #define VMWGFX_DRIVER_MINOR 20
0060 #define VMWGFX_DRIVER_PATCHLEVEL 0
0061 #define VMWGFX_FIFO_STATIC_SIZE (1024*1024)
0062 #define VMWGFX_MAX_DISPLAYS 16
0063 #define VMWGFX_CMD_BOUNCE_INIT_SIZE 32768
0064
0065 #define VMWGFX_PCI_ID_SVGA2 0x0405
0066 #define VMWGFX_PCI_ID_SVGA3 0x0406
0067
0068
0069
0070
0071 #define VMWGFX_MAX_NUM_IRQS 6
0072
0073
0074
0075
0076 #define VMWGFX_NUM_GB_CONTEXT 256
0077 #define VMWGFX_NUM_GB_SHADER 20000
0078 #define VMWGFX_NUM_GB_SURFACE 32768
0079 #define VMWGFX_NUM_GB_SCREEN_TARGET VMWGFX_MAX_DISPLAYS
0080 #define VMWGFX_NUM_DXCONTEXT 256
0081 #define VMWGFX_NUM_DXQUERY 512
0082 #define VMWGFX_NUM_MOB (VMWGFX_NUM_GB_CONTEXT +\
0083 VMWGFX_NUM_GB_SHADER +\
0084 VMWGFX_NUM_GB_SURFACE +\
0085 VMWGFX_NUM_GB_SCREEN_TARGET)
0086
0087 #define VMW_PL_GMR (TTM_PL_PRIV + 0)
0088 #define VMW_PL_MOB (TTM_PL_PRIV + 1)
0089 #define VMW_PL_SYSTEM (TTM_PL_PRIV + 2)
0090
0091 #define VMW_RES_CONTEXT ttm_driver_type0
0092 #define VMW_RES_SURFACE ttm_driver_type1
0093 #define VMW_RES_STREAM ttm_driver_type2
0094 #define VMW_RES_FENCE ttm_driver_type3
0095 #define VMW_RES_SHADER ttm_driver_type4
0096
0097 #define MKSSTAT_CAPACITY_LOG2 5U
0098 #define MKSSTAT_CAPACITY (1U << MKSSTAT_CAPACITY_LOG2)
0099
0100 struct vmw_fpriv {
0101 struct ttm_object_file *tfile;
0102 bool gb_aware;
0103 };
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117 struct vmw_buffer_object {
0118 struct ttm_buffer_object base;
0119 struct rb_root res_tree;
0120
0121 atomic_t base_mapped_count;
0122
0123 atomic_t cpu_writers;
0124
0125 struct vmw_resource *dx_query_ctx;
0126
0127 struct ttm_bo_kmap_obj map;
0128 u32 res_prios[TTM_MAX_BO_PRIORITY];
0129 struct vmw_bo_dirty *dirty;
0130 };
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141 struct vmw_validate_buffer {
0142 struct ttm_validate_buffer base;
0143 struct vmwgfx_hash_item hash;
0144 bool validate_as_mob;
0145 };
0146
0147 struct vmw_res_func;
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178 struct vmw_resource_dirty;
0179 struct vmw_resource {
0180 struct kref kref;
0181 struct vmw_private *dev_priv;
0182 int id;
0183 u32 used_prio;
0184 unsigned long backup_size;
0185 u32 res_dirty : 1;
0186 u32 backup_dirty : 1;
0187 u32 coherent : 1;
0188 struct vmw_buffer_object *backup;
0189 unsigned long backup_offset;
0190 unsigned long pin_count;
0191 const struct vmw_res_func *func;
0192 struct rb_node mob_node;
0193 struct list_head lru_head;
0194 struct list_head binding_head;
0195 struct vmw_resource_dirty *dirty;
0196 void (*res_free) (struct vmw_resource *res);
0197 void (*hw_destroy) (struct vmw_resource *res);
0198 };
0199
0200
0201
0202
0203
0204 enum vmw_res_type {
0205 vmw_res_context,
0206 vmw_res_surface,
0207 vmw_res_stream,
0208 vmw_res_shader,
0209 vmw_res_dx_context,
0210 vmw_res_cotable,
0211 vmw_res_view,
0212 vmw_res_streamoutput,
0213 vmw_res_max
0214 };
0215
0216
0217
0218
0219 enum vmw_cmdbuf_res_type {
0220 vmw_cmdbuf_res_shader,
0221 vmw_cmdbuf_res_view,
0222 vmw_cmdbuf_res_streamoutput
0223 };
0224
0225 struct vmw_cmdbuf_res_manager;
0226
0227 struct vmw_cursor_snooper {
0228 size_t age;
0229 uint32_t *image;
0230 };
0231
0232 struct vmw_framebuffer;
0233 struct vmw_surface_offset;
0234
0235
0236
0237
0238
0239
0240
0241
0242
0243
0244
0245
0246
0247
0248
0249
0250
0251
0252
0253
0254
0255
0256 struct vmw_surface_metadata {
0257 u64 flags;
0258 u32 format;
0259 u32 mip_levels[DRM_VMW_MAX_SURFACE_FACES];
0260 u32 multisample_count;
0261 u32 multisample_pattern;
0262 u32 quality_level;
0263 u32 autogen_filter;
0264 u32 array_size;
0265 u32 num_sizes;
0266 u32 buffer_byte_stride;
0267 struct drm_vmw_size base_size;
0268 struct drm_vmw_size *sizes;
0269 bool scanout;
0270 };
0271
0272
0273
0274
0275
0276
0277
0278
0279
0280
0281 struct vmw_surface {
0282 struct vmw_resource res;
0283 struct vmw_surface_metadata metadata;
0284 struct vmw_cursor_snooper snooper;
0285 struct vmw_surface_offset *offsets;
0286 struct list_head view_list;
0287 };
0288
0289 struct vmw_fifo_state {
0290 unsigned long reserved_size;
0291 u32 *dynamic_buffer;
0292 u32 *static_buffer;
0293 unsigned long static_buffer_size;
0294 bool using_bounce_buffer;
0295 uint32_t capabilities;
0296 struct mutex fifo_mutex;
0297 struct rw_semaphore rwsem;
0298 };
0299
0300
0301
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312 struct vmw_res_cache_entry {
0313 uint32_t handle;
0314 struct vmw_resource *res;
0315 void *private;
0316 unsigned short valid_handle;
0317 unsigned short valid;
0318 };
0319
0320
0321
0322
0323 enum vmw_dma_map_mode {
0324 vmw_dma_alloc_coherent,
0325 vmw_dma_map_populate,
0326 vmw_dma_map_bind,
0327 vmw_dma_map_max
0328 };
0329
0330
0331
0332
0333
0334
0335
0336
0337 struct vmw_sg_table {
0338 enum vmw_dma_map_mode mode;
0339 struct page **pages;
0340 const dma_addr_t *addrs;
0341 struct sg_table *sgt;
0342 unsigned long num_pages;
0343 };
0344
0345
0346
0347
0348
0349
0350
0351
0352
0353
0354
0355
0356
0357
0358
0359 struct vmw_piter {
0360 struct page **pages;
0361 const dma_addr_t *addrs;
0362 struct sg_dma_page_iter iter;
0363 unsigned long i;
0364 unsigned long num_pages;
0365 bool (*next)(struct vmw_piter *);
0366 dma_addr_t (*dma_address)(struct vmw_piter *);
0367 };
0368
0369
0370 struct vmw_ttm_tt {
0371 struct ttm_tt dma_ttm;
0372 struct vmw_private *dev_priv;
0373 int gmr_id;
0374 struct vmw_mob *mob;
0375 int mem_type;
0376 struct sg_table sgt;
0377 struct vmw_sg_table vsgt;
0378 bool mapped;
0379 bool bound;
0380 };
0381
0382
0383
0384
0385 enum vmw_display_unit_type {
0386 vmw_du_invalid = 0,
0387 vmw_du_legacy,
0388 vmw_du_screen_object,
0389 vmw_du_screen_target,
0390 vmw_du_max
0391 };
0392
0393 struct vmw_validation_context;
0394 struct vmw_ctx_validation_info;
0395
0396
0397
0398
0399
0400
0401
0402
0403
0404
0405
0406
0407
0408
0409
0410
0411
0412
0413
0414
0415
0416
0417
0418
0419
0420
0421
0422
0423
0424
0425
0426
0427 struct vmw_sw_context{
0428 struct vmwgfx_open_hash res_ht;
0429 bool res_ht_initialized;
0430 bool kernel;
0431 struct vmw_fpriv *fp;
0432 struct drm_file *filp;
0433 uint32_t *cmd_bounce;
0434 uint32_t cmd_bounce_size;
0435 struct vmw_buffer_object *cur_query_bo;
0436 struct list_head bo_relocations;
0437 struct list_head res_relocations;
0438 uint32_t *buf_start;
0439 struct vmw_res_cache_entry res_cache[vmw_res_max];
0440 struct vmw_resource *last_query_ctx;
0441 bool needs_post_query_barrier;
0442 struct vmw_ctx_binding_state *staged_bindings;
0443 bool staged_bindings_inuse;
0444 struct list_head staged_cmd_res;
0445 struct list_head ctx_list;
0446 struct vmw_ctx_validation_info *dx_ctx_node;
0447 struct vmw_buffer_object *dx_query_mob;
0448 struct vmw_resource *dx_query_ctx;
0449 struct vmw_cmdbuf_res_manager *man;
0450 struct vmw_validation_context *ctx;
0451 };
0452
0453 struct vmw_legacy_display;
0454 struct vmw_overlay;
0455
0456 struct vmw_vga_topology_state {
0457 uint32_t width;
0458 uint32_t height;
0459 uint32_t primary;
0460 uint32_t pos_x;
0461 uint32_t pos_y;
0462 };
0463
0464
0465
0466
0467
0468
0469
0470
0471 struct vmw_otable {
0472 unsigned long size;
0473 struct vmw_mob *page_table;
0474 bool enabled;
0475 };
0476
0477 struct vmw_otable_batch {
0478 unsigned num_otables;
0479 struct vmw_otable *otables;
0480 struct vmw_resource *context;
0481 struct ttm_buffer_object *otable_bo;
0482 };
0483
0484 enum {
0485 VMW_IRQTHREAD_FENCE,
0486 VMW_IRQTHREAD_CMDBUF,
0487 VMW_IRQTHREAD_MAX
0488 };
0489
0490
0491
0492
0493
0494
0495
0496
0497
0498
0499 enum vmw_sm_type {
0500 VMW_SM_LEGACY = 0,
0501 VMW_SM_4,
0502 VMW_SM_4_1,
0503 VMW_SM_5,
0504 VMW_SM_5_1X,
0505 VMW_SM_MAX
0506 };
0507
0508 struct vmw_private {
0509 struct drm_device drm;
0510 struct ttm_device bdev;
0511
0512 struct drm_vma_offset_manager vma_manager;
0513 u32 pci_id;
0514 resource_size_t io_start;
0515 resource_size_t vram_start;
0516 resource_size_t vram_size;
0517 resource_size_t max_primary_mem;
0518 u32 __iomem *rmmio;
0519 u32 *fifo_mem;
0520 resource_size_t fifo_mem_size;
0521 uint32_t fb_max_width;
0522 uint32_t fb_max_height;
0523 uint32_t texture_max_width;
0524 uint32_t texture_max_height;
0525 uint32_t stdu_max_width;
0526 uint32_t stdu_max_height;
0527 uint32_t initial_width;
0528 uint32_t initial_height;
0529 uint32_t capabilities;
0530 uint32_t capabilities2;
0531 uint32_t max_gmr_ids;
0532 uint32_t max_gmr_pages;
0533 uint32_t max_mob_pages;
0534 uint32_t max_mob_size;
0535 uint32_t memory_size;
0536 bool has_gmr;
0537 bool has_mob;
0538 spinlock_t hw_lock;
0539 bool assume_16bpp;
0540 u32 irqs[VMWGFX_MAX_NUM_IRQS];
0541 u32 num_irq_vectors;
0542
0543 enum vmw_sm_type sm_type;
0544
0545
0546
0547
0548
0549 void *fb_info;
0550 enum vmw_display_unit_type active_display_unit;
0551 struct vmw_legacy_display *ldu_priv;
0552 struct vmw_overlay *overlay_priv;
0553 struct drm_property *hotplug_mode_update_property;
0554 struct drm_property *implicit_placement_property;
0555 spinlock_t cursor_lock;
0556 struct drm_atomic_state *suspend_state;
0557
0558
0559
0560
0561
0562 spinlock_t resource_lock;
0563 struct idr res_idr[vmw_res_max];
0564
0565
0566
0567
0568
0569
0570 struct ttm_object_device *tdev;
0571
0572
0573
0574
0575
0576 atomic_t marker_seq;
0577 wait_queue_head_t fence_queue;
0578 wait_queue_head_t fifo_queue;
0579 spinlock_t waiter_lock;
0580 int fence_queue_waiters;
0581 int goal_queue_waiters;
0582 int cmdbuf_waiters;
0583 int error_waiters;
0584 int fifo_queue_waiters;
0585 uint32_t last_read_seqno;
0586 struct vmw_fence_manager *fman;
0587 uint32_t irq_mask;
0588
0589
0590
0591
0592
0593 uint32_t traces_state;
0594 uint32_t enable_state;
0595 uint32_t config_done_state;
0596
0597
0598
0599
0600
0601
0602
0603
0604 struct vmw_sw_context ctx;
0605 struct mutex cmdbuf_mutex;
0606 struct mutex binding_mutex;
0607
0608 bool enable_fb;
0609
0610
0611
0612
0613 struct notifier_block pm_nb;
0614 bool refuse_hibernation;
0615 bool suspend_locked;
0616
0617 atomic_t num_fifo_resources;
0618
0619
0620
0621
0622
0623
0624 struct vmw_buffer_object *dummy_query_bo;
0625 struct vmw_buffer_object *pinned_bo;
0626 uint32_t query_cid;
0627 uint32_t query_cid_valid;
0628 bool dummy_query_bo_pinned;
0629
0630
0631
0632
0633
0634
0635
0636
0637 struct list_head res_lru[vmw_res_max];
0638 uint32_t used_memory_size;
0639
0640
0641
0642
0643 enum vmw_dma_map_mode map_mode;
0644
0645
0646
0647
0648 struct vmw_otable_batch otable_batch;
0649
0650 struct vmw_fifo_state *fifo;
0651 struct vmw_cmdbuf_man *cman;
0652 DECLARE_BITMAP(irqthread_pending, VMW_IRQTHREAD_MAX);
0653
0654 uint32 *devcaps;
0655
0656
0657
0658
0659 struct page *mksstat_user_pages[MKSSTAT_CAPACITY];
0660 atomic_t mksstat_user_pids[MKSSTAT_CAPACITY];
0661
0662 #if IS_ENABLED(CONFIG_DRM_VMWGFX_MKSSTATS)
0663 struct page *mksstat_kern_pages[MKSSTAT_CAPACITY];
0664 u8 mksstat_kern_top_timer[MKSSTAT_CAPACITY];
0665 atomic_t mksstat_kern_pids[MKSSTAT_CAPACITY];
0666 #endif
0667 };
0668
0669 static inline struct vmw_buffer_object *gem_to_vmw_bo(struct drm_gem_object *gobj)
0670 {
0671 return container_of((gobj), struct vmw_buffer_object, base.base);
0672 }
0673
0674 static inline struct vmw_surface *vmw_res_to_srf(struct vmw_resource *res)
0675 {
0676 return container_of(res, struct vmw_surface, res);
0677 }
0678
0679 static inline struct vmw_private *vmw_priv(struct drm_device *dev)
0680 {
0681 return (struct vmw_private *)dev->dev_private;
0682 }
0683
0684 static inline struct vmw_fpriv *vmw_fpriv(struct drm_file *file_priv)
0685 {
0686 return (struct vmw_fpriv *)file_priv->driver_priv;
0687 }
0688
0689
0690
0691
0692 static inline bool vmw_is_svga_v3(const struct vmw_private *dev)
0693 {
0694 return dev->pci_id == VMWGFX_PCI_ID_SVGA3;
0695 }
0696
0697
0698
0699
0700
0701
0702
0703
0704 static inline void vmw_write(struct vmw_private *dev_priv,
0705 unsigned int offset, uint32_t value)
0706 {
0707 if (vmw_is_svga_v3(dev_priv)) {
0708 iowrite32(value, dev_priv->rmmio + offset);
0709 } else {
0710 spin_lock(&dev_priv->hw_lock);
0711 outl(offset, dev_priv->io_start + SVGA_INDEX_PORT);
0712 outl(value, dev_priv->io_start + SVGA_VALUE_PORT);
0713 spin_unlock(&dev_priv->hw_lock);
0714 }
0715 }
0716
0717 static inline uint32_t vmw_read(struct vmw_private *dev_priv,
0718 unsigned int offset)
0719 {
0720 u32 val;
0721
0722 if (vmw_is_svga_v3(dev_priv)) {
0723 val = ioread32(dev_priv->rmmio + offset);
0724 } else {
0725 spin_lock(&dev_priv->hw_lock);
0726 outl(offset, dev_priv->io_start + SVGA_INDEX_PORT);
0727 val = inl(dev_priv->io_start + SVGA_VALUE_PORT);
0728 spin_unlock(&dev_priv->hw_lock);
0729 }
0730
0731 return val;
0732 }
0733
0734
0735
0736
0737
0738
0739
0740 static inline bool has_sm4_context(const struct vmw_private *dev_priv)
0741 {
0742 return (dev_priv->sm_type >= VMW_SM_4);
0743 }
0744
0745
0746
0747
0748
0749
0750
0751 static inline bool has_sm4_1_context(const struct vmw_private *dev_priv)
0752 {
0753 return (dev_priv->sm_type >= VMW_SM_4_1);
0754 }
0755
0756
0757
0758
0759
0760
0761
0762 static inline bool has_sm5_context(const struct vmw_private *dev_priv)
0763 {
0764 return (dev_priv->sm_type >= VMW_SM_5);
0765 }
0766
0767
0768
0769
0770
0771
0772
0773 static inline bool has_gl43_context(const struct vmw_private *dev_priv)
0774 {
0775 return (dev_priv->sm_type >= VMW_SM_5_1X);
0776 }
0777
0778
0779 static inline u32 vmw_max_num_uavs(struct vmw_private *dev_priv)
0780 {
0781 return (has_gl43_context(dev_priv) ?
0782 SVGA3D_DX11_1_MAX_UAVIEWS : SVGA3D_MAX_UAVIEWS);
0783 }
0784
0785 extern void vmw_svga_enable(struct vmw_private *dev_priv);
0786 extern void vmw_svga_disable(struct vmw_private *dev_priv);
0787
0788
0789
0790
0791
0792
0793 extern int vmw_gmr_bind(struct vmw_private *dev_priv,
0794 const struct vmw_sg_table *vsgt,
0795 unsigned long num_pages,
0796 int gmr_id);
0797 extern void vmw_gmr_unbind(struct vmw_private *dev_priv, int gmr_id);
0798
0799
0800
0801
0802 struct vmw_user_resource_conv;
0803
0804 extern void vmw_resource_unreference(struct vmw_resource **p_res);
0805 extern struct vmw_resource *vmw_resource_reference(struct vmw_resource *res);
0806 extern struct vmw_resource *
0807 vmw_resource_reference_unless_doomed(struct vmw_resource *res);
0808 extern int vmw_resource_validate(struct vmw_resource *res, bool intr,
0809 bool dirtying);
0810 extern int vmw_resource_reserve(struct vmw_resource *res, bool interruptible,
0811 bool no_backup);
0812 extern bool vmw_resource_needs_backup(const struct vmw_resource *res);
0813 extern int vmw_user_lookup_handle(struct vmw_private *dev_priv,
0814 struct drm_file *filp,
0815 uint32_t handle,
0816 struct vmw_surface **out_surf,
0817 struct vmw_buffer_object **out_buf);
0818 extern int vmw_user_resource_lookup_handle(
0819 struct vmw_private *dev_priv,
0820 struct ttm_object_file *tfile,
0821 uint32_t handle,
0822 const struct vmw_user_resource_conv *converter,
0823 struct vmw_resource **p_res);
0824 extern struct vmw_resource *
0825 vmw_user_resource_noref_lookup_handle(struct vmw_private *dev_priv,
0826 struct ttm_object_file *tfile,
0827 uint32_t handle,
0828 const struct vmw_user_resource_conv *
0829 converter);
0830 extern int vmw_stream_claim_ioctl(struct drm_device *dev, void *data,
0831 struct drm_file *file_priv);
0832 extern int vmw_stream_unref_ioctl(struct drm_device *dev, void *data,
0833 struct drm_file *file_priv);
0834 extern int vmw_user_stream_lookup(struct vmw_private *dev_priv,
0835 struct ttm_object_file *tfile,
0836 uint32_t *inout_id,
0837 struct vmw_resource **out);
0838 extern void vmw_resource_unreserve(struct vmw_resource *res,
0839 bool dirty_set,
0840 bool dirty,
0841 bool switch_backup,
0842 struct vmw_buffer_object *new_backup,
0843 unsigned long new_backup_offset);
0844 extern void vmw_query_move_notify(struct ttm_buffer_object *bo,
0845 struct ttm_resource *old_mem,
0846 struct ttm_resource *new_mem);
0847 extern int vmw_query_readback_all(struct vmw_buffer_object *dx_query_mob);
0848 extern void vmw_resource_evict_all(struct vmw_private *dev_priv);
0849 extern void vmw_resource_unbind_list(struct vmw_buffer_object *vbo);
0850 void vmw_resource_mob_attach(struct vmw_resource *res);
0851 void vmw_resource_mob_detach(struct vmw_resource *res);
0852 void vmw_resource_dirty_update(struct vmw_resource *res, pgoff_t start,
0853 pgoff_t end);
0854 int vmw_resources_clean(struct vmw_buffer_object *vbo, pgoff_t start,
0855 pgoff_t end, pgoff_t *num_prefault);
0856
0857
0858
0859
0860
0861
0862
0863 static inline bool vmw_resource_mob_attached(const struct vmw_resource *res)
0864 {
0865 return !RB_EMPTY_NODE(&res->mob_node);
0866 }
0867
0868
0869
0870
0871
0872 static inline void vmw_user_resource_noref_release(void)
0873 {
0874 ttm_base_object_noref_release();
0875 }
0876
0877
0878
0879
0880 extern bool vmw_bo_is_vmw_bo(struct ttm_buffer_object *bo);
0881 extern int vmw_bo_pin_in_placement(struct vmw_private *vmw_priv,
0882 struct vmw_buffer_object *bo,
0883 struct ttm_placement *placement,
0884 bool interruptible);
0885 extern int vmw_bo_pin_in_vram(struct vmw_private *dev_priv,
0886 struct vmw_buffer_object *buf,
0887 bool interruptible);
0888 extern int vmw_bo_pin_in_vram_or_gmr(struct vmw_private *dev_priv,
0889 struct vmw_buffer_object *buf,
0890 bool interruptible);
0891 extern int vmw_bo_pin_in_start_of_vram(struct vmw_private *vmw_priv,
0892 struct vmw_buffer_object *bo,
0893 bool interruptible);
0894 extern int vmw_bo_unpin(struct vmw_private *vmw_priv,
0895 struct vmw_buffer_object *bo,
0896 bool interruptible);
0897 extern void vmw_bo_get_guest_ptr(const struct ttm_buffer_object *buf,
0898 SVGAGuestPtr *ptr);
0899 extern void vmw_bo_pin_reserved(struct vmw_buffer_object *bo, bool pin);
0900 extern void vmw_bo_bo_free(struct ttm_buffer_object *bo);
0901 extern int vmw_bo_create_kernel(struct vmw_private *dev_priv,
0902 unsigned long size,
0903 struct ttm_placement *placement,
0904 struct ttm_buffer_object **p_bo);
0905 extern int vmw_bo_create(struct vmw_private *dev_priv,
0906 size_t size, struct ttm_placement *placement,
0907 bool interruptible, bool pin,
0908 void (*bo_free)(struct ttm_buffer_object *bo),
0909 struct vmw_buffer_object **p_bo);
0910 extern int vmw_bo_init(struct vmw_private *dev_priv,
0911 struct vmw_buffer_object *vmw_bo,
0912 size_t size, struct ttm_placement *placement,
0913 bool interruptible, bool pin,
0914 void (*bo_free)(struct ttm_buffer_object *bo));
0915 extern int vmw_bo_unref_ioctl(struct drm_device *dev, void *data,
0916 struct drm_file *file_priv);
0917 extern int vmw_user_bo_synccpu_ioctl(struct drm_device *dev, void *data,
0918 struct drm_file *file_priv);
0919 extern int vmw_user_bo_lookup(struct drm_file *filp,
0920 uint32_t handle,
0921 struct vmw_buffer_object **out);
0922 extern void vmw_bo_fence_single(struct ttm_buffer_object *bo,
0923 struct vmw_fence_obj *fence);
0924 extern void *vmw_bo_map_and_cache(struct vmw_buffer_object *vbo);
0925 extern void vmw_bo_unmap(struct vmw_buffer_object *vbo);
0926 extern void vmw_bo_move_notify(struct ttm_buffer_object *bo,
0927 struct ttm_resource *mem);
0928 extern void vmw_bo_swap_notify(struct ttm_buffer_object *bo);
0929 extern struct vmw_buffer_object *
0930 vmw_user_bo_noref_lookup(struct drm_file *filp, u32 handle);
0931
0932
0933
0934
0935
0936
0937 static inline void vmw_bo_prio_adjust(struct vmw_buffer_object *vbo)
0938 {
0939 int i = ARRAY_SIZE(vbo->res_prios);
0940
0941 while (i--) {
0942 if (vbo->res_prios[i]) {
0943 vbo->base.priority = i;
0944 return;
0945 }
0946 }
0947
0948 vbo->base.priority = 3;
0949 }
0950
0951
0952
0953
0954
0955
0956
0957
0958
0959
0960 static inline void vmw_bo_prio_add(struct vmw_buffer_object *vbo, int prio)
0961 {
0962 if (vbo->res_prios[prio]++ == 0)
0963 vmw_bo_prio_adjust(vbo);
0964 }
0965
0966
0967
0968
0969
0970
0971
0972
0973
0974
0975 static inline void vmw_bo_prio_del(struct vmw_buffer_object *vbo, int prio)
0976 {
0977 if (--vbo->res_prios[prio] == 0)
0978 vmw_bo_prio_adjust(vbo);
0979 }
0980
0981
0982
0983
0984 extern int vmw_gem_object_create_with_handle(struct vmw_private *dev_priv,
0985 struct drm_file *filp,
0986 uint32_t size,
0987 uint32_t *handle,
0988 struct vmw_buffer_object **p_vbo);
0989 extern int vmw_gem_object_create_ioctl(struct drm_device *dev, void *data,
0990 struct drm_file *filp);
0991 extern void vmw_gem_destroy(struct ttm_buffer_object *bo);
0992 extern void vmw_debugfs_gem_init(struct vmw_private *vdev);
0993
0994
0995
0996
0997
0998 extern int vmw_getparam_ioctl(struct drm_device *dev, void *data,
0999 struct drm_file *file_priv);
1000 extern int vmw_get_cap_3d_ioctl(struct drm_device *dev, void *data,
1001 struct drm_file *file_priv);
1002 extern int vmw_present_ioctl(struct drm_device *dev, void *data,
1003 struct drm_file *file_priv);
1004 extern int vmw_present_readback_ioctl(struct drm_device *dev, void *data,
1005 struct drm_file *file_priv);
1006
1007
1008
1009
1010
1011 extern struct vmw_fifo_state *vmw_fifo_create(struct vmw_private *dev_priv);
1012 extern void vmw_fifo_destroy(struct vmw_private *dev_priv);
1013 extern bool vmw_cmd_supported(struct vmw_private *vmw);
1014 extern void *
1015 vmw_cmd_ctx_reserve(struct vmw_private *dev_priv, uint32_t bytes, int ctx_id);
1016 extern void vmw_cmd_commit(struct vmw_private *dev_priv, uint32_t bytes);
1017 extern void vmw_cmd_commit_flush(struct vmw_private *dev_priv, uint32_t bytes);
1018 extern int vmw_cmd_send_fence(struct vmw_private *dev_priv, uint32_t *seqno);
1019 extern bool vmw_supports_3d(struct vmw_private *dev_priv);
1020 extern void vmw_fifo_ping_host(struct vmw_private *dev_priv, uint32_t reason);
1021 extern bool vmw_fifo_have_pitchlock(struct vmw_private *dev_priv);
1022 extern int vmw_cmd_emit_dummy_query(struct vmw_private *dev_priv,
1023 uint32_t cid);
1024 extern int vmw_cmd_flush(struct vmw_private *dev_priv,
1025 bool interruptible);
1026
1027 #define VMW_CMD_CTX_RESERVE(__priv, __bytes, __ctx_id) \
1028 ({ \
1029 vmw_cmd_ctx_reserve(__priv, __bytes, __ctx_id) ? : ({ \
1030 DRM_ERROR("FIFO reserve failed at %s for %u bytes\n", \
1031 __func__, (unsigned int) __bytes); \
1032 NULL; \
1033 }); \
1034 })
1035
1036 #define VMW_CMD_RESERVE(__priv, __bytes) \
1037 VMW_CMD_CTX_RESERVE(__priv, __bytes, SVGA3D_INVALID_ID)
1038
1039
1040
1041
1042
1043
1044
1045 static inline uint32_t vmw_fifo_caps(const struct vmw_private *dev_priv)
1046 {
1047 if (!dev_priv->fifo_mem || !dev_priv->fifo)
1048 return 0;
1049 return dev_priv->fifo->capabilities;
1050 }
1051
1052
1053
1054
1055
1056
1057
1058 static inline bool
1059 vmw_is_cursor_bypass3_enabled(const struct vmw_private *dev_priv)
1060 {
1061 return (vmw_fifo_caps(dev_priv) & SVGA_FIFO_CAP_CURSOR_BYPASS_3) != 0;
1062 }
1063
1064
1065
1066
1067
1068 extern int vmw_mmap(struct file *filp, struct vm_area_struct *vma);
1069
1070
1071
1072
1073
1074 extern const size_t vmw_tt_size;
1075 extern struct ttm_placement vmw_vram_placement;
1076 extern struct ttm_placement vmw_vram_sys_placement;
1077 extern struct ttm_placement vmw_vram_gmr_placement;
1078 extern struct ttm_placement vmw_sys_placement;
1079 extern struct ttm_placement vmw_srf_placement;
1080 extern struct ttm_placement vmw_mob_placement;
1081 extern struct ttm_placement vmw_nonfixed_placement;
1082 extern struct ttm_device_funcs vmw_bo_driver;
1083 extern const struct vmw_sg_table *
1084 vmw_bo_sg_table(struct ttm_buffer_object *bo);
1085 extern int vmw_bo_create_and_populate(struct vmw_private *dev_priv,
1086 unsigned long bo_size,
1087 struct ttm_buffer_object **bo_p);
1088
1089 extern void vmw_piter_start(struct vmw_piter *viter,
1090 const struct vmw_sg_table *vsgt,
1091 unsigned long p_offs);
1092
1093
1094
1095
1096
1097
1098
1099
1100 static inline bool vmw_piter_next(struct vmw_piter *viter)
1101 {
1102 return viter->next(viter);
1103 }
1104
1105
1106
1107
1108
1109
1110
1111
1112 static inline dma_addr_t vmw_piter_dma_addr(struct vmw_piter *viter)
1113 {
1114 return viter->dma_address(viter);
1115 }
1116
1117
1118
1119
1120
1121
1122
1123
1124 static inline struct page *vmw_piter_page(struct vmw_piter *viter)
1125 {
1126 return viter->pages[viter->i];
1127 }
1128
1129
1130
1131
1132
1133 extern int vmw_execbuf_ioctl(struct drm_device *dev, void *data,
1134 struct drm_file *file_priv);
1135 extern int vmw_execbuf_process(struct drm_file *file_priv,
1136 struct vmw_private *dev_priv,
1137 void __user *user_commands,
1138 void *kernel_commands,
1139 uint32_t command_size,
1140 uint64_t throttle_us,
1141 uint32_t dx_context_handle,
1142 struct drm_vmw_fence_rep __user
1143 *user_fence_rep,
1144 struct vmw_fence_obj **out_fence,
1145 uint32_t flags);
1146 extern void __vmw_execbuf_release_pinned_bo(struct vmw_private *dev_priv,
1147 struct vmw_fence_obj *fence);
1148 extern void vmw_execbuf_release_pinned_bo(struct vmw_private *dev_priv);
1149
1150 extern int vmw_execbuf_fence_commands(struct drm_file *file_priv,
1151 struct vmw_private *dev_priv,
1152 struct vmw_fence_obj **p_fence,
1153 uint32_t *p_handle);
1154 extern int vmw_execbuf_copy_fence_user(struct vmw_private *dev_priv,
1155 struct vmw_fpriv *vmw_fp,
1156 int ret,
1157 struct drm_vmw_fence_rep __user
1158 *user_fence_rep,
1159 struct vmw_fence_obj *fence,
1160 uint32_t fence_handle,
1161 int32_t out_fence_fd);
1162 bool vmw_cmd_describe(const void *buf, u32 *size, char const **cmd);
1163
1164
1165
1166
1167
1168 extern int vmw_irq_install(struct vmw_private *dev_priv);
1169 extern void vmw_irq_uninstall(struct drm_device *dev);
1170 extern bool vmw_seqno_passed(struct vmw_private *dev_priv,
1171 uint32_t seqno);
1172 extern int vmw_fallback_wait(struct vmw_private *dev_priv,
1173 bool lazy,
1174 bool fifo_idle,
1175 uint32_t seqno,
1176 bool interruptible,
1177 unsigned long timeout);
1178 extern void vmw_update_seqno(struct vmw_private *dev_priv);
1179 extern void vmw_seqno_waiter_add(struct vmw_private *dev_priv);
1180 extern void vmw_seqno_waiter_remove(struct vmw_private *dev_priv);
1181 extern void vmw_goal_waiter_add(struct vmw_private *dev_priv);
1182 extern void vmw_goal_waiter_remove(struct vmw_private *dev_priv);
1183 extern void vmw_generic_waiter_add(struct vmw_private *dev_priv, u32 flag,
1184 int *waiter_count);
1185 extern void vmw_generic_waiter_remove(struct vmw_private *dev_priv,
1186 u32 flag, int *waiter_count);
1187
1188
1189
1190
1191
1192
1193 #ifdef CONFIG_DRM_FBDEV_EMULATION
1194 int vmw_fb_init(struct vmw_private *vmw_priv);
1195 int vmw_fb_close(struct vmw_private *dev_priv);
1196 int vmw_fb_off(struct vmw_private *vmw_priv);
1197 int vmw_fb_on(struct vmw_private *vmw_priv);
1198 #else
1199 static inline int vmw_fb_init(struct vmw_private *vmw_priv)
1200 {
1201 return 0;
1202 }
1203 static inline int vmw_fb_close(struct vmw_private *dev_priv)
1204 {
1205 return 0;
1206 }
1207 static inline int vmw_fb_off(struct vmw_private *vmw_priv)
1208 {
1209 return 0;
1210 }
1211 static inline int vmw_fb_on(struct vmw_private *vmw_priv)
1212 {
1213 return 0;
1214 }
1215 #endif
1216
1217
1218
1219
1220
1221 int vmw_kms_init(struct vmw_private *dev_priv);
1222 int vmw_kms_close(struct vmw_private *dev_priv);
1223 int vmw_kms_cursor_bypass_ioctl(struct drm_device *dev, void *data,
1224 struct drm_file *file_priv);
1225 void vmw_kms_cursor_post_execbuf(struct vmw_private *dev_priv);
1226 void vmw_kms_cursor_snoop(struct vmw_surface *srf,
1227 struct ttm_object_file *tfile,
1228 struct ttm_buffer_object *bo,
1229 SVGA3dCmdHeader *header);
1230 int vmw_kms_write_svga(struct vmw_private *vmw_priv,
1231 unsigned width, unsigned height, unsigned pitch,
1232 unsigned bpp, unsigned depth);
1233 bool vmw_kms_validate_mode_vram(struct vmw_private *dev_priv,
1234 uint32_t pitch,
1235 uint32_t height);
1236 u32 vmw_get_vblank_counter(struct drm_crtc *crtc);
1237 int vmw_enable_vblank(struct drm_crtc *crtc);
1238 void vmw_disable_vblank(struct drm_crtc *crtc);
1239 int vmw_kms_present(struct vmw_private *dev_priv,
1240 struct drm_file *file_priv,
1241 struct vmw_framebuffer *vfb,
1242 struct vmw_surface *surface,
1243 uint32_t sid, int32_t destX, int32_t destY,
1244 struct drm_vmw_rect *clips,
1245 uint32_t num_clips);
1246 int vmw_kms_update_layout_ioctl(struct drm_device *dev, void *data,
1247 struct drm_file *file_priv);
1248 void vmw_kms_legacy_hotspot_clear(struct vmw_private *dev_priv);
1249 int vmw_kms_suspend(struct drm_device *dev);
1250 int vmw_kms_resume(struct drm_device *dev);
1251 void vmw_kms_lost_device(struct drm_device *dev);
1252
1253 int vmw_dumb_create(struct drm_file *file_priv,
1254 struct drm_device *dev,
1255 struct drm_mode_create_dumb *args);
1256 extern int vmw_resource_pin(struct vmw_resource *res, bool interruptible);
1257 extern void vmw_resource_unpin(struct vmw_resource *res);
1258 extern enum vmw_res_type vmw_res_type(const struct vmw_resource *res);
1259
1260
1261
1262
1263
1264 int vmw_overlay_init(struct vmw_private *dev_priv);
1265 int vmw_overlay_close(struct vmw_private *dev_priv);
1266 int vmw_overlay_ioctl(struct drm_device *dev, void *data,
1267 struct drm_file *file_priv);
1268 int vmw_overlay_resume_all(struct vmw_private *dev_priv);
1269 int vmw_overlay_pause_all(struct vmw_private *dev_priv);
1270 int vmw_overlay_claim(struct vmw_private *dev_priv, uint32_t *out);
1271 int vmw_overlay_unref(struct vmw_private *dev_priv, uint32_t stream_id);
1272 int vmw_overlay_num_overlays(struct vmw_private *dev_priv);
1273 int vmw_overlay_num_free_overlays(struct vmw_private *dev_priv);
1274
1275
1276
1277
1278
1279 int vmw_gmrid_man_init(struct vmw_private *dev_priv, int type);
1280 void vmw_gmrid_man_fini(struct vmw_private *dev_priv, int type);
1281
1282
1283
1284
1285 int vmw_sys_man_init(struct vmw_private *dev_priv);
1286 void vmw_sys_man_fini(struct vmw_private *dev_priv);
1287
1288
1289
1290
1291
1292 extern const struct dma_buf_ops vmw_prime_dmabuf_ops;
1293 extern int vmw_prime_fd_to_handle(struct drm_device *dev,
1294 struct drm_file *file_priv,
1295 int fd, u32 *handle);
1296 extern int vmw_prime_handle_to_fd(struct drm_device *dev,
1297 struct drm_file *file_priv,
1298 uint32_t handle, uint32_t flags,
1299 int *prime_fd);
1300
1301
1302
1303
1304 struct vmw_mob;
1305 extern int vmw_mob_bind(struct vmw_private *dev_priv, struct vmw_mob *mob,
1306 const struct vmw_sg_table *vsgt,
1307 unsigned long num_data_pages, int32_t mob_id);
1308 extern void vmw_mob_unbind(struct vmw_private *dev_priv,
1309 struct vmw_mob *mob);
1310 extern void vmw_mob_destroy(struct vmw_mob *mob);
1311 extern struct vmw_mob *vmw_mob_create(unsigned long data_pages);
1312 extern int vmw_otables_setup(struct vmw_private *dev_priv);
1313 extern void vmw_otables_takedown(struct vmw_private *dev_priv);
1314
1315
1316
1317
1318
1319 extern const struct vmw_user_resource_conv *user_context_converter;
1320
1321 extern int vmw_context_define_ioctl(struct drm_device *dev, void *data,
1322 struct drm_file *file_priv);
1323 extern int vmw_extended_context_define_ioctl(struct drm_device *dev, void *data,
1324 struct drm_file *file_priv);
1325 extern int vmw_context_destroy_ioctl(struct drm_device *dev, void *data,
1326 struct drm_file *file_priv);
1327 extern struct list_head *vmw_context_binding_list(struct vmw_resource *ctx);
1328 extern struct vmw_cmdbuf_res_manager *
1329 vmw_context_res_man(struct vmw_resource *ctx);
1330 extern struct vmw_resource *vmw_context_cotable(struct vmw_resource *ctx,
1331 SVGACOTableType cotable_type);
1332 struct vmw_ctx_binding_state;
1333 extern struct vmw_ctx_binding_state *
1334 vmw_context_binding_state(struct vmw_resource *ctx);
1335 extern void vmw_dx_context_scrub_cotables(struct vmw_resource *ctx,
1336 bool readback);
1337 extern int vmw_context_bind_dx_query(struct vmw_resource *ctx_res,
1338 struct vmw_buffer_object *mob);
1339 extern struct vmw_buffer_object *
1340 vmw_context_get_dx_query_mob(struct vmw_resource *ctx_res);
1341
1342
1343
1344
1345
1346
1347 extern const struct vmw_user_resource_conv *user_surface_converter;
1348
1349 extern int vmw_surface_destroy_ioctl(struct drm_device *dev, void *data,
1350 struct drm_file *file_priv);
1351 extern int vmw_surface_define_ioctl(struct drm_device *dev, void *data,
1352 struct drm_file *file_priv);
1353 extern int vmw_surface_reference_ioctl(struct drm_device *dev, void *data,
1354 struct drm_file *file_priv);
1355 extern int vmw_gb_surface_define_ioctl(struct drm_device *dev, void *data,
1356 struct drm_file *file_priv);
1357 extern int vmw_gb_surface_reference_ioctl(struct drm_device *dev, void *data,
1358 struct drm_file *file_priv);
1359 extern int vmw_gb_surface_define_ext_ioctl(struct drm_device *dev,
1360 void *data,
1361 struct drm_file *file_priv);
1362 extern int vmw_gb_surface_reference_ext_ioctl(struct drm_device *dev,
1363 void *data,
1364 struct drm_file *file_priv);
1365
1366 int vmw_gb_surface_define(struct vmw_private *dev_priv,
1367 const struct vmw_surface_metadata *req,
1368 struct vmw_surface **srf_out);
1369
1370
1371
1372
1373
1374 extern const struct vmw_user_resource_conv *user_shader_converter;
1375
1376 extern int vmw_shader_define_ioctl(struct drm_device *dev, void *data,
1377 struct drm_file *file_priv);
1378 extern int vmw_shader_destroy_ioctl(struct drm_device *dev, void *data,
1379 struct drm_file *file_priv);
1380 extern int vmw_compat_shader_add(struct vmw_private *dev_priv,
1381 struct vmw_cmdbuf_res_manager *man,
1382 u32 user_key, const void *bytecode,
1383 SVGA3dShaderType shader_type,
1384 size_t size,
1385 struct list_head *list);
1386 extern int vmw_shader_remove(struct vmw_cmdbuf_res_manager *man,
1387 u32 user_key, SVGA3dShaderType shader_type,
1388 struct list_head *list);
1389 extern int vmw_dx_shader_add(struct vmw_cmdbuf_res_manager *man,
1390 struct vmw_resource *ctx,
1391 u32 user_key,
1392 SVGA3dShaderType shader_type,
1393 struct list_head *list);
1394 extern void vmw_dx_shader_cotable_list_scrub(struct vmw_private *dev_priv,
1395 struct list_head *list,
1396 bool readback);
1397
1398 extern struct vmw_resource *
1399 vmw_shader_lookup(struct vmw_cmdbuf_res_manager *man,
1400 u32 user_key, SVGA3dShaderType shader_type);
1401
1402
1403
1404
1405 struct vmw_resource *
1406 vmw_dx_streamoutput_lookup(struct vmw_cmdbuf_res_manager *man,
1407 u32 user_key);
1408 int vmw_dx_streamoutput_add(struct vmw_cmdbuf_res_manager *man,
1409 struct vmw_resource *ctx,
1410 SVGA3dStreamOutputId user_key,
1411 struct list_head *list);
1412 void vmw_dx_streamoutput_set_size(struct vmw_resource *res, u32 size);
1413 int vmw_dx_streamoutput_remove(struct vmw_cmdbuf_res_manager *man,
1414 SVGA3dStreamOutputId user_key,
1415 struct list_head *list);
1416 void vmw_dx_streamoutput_cotable_list_scrub(struct vmw_private *dev_priv,
1417 struct list_head *list,
1418 bool readback);
1419
1420
1421
1422
1423
1424 extern struct vmw_cmdbuf_res_manager *
1425 vmw_cmdbuf_res_man_create(struct vmw_private *dev_priv);
1426 extern void vmw_cmdbuf_res_man_destroy(struct vmw_cmdbuf_res_manager *man);
1427 extern struct vmw_resource *
1428 vmw_cmdbuf_res_lookup(struct vmw_cmdbuf_res_manager *man,
1429 enum vmw_cmdbuf_res_type res_type,
1430 u32 user_key);
1431 extern void vmw_cmdbuf_res_revert(struct list_head *list);
1432 extern void vmw_cmdbuf_res_commit(struct list_head *list);
1433 extern int vmw_cmdbuf_res_add(struct vmw_cmdbuf_res_manager *man,
1434 enum vmw_cmdbuf_res_type res_type,
1435 u32 user_key,
1436 struct vmw_resource *res,
1437 struct list_head *list);
1438 extern int vmw_cmdbuf_res_remove(struct vmw_cmdbuf_res_manager *man,
1439 enum vmw_cmdbuf_res_type res_type,
1440 u32 user_key,
1441 struct list_head *list,
1442 struct vmw_resource **res);
1443
1444
1445
1446
1447 extern const SVGACOTableType vmw_cotable_scrub_order[];
1448 extern struct vmw_resource *vmw_cotable_alloc(struct vmw_private *dev_priv,
1449 struct vmw_resource *ctx,
1450 u32 type);
1451 extern int vmw_cotable_notify(struct vmw_resource *res, int id);
1452 extern int vmw_cotable_scrub(struct vmw_resource *res, bool readback);
1453 extern void vmw_cotable_add_resource(struct vmw_resource *ctx,
1454 struct list_head *head);
1455
1456
1457
1458
1459 struct vmw_cmdbuf_man;
1460 struct vmw_cmdbuf_header;
1461
1462 extern struct vmw_cmdbuf_man *
1463 vmw_cmdbuf_man_create(struct vmw_private *dev_priv);
1464 extern int vmw_cmdbuf_set_pool_size(struct vmw_cmdbuf_man *man, size_t size);
1465 extern void vmw_cmdbuf_remove_pool(struct vmw_cmdbuf_man *man);
1466 extern void vmw_cmdbuf_man_destroy(struct vmw_cmdbuf_man *man);
1467 extern int vmw_cmdbuf_idle(struct vmw_cmdbuf_man *man, bool interruptible,
1468 unsigned long timeout);
1469 extern void *vmw_cmdbuf_reserve(struct vmw_cmdbuf_man *man, size_t size,
1470 int ctx_id, bool interruptible,
1471 struct vmw_cmdbuf_header *header);
1472 extern void vmw_cmdbuf_commit(struct vmw_cmdbuf_man *man, size_t size,
1473 struct vmw_cmdbuf_header *header,
1474 bool flush);
1475 extern void *vmw_cmdbuf_alloc(struct vmw_cmdbuf_man *man,
1476 size_t size, bool interruptible,
1477 struct vmw_cmdbuf_header **p_header);
1478 extern void vmw_cmdbuf_header_free(struct vmw_cmdbuf_header *header);
1479 extern int vmw_cmdbuf_cur_flush(struct vmw_cmdbuf_man *man,
1480 bool interruptible);
1481 extern void vmw_cmdbuf_irqthread(struct vmw_cmdbuf_man *man);
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494 struct vmw_diff_cpy {
1495 struct drm_rect rect;
1496 size_t line;
1497 size_t line_offset;
1498 int cpp;
1499 void (*do_cpy)(struct vmw_diff_cpy *diff, u8 *dest, const u8 *src,
1500 size_t n);
1501 };
1502
1503 #define VMW_CPU_BLIT_INITIALIZER { \
1504 .do_cpy = vmw_memcpy, \
1505 }
1506
1507 #define VMW_CPU_BLIT_DIFF_INITIALIZER(_cpp) { \
1508 .line = 0, \
1509 .line_offset = 0, \
1510 .rect = { .x1 = INT_MAX/2, \
1511 .y1 = INT_MAX/2, \
1512 .x2 = INT_MIN/2, \
1513 .y2 = INT_MIN/2 \
1514 }, \
1515 .cpp = _cpp, \
1516 .do_cpy = vmw_diff_memcpy, \
1517 }
1518
1519 void vmw_diff_memcpy(struct vmw_diff_cpy *diff, u8 *dest, const u8 *src,
1520 size_t n);
1521
1522 void vmw_memcpy(struct vmw_diff_cpy *diff, u8 *dest, const u8 *src, size_t n);
1523
1524 int vmw_bo_cpu_blit(struct ttm_buffer_object *dst,
1525 u32 dst_offset, u32 dst_stride,
1526 struct ttm_buffer_object *src,
1527 u32 src_offset, u32 src_stride,
1528 u32 w, u32 h,
1529 struct vmw_diff_cpy *diff);
1530
1531
1532 int vmw_host_get_guestinfo(const char *guest_info_param,
1533 char *buffer, size_t *length);
1534 __printf(1, 2) int vmw_host_printf(const char *fmt, ...);
1535 int vmw_msg_ioctl(struct drm_device *dev, void *data,
1536 struct drm_file *file_priv);
1537
1538
1539 int vmw_mksstat_get_kern_slot(pid_t pid, struct vmw_private *dev_priv);
1540
1541 int vmw_mksstat_reset_ioctl(struct drm_device *dev, void *data,
1542 struct drm_file *file_priv);
1543 int vmw_mksstat_add_ioctl(struct drm_device *dev, void *data,
1544 struct drm_file *file_priv);
1545 int vmw_mksstat_remove_ioctl(struct drm_device *dev, void *data,
1546 struct drm_file *file_priv);
1547 int vmw_mksstat_remove_all(struct vmw_private *dev_priv);
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560 #define VMW_DEBUG_USER(fmt, ...) \
1561 DRM_DEBUG_DRIVER(fmt, ##__VA_ARGS__)
1562
1563
1564 void vmw_bo_dirty_scan(struct vmw_buffer_object *vbo);
1565 int vmw_bo_dirty_add(struct vmw_buffer_object *vbo);
1566 void vmw_bo_dirty_transfer_to_res(struct vmw_resource *res);
1567 void vmw_bo_dirty_clear_res(struct vmw_resource *res);
1568 void vmw_bo_dirty_release(struct vmw_buffer_object *vbo);
1569 void vmw_bo_dirty_unmap(struct vmw_buffer_object *vbo,
1570 pgoff_t start, pgoff_t end);
1571 vm_fault_t vmw_bo_vm_fault(struct vm_fault *vmf);
1572 vm_fault_t vmw_bo_vm_mkwrite(struct vm_fault *vmf);
1573
1574
1575
1576
1577
1578
1579
1580 #define VMW_DEBUG_KMS(fmt, ...) \
1581 DRM_DEBUG_DRIVER(fmt, ##__VA_ARGS__)
1582
1583
1584
1585
1586
1587 static inline void vmw_surface_unreference(struct vmw_surface **srf)
1588 {
1589 struct vmw_surface *tmp_srf = *srf;
1590 struct vmw_resource *res = &tmp_srf->res;
1591 *srf = NULL;
1592
1593 vmw_resource_unreference(&res);
1594 }
1595
1596 static inline struct vmw_surface *vmw_surface_reference(struct vmw_surface *srf)
1597 {
1598 (void) vmw_resource_reference(&srf->res);
1599 return srf;
1600 }
1601
1602 static inline void vmw_bo_unreference(struct vmw_buffer_object **buf)
1603 {
1604 struct vmw_buffer_object *tmp_buf = *buf;
1605
1606 *buf = NULL;
1607 if (tmp_buf != NULL)
1608 ttm_bo_put(&tmp_buf->base);
1609 }
1610
1611 static inline struct vmw_buffer_object *
1612 vmw_bo_reference(struct vmw_buffer_object *buf)
1613 {
1614 ttm_bo_get(&buf->base);
1615 return buf;
1616 }
1617
1618 static inline void vmw_fifo_resource_inc(struct vmw_private *dev_priv)
1619 {
1620 atomic_inc(&dev_priv->num_fifo_resources);
1621 }
1622
1623 static inline void vmw_fifo_resource_dec(struct vmw_private *dev_priv)
1624 {
1625 atomic_dec(&dev_priv->num_fifo_resources);
1626 }
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636 static inline u32 vmw_fifo_mem_read(struct vmw_private *vmw, uint32 fifo_reg)
1637 {
1638 BUG_ON(vmw_is_svga_v3(vmw));
1639 return READ_ONCE(*(vmw->fifo_mem + fifo_reg));
1640 }
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650 static inline void vmw_fifo_mem_write(struct vmw_private *vmw, u32 fifo_reg,
1651 u32 value)
1652 {
1653 BUG_ON(vmw_is_svga_v3(vmw));
1654 WRITE_ONCE(*(vmw->fifo_mem + fifo_reg), value);
1655 }
1656
1657 static inline u32 vmw_fence_read(struct vmw_private *dev_priv)
1658 {
1659 u32 fence;
1660 if (vmw_is_svga_v3(dev_priv))
1661 fence = vmw_read(dev_priv, SVGA_REG_FENCE);
1662 else
1663 fence = vmw_fifo_mem_read(dev_priv, SVGA_FIFO_FENCE);
1664 return fence;
1665 }
1666
1667 static inline void vmw_fence_write(struct vmw_private *dev_priv,
1668 u32 fence)
1669 {
1670 BUG_ON(vmw_is_svga_v3(dev_priv));
1671 vmw_fifo_mem_write(dev_priv, SVGA_FIFO_FENCE, fence);
1672 }
1673
1674 static inline u32 vmw_irq_status_read(struct vmw_private *vmw)
1675 {
1676 u32 status;
1677 if (vmw_is_svga_v3(vmw))
1678 status = vmw_read(vmw, SVGA_REG_IRQ_STATUS);
1679 else
1680 status = inl(vmw->io_start + SVGA_IRQSTATUS_PORT);
1681 return status;
1682 }
1683
1684 static inline void vmw_irq_status_write(struct vmw_private *vmw,
1685 uint32 status)
1686 {
1687 if (vmw_is_svga_v3(vmw))
1688 vmw_write(vmw, SVGA_REG_IRQ_STATUS, status);
1689 else
1690 outl(status, vmw->io_start + SVGA_IRQSTATUS_PORT);
1691 }
1692
1693 static inline bool vmw_has_fences(struct vmw_private *vmw)
1694 {
1695 if ((vmw->capabilities & (SVGA_CAP_COMMAND_BUFFERS |
1696 SVGA_CAP_CMD_BUFFERS_2)) != 0)
1697 return true;
1698 return (vmw_fifo_caps(vmw) & SVGA_FIFO_CAP_FENCE) != 0;
1699 }
1700
1701 #endif