Subversion Repositories Kolibri OS

Rev

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