Rev 4111 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4111 | Rev 4569 | ||
---|---|---|---|
Line 33... | Line 33... | ||
33 | #include |
33 | #include |
Line 34... | Line 34... | ||
34 | 34 | ||
35 | #define VMW_PPN_SIZE (sizeof(unsigned long)) |
35 | #define VMW_PPN_SIZE (sizeof(unsigned long)) |
36 | /* A future safe maximum remap size. */ |
36 | /* A future safe maximum remap size. */ |
- | 37 | #define VMW_PPN_PER_REMAP ((31 * 1024) / VMW_PPN_SIZE) |
|
- | 38 | #define DMA_ADDR_INVALID ((dma_addr_t) 0) |
|
Line 37... | Line 39... | ||
37 | #define VMW_PPN_PER_REMAP ((31 * 1024) / VMW_PPN_SIZE) |
39 | #define DMA_PAGE_INVALID 0UL |
38 | 40 | ||
39 | static int vmw_gmr2_bind(struct vmw_private *dev_priv, |
41 | static int vmw_gmr2_bind(struct vmw_private *dev_priv, |
40 | struct page *pages[], |
42 | struct vmw_piter *iter, |
41 | unsigned long num_pages, |
43 | unsigned long num_pages, |
42 | int gmr_id) |
44 | int gmr_id) |
43 | { |
45 | { |
Line 82... | Line 84... | ||
82 | memcpy(cmd, &remap_cmd, sizeof(remap_cmd)); |
84 | memcpy(cmd, &remap_cmd, sizeof(remap_cmd)); |
83 | cmd += sizeof(remap_cmd) / sizeof(*cmd); |
85 | cmd += sizeof(remap_cmd) / sizeof(*cmd); |
Line 84... | Line 86... | ||
84 | 86 | ||
85 | for (i = 0; i < nr; ++i) { |
87 | for (i = 0; i < nr; ++i) { |
86 | if (VMW_PPN_SIZE <= 4) |
88 | if (VMW_PPN_SIZE <= 4) |
87 | *cmd = page_to_pfn(*pages++); |
89 | *cmd = vmw_piter_dma_addr(iter) >> PAGE_SHIFT; |
88 | else |
90 | else |
- | 91 | *((uint64_t *)cmd) = vmw_piter_dma_addr(iter) >> |
|
Line 89... | Line 92... | ||
89 | *((uint64_t *)cmd) = page_to_pfn(*pages++); |
92 | PAGE_SHIFT; |
- | 93 | ||
90 | 94 | cmd += VMW_PPN_SIZE / sizeof(*cmd); |
|
Line 91... | Line 95... | ||
91 | cmd += VMW_PPN_SIZE / sizeof(*cmd); |
95 | vmw_piter_next(iter); |
92 | } |
96 | } |
93 | 97 | ||
Line 123... | Line 127... | ||
123 | vmw_fifo_commit(dev_priv, define_size); |
127 | vmw_fifo_commit(dev_priv, define_size); |
124 | } |
128 | } |
Line 125... | Line 129... | ||
125 | 129 | ||
126 | 130 | ||
127 | int vmw_gmr_bind(struct vmw_private *dev_priv, |
131 | int vmw_gmr_bind(struct vmw_private *dev_priv, |
128 | struct page *pages[], |
132 | const struct vmw_sg_table *vsgt, |
129 | unsigned long num_pages, |
133 | unsigned long num_pages, |
130 | int gmr_id) |
134 | int gmr_id) |
131 | { |
- | |
Line 132... | Line 135... | ||
132 | struct list_head desc_pages; |
135 | { |
- | 136 | struct vmw_piter data_iter; |
|
133 | int ret; |
137 | |
- | 138 | vmw_piter_start(&data_iter, vsgt, 0); |
|
Line 134... | Line 139... | ||
134 | 139 | ||
135 | if (likely(dev_priv->capabilities & SVGA_CAP_GMR2)) |
140 | if (unlikely(!vmw_piter_next(&data_iter))) |
- | 141 | return 0; |
|
- | 142 | ||
136 | return vmw_gmr2_bind(dev_priv, pages, num_pages, gmr_id); |
143 | if (unlikely(!(dev_priv->capabilities & SVGA_CAP_GMR2))) |
Line 137... | Line 144... | ||
137 | 144 | return -EINVAL; |
|
138 | printf("%s epic fail\n",__FUNCTION__); |
145 | |
139 | return -EINVAL; |
146 | return vmw_gmr2_bind(dev_priv, &data_iter, num_pages, gmr_id); |
140 | } |
147 | } |
141 | - | ||
142 | - | ||
143 | void vmw_gmr_unbind(struct vmw_private *dev_priv, int gmr_id) |
- | |
144 | { |
- | |
145 | if (likely(dev_priv->capabilities & SVGA_CAP_GMR2)) { |
- | |
146 | vmw_gmr2_unbind(dev_priv, gmr_id); |
- | |
147 | return; |
- | |
148 | } |
- | |
149 | - | ||
150 | mutex_lock(&dev_priv->hw_mutex); |
148 |