samples/vfio-mdev/mbochs.c
1002
struct mdev_state *mdev_state = dmabuf->mdev_state;
samples/vfio-mdev/mbochs.c
1003
struct device *dev = mdev_state->vdev.dev;
samples/vfio-mdev/mbochs.c
1007
WARN_ON(!mutex_is_locked(&mdev_state->ops_lock));
samples/vfio-mdev/mbochs.c
1035
struct mdev_state *mdev_state =
samples/vfio-mdev/mbochs.c
1036
container_of(vdev, struct mdev_state, vdev);
samples/vfio-mdev/mbochs.c
1050
region_info->size = mdev_state->memsize;
samples/vfio-mdev/mbochs.c
1101
static int mbochs_query_gfx_plane(struct mdev_state *mdev_state,
samples/vfio-mdev/mbochs.c
1124
mutex_lock(&mdev_state->ops_lock);
samples/vfio-mdev/mbochs.c
1128
ret = mbochs_check_framebuffer(mdev_state, &mode);
samples/vfio-mdev/mbochs.c
1139
dmabuf = mbochs_dmabuf_find_by_mode(mdev_state, &mode);
samples/vfio-mdev/mbochs.c
1141
mbochs_dmabuf_alloc(mdev_state, &mode);
samples/vfio-mdev/mbochs.c
1143
mutex_unlock(&mdev_state->ops_lock);
samples/vfio-mdev/mbochs.c
1156
mdev_state->active_id != plane->dmabuf_id) {
samples/vfio-mdev/mbochs.c
1157
dev_dbg(mdev_state->vdev.dev, "%s: primary: %d => %d\n",
samples/vfio-mdev/mbochs.c
1158
__func__, mdev_state->active_id, plane->dmabuf_id);
samples/vfio-mdev/mbochs.c
1159
mdev_state->active_id = plane->dmabuf_id;
samples/vfio-mdev/mbochs.c
1161
mutex_unlock(&mdev_state->ops_lock);
samples/vfio-mdev/mbochs.c
1165
static int mbochs_get_gfx_dmabuf(struct mdev_state *mdev_state, u32 id)
samples/vfio-mdev/mbochs.c
1169
mutex_lock(&mdev_state->ops_lock);
samples/vfio-mdev/mbochs.c
1171
dmabuf = mbochs_dmabuf_find_by_id(mdev_state, id);
samples/vfio-mdev/mbochs.c
1173
mutex_unlock(&mdev_state->ops_lock);
samples/vfio-mdev/mbochs.c
1180
mutex_unlock(&mdev_state->ops_lock);
samples/vfio-mdev/mbochs.c
1191
struct mdev_state *mdev_state =
samples/vfio-mdev/mbochs.c
1192
container_of(vdev, struct mdev_state, vdev);
samples/vfio-mdev/mbochs.c
1255
ret = mbochs_query_gfx_plane(mdev_state, &plane);
samples/vfio-mdev/mbochs.c
1272
return mbochs_get_gfx_dmabuf(mdev_state, dmabuf_id);
samples/vfio-mdev/mbochs.c
1279
return mbochs_reset(mdev_state);
samples/vfio-mdev/mbochs.c
1286
struct mdev_state *mdev_state =
samples/vfio-mdev/mbochs.c
1287
container_of(vdev, struct mdev_state, vdev);
samples/vfio-mdev/mbochs.c
1290
mutex_lock(&mdev_state->ops_lock);
samples/vfio-mdev/mbochs.c
1292
list_for_each_entry_safe(dmabuf, tmp, &mdev_state->dmabufs, next) {
samples/vfio-mdev/mbochs.c
1301
mbochs_put_pages(mdev_state);
samples/vfio-mdev/mbochs.c
1303
mutex_unlock(&mdev_state->ops_lock);
samples/vfio-mdev/mbochs.c
1310
struct mdev_state *mdev_state = dev_get_drvdata(dev);
samples/vfio-mdev/mbochs.c
1312
return sprintf(buf, "%d MB\n", mdev_state->type->mbytes);
samples/vfio-mdev/mbochs.c
163
struct mdev_state *mdev_state;
samples/vfio-mdev/mbochs.c
211
static struct page *__mbochs_get_page(struct mdev_state *mdev_state,
samples/vfio-mdev/mbochs.c
213
static struct page *mbochs_get_page(struct mdev_state *mdev_state,
samples/vfio-mdev/mbochs.c
216
static void mbochs_create_config_space(struct mdev_state *mdev_state)
samples/vfio-mdev/mbochs.c
218
STORE_LE16((u16 *) &mdev_state->vconfig[PCI_VENDOR_ID],
samples/vfio-mdev/mbochs.c
220
STORE_LE16((u16 *) &mdev_state->vconfig[PCI_DEVICE_ID],
samples/vfio-mdev/mbochs.c
222
STORE_LE16((u16 *) &mdev_state->vconfig[PCI_SUBSYSTEM_VENDOR_ID],
samples/vfio-mdev/mbochs.c
224
STORE_LE16((u16 *) &mdev_state->vconfig[PCI_SUBSYSTEM_ID],
samples/vfio-mdev/mbochs.c
227
STORE_LE16((u16 *) &mdev_state->vconfig[PCI_COMMAND],
samples/vfio-mdev/mbochs.c
229
STORE_LE16((u16 *) &mdev_state->vconfig[PCI_CLASS_DEVICE],
samples/vfio-mdev/mbochs.c
231
mdev_state->vconfig[PCI_CLASS_REVISION] = 0x01;
samples/vfio-mdev/mbochs.c
233
STORE_LE32((u32 *) &mdev_state->vconfig[PCI_BASE_ADDRESS_0],
samples/vfio-mdev/mbochs.c
237
mdev_state->bar_mask[0] = ~(mdev_state->memsize) + 1;
samples/vfio-mdev/mbochs.c
239
STORE_LE32((u32 *) &mdev_state->vconfig[PCI_BASE_ADDRESS_2],
samples/vfio-mdev/mbochs.c
242
mdev_state->bar_mask[2] = ~(MBOCHS_MMIO_BAR_SIZE) + 1;
samples/vfio-mdev/mbochs.c
245
static int mbochs_check_framebuffer(struct mdev_state *mdev_state,
samples/vfio-mdev/mbochs.c
248
struct device *dev = mdev_dev(mdev_state->mdev);
samples/vfio-mdev/mbochs.c
249
u16 *vbe = mdev_state->vbe;
samples/vfio-mdev/mbochs.c
252
WARN_ON(!mutex_is_locked(&mdev_state->ops_lock));
samples/vfio-mdev/mbochs.c
284
if (mode->offset + mode->size > mdev_state->memsize) {
samples/vfio-mdev/mbochs.c
303
static void handle_pci_cfg_write(struct mdev_state *mdev_state, u16 offset,
samples/vfio-mdev/mbochs.c
306
struct device *dev = mdev_dev(mdev_state->mdev);
samples/vfio-mdev/mbochs.c
316
cfg_addr = (cfg_addr & mdev_state->bar_mask[index]);
samples/vfio-mdev/mbochs.c
324
cfg_addr |= (mdev_state->vconfig[offset] &
samples/vfio-mdev/mbochs.c
326
STORE_LE32(&mdev_state->vconfig[offset], cfg_addr);
samples/vfio-mdev/mbochs.c
331
static void handle_mmio_write(struct mdev_state *mdev_state, u16 offset,
samples/vfio-mdev/mbochs.c
334
struct device *dev = mdev_dev(mdev_state->mdev);
samples/vfio-mdev/mbochs.c
346
if (index < ARRAY_SIZE(mdev_state->vbe))
samples/vfio-mdev/mbochs.c
347
mdev_state->vbe[index] = reg16;
samples/vfio-mdev/mbochs.c
361
static void handle_mmio_read(struct mdev_state *mdev_state, u16 offset,
samples/vfio-mdev/mbochs.c
364
struct device *dev = mdev_dev(mdev_state->mdev);
samples/vfio-mdev/mbochs.c
371
edid = &mdev_state->edid_regs;
samples/vfio-mdev/mbochs.c
377
memcpy(buf, mdev_state->edid_blob + offset, count);
samples/vfio-mdev/mbochs.c
383
if (index < ARRAY_SIZE(mdev_state->vbe))
samples/vfio-mdev/mbochs.c
384
reg16 = mdev_state->vbe[index];
samples/vfio-mdev/mbochs.c
398
static void handle_edid_regs(struct mdev_state *mdev_state, u16 offset,
samples/vfio-mdev/mbochs.c
401
char *regs = (void *)&mdev_state->edid_regs;
samples/vfio-mdev/mbochs.c
403
if (offset + count > sizeof(mdev_state->edid_regs))
samples/vfio-mdev/mbochs.c
425
static void handle_edid_blob(struct mdev_state *mdev_state, u16 offset,
samples/vfio-mdev/mbochs.c
428
if (offset + count > mdev_state->edid_regs.edid_max_size)
samples/vfio-mdev/mbochs.c
431
memcpy(mdev_state->edid_blob + offset, buf, count);
samples/vfio-mdev/mbochs.c
433
memcpy(buf, mdev_state->edid_blob + offset, count);
samples/vfio-mdev/mbochs.c
436
static ssize_t mdev_access(struct mdev_state *mdev_state, char *buf,
samples/vfio-mdev/mbochs.c
444
mutex_lock(&mdev_state->ops_lock);
samples/vfio-mdev/mbochs.c
448
handle_pci_cfg_write(mdev_state, pos, buf, count);
samples/vfio-mdev/mbochs.c
450
memcpy(buf, (mdev_state->vconfig + pos), count);
samples/vfio-mdev/mbochs.c
457
handle_mmio_write(mdev_state, pos, buf, count);
samples/vfio-mdev/mbochs.c
459
handle_mmio_read(mdev_state, pos, buf, count);
samples/vfio-mdev/mbochs.c
466
handle_edid_regs(mdev_state, pos, buf, count, is_write);
samples/vfio-mdev/mbochs.c
469
handle_edid_blob(mdev_state, pos, buf, count, is_write);
samples/vfio-mdev/mbochs.c
474
MBOCHS_MEMORY_BAR_OFFSET + mdev_state->memsize) {
samples/vfio-mdev/mbochs.c
477
pg = __mbochs_get_page(mdev_state, pos >> PAGE_SHIFT);
samples/vfio-mdev/mbochs.c
487
dev_dbg(mdev_state->vdev.dev, "%s: %s @0x%llx (unhandled)\n",
samples/vfio-mdev/mbochs.c
497
mutex_unlock(&mdev_state->ops_lock);
samples/vfio-mdev/mbochs.c
502
static int mbochs_reset(struct mdev_state *mdev_state)
samples/vfio-mdev/mbochs.c
504
u32 size64k = mdev_state->memsize / (64 * 1024);
samples/vfio-mdev/mbochs.c
507
for (i = 0; i < ARRAY_SIZE(mdev_state->vbe); i++)
samples/vfio-mdev/mbochs.c
508
mdev_state->vbe[i] = 0;
samples/vfio-mdev/mbochs.c
509
mdev_state->vbe[VBE_DISPI_INDEX_ID] = VBE_DISPI_ID5;
samples/vfio-mdev/mbochs.c
510
mdev_state->vbe[VBE_DISPI_INDEX_VIDEO_MEMORY_64K] = size64k;
samples/vfio-mdev/mbochs.c
516
struct mdev_state *mdev_state =
samples/vfio-mdev/mbochs.c
517
container_of(vdev, struct mdev_state, vdev);
samples/vfio-mdev/mbochs.c
530
mdev_state->vconfig = kzalloc(MBOCHS_CONFIG_SPACE_SIZE, GFP_KERNEL);
samples/vfio-mdev/mbochs.c
531
if (!mdev_state->vconfig)
samples/vfio-mdev/mbochs.c
534
mdev_state->memsize = type->mbytes * 1024 * 1024;
samples/vfio-mdev/mbochs.c
535
mdev_state->pagecount = mdev_state->memsize >> PAGE_SHIFT;
samples/vfio-mdev/mbochs.c
536
mdev_state->pages = kcalloc(mdev_state->pagecount,
samples/vfio-mdev/mbochs.c
539
if (!mdev_state->pages)
samples/vfio-mdev/mbochs.c
542
mutex_init(&mdev_state->ops_lock);
samples/vfio-mdev/mbochs.c
543
mdev_state->mdev = mdev;
samples/vfio-mdev/mbochs.c
544
INIT_LIST_HEAD(&mdev_state->dmabufs);
samples/vfio-mdev/mbochs.c
545
mdev_state->next_id = 1;
samples/vfio-mdev/mbochs.c
547
mdev_state->type = type;
samples/vfio-mdev/mbochs.c
548
mdev_state->edid_regs.max_xres = type->max_x;
samples/vfio-mdev/mbochs.c
549
mdev_state->edid_regs.max_yres = type->max_y;
samples/vfio-mdev/mbochs.c
550
mdev_state->edid_regs.edid_offset = MBOCHS_EDID_BLOB_OFFSET;
samples/vfio-mdev/mbochs.c
551
mdev_state->edid_regs.edid_max_size = sizeof(mdev_state->edid_blob);
samples/vfio-mdev/mbochs.c
552
mbochs_create_config_space(mdev_state);
samples/vfio-mdev/mbochs.c
553
mbochs_reset(mdev_state);
samples/vfio-mdev/mbochs.c
556
type->type.pretty_name, type->mbytes, mdev_state->pagecount);
samples/vfio-mdev/mbochs.c
560
kfree(mdev_state->vconfig);
samples/vfio-mdev/mbochs.c
568
struct mdev_state *mdev_state;
samples/vfio-mdev/mbochs.c
571
mdev_state = vfio_alloc_device(mdev_state, vdev, &mdev->dev,
samples/vfio-mdev/mbochs.c
573
if (IS_ERR(mdev_state))
samples/vfio-mdev/mbochs.c
574
return PTR_ERR(mdev_state);
samples/vfio-mdev/mbochs.c
576
ret = vfio_register_emulated_iommu_dev(&mdev_state->vdev);
samples/vfio-mdev/mbochs.c
579
dev_set_drvdata(&mdev->dev, mdev_state);
samples/vfio-mdev/mbochs.c
583
vfio_put_device(&mdev_state->vdev);
samples/vfio-mdev/mbochs.c
589
struct mdev_state *mdev_state =
samples/vfio-mdev/mbochs.c
590
container_of(vdev, struct mdev_state, vdev);
samples/vfio-mdev/mbochs.c
592
atomic_add(mdev_state->type->mbytes, &mbochs_avail_mbytes);
samples/vfio-mdev/mbochs.c
593
kfree(mdev_state->pages);
samples/vfio-mdev/mbochs.c
594
kfree(mdev_state->vconfig);
samples/vfio-mdev/mbochs.c
599
struct mdev_state *mdev_state = dev_get_drvdata(&mdev->dev);
samples/vfio-mdev/mbochs.c
601
vfio_unregister_group_dev(&mdev_state->vdev);
samples/vfio-mdev/mbochs.c
602
vfio_put_device(&mdev_state->vdev);
samples/vfio-mdev/mbochs.c
608
struct mdev_state *mdev_state =
samples/vfio-mdev/mbochs.c
609
container_of(vdev, struct mdev_state, vdev);
samples/vfio-mdev/mbochs.c
619
ret = mdev_access(mdev_state, (char *)&val, sizeof(val),
samples/vfio-mdev/mbochs.c
631
ret = mdev_access(mdev_state, (char *)&val, sizeof(val),
samples/vfio-mdev/mbochs.c
643
ret = mdev_access(mdev_state, (char *)&val, sizeof(val),
samples/vfio-mdev/mbochs.c
669
struct mdev_state *mdev_state =
samples/vfio-mdev/mbochs.c
670
container_of(vdev, struct mdev_state, vdev);
samples/vfio-mdev/mbochs.c
683
ret = mdev_access(mdev_state, (char *)&val, sizeof(val),
samples/vfio-mdev/mbochs.c
695
ret = mdev_access(mdev_state, (char *)&val, sizeof(val),
samples/vfio-mdev/mbochs.c
707
ret = mdev_access(mdev_state, (char *)&val, sizeof(val),
samples/vfio-mdev/mbochs.c
725
static struct page *__mbochs_get_page(struct mdev_state *mdev_state,
samples/vfio-mdev/mbochs.c
728
WARN_ON(!mutex_is_locked(&mdev_state->ops_lock));
samples/vfio-mdev/mbochs.c
730
if (!mdev_state->pages[pgoff]) {
samples/vfio-mdev/mbochs.c
731
mdev_state->pages[pgoff] =
samples/vfio-mdev/mbochs.c
733
if (!mdev_state->pages[pgoff])
samples/vfio-mdev/mbochs.c
737
get_page(mdev_state->pages[pgoff]);
samples/vfio-mdev/mbochs.c
738
return mdev_state->pages[pgoff];
samples/vfio-mdev/mbochs.c
741
static struct page *mbochs_get_page(struct mdev_state *mdev_state,
samples/vfio-mdev/mbochs.c
746
if (WARN_ON(pgoff >= mdev_state->pagecount))
samples/vfio-mdev/mbochs.c
749
mutex_lock(&mdev_state->ops_lock);
samples/vfio-mdev/mbochs.c
750
page = __mbochs_get_page(mdev_state, pgoff);
samples/vfio-mdev/mbochs.c
751
mutex_unlock(&mdev_state->ops_lock);
samples/vfio-mdev/mbochs.c
756
static void mbochs_put_pages(struct mdev_state *mdev_state)
samples/vfio-mdev/mbochs.c
758
struct device *dev = mdev_dev(mdev_state->mdev);
samples/vfio-mdev/mbochs.c
761
WARN_ON(!mutex_is_locked(&mdev_state->ops_lock));
samples/vfio-mdev/mbochs.c
763
for (i = 0; i < mdev_state->pagecount; i++) {
samples/vfio-mdev/mbochs.c
764
if (!mdev_state->pages[i])
samples/vfio-mdev/mbochs.c
766
put_page(mdev_state->pages[i]);
samples/vfio-mdev/mbochs.c
767
mdev_state->pages[i] = NULL;
samples/vfio-mdev/mbochs.c
776
struct mdev_state *mdev_state = vma->vm_private_data;
samples/vfio-mdev/mbochs.c
779
if (page_offset >= mdev_state->pagecount)
samples/vfio-mdev/mbochs.c
782
vmf->page = mbochs_get_page(mdev_state, page_offset);
samples/vfio-mdev/mbochs.c
795
struct mdev_state *mdev_state =
samples/vfio-mdev/mbochs.c
796
container_of(vdev, struct mdev_state, vdev);
samples/vfio-mdev/mbochs.c
802
if (vma->vm_end - vma->vm_start > mdev_state->memsize)
samples/vfio-mdev/mbochs.c
808
vma->vm_private_data = mdev_state;
samples/vfio-mdev/mbochs.c
832
struct device *dev = mdev_dev(dmabuf->mdev_state->mdev);
samples/vfio-mdev/mbochs.c
847
struct device *dev = mdev_dev(dmabuf->mdev_state->mdev);
samples/vfio-mdev/mbochs.c
864
struct device *dev = mdev_dev(dmabuf->mdev_state->mdev);
samples/vfio-mdev/mbochs.c
893
struct device *dev = mdev_dev(dmabuf->mdev_state->mdev);
samples/vfio-mdev/mbochs.c
905
struct mdev_state *mdev_state = dmabuf->mdev_state;
samples/vfio-mdev/mbochs.c
906
struct device *dev = mdev_dev(mdev_state->mdev);
samples/vfio-mdev/mbochs.c
914
mutex_lock(&mdev_state->ops_lock);
samples/vfio-mdev/mbochs.c
918
mutex_unlock(&mdev_state->ops_lock);
samples/vfio-mdev/mbochs.c
928
static struct mbochs_dmabuf *mbochs_dmabuf_alloc(struct mdev_state *mdev_state,
samples/vfio-mdev/mbochs.c
934
WARN_ON(!mutex_is_locked(&mdev_state->ops_lock));
samples/vfio-mdev/mbochs.c
941
dmabuf->id = mdev_state->next_id++;
samples/vfio-mdev/mbochs.c
950
dmabuf->pages[pg] = __mbochs_get_page(mdev_state,
samples/vfio-mdev/mbochs.c
956
dmabuf->mdev_state = mdev_state;
samples/vfio-mdev/mbochs.c
957
list_add(&dmabuf->next, &mdev_state->dmabufs);
samples/vfio-mdev/mbochs.c
972
mbochs_dmabuf_find_by_mode(struct mdev_state *mdev_state,
samples/vfio-mdev/mbochs.c
977
WARN_ON(!mutex_is_locked(&mdev_state->ops_lock));
samples/vfio-mdev/mbochs.c
979
list_for_each_entry(dmabuf, &mdev_state->dmabufs, next)
samples/vfio-mdev/mbochs.c
987
mbochs_dmabuf_find_by_id(struct mdev_state *mdev_state, u32 id)
samples/vfio-mdev/mbochs.c
991
WARN_ON(!mutex_is_locked(&mdev_state->ops_lock));
samples/vfio-mdev/mbochs.c
993
list_for_each_entry(dmabuf, &mdev_state->dmabufs, next)
samples/vfio-mdev/mdpy.c
110
static void mdpy_create_config_space(struct mdev_state *mdev_state)
samples/vfio-mdev/mdpy.c
112
STORE_LE16((u16 *) &mdev_state->vconfig[PCI_VENDOR_ID],
samples/vfio-mdev/mdpy.c
114
STORE_LE16((u16 *) &mdev_state->vconfig[PCI_DEVICE_ID],
samples/vfio-mdev/mdpy.c
116
STORE_LE16((u16 *) &mdev_state->vconfig[PCI_SUBSYSTEM_VENDOR_ID],
samples/vfio-mdev/mdpy.c
118
STORE_LE16((u16 *) &mdev_state->vconfig[PCI_SUBSYSTEM_ID],
samples/vfio-mdev/mdpy.c
121
STORE_LE16((u16 *) &mdev_state->vconfig[PCI_COMMAND],
samples/vfio-mdev/mdpy.c
123
STORE_LE16((u16 *) &mdev_state->vconfig[PCI_STATUS],
samples/vfio-mdev/mdpy.c
125
STORE_LE16((u16 *) &mdev_state->vconfig[PCI_CLASS_DEVICE],
samples/vfio-mdev/mdpy.c
127
mdev_state->vconfig[PCI_CLASS_REVISION] = 0x01;
samples/vfio-mdev/mdpy.c
129
STORE_LE32((u32 *) &mdev_state->vconfig[PCI_BASE_ADDRESS_0],
samples/vfio-mdev/mdpy.c
133
mdev_state->bar_mask = ~(mdev_state->memsize) + 1;
samples/vfio-mdev/mdpy.c
136
mdev_state->vconfig[PCI_CAPABILITY_LIST] = MDPY_VENDORCAP_OFFSET;
samples/vfio-mdev/mdpy.c
137
mdev_state->vconfig[MDPY_VENDORCAP_OFFSET + 0] = 0x09; /* vendor cap */
samples/vfio-mdev/mdpy.c
138
mdev_state->vconfig[MDPY_VENDORCAP_OFFSET + 1] = 0x00; /* next ptr */
samples/vfio-mdev/mdpy.c
139
mdev_state->vconfig[MDPY_VENDORCAP_OFFSET + 2] = MDPY_VENDORCAP_SIZE;
samples/vfio-mdev/mdpy.c
140
STORE_LE32((u32 *) &mdev_state->vconfig[MDPY_FORMAT_OFFSET],
samples/vfio-mdev/mdpy.c
141
mdev_state->type->format);
samples/vfio-mdev/mdpy.c
142
STORE_LE32((u32 *) &mdev_state->vconfig[MDPY_WIDTH_OFFSET],
samples/vfio-mdev/mdpy.c
143
mdev_state->type->width);
samples/vfio-mdev/mdpy.c
144
STORE_LE32((u32 *) &mdev_state->vconfig[MDPY_HEIGHT_OFFSET],
samples/vfio-mdev/mdpy.c
145
mdev_state->type->height);
samples/vfio-mdev/mdpy.c
148
static void handle_pci_cfg_write(struct mdev_state *mdev_state, u16 offset,
samples/vfio-mdev/mdpy.c
151
struct device *dev = mdev_dev(mdev_state->mdev);
samples/vfio-mdev/mdpy.c
159
cfg_addr = (cfg_addr & mdev_state->bar_mask);
samples/vfio-mdev/mdpy.c
166
cfg_addr |= (mdev_state->vconfig[offset] &
samples/vfio-mdev/mdpy.c
168
STORE_LE32(&mdev_state->vconfig[offset], cfg_addr);
samples/vfio-mdev/mdpy.c
173
static ssize_t mdev_access(struct mdev_state *mdev_state, char *buf,
samples/vfio-mdev/mdpy.c
178
mutex_lock(&mdev_state->ops_lock);
samples/vfio-mdev/mdpy.c
182
handle_pci_cfg_write(mdev_state, pos, buf, count);
samples/vfio-mdev/mdpy.c
184
memcpy(buf, (mdev_state->vconfig + pos), count);
samples/vfio-mdev/mdpy.c
188
MDPY_MEMORY_BAR_OFFSET + mdev_state->memsize)) {
samples/vfio-mdev/mdpy.c
191
memcpy(mdev_state->memblk, buf, count);
samples/vfio-mdev/mdpy.c
193
memcpy(buf, mdev_state->memblk, count);
samples/vfio-mdev/mdpy.c
196
dev_info(mdev_state->vdev.dev,
samples/vfio-mdev/mdpy.c
207
mutex_unlock(&mdev_state->ops_lock);
samples/vfio-mdev/mdpy.c
212
static int mdpy_reset(struct mdev_state *mdev_state)
samples/vfio-mdev/mdpy.c
217
stride = mdev_state->type->width * mdev_state->type->bytepp;
samples/vfio-mdev/mdpy.c
218
for (i = 0; i < mdev_state->type->height; i++)
samples/vfio-mdev/mdpy.c
219
memset(mdev_state->memblk + i * stride,
samples/vfio-mdev/mdpy.c
220
i * 255 / mdev_state->type->height,
samples/vfio-mdev/mdpy.c
227
struct mdev_state *mdev_state =
samples/vfio-mdev/mdpy.c
228
container_of(vdev, struct mdev_state, vdev);
samples/vfio-mdev/mdpy.c
235
mdev_state->vconfig = kzalloc(MDPY_CONFIG_SPACE_SIZE, GFP_KERNEL);
samples/vfio-mdev/mdpy.c
236
if (!mdev_state->vconfig)
samples/vfio-mdev/mdpy.c
241
mdev_state->memblk = vmalloc_user(fbsize);
samples/vfio-mdev/mdpy.c
242
if (!mdev_state->memblk)
samples/vfio-mdev/mdpy.c
245
mutex_init(&mdev_state->ops_lock);
samples/vfio-mdev/mdpy.c
246
mdev_state->mdev = mdev;
samples/vfio-mdev/mdpy.c
247
mdev_state->type = type;
samples/vfio-mdev/mdpy.c
248
mdev_state->memsize = fbsize;
samples/vfio-mdev/mdpy.c
249
mdpy_create_config_space(mdev_state);
samples/vfio-mdev/mdpy.c
250
mdpy_reset(mdev_state);
samples/vfio-mdev/mdpy.c
257
kfree(mdev_state->vconfig);
samples/vfio-mdev/mdpy.c
263
struct mdev_state *mdev_state;
samples/vfio-mdev/mdpy.c
266
mdev_state = vfio_alloc_device(mdev_state, vdev, &mdev->dev,
samples/vfio-mdev/mdpy.c
268
if (IS_ERR(mdev_state))
samples/vfio-mdev/mdpy.c
269
return PTR_ERR(mdev_state);
samples/vfio-mdev/mdpy.c
271
ret = vfio_register_emulated_iommu_dev(&mdev_state->vdev);
samples/vfio-mdev/mdpy.c
274
dev_set_drvdata(&mdev->dev, mdev_state);
samples/vfio-mdev/mdpy.c
278
vfio_put_device(&mdev_state->vdev);
samples/vfio-mdev/mdpy.c
284
struct mdev_state *mdev_state =
samples/vfio-mdev/mdpy.c
285
container_of(vdev, struct mdev_state, vdev);
samples/vfio-mdev/mdpy.c
287
vfree(mdev_state->memblk);
samples/vfio-mdev/mdpy.c
288
kfree(mdev_state->vconfig);
samples/vfio-mdev/mdpy.c
293
struct mdev_state *mdev_state = dev_get_drvdata(&mdev->dev);
samples/vfio-mdev/mdpy.c
297
vfio_unregister_group_dev(&mdev_state->vdev);
samples/vfio-mdev/mdpy.c
298
vfio_put_device(&mdev_state->vdev);
samples/vfio-mdev/mdpy.c
304
struct mdev_state *mdev_state =
samples/vfio-mdev/mdpy.c
305
container_of(vdev, struct mdev_state, vdev);
samples/vfio-mdev/mdpy.c
315
ret = mdev_access(mdev_state, (char *)&val, sizeof(val),
samples/vfio-mdev/mdpy.c
327
ret = mdev_access(mdev_state, (char *)&val, sizeof(val),
samples/vfio-mdev/mdpy.c
339
ret = mdev_access(mdev_state, (char *)&val, sizeof(val),
samples/vfio-mdev/mdpy.c
365
struct mdev_state *mdev_state =
samples/vfio-mdev/mdpy.c
366
container_of(vdev, struct mdev_state, vdev);
samples/vfio-mdev/mdpy.c
379
ret = mdev_access(mdev_state, (char *)&val, sizeof(val),
samples/vfio-mdev/mdpy.c
391
ret = mdev_access(mdev_state, (char *)&val, sizeof(val),
samples/vfio-mdev/mdpy.c
403
ret = mdev_access(mdev_state, (char *)&val, sizeof(val),
samples/vfio-mdev/mdpy.c
423
struct mdev_state *mdev_state =
samples/vfio-mdev/mdpy.c
424
container_of(vdev, struct mdev_state, vdev);
samples/vfio-mdev/mdpy.c
430
if (vma->vm_end - vma->vm_start > mdev_state->memsize)
samples/vfio-mdev/mdpy.c
435
return remap_vmalloc_range(vma, mdev_state->memblk, 0);
samples/vfio-mdev/mdpy.c
442
struct mdev_state *mdev_state =
samples/vfio-mdev/mdpy.c
443
container_of(vdev, struct mdev_state, vdev);
samples/vfio-mdev/mdpy.c
459
region_info->size = mdev_state->memsize;
samples/vfio-mdev/mdpy.c
487
static int mdpy_query_gfx_plane(struct mdev_state *mdev_state,
samples/vfio-mdev/mdpy.c
500
plane->drm_format = mdev_state->type->format;
samples/vfio-mdev/mdpy.c
501
plane->width = mdev_state->type->width;
samples/vfio-mdev/mdpy.c
502
plane->height = mdev_state->type->height;
samples/vfio-mdev/mdpy.c
503
plane->stride = (mdev_state->type->width *
samples/vfio-mdev/mdpy.c
504
mdev_state->type->bytepp);
samples/vfio-mdev/mdpy.c
505
plane->size = mdev_state->memsize;
samples/vfio-mdev/mdpy.c
523
struct mdev_state *mdev_state =
samples/vfio-mdev/mdpy.c
524
container_of(vdev, struct mdev_state, vdev);
samples/vfio-mdev/mdpy.c
543
memcpy(&mdev_state->dev_info, &info, sizeof(info));
samples/vfio-mdev/mdpy.c
561
(info.index >= mdev_state->dev_info.num_irqs))
samples/vfio-mdev/mdpy.c
587
ret = mdpy_query_gfx_plane(mdev_state, &plane);
samples/vfio-mdev/mdpy.c
601
return mdpy_reset(mdev_state);
samples/vfio-mdev/mdpy.c
610
struct mdev_state *mdev_state = dev_get_drvdata(dev);
samples/vfio-mdev/mdpy.c
613
mdev_state->type->width,
samples/vfio-mdev/mdpy.c
614
mdev_state->type->height);
samples/vfio-mdev/mtty.c
1004
migf->data.nr_ports = mdev_state->nr_ports;
samples/vfio-mdev/mtty.c
1008
dev_dbg(mdev_state->vdev.dev, "%s filled header to %zu\n",
samples/vfio-mdev/mtty.c
1011
ret = mdev_state->saving_migf = migf;
samples/vfio-mdev/mtty.c
1015
mtty_save_state(mdev_state);
samples/vfio-mdev/mtty.c
1024
struct mdev_state *mdev_state = migf->mdev_state;
samples/vfio-mdev/mtty.c
1037
if (requested_length > mtty_data_size(mdev_state))
samples/vfio-mdev/mtty.c
1055
dev_dbg(migf->mdev_state->vdev.dev, "%s received %zu, total %zu\n",
samples/vfio-mdev/mtty.c
1063
migf->data.nr_ports != mdev_state->nr_ports) {
samples/vfio-mdev/mtty.c
1064
dev_dbg(migf->mdev_state->vdev.dev,
samples/vfio-mdev/mtty.c
1068
dev_dbg(migf->mdev_state->vdev.dev,
samples/vfio-mdev/mtty.c
1087
mtty_resume_device_data(struct mdev_state *mdev_state)
samples/vfio-mdev/mtty.c
1106
migf->mdev_state = mdev_state;
samples/vfio-mdev/mtty.c
1108
mdev_state->resuming_migf = migf;
samples/vfio-mdev/mtty.c
1113
static struct file *mtty_step_state(struct mdev_state *mdev_state,
samples/vfio-mdev/mtty.c
1116
enum vfio_device_mig_state cur = mdev_state->state;
samples/vfio-mdev/mtty.c
1118
dev_dbg(mdev_state->vdev.dev, "%s: %d -> %d\n", __func__, cur, new);
samples/vfio-mdev/mtty.c
1158
ret = mtty_load_state(mdev_state);
samples/vfio-mdev/mtty.c
1161
mtty_disable_files(mdev_state);
samples/vfio-mdev/mtty.c
1171
mtty_disable_files(mdev_state);
samples/vfio-mdev/mtty.c
1194
migf = mtty_save_device_data(mdev_state, new);
samples/vfio-mdev/mtty.c
1210
migf = mtty_resume_device_data(mdev_state);
samples/vfio-mdev/mtty.c
1227
struct mdev_state *mdev_state =
samples/vfio-mdev/mtty.c
1228
container_of(vdev, struct mdev_state, vdev);
samples/vfio-mdev/mtty.c
1233
mutex_lock(&mdev_state->state_mutex);
samples/vfio-mdev/mtty.c
1234
while (mdev_state->state != new_state) {
samples/vfio-mdev/mtty.c
1236
int rc = vfio_mig_get_next_state(vdev, mdev_state->state,
samples/vfio-mdev/mtty.c
1243
ret = mtty_step_state(mdev_state, next_state);
samples/vfio-mdev/mtty.c
1247
mdev_state->state = next_state;
samples/vfio-mdev/mtty.c
1255
mtty_state_mutex_unlock(mdev_state);
samples/vfio-mdev/mtty.c
1262
struct mdev_state *mdev_state =
samples/vfio-mdev/mtty.c
1263
container_of(vdev, struct mdev_state, vdev);
samples/vfio-mdev/mtty.c
1265
mutex_lock(&mdev_state->state_mutex);
samples/vfio-mdev/mtty.c
1266
*current_state = mdev_state->state;
samples/vfio-mdev/mtty.c
1267
mtty_state_mutex_unlock(mdev_state);
samples/vfio-mdev/mtty.c
1274
struct mdev_state *mdev_state =
samples/vfio-mdev/mtty.c
1275
container_of(vdev, struct mdev_state, vdev);
samples/vfio-mdev/mtty.c
1277
*stop_copy_length = mtty_data_size(mdev_state);
samples/vfio-mdev/mtty.c
1314
struct mdev_state *mdev_state =
samples/vfio-mdev/mtty.c
1315
container_of(vdev, struct mdev_state, vdev);
samples/vfio-mdev/mtty.c
1329
mdev_state->nr_ports = type->nr_ports;
samples/vfio-mdev/mtty.c
1330
mdev_state->irq_index = -1;
samples/vfio-mdev/mtty.c
1331
mdev_state->s[0].max_fifo_size = MAX_FIFO_SIZE;
samples/vfio-mdev/mtty.c
1332
mdev_state->s[1].max_fifo_size = MAX_FIFO_SIZE;
samples/vfio-mdev/mtty.c
1333
mutex_init(&mdev_state->rxtx_lock);
samples/vfio-mdev/mtty.c
1335
mdev_state->vconfig = kzalloc(MTTY_CONFIG_SPACE_SIZE, GFP_KERNEL);
samples/vfio-mdev/mtty.c
1336
if (!mdev_state->vconfig) {
samples/vfio-mdev/mtty.c
1341
mutex_init(&mdev_state->ops_lock);
samples/vfio-mdev/mtty.c
1342
mdev_state->mdev = mdev;
samples/vfio-mdev/mtty.c
1343
mtty_create_config_space(mdev_state);
samples/vfio-mdev/mtty.c
1345
mutex_init(&mdev_state->state_mutex);
samples/vfio-mdev/mtty.c
1346
mutex_init(&mdev_state->reset_mutex);
samples/vfio-mdev/mtty.c
1352
mdev_state->state = VFIO_DEVICE_STATE_RUNNING;
samples/vfio-mdev/mtty.c
1363
struct mdev_state *mdev_state;
samples/vfio-mdev/mtty.c
1366
mdev_state = vfio_alloc_device(mdev_state, vdev, &mdev->dev,
samples/vfio-mdev/mtty.c
1368
if (IS_ERR(mdev_state))
samples/vfio-mdev/mtty.c
1369
return PTR_ERR(mdev_state);
samples/vfio-mdev/mtty.c
1371
ret = vfio_register_emulated_iommu_dev(&mdev_state->vdev);
samples/vfio-mdev/mtty.c
1374
dev_set_drvdata(&mdev->dev, mdev_state);
samples/vfio-mdev/mtty.c
1378
vfio_put_device(&mdev_state->vdev);
samples/vfio-mdev/mtty.c
1384
struct mdev_state *mdev_state =
samples/vfio-mdev/mtty.c
1385
container_of(vdev, struct mdev_state, vdev);
samples/vfio-mdev/mtty.c
1387
mutex_destroy(&mdev_state->reset_mutex);
samples/vfio-mdev/mtty.c
1388
mutex_destroy(&mdev_state->state_mutex);
samples/vfio-mdev/mtty.c
1389
atomic_add(mdev_state->nr_ports, &mdev_avail_ports);
samples/vfio-mdev/mtty.c
1390
kfree(mdev_state->vconfig);
samples/vfio-mdev/mtty.c
1395
struct mdev_state *mdev_state = dev_get_drvdata(&mdev->dev);
samples/vfio-mdev/mtty.c
1397
vfio_unregister_group_dev(&mdev_state->vdev);
samples/vfio-mdev/mtty.c
1398
vfio_put_device(&mdev_state->vdev);
samples/vfio-mdev/mtty.c
1401
static int mtty_reset(struct mdev_state *mdev_state)
samples/vfio-mdev/mtty.c
1405
mutex_lock(&mdev_state->reset_mutex);
samples/vfio-mdev/mtty.c
1406
mdev_state->deferred_reset = true;
samples/vfio-mdev/mtty.c
1407
if (!mutex_trylock(&mdev_state->state_mutex)) {
samples/vfio-mdev/mtty.c
1408
mutex_unlock(&mdev_state->reset_mutex);
samples/vfio-mdev/mtty.c
141
struct mdev_state;
samples/vfio-mdev/mtty.c
1411
mutex_unlock(&mdev_state->reset_mutex);
samples/vfio-mdev/mtty.c
1412
mtty_state_mutex_unlock(mdev_state);
samples/vfio-mdev/mtty.c
1420
struct mdev_state *mdev_state =
samples/vfio-mdev/mtty.c
1421
container_of(vdev, struct mdev_state, vdev);
samples/vfio-mdev/mtty.c
1431
ret = mdev_access(mdev_state, (u8 *)&val, sizeof(val),
samples/vfio-mdev/mtty.c
1443
ret = mdev_access(mdev_state, (u8 *)&val, sizeof(val),
samples/vfio-mdev/mtty.c
1455
ret = mdev_access(mdev_state, (u8 *)&val, sizeof(val),
samples/vfio-mdev/mtty.c
146
struct mdev_state *mdev_state;
samples/vfio-mdev/mtty.c
1481
struct mdev_state *mdev_state =
samples/vfio-mdev/mtty.c
1482
container_of(vdev, struct mdev_state, vdev);
samples/vfio-mdev/mtty.c
1495
ret = mdev_access(mdev_state, (u8 *)&val, sizeof(val),
samples/vfio-mdev/mtty.c
1507
ret = mdev_access(mdev_state, (u8 *)&val, sizeof(val),
samples/vfio-mdev/mtty.c
1519
ret = mdev_access(mdev_state, (u8 *)&val, sizeof(val),
samples/vfio-mdev/mtty.c
1537
static void mtty_disable_intx(struct mdev_state *mdev_state)
samples/vfio-mdev/mtty.c
1539
if (mdev_state->intx_evtfd) {
samples/vfio-mdev/mtty.c
1540
eventfd_ctx_put(mdev_state->intx_evtfd);
samples/vfio-mdev/mtty.c
1541
mdev_state->intx_evtfd = NULL;
samples/vfio-mdev/mtty.c
1542
mdev_state->intx_mask = false;
samples/vfio-mdev/mtty.c
1543
mdev_state->irq_index = -1;
samples/vfio-mdev/mtty.c
1547
static void mtty_disable_msi(struct mdev_state *mdev_state)
samples/vfio-mdev/mtty.c
1549
if (mdev_state->msi_evtfd) {
samples/vfio-mdev/mtty.c
1550
eventfd_ctx_put(mdev_state->msi_evtfd);
samples/vfio-mdev/mtty.c
1551
mdev_state->msi_evtfd = NULL;
samples/vfio-mdev/mtty.c
1552
mdev_state->irq_index = -1;
samples/vfio-mdev/mtty.c
1556
static int mtty_set_irqs(struct mdev_state *mdev_state, uint32_t flags,
samples/vfio-mdev/mtty.c
1562
mutex_lock(&mdev_state->ops_lock);
samples/vfio-mdev/mtty.c
1567
if (!is_intx(mdev_state) || start != 0 || count != 1) {
samples/vfio-mdev/mtty.c
1573
mdev_state->intx_mask = true;
samples/vfio-mdev/mtty.c
1578
mdev_state->intx_mask = true;
samples/vfio-mdev/mtty.c
1584
if (!is_intx(mdev_state) || start != 0 || count != 1) {
samples/vfio-mdev/mtty.c
1590
mdev_state->intx_mask = false;
samples/vfio-mdev/mtty.c
1595
mdev_state->intx_mask = false;
samples/vfio-mdev/mtty.c
1601
if (is_intx(mdev_state) && !count &&
samples/vfio-mdev/mtty.c
1603
mtty_disable_intx(mdev_state);
samples/vfio-mdev/mtty.c
1607
if (!(is_intx(mdev_state) || is_noirq(mdev_state)) ||
samples/vfio-mdev/mtty.c
1617
mtty_disable_intx(mdev_state);
samples/vfio-mdev/mtty.c
1627
mdev_state->intx_evtfd = evt;
samples/vfio-mdev/mtty.c
1628
mdev_state->irq_index = index;
samples/vfio-mdev/mtty.c
1632
if (!is_intx(mdev_state)) {
samples/vfio-mdev/mtty.c
1638
mtty_trigger_interrupt(mdev_state);
samples/vfio-mdev/mtty.c
1643
mtty_trigger_interrupt(mdev_state);
samples/vfio-mdev/mtty.c
1655
if (is_msi(mdev_state) && !count &&
samples/vfio-mdev/mtty.c
1657
mtty_disable_msi(mdev_state);
samples/vfio-mdev/mtty.c
1661
if (!(is_msi(mdev_state) || is_noirq(mdev_state)) ||
samples/vfio-mdev/mtty.c
1671
mtty_disable_msi(mdev_state);
samples/vfio-mdev/mtty.c
1681
mdev_state->msi_evtfd = evt;
samples/vfio-mdev/mtty.c
1682
mdev_state->irq_index = index;
samples/vfio-mdev/mtty.c
1686
if (!is_msi(mdev_state)) {
samples/vfio-mdev/mtty.c
1692
mtty_trigger_interrupt(mdev_state);
samples/vfio-mdev/mtty.c
1697
mtty_trigger_interrupt(mdev_state);
samples/vfio-mdev/mtty.c
1703
dev_dbg(mdev_state->vdev.dev, "%s: MSIX_IRQ\n", __func__);
samples/vfio-mdev/mtty.c
1707
dev_dbg(mdev_state->vdev.dev, "%s: ERR_IRQ\n", __func__);
samples/vfio-mdev/mtty.c
1711
dev_dbg(mdev_state->vdev.dev, "%s: REQ_IRQ\n", __func__);
samples/vfio-mdev/mtty.c
1716
mutex_unlock(&mdev_state->ops_lock);
samples/vfio-mdev/mtty.c
1724
struct mdev_state *mdev_state =
samples/vfio-mdev/mtty.c
1725
container_of(vdev, struct mdev_state, vdev);
samples/vfio-mdev/mtty.c
1733
mutex_lock(&mdev_state->ops_lock);
samples/vfio-mdev/mtty.c
1743
if (mdev_state->nr_ports == 2)
samples/vfio-mdev/mtty.c
1751
mdev_state->region_info[bar_index].size = size;
samples/vfio-mdev/mtty.c
1752
mdev_state->region_info[bar_index].vfio_offset =
samples/vfio-mdev/mtty.c
1759
mutex_unlock(&mdev_state->ops_lock);
samples/vfio-mdev/mtty.c
1793
struct mdev_state *mdev_state =
samples/vfio-mdev/mtty.c
1794
container_of(vdev, struct mdev_state, vdev);
samples/vfio-mdev/mtty.c
1815
memcpy(&mdev_state->dev_info, &info, sizeof(info));
samples/vfio-mdev/mtty.c
1833
(info.index >= mdev_state->dev_info.num_irqs))
samples/vfio-mdev/mtty.c
1857
mdev_state->dev_info.num_irqs,
samples/vfio-mdev/mtty.c
1870
ret = mtty_set_irqs(mdev_state, hdr.flags, hdr.index, hdr.start,
samples/vfio-mdev/mtty.c
1877
return mtty_reset(mdev_state);
samples/vfio-mdev/mtty.c
1915
struct mdev_state *mdev_state =
samples/vfio-mdev/mtty.c
1916
container_of(vdev, struct mdev_state, vdev);
samples/vfio-mdev/mtty.c
1918
mtty_disable_files(mdev_state);
samples/vfio-mdev/mtty.c
1919
mtty_disable_intx(mdev_state);
samples/vfio-mdev/mtty.c
1920
mtty_disable_msi(mdev_state);
samples/vfio-mdev/mtty.c
216
static bool is_intx(struct mdev_state *mdev_state)
samples/vfio-mdev/mtty.c
218
return mdev_state->irq_index == VFIO_PCI_INTX_IRQ_INDEX;
samples/vfio-mdev/mtty.c
221
static bool is_msi(struct mdev_state *mdev_state)
samples/vfio-mdev/mtty.c
223
return mdev_state->irq_index == VFIO_PCI_MSI_IRQ_INDEX;
samples/vfio-mdev/mtty.c
226
static bool is_noirq(struct mdev_state *mdev_state)
samples/vfio-mdev/mtty.c
228
return !is_intx(mdev_state) && !is_msi(mdev_state);
samples/vfio-mdev/mtty.c
231
static void mtty_trigger_interrupt(struct mdev_state *mdev_state)
samples/vfio-mdev/mtty.c
233
lockdep_assert_held(&mdev_state->ops_lock);
samples/vfio-mdev/mtty.c
235
if (is_msi(mdev_state)) {
samples/vfio-mdev/mtty.c
236
if (mdev_state->msi_evtfd)
samples/vfio-mdev/mtty.c
237
eventfd_signal(mdev_state->msi_evtfd);
samples/vfio-mdev/mtty.c
238
} else if (is_intx(mdev_state)) {
samples/vfio-mdev/mtty.c
239
if (mdev_state->intx_evtfd && !mdev_state->intx_mask) {
samples/vfio-mdev/mtty.c
240
eventfd_signal(mdev_state->intx_evtfd);
samples/vfio-mdev/mtty.c
241
mdev_state->intx_mask = true;
samples/vfio-mdev/mtty.c
246
static void mtty_create_config_space(struct mdev_state *mdev_state)
samples/vfio-mdev/mtty.c
249
STORE_LE32((u32 *) &mdev_state->vconfig[0x0], 0x32534348);
samples/vfio-mdev/mtty.c
252
STORE_LE16((u16 *) &mdev_state->vconfig[0x4], 0x0001);
samples/vfio-mdev/mtty.c
255
STORE_LE16((u16 *) &mdev_state->vconfig[0x6], 0x0200);
samples/vfio-mdev/mtty.c
258
mdev_state->vconfig[0x8] = 0x10;
samples/vfio-mdev/mtty.c
261
mdev_state->vconfig[0x9] = 0x02;
samples/vfio-mdev/mtty.c
264
mdev_state->vconfig[0xa] = 0x00;
samples/vfio-mdev/mtty.c
267
mdev_state->vconfig[0xb] = 0x07;
samples/vfio-mdev/mtty.c
271
STORE_LE32((u32 *) &mdev_state->vconfig[0x10], 0x000001);
samples/vfio-mdev/mtty.c
272
mdev_state->bar_mask[0] = ~(MTTY_IO_BAR_SIZE) + 1;
samples/vfio-mdev/mtty.c
274
if (mdev_state->nr_ports == 2) {
samples/vfio-mdev/mtty.c
276
STORE_LE32((u32 *) &mdev_state->vconfig[0x14], 0x000001);
samples/vfio-mdev/mtty.c
277
mdev_state->bar_mask[1] = ~(MTTY_IO_BAR_SIZE) + 1;
samples/vfio-mdev/mtty.c
281
STORE_LE32((u32 *) &mdev_state->vconfig[0x2c], 0x32534348);
samples/vfio-mdev/mtty.c
283
mdev_state->vconfig[0x34] = 0x00; /* Cap Ptr */
samples/vfio-mdev/mtty.c
284
mdev_state->vconfig[0x3d] = 0x01; /* interrupt pin (INTA#) */
samples/vfio-mdev/mtty.c
287
mdev_state->vconfig[0x40] = 0x23;
samples/vfio-mdev/mtty.c
288
mdev_state->vconfig[0x43] = 0x80;
samples/vfio-mdev/mtty.c
289
mdev_state->vconfig[0x44] = 0x23;
samples/vfio-mdev/mtty.c
290
mdev_state->vconfig[0x48] = 0x23;
samples/vfio-mdev/mtty.c
291
mdev_state->vconfig[0x4c] = 0x23;
samples/vfio-mdev/mtty.c
293
mdev_state->vconfig[0x60] = 0x50;
samples/vfio-mdev/mtty.c
294
mdev_state->vconfig[0x61] = 0x43;
samples/vfio-mdev/mtty.c
295
mdev_state->vconfig[0x62] = 0x49;
samples/vfio-mdev/mtty.c
296
mdev_state->vconfig[0x63] = 0x20;
samples/vfio-mdev/mtty.c
297
mdev_state->vconfig[0x64] = 0x53;
samples/vfio-mdev/mtty.c
298
mdev_state->vconfig[0x65] = 0x65;
samples/vfio-mdev/mtty.c
299
mdev_state->vconfig[0x66] = 0x72;
samples/vfio-mdev/mtty.c
300
mdev_state->vconfig[0x67] = 0x69;
samples/vfio-mdev/mtty.c
301
mdev_state->vconfig[0x68] = 0x61;
samples/vfio-mdev/mtty.c
302
mdev_state->vconfig[0x69] = 0x6c;
samples/vfio-mdev/mtty.c
303
mdev_state->vconfig[0x6a] = 0x2f;
samples/vfio-mdev/mtty.c
304
mdev_state->vconfig[0x6b] = 0x55;
samples/vfio-mdev/mtty.c
305
mdev_state->vconfig[0x6c] = 0x41;
samples/vfio-mdev/mtty.c
306
mdev_state->vconfig[0x6d] = 0x52;
samples/vfio-mdev/mtty.c
307
mdev_state->vconfig[0x6e] = 0x54;
samples/vfio-mdev/mtty.c
310
static void handle_pci_cfg_write(struct mdev_state *mdev_state, u16 offset,
samples/vfio-mdev/mtty.c
321
mdev_state->vconfig[0x3c] = buf[0];
samples/vfio-mdev/mtty.c
336
if ((mdev_state->nr_ports == 1) && (bar_index == 1)) {
samples/vfio-mdev/mtty.c
337
STORE_LE32(&mdev_state->vconfig[offset], 0);
samples/vfio-mdev/mtty.c
345
bar_mask = mdev_state->bar_mask[bar_index];
samples/vfio-mdev/mtty.c
349
cfg_addr |= (mdev_state->vconfig[offset] & 0x3ul);
samples/vfio-mdev/mtty.c
350
STORE_LE32(&mdev_state->vconfig[offset], cfg_addr);
samples/vfio-mdev/mtty.c
355
STORE_LE32(&mdev_state->vconfig[offset], 0);
samples/vfio-mdev/mtty.c
364
static void handle_bar_write(unsigned int index, struct mdev_state *mdev_state,
samples/vfio-mdev/mtty.c
373
if (mdev_state->s[index].dlab) {
samples/vfio-mdev/mtty.c
374
mdev_state->s[index].divisor |= data;
samples/vfio-mdev/mtty.c
378
mutex_lock(&mdev_state->rxtx_lock);
samples/vfio-mdev/mtty.c
381
if (mdev_state->s[index].rxtx.count <
samples/vfio-mdev/mtty.c
382
mdev_state->s[index].max_fifo_size) {
samples/vfio-mdev/mtty.c
383
mdev_state->s[index].rxtx.fifo[
samples/vfio-mdev/mtty.c
384
mdev_state->s[index].rxtx.head] = data;
samples/vfio-mdev/mtty.c
385
mdev_state->s[index].rxtx.count++;
samples/vfio-mdev/mtty.c
386
CIRCULAR_BUF_INC_IDX(mdev_state->s[index].rxtx.head);
samples/vfio-mdev/mtty.c
387
mdev_state->s[index].overrun = false;
samples/vfio-mdev/mtty.c
393
if ((mdev_state->s[index].uart_reg[UART_IER] &
samples/vfio-mdev/mtty.c
395
(mdev_state->s[index].rxtx.count ==
samples/vfio-mdev/mtty.c
396
mdev_state->s[index].intr_trigger_level)) {
samples/vfio-mdev/mtty.c
402
mtty_trigger_interrupt(mdev_state);
samples/vfio-mdev/mtty.c
408
mdev_state->s[index].overrun = true;
samples/vfio-mdev/mtty.c
414
if (mdev_state->s[index].uart_reg[UART_IER] &
samples/vfio-mdev/mtty.c
416
mtty_trigger_interrupt(mdev_state);
samples/vfio-mdev/mtty.c
418
mutex_unlock(&mdev_state->rxtx_lock);
samples/vfio-mdev/mtty.c
423
if (mdev_state->s[index].dlab)
samples/vfio-mdev/mtty.c
424
mdev_state->s[index].divisor |= (u16)data << 8;
samples/vfio-mdev/mtty.c
426
mdev_state->s[index].uart_reg[offset] = data;
samples/vfio-mdev/mtty.c
427
mutex_lock(&mdev_state->rxtx_lock);
samples/vfio-mdev/mtty.c
429
(mdev_state->s[index].rxtx.head ==
samples/vfio-mdev/mtty.c
430
mdev_state->s[index].rxtx.tail)) {
samples/vfio-mdev/mtty.c
435
mtty_trigger_interrupt(mdev_state);
samples/vfio-mdev/mtty.c
438
mutex_unlock(&mdev_state->rxtx_lock);
samples/vfio-mdev/mtty.c
444
mdev_state->s[index].fcr = data;
samples/vfio-mdev/mtty.c
446
mutex_lock(&mdev_state->rxtx_lock);
samples/vfio-mdev/mtty.c
449
mdev_state->s[index].rxtx.count = 0;
samples/vfio-mdev/mtty.c
450
mdev_state->s[index].rxtx.head = 0;
samples/vfio-mdev/mtty.c
451
mdev_state->s[index].rxtx.tail = 0;
samples/vfio-mdev/mtty.c
453
mutex_unlock(&mdev_state->rxtx_lock);
samples/vfio-mdev/mtty.c
457
mdev_state->s[index].intr_trigger_level = 1;
samples/vfio-mdev/mtty.c
461
mdev_state->s[index].intr_trigger_level = 4;
samples/vfio-mdev/mtty.c
465
mdev_state->s[index].intr_trigger_level = 8;
samples/vfio-mdev/mtty.c
469
mdev_state->s[index].intr_trigger_level = 14;
samples/vfio-mdev/mtty.c
478
mdev_state->s[index].intr_trigger_level = 1;
samples/vfio-mdev/mtty.c
480
mdev_state->s[index].max_fifo_size = MAX_FIFO_SIZE;
samples/vfio-mdev/mtty.c
482
mdev_state->s[index].max_fifo_size = 1;
samples/vfio-mdev/mtty.c
483
mdev_state->s[index].intr_trigger_level = 1;
samples/vfio-mdev/mtty.c
490
mdev_state->s[index].dlab = true;
samples/vfio-mdev/mtty.c
491
mdev_state->s[index].divisor = 0;
samples/vfio-mdev/mtty.c
493
mdev_state->s[index].dlab = false;
samples/vfio-mdev/mtty.c
495
mdev_state->s[index].uart_reg[offset] = data;
samples/vfio-mdev/mtty.c
499
mdev_state->s[index].uart_reg[offset] = data;
samples/vfio-mdev/mtty.c
501
if ((mdev_state->s[index].uart_reg[UART_IER] & UART_IER_MSI) &&
samples/vfio-mdev/mtty.c
506
mtty_trigger_interrupt(mdev_state);
samples/vfio-mdev/mtty.c
509
if ((mdev_state->s[index].uart_reg[UART_IER] & UART_IER_MSI) &&
samples/vfio-mdev/mtty.c
514
mtty_trigger_interrupt(mdev_state);
samples/vfio-mdev/mtty.c
524
mdev_state->s[index].uart_reg[offset] = data;
samples/vfio-mdev/mtty.c
532
static void handle_bar_read(unsigned int index, struct mdev_state *mdev_state,
samples/vfio-mdev/mtty.c
539
if (mdev_state->s[index].dlab) {
samples/vfio-mdev/mtty.c
540
*buf = (u8)mdev_state->s[index].divisor;
samples/vfio-mdev/mtty.c
544
mutex_lock(&mdev_state->rxtx_lock);
samples/vfio-mdev/mtty.c
546
if (mdev_state->s[index].rxtx.head !=
samples/vfio-mdev/mtty.c
547
mdev_state->s[index].rxtx.tail) {
samples/vfio-mdev/mtty.c
548
*buf = mdev_state->s[index].rxtx.fifo[
samples/vfio-mdev/mtty.c
549
mdev_state->s[index].rxtx.tail];
samples/vfio-mdev/mtty.c
550
mdev_state->s[index].rxtx.count--;
samples/vfio-mdev/mtty.c
551
CIRCULAR_BUF_INC_IDX(mdev_state->s[index].rxtx.tail);
samples/vfio-mdev/mtty.c
554
if (mdev_state->s[index].rxtx.head ==
samples/vfio-mdev/mtty.c
555
mdev_state->s[index].rxtx.tail) {
samples/vfio-mdev/mtty.c
563
if (mdev_state->s[index].uart_reg[UART_IER] &
samples/vfio-mdev/mtty.c
565
mtty_trigger_interrupt(mdev_state);
samples/vfio-mdev/mtty.c
567
mutex_unlock(&mdev_state->rxtx_lock);
samples/vfio-mdev/mtty.c
572
if (mdev_state->s[index].dlab) {
samples/vfio-mdev/mtty.c
573
*buf = (u8)(mdev_state->s[index].divisor >> 8);
samples/vfio-mdev/mtty.c
576
*buf = mdev_state->s[index].uart_reg[offset] & 0x0f;
samples/vfio-mdev/mtty.c
581
u8 ier = mdev_state->s[index].uart_reg[UART_IER];
samples/vfio-mdev/mtty.c
584
mutex_lock(&mdev_state->rxtx_lock);
samples/vfio-mdev/mtty.c
586
if ((ier & UART_IER_RLSI) && mdev_state->s[index].overrun)
samples/vfio-mdev/mtty.c
591
(mdev_state->s[index].rxtx.count >=
samples/vfio-mdev/mtty.c
592
mdev_state->s[index].intr_trigger_level))
samples/vfio-mdev/mtty.c
597
(mdev_state->s[index].rxtx.head ==
samples/vfio-mdev/mtty.c
598
mdev_state->s[index].rxtx.tail))
samples/vfio-mdev/mtty.c
603
(mdev_state->s[index].uart_reg[UART_MCR] &
samples/vfio-mdev/mtty.c
613
mutex_unlock(&mdev_state->rxtx_lock);
samples/vfio-mdev/mtty.c
619
*buf = mdev_state->s[index].uart_reg[offset];
samples/vfio-mdev/mtty.c
626
mutex_lock(&mdev_state->rxtx_lock);
samples/vfio-mdev/mtty.c
628
if (mdev_state->s[index].rxtx.head !=
samples/vfio-mdev/mtty.c
629
mdev_state->s[index].rxtx.tail)
samples/vfio-mdev/mtty.c
633
if (mdev_state->s[index].overrun)
samples/vfio-mdev/mtty.c
637
if (mdev_state->s[index].rxtx.head ==
samples/vfio-mdev/mtty.c
638
mdev_state->s[index].rxtx.tail)
samples/vfio-mdev/mtty.c
641
mutex_unlock(&mdev_state->rxtx_lock);
samples/vfio-mdev/mtty.c
648
mutex_lock(&mdev_state->rxtx_lock);
samples/vfio-mdev/mtty.c
650
if (mdev_state->s[index].uart_reg[UART_MCR] &
samples/vfio-mdev/mtty.c
652
if (mdev_state->s[index].rxtx.count <
samples/vfio-mdev/mtty.c
653
mdev_state->s[index].max_fifo_size)
samples/vfio-mdev/mtty.c
657
mutex_unlock(&mdev_state->rxtx_lock);
samples/vfio-mdev/mtty.c
662
*buf = mdev_state->s[index].uart_reg[offset];
samples/vfio-mdev/mtty.c
670
static void mdev_read_base(struct mdev_state *mdev_state)
samples/vfio-mdev/mtty.c
680
if (!mdev_state->region_info[index].size)
samples/vfio-mdev/mtty.c
683
start_lo = (*(u32 *)(mdev_state->vconfig + pos)) &
samples/vfio-mdev/mtty.c
685
mem_type = (*(u32 *)(mdev_state->vconfig + pos)) &
samples/vfio-mdev/mtty.c
690
start_hi = (*(u32 *)(mdev_state->vconfig + pos + 4));
samples/vfio-mdev/mtty.c
702
mdev_state->region_info[index].start = ((u64)start_hi << 32) |
samples/vfio-mdev/mtty.c
707
static ssize_t mdev_access(struct mdev_state *mdev_state, u8 *buf, size_t count,
samples/vfio-mdev/mtty.c
717
mutex_lock(&mdev_state->ops_lock);
samples/vfio-mdev/mtty.c
730
handle_pci_cfg_write(mdev_state, offset, buf, count);
samples/vfio-mdev/mtty.c
732
memcpy(buf, (mdev_state->vconfig + offset), count);
samples/vfio-mdev/mtty.c
739
if (!mdev_state->region_info[index].start)
samples/vfio-mdev/mtty.c
740
mdev_read_base(mdev_state);
samples/vfio-mdev/mtty.c
748
*buf, mdev_state->s[index].dlab);
samples/vfio-mdev/mtty.c
750
handle_bar_write(index, mdev_state, offset, buf, count);
samples/vfio-mdev/mtty.c
752
handle_bar_read(index, mdev_state, offset, buf, count);
samples/vfio-mdev/mtty.c
758
*buf, mdev_state->s[index].dlab);
samples/vfio-mdev/mtty.c
772
mutex_unlock(&mdev_state->ops_lock);
samples/vfio-mdev/mtty.c
777
static size_t mtty_data_size(struct mdev_state *mdev_state)
samples/vfio-mdev/mtty.c
780
(mdev_state->nr_ports * sizeof(struct serial_port));
samples/vfio-mdev/mtty.c
792
static void mtty_disable_files(struct mdev_state *mdev_state)
samples/vfio-mdev/mtty.c
794
if (mdev_state->saving_migf) {
samples/vfio-mdev/mtty.c
795
mtty_disable_file(mdev_state->saving_migf);
samples/vfio-mdev/mtty.c
796
fput(mdev_state->saving_migf->filp);
samples/vfio-mdev/mtty.c
797
mdev_state->saving_migf = NULL;
samples/vfio-mdev/mtty.c
800
if (mdev_state->resuming_migf) {
samples/vfio-mdev/mtty.c
801
mtty_disable_file(mdev_state->resuming_migf);
samples/vfio-mdev/mtty.c
802
fput(mdev_state->resuming_migf->filp);
samples/vfio-mdev/mtty.c
803
mdev_state->resuming_migf = NULL;
samples/vfio-mdev/mtty.c
807
static void mtty_state_mutex_unlock(struct mdev_state *mdev_state)
samples/vfio-mdev/mtty.c
810
mutex_lock(&mdev_state->reset_mutex);
samples/vfio-mdev/mtty.c
811
if (mdev_state->deferred_reset) {
samples/vfio-mdev/mtty.c
812
mdev_state->deferred_reset = false;
samples/vfio-mdev/mtty.c
813
mutex_unlock(&mdev_state->reset_mutex);
samples/vfio-mdev/mtty.c
814
mdev_state->state = VFIO_DEVICE_STATE_RUNNING;
samples/vfio-mdev/mtty.c
815
mtty_disable_files(mdev_state);
samples/vfio-mdev/mtty.c
818
mutex_unlock(&mdev_state->state_mutex);
samples/vfio-mdev/mtty.c
819
mutex_unlock(&mdev_state->reset_mutex);
samples/vfio-mdev/mtty.c
837
struct mdev_state *mdev_state = migf->mdev_state;
samples/vfio-mdev/mtty.c
853
mutex_lock(&mdev_state->state_mutex);
samples/vfio-mdev/mtty.c
854
if (mdev_state->state != VFIO_DEVICE_STATE_PRE_COPY &&
samples/vfio-mdev/mtty.c
855
mdev_state->state != VFIO_DEVICE_STATE_PRE_COPY_P2P) {
samples/vfio-mdev/mtty.c
880
mtty_state_mutex_unlock(mdev_state);
samples/vfio-mdev/mtty.c
897
dev_dbg(migf->mdev_state->vdev.dev, "%s ask %zu\n", __func__, len);
samples/vfio-mdev/mtty.c
919
dev_dbg(migf->mdev_state->vdev.dev, "%s read %zu\n", __func__, ret);
samples/vfio-mdev/mtty.c
932
static void mtty_save_state(struct mdev_state *mdev_state)
samples/vfio-mdev/mtty.c
934
struct mtty_migration_file *migf = mdev_state->saving_migf;
samples/vfio-mdev/mtty.c
938
for (i = 0; i < mdev_state->nr_ports; i++) {
samples/vfio-mdev/mtty.c
940
&mdev_state->s[i], sizeof(struct serial_port));
samples/vfio-mdev/mtty.c
943
dev_dbg(mdev_state->vdev.dev,
samples/vfio-mdev/mtty.c
948
static int mtty_load_state(struct mdev_state *mdev_state)
samples/vfio-mdev/mtty.c
950
struct mtty_migration_file *migf = mdev_state->resuming_migf;
samples/vfio-mdev/mtty.c
955
if (migf->filled_size < mtty_data_size(mdev_state)) {
samples/vfio-mdev/mtty.c
956
dev_dbg(mdev_state->vdev.dev, "%s expected %zu, got %zu\n",
samples/vfio-mdev/mtty.c
957
__func__, mtty_data_size(mdev_state),
samples/vfio-mdev/mtty.c
963
for (i = 0; i < mdev_state->nr_ports; i++)
samples/vfio-mdev/mtty.c
964
memcpy(&mdev_state->s[i],
samples/vfio-mdev/mtty.c
972
mtty_save_device_data(struct mdev_state *mdev_state,
samples/vfio-mdev/mtty.c
975
struct mtty_migration_file *migf = mdev_state->saving_migf;
samples/vfio-mdev/mtty.c
999
migf->mdev_state = mdev_state;