xref: /linux/drivers/vfio/pci/pds/dirty.c (revision 32a92f8c89326985e05dce8b22d3f0aa07a3e1bd)
1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright(c) 2023 Advanced Micro Devices, Inc. */
3 
4 #include <linux/interval_tree.h>
5 #include <linux/vfio.h>
6 #include <linux/vmalloc.h>
7 
8 #include <linux/pds/pds_common.h>
9 #include <linux/pds/pds_core_if.h>
10 #include <linux/pds/pds_adminq.h>
11 
12 #include "vfio_dev.h"
13 #include "cmds.h"
14 #include "dirty.h"
15 
16 #define READ_SEQ true
17 #define WRITE_ACK false
18 
pds_vfio_dirty_is_enabled(struct pds_vfio_pci_device * pds_vfio)19 bool pds_vfio_dirty_is_enabled(struct pds_vfio_pci_device *pds_vfio)
20 {
21 	return pds_vfio->dirty.is_enabled;
22 }
23 
pds_vfio_dirty_set_enabled(struct pds_vfio_pci_device * pds_vfio)24 void pds_vfio_dirty_set_enabled(struct pds_vfio_pci_device *pds_vfio)
25 {
26 	pds_vfio->dirty.is_enabled = true;
27 }
28 
pds_vfio_dirty_set_disabled(struct pds_vfio_pci_device * pds_vfio)29 void pds_vfio_dirty_set_disabled(struct pds_vfio_pci_device *pds_vfio)
30 {
31 	pds_vfio->dirty.is_enabled = false;
32 }
33 
34 static void
pds_vfio_print_guest_region_info(struct pds_vfio_pci_device * pds_vfio,u8 max_regions)35 pds_vfio_print_guest_region_info(struct pds_vfio_pci_device *pds_vfio,
36 				 u8 max_regions)
37 {
38 	int len = max_regions * sizeof(struct pds_lm_dirty_region_info);
39 	struct pci_dev *pdev = pds_vfio->vfio_coredev.pdev;
40 	struct device *pdsc_dev = &pci_physfn(pdev)->dev;
41 	struct pds_lm_dirty_region_info *region_info;
42 	dma_addr_t regions_dma;
43 	u8 num_regions;
44 	int err;
45 
46 	region_info = kzalloc_objs(struct pds_lm_dirty_region_info, max_regions);
47 	if (!region_info)
48 		return;
49 
50 	regions_dma =
51 		dma_map_single(pdsc_dev, region_info, len, DMA_FROM_DEVICE);
52 	if (dma_mapping_error(pdsc_dev, regions_dma))
53 		goto out_free_region_info;
54 
55 	err = pds_vfio_dirty_status_cmd(pds_vfio, regions_dma, &max_regions,
56 					&num_regions);
57 	dma_unmap_single(pdsc_dev, regions_dma, len, DMA_FROM_DEVICE);
58 	if (err)
59 		goto out_free_region_info;
60 
61 	for (unsigned int i = 0; i < num_regions; i++)
62 		dev_dbg(&pdev->dev,
63 			"region_info[%d]: dma_base 0x%llx page_count %u page_size_log2 %u\n",
64 			i, le64_to_cpu(region_info[i].dma_base),
65 			le32_to_cpu(region_info[i].page_count),
66 			region_info[i].page_size_log2);
67 
68 out_free_region_info:
69 	kfree(region_info);
70 }
71 
pds_vfio_dirty_alloc_bitmaps(struct pds_vfio_region * region,unsigned long bytes)72 static int pds_vfio_dirty_alloc_bitmaps(struct pds_vfio_region *region,
73 					unsigned long bytes)
74 {
75 	unsigned long *host_seq_bmp, *host_ack_bmp;
76 
77 	host_seq_bmp = vzalloc(bytes);
78 	if (!host_seq_bmp)
79 		return -ENOMEM;
80 
81 	host_ack_bmp = vzalloc(bytes);
82 	if (!host_ack_bmp) {
83 		vfree(host_seq_bmp);
84 		return -ENOMEM;
85 	}
86 
87 	region->host_seq = host_seq_bmp;
88 	region->host_ack = host_ack_bmp;
89 	region->bmp_bytes = bytes;
90 
91 	return 0;
92 }
93 
pds_vfio_dirty_free_bitmaps(struct pds_vfio_dirty * dirty)94 static void pds_vfio_dirty_free_bitmaps(struct pds_vfio_dirty *dirty)
95 {
96 	if (!dirty->regions)
97 		return;
98 
99 	for (int i = 0; i < dirty->num_regions; i++) {
100 		struct pds_vfio_region *region = &dirty->regions[i];
101 
102 		vfree(region->host_seq);
103 		vfree(region->host_ack);
104 		region->host_seq = NULL;
105 		region->host_ack = NULL;
106 		region->bmp_bytes = 0;
107 	}
108 }
109 
__pds_vfio_dirty_free_sgl(struct pds_vfio_pci_device * pds_vfio,struct pds_vfio_region * region)110 static void __pds_vfio_dirty_free_sgl(struct pds_vfio_pci_device *pds_vfio,
111 				      struct pds_vfio_region *region)
112 {
113 	struct pci_dev *pdev = pds_vfio->vfio_coredev.pdev;
114 	struct device *pdsc_dev = &pci_physfn(pdev)->dev;
115 
116 	dma_unmap_single(pdsc_dev, region->sgl_addr,
117 			 region->num_sge * sizeof(struct pds_lm_sg_elem),
118 			 DMA_BIDIRECTIONAL);
119 	kfree(region->sgl);
120 
121 	region->num_sge = 0;
122 	region->sgl = NULL;
123 	region->sgl_addr = 0;
124 }
125 
pds_vfio_dirty_free_sgl(struct pds_vfio_pci_device * pds_vfio)126 static void pds_vfio_dirty_free_sgl(struct pds_vfio_pci_device *pds_vfio)
127 {
128 	struct pds_vfio_dirty *dirty = &pds_vfio->dirty;
129 
130 	if (!dirty->regions)
131 		return;
132 
133 	for (int i = 0; i < dirty->num_regions; i++) {
134 		struct pds_vfio_region *region = &dirty->regions[i];
135 
136 		if (region->sgl)
137 			__pds_vfio_dirty_free_sgl(pds_vfio, region);
138 	}
139 }
140 
pds_vfio_dirty_alloc_sgl(struct pds_vfio_pci_device * pds_vfio,struct pds_vfio_region * region,u32 page_count)141 static int pds_vfio_dirty_alloc_sgl(struct pds_vfio_pci_device *pds_vfio,
142 				    struct pds_vfio_region *region,
143 				    u32 page_count)
144 {
145 	struct pci_dev *pdev = pds_vfio->vfio_coredev.pdev;
146 	struct device *pdsc_dev = &pci_physfn(pdev)->dev;
147 	struct pds_lm_sg_elem *sgl;
148 	dma_addr_t sgl_addr;
149 	size_t sgl_size;
150 	u32 max_sge;
151 
152 	max_sge = DIV_ROUND_UP(page_count, PAGE_SIZE * 8);
153 	sgl_size = max_sge * sizeof(struct pds_lm_sg_elem);
154 
155 	sgl = kzalloc(sgl_size, GFP_KERNEL);
156 	if (!sgl)
157 		return -ENOMEM;
158 
159 	sgl_addr = dma_map_single(pdsc_dev, sgl, sgl_size, DMA_BIDIRECTIONAL);
160 	if (dma_mapping_error(pdsc_dev, sgl_addr)) {
161 		kfree(sgl);
162 		return -EIO;
163 	}
164 
165 	region->sgl = sgl;
166 	region->num_sge = max_sge;
167 	region->sgl_addr = sgl_addr;
168 
169 	return 0;
170 }
171 
pds_vfio_dirty_free_regions(struct pds_vfio_dirty * dirty)172 static void pds_vfio_dirty_free_regions(struct pds_vfio_dirty *dirty)
173 {
174 	vfree(dirty->regions);
175 	dirty->regions = NULL;
176 	dirty->num_regions = 0;
177 }
178 
pds_vfio_dirty_alloc_regions(struct pds_vfio_pci_device * pds_vfio,struct pds_lm_dirty_region_info * region_info,u64 region_page_size,u8 num_regions)179 static int pds_vfio_dirty_alloc_regions(struct pds_vfio_pci_device *pds_vfio,
180 					struct pds_lm_dirty_region_info *region_info,
181 					u64 region_page_size, u8 num_regions)
182 {
183 	struct pci_dev *pdev = pds_vfio->vfio_coredev.pdev;
184 	struct pds_vfio_dirty *dirty = &pds_vfio->dirty;
185 	u32 dev_bmp_offset_byte = 0;
186 	int err;
187 
188 	dirty->regions = vcalloc(num_regions, sizeof(struct pds_vfio_region));
189 	if (!dirty->regions)
190 		return -ENOMEM;
191 	dirty->num_regions = num_regions;
192 
193 	for (int i = 0; i < num_regions; i++) {
194 		struct pds_lm_dirty_region_info *ri = &region_info[i];
195 		struct pds_vfio_region *region = &dirty->regions[i];
196 		u64 region_size, region_start;
197 		u32 page_count;
198 
199 		/* page_count might be adjusted by the device */
200 		page_count = le32_to_cpu(ri->page_count);
201 		region_start = le64_to_cpu(ri->dma_base);
202 		region_size = page_count * region_page_size;
203 
204 		err = pds_vfio_dirty_alloc_bitmaps(region,
205 						   page_count / BITS_PER_BYTE);
206 		if (err) {
207 			dev_err(&pdev->dev, "Failed to alloc dirty bitmaps: %pe\n",
208 				ERR_PTR(err));
209 			goto out_free_regions;
210 		}
211 
212 		err = pds_vfio_dirty_alloc_sgl(pds_vfio, region, page_count);
213 		if (err) {
214 			dev_err(&pdev->dev, "Failed to alloc dirty sg lists: %pe\n",
215 				ERR_PTR(err));
216 			goto out_free_regions;
217 		}
218 
219 		region->size = region_size;
220 		region->start = region_start;
221 		region->page_size = region_page_size;
222 		region->dev_bmp_offset_start_byte = dev_bmp_offset_byte;
223 
224 		dev_bmp_offset_byte += page_count / BITS_PER_BYTE;
225 		if (dev_bmp_offset_byte % BITS_PER_BYTE) {
226 			dev_err(&pdev->dev, "Device bitmap offset is mis-aligned\n");
227 			err = -EINVAL;
228 			goto out_free_regions;
229 		}
230 	}
231 
232 	return 0;
233 
234 out_free_regions:
235 	pds_vfio_dirty_free_bitmaps(dirty);
236 	pds_vfio_dirty_free_sgl(pds_vfio);
237 	pds_vfio_dirty_free_regions(dirty);
238 
239 	return err;
240 }
241 
pds_vfio_dirty_enable(struct pds_vfio_pci_device * pds_vfio,struct rb_root_cached * ranges,u32 nnodes,u64 * page_size)242 static int pds_vfio_dirty_enable(struct pds_vfio_pci_device *pds_vfio,
243 				 struct rb_root_cached *ranges, u32 nnodes,
244 				 u64 *page_size)
245 {
246 	struct pci_dev *pdev = pds_vfio->vfio_coredev.pdev;
247 	struct device *pdsc_dev = &pci_physfn(pdev)->dev;
248 	struct pds_lm_dirty_region_info *region_info;
249 	struct interval_tree_node *node = NULL;
250 	u64 region_page_size = *page_size;
251 	u8 max_regions = 0, num_regions;
252 	dma_addr_t regions_dma = 0;
253 	u32 num_ranges = nnodes;
254 	int err;
255 	u16 len;
256 
257 	dev_dbg(&pdev->dev, "vf%u: Start dirty page tracking\n",
258 		pds_vfio->vf_id);
259 
260 	if (pds_vfio_dirty_is_enabled(pds_vfio))
261 		return -EINVAL;
262 
263 	/* find if dirty tracking is disabled, i.e. num_regions == 0 */
264 	err = pds_vfio_dirty_status_cmd(pds_vfio, 0, &max_regions,
265 					&num_regions);
266 	if (err < 0) {
267 		dev_err(&pdev->dev, "Failed to get dirty status, err %pe\n",
268 			ERR_PTR(err));
269 		return err;
270 	} else if (num_regions) {
271 		dev_err(&pdev->dev,
272 			"Dirty tracking already enabled for %d regions\n",
273 			num_regions);
274 		return -EEXIST;
275 	} else if (!max_regions) {
276 		dev_err(&pdev->dev,
277 			"Device doesn't support dirty tracking, max_regions %d\n",
278 			max_regions);
279 		return -EOPNOTSUPP;
280 	}
281 
282 	if (num_ranges > max_regions) {
283 		vfio_combine_iova_ranges(ranges, nnodes, max_regions);
284 		num_ranges = max_regions;
285 	}
286 
287 	region_info = kzalloc_objs(*region_info, num_ranges);
288 	if (!region_info)
289 		return -ENOMEM;
290 	len = num_ranges * sizeof(*region_info);
291 
292 	node = interval_tree_iter_first(ranges, 0, ULONG_MAX);
293 	if (!node) {
294 		err = -EINVAL;
295 		goto out_free_region_info;
296 	}
297 
298 	for (int i = 0; i < num_ranges; i++) {
299 		struct pds_lm_dirty_region_info *ri = &region_info[i];
300 		u64 region_size = node->last - node->start + 1;
301 		u64 region_start = node->start;
302 		u32 page_count;
303 
304 		page_count = DIV_ROUND_UP(region_size, region_page_size);
305 
306 		ri->dma_base = cpu_to_le64(region_start);
307 		ri->page_count = cpu_to_le32(page_count);
308 		ri->page_size_log2 = ilog2(region_page_size);
309 
310 		dev_dbg(&pdev->dev,
311 			"region_info[%d]: region_start 0x%llx region_end 0x%lx region_size 0x%llx page_count %u page_size %llu\n",
312 			i, region_start, node->last, region_size, page_count,
313 			region_page_size);
314 
315 		node = interval_tree_iter_next(node, 0, ULONG_MAX);
316 	}
317 
318 	regions_dma = dma_map_single(pdsc_dev, (void *)region_info, len,
319 				     DMA_BIDIRECTIONAL);
320 	if (dma_mapping_error(pdsc_dev, regions_dma)) {
321 		err = -ENOMEM;
322 		goto out_free_region_info;
323 	}
324 
325 	err = pds_vfio_dirty_enable_cmd(pds_vfio, regions_dma, num_ranges);
326 	dma_unmap_single(pdsc_dev, regions_dma, len, DMA_BIDIRECTIONAL);
327 	if (err)
328 		goto out_free_region_info;
329 
330 	err = pds_vfio_dirty_alloc_regions(pds_vfio, region_info,
331 					   region_page_size, num_ranges);
332 	if (err) {
333 		dev_err(&pdev->dev,
334 			"Failed to allocate %d regions for tracking dirty regions: %pe\n",
335 			num_regions, ERR_PTR(err));
336 		goto out_dirty_disable;
337 	}
338 
339 	pds_vfio_dirty_set_enabled(pds_vfio);
340 
341 	pds_vfio_print_guest_region_info(pds_vfio, max_regions);
342 
343 	kfree(region_info);
344 
345 	return 0;
346 
347 out_dirty_disable:
348 	pds_vfio_dirty_disable_cmd(pds_vfio);
349 out_free_region_info:
350 	kfree(region_info);
351 	return err;
352 }
353 
pds_vfio_dirty_disable(struct pds_vfio_pci_device * pds_vfio,bool send_cmd)354 void pds_vfio_dirty_disable(struct pds_vfio_pci_device *pds_vfio, bool send_cmd)
355 {
356 	if (pds_vfio_dirty_is_enabled(pds_vfio)) {
357 		pds_vfio_dirty_set_disabled(pds_vfio);
358 		if (send_cmd)
359 			pds_vfio_dirty_disable_cmd(pds_vfio);
360 		pds_vfio_dirty_free_sgl(pds_vfio);
361 		pds_vfio_dirty_free_bitmaps(&pds_vfio->dirty);
362 		pds_vfio_dirty_free_regions(&pds_vfio->dirty);
363 	}
364 
365 	if (send_cmd)
366 		pds_vfio_send_host_vf_lm_status_cmd(pds_vfio, PDS_LM_STA_NONE);
367 }
368 
pds_vfio_dirty_seq_ack(struct pds_vfio_pci_device * pds_vfio,struct pds_vfio_region * region,unsigned long * seq_ack_bmp,u32 offset,u32 bmp_bytes,bool read_seq)369 static int pds_vfio_dirty_seq_ack(struct pds_vfio_pci_device *pds_vfio,
370 				  struct pds_vfio_region *region,
371 				  unsigned long *seq_ack_bmp, u32 offset,
372 				  u32 bmp_bytes, bool read_seq)
373 {
374 	const char *bmp_type_str = read_seq ? "read_seq" : "write_ack";
375 	u8 dma_dir = read_seq ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
376 	struct pci_dev *pdev = pds_vfio->vfio_coredev.pdev;
377 	struct device *pdsc_dev = &pci_physfn(pdev)->dev;
378 	unsigned long long npages;
379 	struct sg_table sg_table;
380 	struct scatterlist *sg;
381 	struct page **pages;
382 	u32 page_offset;
383 	const void *bmp;
384 	size_t size;
385 	u16 num_sge;
386 	int err;
387 	int i;
388 
389 	bmp = (void *)((u64)seq_ack_bmp + offset);
390 	page_offset = offset_in_page(bmp);
391 	bmp -= page_offset;
392 
393 	/*
394 	 * Start and end of bitmap section to seq/ack might not be page
395 	 * aligned, so use the page_offset to account for that so there
396 	 * will be enough pages to represent the bmp_bytes
397 	 */
398 	npages = DIV_ROUND_UP_ULL(bmp_bytes + page_offset, PAGE_SIZE);
399 	pages = kmalloc_objs(*pages, npages);
400 	if (!pages)
401 		return -ENOMEM;
402 
403 	for (unsigned long long i = 0; i < npages; i++) {
404 		struct page *page = vmalloc_to_page(bmp);
405 
406 		if (!page) {
407 			err = -EFAULT;
408 			goto out_free_pages;
409 		}
410 
411 		pages[i] = page;
412 		bmp += PAGE_SIZE;
413 	}
414 
415 	err = sg_alloc_table_from_pages(&sg_table, pages, npages, page_offset,
416 					bmp_bytes, GFP_KERNEL);
417 	if (err)
418 		goto out_free_pages;
419 
420 	err = dma_map_sgtable(pdsc_dev, &sg_table, dma_dir, 0);
421 	if (err)
422 		goto out_free_sg_table;
423 
424 	for_each_sgtable_dma_sg(&sg_table, sg, i) {
425 		struct pds_lm_sg_elem *sg_elem = &region->sgl[i];
426 
427 		sg_elem->addr = cpu_to_le64(sg_dma_address(sg));
428 		sg_elem->len = cpu_to_le32(sg_dma_len(sg));
429 	}
430 
431 	num_sge = sg_table.nents;
432 	size = num_sge * sizeof(struct pds_lm_sg_elem);
433 	offset += region->dev_bmp_offset_start_byte;
434 	dma_sync_single_for_device(pdsc_dev, region->sgl_addr, size, dma_dir);
435 	err = pds_vfio_dirty_seq_ack_cmd(pds_vfio, region->sgl_addr, num_sge,
436 					 offset, bmp_bytes, read_seq);
437 	if (err)
438 		dev_err(&pdev->dev,
439 			"Dirty bitmap %s failed offset %u bmp_bytes %u num_sge %u DMA 0x%llx: %pe\n",
440 			bmp_type_str, offset, bmp_bytes,
441 			num_sge, region->sgl_addr, ERR_PTR(err));
442 	dma_sync_single_for_cpu(pdsc_dev, region->sgl_addr, size, dma_dir);
443 
444 	dma_unmap_sgtable(pdsc_dev, &sg_table, dma_dir, 0);
445 out_free_sg_table:
446 	sg_free_table(&sg_table);
447 out_free_pages:
448 	kfree(pages);
449 
450 	return err;
451 }
452 
pds_vfio_dirty_write_ack(struct pds_vfio_pci_device * pds_vfio,struct pds_vfio_region * region,u32 offset,u32 len)453 static int pds_vfio_dirty_write_ack(struct pds_vfio_pci_device *pds_vfio,
454 				   struct pds_vfio_region *region,
455 				    u32 offset, u32 len)
456 {
457 
458 	return pds_vfio_dirty_seq_ack(pds_vfio, region, region->host_ack,
459 				      offset, len, WRITE_ACK);
460 }
461 
pds_vfio_dirty_read_seq(struct pds_vfio_pci_device * pds_vfio,struct pds_vfio_region * region,u32 offset,u32 len)462 static int pds_vfio_dirty_read_seq(struct pds_vfio_pci_device *pds_vfio,
463 				   struct pds_vfio_region *region,
464 				   u32 offset, u32 len)
465 {
466 	return pds_vfio_dirty_seq_ack(pds_vfio, region, region->host_seq,
467 				      offset, len, READ_SEQ);
468 }
469 
pds_vfio_dirty_process_bitmaps(struct pds_vfio_pci_device * pds_vfio,struct pds_vfio_region * region,struct iova_bitmap * dirty_bitmap,u32 bmp_offset,u32 len_bytes)470 static int pds_vfio_dirty_process_bitmaps(struct pds_vfio_pci_device *pds_vfio,
471 					  struct pds_vfio_region *region,
472 					  struct iova_bitmap *dirty_bitmap,
473 					  u32 bmp_offset, u32 len_bytes)
474 {
475 	u64 page_size = region->page_size;
476 	u64 region_start = region->start;
477 	u32 bmp_offset_bit;
478 	__le64 *seq, *ack;
479 	int dword_count;
480 
481 	dword_count = len_bytes / sizeof(u64);
482 	seq = (__le64 *)((u64)region->host_seq + bmp_offset);
483 	ack = (__le64 *)((u64)region->host_ack + bmp_offset);
484 	bmp_offset_bit = bmp_offset * 8;
485 
486 	for (int i = 0; i < dword_count; i++) {
487 		u64 xor = le64_to_cpu(seq[i]) ^ le64_to_cpu(ack[i]);
488 
489 		/* prepare for next write_ack call */
490 		ack[i] = seq[i];
491 
492 		for (u8 bit_i = 0; bit_i < BITS_PER_TYPE(u64); ++bit_i) {
493 			if (xor & BIT(bit_i)) {
494 				u64 abs_bit_i = bmp_offset_bit +
495 						i * BITS_PER_TYPE(u64) + bit_i;
496 				u64 addr = abs_bit_i * page_size + region_start;
497 
498 				iova_bitmap_set(dirty_bitmap, addr, page_size);
499 			}
500 		}
501 	}
502 
503 	return 0;
504 }
505 
506 static struct pds_vfio_region *
pds_vfio_get_region(struct pds_vfio_pci_device * pds_vfio,unsigned long iova)507 pds_vfio_get_region(struct pds_vfio_pci_device *pds_vfio, unsigned long iova)
508 {
509 	struct pds_vfio_dirty *dirty = &pds_vfio->dirty;
510 
511 	for (int i = 0; i < dirty->num_regions; i++) {
512 		struct pds_vfio_region *region = &dirty->regions[i];
513 
514 		if (iova >= region->start &&
515 		    iova < (region->start + region->size))
516 			return region;
517 	}
518 
519 	return NULL;
520 }
521 
pds_vfio_dirty_sync(struct pds_vfio_pci_device * pds_vfio,struct iova_bitmap * dirty_bitmap,unsigned long iova,unsigned long length)522 static int pds_vfio_dirty_sync(struct pds_vfio_pci_device *pds_vfio,
523 			       struct iova_bitmap *dirty_bitmap,
524 			       unsigned long iova, unsigned long length)
525 {
526 	struct device *dev = &pds_vfio->vfio_coredev.pdev->dev;
527 	struct pds_vfio_region *region;
528 	u64 bmp_offset, bmp_bytes;
529 	u64 bitmap_size, pages;
530 	int err;
531 
532 	dev_dbg(dev, "vf%u: Get dirty page bitmap\n", pds_vfio->vf_id);
533 
534 	if (!pds_vfio_dirty_is_enabled(pds_vfio)) {
535 		dev_err(dev, "vf%u: Sync failed, dirty tracking is disabled\n",
536 			pds_vfio->vf_id);
537 		return -EINVAL;
538 	}
539 
540 	region = pds_vfio_get_region(pds_vfio, iova);
541 	if (!region) {
542 		dev_err(dev, "vf%u: Failed to find region that contains iova 0x%lx length 0x%lx\n",
543 			pds_vfio->vf_id, iova, length);
544 		return -EINVAL;
545 	}
546 
547 	pages = DIV_ROUND_UP(length, region->page_size);
548 	bitmap_size =
549 		round_up(pages, sizeof(u64) * BITS_PER_BYTE) / BITS_PER_BYTE;
550 
551 	dev_dbg(dev,
552 		"vf%u: iova 0x%lx length %lu page_size %llu pages %llu bitmap_size %llu\n",
553 		pds_vfio->vf_id, iova, length, region->page_size,
554 		pages, bitmap_size);
555 
556 	if (!length || ((iova - region->start + length) > region->size)) {
557 		dev_err(dev, "Invalid iova 0x%lx and/or length 0x%lx to sync\n",
558 			iova, length);
559 		return -EINVAL;
560 	}
561 
562 	/* bitmap is modified in 64 bit chunks */
563 	bmp_bytes = ALIGN(DIV_ROUND_UP(length / region->page_size,
564 				       sizeof(u64)), sizeof(u64));
565 	if (bmp_bytes != bitmap_size) {
566 		dev_err(dev,
567 			"Calculated bitmap bytes %llu not equal to bitmap size %llu\n",
568 			bmp_bytes, bitmap_size);
569 		return -EINVAL;
570 	}
571 
572 	if (bmp_bytes > region->bmp_bytes) {
573 		dev_err(dev,
574 			"Calculated bitmap bytes %llu larger than region's cached bmp_bytes %llu\n",
575 			bmp_bytes, region->bmp_bytes);
576 		return -EINVAL;
577 	}
578 
579 	bmp_offset = DIV_ROUND_UP((iova - region->start) /
580 				  region->page_size, sizeof(u64));
581 
582 	dev_dbg(dev,
583 		"Syncing dirty bitmap, iova 0x%lx length 0x%lx, bmp_offset %llu bmp_bytes %llu\n",
584 		iova, length, bmp_offset, bmp_bytes);
585 
586 	err = pds_vfio_dirty_read_seq(pds_vfio, region, bmp_offset, bmp_bytes);
587 	if (err)
588 		return err;
589 
590 	err = pds_vfio_dirty_process_bitmaps(pds_vfio, region, dirty_bitmap,
591 					     bmp_offset, bmp_bytes);
592 	if (err)
593 		return err;
594 
595 	err = pds_vfio_dirty_write_ack(pds_vfio, region, bmp_offset, bmp_bytes);
596 	if (err)
597 		return err;
598 
599 	return 0;
600 }
601 
pds_vfio_dma_logging_report(struct vfio_device * vdev,unsigned long iova,unsigned long length,struct iova_bitmap * dirty)602 int pds_vfio_dma_logging_report(struct vfio_device *vdev, unsigned long iova,
603 				unsigned long length, struct iova_bitmap *dirty)
604 {
605 	struct pds_vfio_pci_device *pds_vfio =
606 		container_of(vdev, struct pds_vfio_pci_device,
607 			     vfio_coredev.vdev);
608 	int err;
609 
610 	mutex_lock(&pds_vfio->state_mutex);
611 	err = pds_vfio_dirty_sync(pds_vfio, dirty, iova, length);
612 	mutex_unlock(&pds_vfio->state_mutex);
613 
614 	return err;
615 }
616 
pds_vfio_dma_logging_start(struct vfio_device * vdev,struct rb_root_cached * ranges,u32 nnodes,u64 * page_size)617 int pds_vfio_dma_logging_start(struct vfio_device *vdev,
618 			       struct rb_root_cached *ranges, u32 nnodes,
619 			       u64 *page_size)
620 {
621 	struct pds_vfio_pci_device *pds_vfio =
622 		container_of(vdev, struct pds_vfio_pci_device,
623 			     vfio_coredev.vdev);
624 	int err;
625 
626 	mutex_lock(&pds_vfio->state_mutex);
627 	pds_vfio_send_host_vf_lm_status_cmd(pds_vfio, PDS_LM_STA_IN_PROGRESS);
628 	err = pds_vfio_dirty_enable(pds_vfio, ranges, nnodes, page_size);
629 	mutex_unlock(&pds_vfio->state_mutex);
630 
631 	return err;
632 }
633 
pds_vfio_dma_logging_stop(struct vfio_device * vdev)634 int pds_vfio_dma_logging_stop(struct vfio_device *vdev)
635 {
636 	struct pds_vfio_pci_device *pds_vfio =
637 		container_of(vdev, struct pds_vfio_pci_device,
638 			     vfio_coredev.vdev);
639 
640 	mutex_lock(&pds_vfio->state_mutex);
641 	pds_vfio_dirty_disable(pds_vfio, true);
642 	mutex_unlock(&pds_vfio->state_mutex);
643 
644 	return 0;
645 }
646