Lines Matching +full:ext +full:- +full:regs

1 // SPDX-License-Identifier: GPL-2.0
5 * Emulate enough of qemu stdvga to make bochs-drm.ko happy. That is
8 * include any legacy vga stuff. Device looks a lot like "qemu -device
9 * secondary-vga".
33 #include <linux/dma-buf.h>
110 .type.pretty_name = MBOCHS_CLASS_NAME "-" MBOCHS_TYPE_1,
116 .type.pretty_name = MBOCHS_CLASS_NAME "-" MBOCHS_TYPE_2,
122 .type.pretty_name = MBOCHS_CLASS_NAME "-" MBOCHS_TYPE_3,
199 [VBE_DISPI_INDEX_VIRT_WIDTH] = "virt-width",
200 [VBE_DISPI_INDEX_VIRT_HEIGHT] = "virt-height",
201 [VBE_DISPI_INDEX_X_OFFSET] = "x-offset",
202 [VBE_DISPI_INDEX_Y_OFFSET] = "y-offset",
203 [VBE_DISPI_INDEX_VIDEO_MEMORY_64K] = "video-mem",
220 STORE_LE16((u16 *) &mdev_state->vconfig[PCI_VENDOR_ID], in mbochs_create_config_space()
222 STORE_LE16((u16 *) &mdev_state->vconfig[PCI_DEVICE_ID], in mbochs_create_config_space()
224 STORE_LE16((u16 *) &mdev_state->vconfig[PCI_SUBSYSTEM_VENDOR_ID], in mbochs_create_config_space()
226 STORE_LE16((u16 *) &mdev_state->vconfig[PCI_SUBSYSTEM_ID], in mbochs_create_config_space()
229 STORE_LE16((u16 *) &mdev_state->vconfig[PCI_COMMAND], in mbochs_create_config_space()
231 STORE_LE16((u16 *) &mdev_state->vconfig[PCI_CLASS_DEVICE], in mbochs_create_config_space()
233 mdev_state->vconfig[PCI_CLASS_REVISION] = 0x01; in mbochs_create_config_space()
235 STORE_LE32((u32 *) &mdev_state->vconfig[PCI_BASE_ADDRESS_0], in mbochs_create_config_space()
239 mdev_state->bar_mask[0] = ~(mdev_state->memsize) + 1; in mbochs_create_config_space()
241 STORE_LE32((u32 *) &mdev_state->vconfig[PCI_BASE_ADDRESS_2], in mbochs_create_config_space()
244 mdev_state->bar_mask[2] = ~(MBOCHS_MMIO_BAR_SIZE) + 1; in mbochs_create_config_space()
250 struct device *dev = mdev_dev(mdev_state->mdev); in mbochs_check_framebuffer()
251 u16 *vbe = mdev_state->vbe; in mbochs_check_framebuffer()
254 WARN_ON(!mutex_is_locked(&mdev_state->ops_lock)); in mbochs_check_framebuffer()
262 mode->drm_format = DRM_FORMAT_XRGB8888; in mbochs_check_framebuffer()
263 mode->bytepp = 4; in mbochs_check_framebuffer()
271 mode->width = vbe[VBE_DISPI_INDEX_XRES]; in mbochs_check_framebuffer()
272 mode->height = vbe[VBE_DISPI_INDEX_YRES]; in mbochs_check_framebuffer()
274 if (virt_width < mode->width) in mbochs_check_framebuffer()
275 virt_width = mode->width; in mbochs_check_framebuffer()
276 mode->stride = virt_width * mode->bytepp; in mbochs_check_framebuffer()
277 mode->size = (u64)mode->stride * mode->height; in mbochs_check_framebuffer()
278 mode->offset = ((u64)vbe[VBE_DISPI_INDEX_X_OFFSET] * mode->bytepp + in mbochs_check_framebuffer()
279 (u64)vbe[VBE_DISPI_INDEX_Y_OFFSET] * mode->stride); in mbochs_check_framebuffer()
281 if (mode->width < 64 || mode->height < 64) { in mbochs_check_framebuffer()
283 __func__, mode->width, mode->height); in mbochs_check_framebuffer()
286 if (mode->offset + mode->size > mdev_state->memsize) { in mbochs_check_framebuffer()
296 return -EINVAL; in mbochs_check_framebuffer()
308 struct device *dev = mdev_dev(mdev_state->mdev); in handle_pci_cfg_write()
309 int index = (offset - PCI_BASE_ADDRESS_0) / 0x04; in handle_pci_cfg_write()
318 cfg_addr = (cfg_addr & mdev_state->bar_mask[index]); in handle_pci_cfg_write()
326 cfg_addr |= (mdev_state->vconfig[offset] & in handle_pci_cfg_write()
328 STORE_LE32(&mdev_state->vconfig[offset], cfg_addr); in handle_pci_cfg_write()
336 struct device *dev = mdev_dev(mdev_state->mdev); in handle_mmio_write()
346 index = (offset - 0x500) / 2; in handle_mmio_write()
348 if (index < ARRAY_SIZE(mdev_state->vbe)) in handle_mmio_write()
349 mdev_state->vbe[index] = reg16; in handle_mmio_write()
353 case 0x600 ... 0x607: /* qemu extended regs */ in handle_mmio_write()
366 struct device *dev = mdev_dev(mdev_state->mdev); in handle_mmio_read()
373 edid = &mdev_state->edid_regs; in handle_mmio_read()
374 if (edid->link_state != VFIO_DEVICE_GFX_LINK_STATE_UP || in handle_mmio_read()
375 offset >= edid->edid_size) { in handle_mmio_read()
379 memcpy(buf, mdev_state->edid_blob + offset, count); in handle_mmio_read()
384 index = (offset - 0x500) / 2; in handle_mmio_read()
385 if (index < ARRAY_SIZE(mdev_state->vbe)) in handle_mmio_read()
386 reg16 = mdev_state->vbe[index]; in handle_mmio_read()
403 char *regs = (void *)&mdev_state->edid_regs; in handle_edid_regs() local
405 if (offset + count > sizeof(mdev_state->edid_regs)) in handle_edid_regs()
416 memcpy(regs + offset, buf, count); in handle_edid_regs()
419 /* read-only regs */ in handle_edid_regs()
423 memcpy(buf, regs + offset, count); in handle_edid_regs()
430 if (offset + count > mdev_state->edid_regs.edid_max_size) in handle_edid_blob()
433 memcpy(mdev_state->edid_blob + offset, buf, count); in handle_edid_blob()
435 memcpy(buf, mdev_state->edid_blob + offset, count); in handle_edid_blob()
446 mutex_lock(&mdev_state->ops_lock); in mdev_access()
452 memcpy(buf, (mdev_state->vconfig + pos), count); in mdev_access()
457 pos -= MBOCHS_MMIO_BAR_OFFSET; in mdev_access()
466 pos -= MBOCHS_EDID_OFFSET; in mdev_access()
470 pos -= MBOCHS_EDID_BLOB_OFFSET; in mdev_access()
476 MBOCHS_MEMORY_BAR_OFFSET + mdev_state->memsize) { in mdev_access()
477 pos -= MBOCHS_MMIO_BAR_OFFSET; in mdev_access()
489 dev_dbg(mdev_state->vdev.dev, "%s: %s @0x%llx (unhandled)\n", in mdev_access()
491 ret = -1; in mdev_access()
499 mutex_unlock(&mdev_state->ops_lock); in mdev_access()
506 u32 size64k = mdev_state->memsize / (64 * 1024); in mbochs_reset()
509 for (i = 0; i < ARRAY_SIZE(mdev_state->vbe); i++) in mbochs_reset()
510 mdev_state->vbe[i] = 0; in mbochs_reset()
511 mdev_state->vbe[VBE_DISPI_INDEX_ID] = VBE_DISPI_ID5; in mbochs_reset()
512 mdev_state->vbe[VBE_DISPI_INDEX_VIDEO_MEMORY_64K] = size64k; in mbochs_reset()
520 struct mdev_device *mdev = to_mdev_device(vdev->dev); in mbochs_init_dev()
522 container_of(mdev->type, struct mbochs_type, type); in mbochs_init_dev()
524 int ret = -ENOMEM; in mbochs_init_dev()
527 if (avail_mbytes < type->mbytes) in mbochs_init_dev()
528 return -ENOSPC; in mbochs_init_dev()
530 avail_mbytes - type->mbytes)); in mbochs_init_dev()
532 mdev_state->vconfig = kzalloc(MBOCHS_CONFIG_SPACE_SIZE, GFP_KERNEL); in mbochs_init_dev()
533 if (!mdev_state->vconfig) in mbochs_init_dev()
536 mdev_state->memsize = type->mbytes * 1024 * 1024; in mbochs_init_dev()
537 mdev_state->pagecount = mdev_state->memsize >> PAGE_SHIFT; in mbochs_init_dev()
538 mdev_state->pages = kcalloc(mdev_state->pagecount, in mbochs_init_dev()
541 if (!mdev_state->pages) in mbochs_init_dev()
544 mutex_init(&mdev_state->ops_lock); in mbochs_init_dev()
545 mdev_state->mdev = mdev; in mbochs_init_dev()
546 INIT_LIST_HEAD(&mdev_state->dmabufs); in mbochs_init_dev()
547 mdev_state->next_id = 1; in mbochs_init_dev()
549 mdev_state->type = type; in mbochs_init_dev()
550 mdev_state->edid_regs.max_xres = type->max_x; in mbochs_init_dev()
551 mdev_state->edid_regs.max_yres = type->max_y; in mbochs_init_dev()
552 mdev_state->edid_regs.edid_offset = MBOCHS_EDID_BLOB_OFFSET; in mbochs_init_dev()
553 mdev_state->edid_regs.edid_max_size = sizeof(mdev_state->edid_blob); in mbochs_init_dev()
557 dev_info(vdev->dev, "%s: %s, %d MB, %ld pages\n", __func__, in mbochs_init_dev()
558 type->type.pretty_name, type->mbytes, mdev_state->pagecount); in mbochs_init_dev()
562 kfree(mdev_state->vconfig); in mbochs_init_dev()
564 atomic_add(type->mbytes, &mbochs_avail_mbytes); in mbochs_init_dev()
571 int ret = -ENOMEM; in mbochs_probe()
573 mdev_state = vfio_alloc_device(mdev_state, vdev, &mdev->dev, in mbochs_probe()
578 ret = vfio_register_emulated_iommu_dev(&mdev_state->vdev); in mbochs_probe()
581 dev_set_drvdata(&mdev->dev, mdev_state); in mbochs_probe()
585 vfio_put_device(&mdev_state->vdev); in mbochs_probe()
594 atomic_add(mdev_state->type->mbytes, &mbochs_avail_mbytes); in mbochs_release_dev()
595 kfree(mdev_state->pages); in mbochs_release_dev()
596 kfree(mdev_state->vconfig); in mbochs_release_dev()
601 struct mdev_state *mdev_state = dev_get_drvdata(&mdev->dev); in mbochs_remove()
603 vfio_unregister_group_dev(&mdev_state->vdev); in mbochs_remove()
604 vfio_put_device(&mdev_state->vdev); in mbochs_remove()
656 count -= filled; in mbochs_read()
665 return -EFAULT; in mbochs_read()
716 count -= filled; in mbochs_write()
724 return -EFAULT; in mbochs_write()
730 WARN_ON(!mutex_is_locked(&mdev_state->ops_lock)); in __mbochs_get_page()
732 if (!mdev_state->pages[pgoff]) { in __mbochs_get_page()
733 mdev_state->pages[pgoff] = in __mbochs_get_page()
735 if (!mdev_state->pages[pgoff]) in __mbochs_get_page()
739 get_page(mdev_state->pages[pgoff]); in __mbochs_get_page()
740 return mdev_state->pages[pgoff]; in __mbochs_get_page()
748 if (WARN_ON(pgoff >= mdev_state->pagecount)) in mbochs_get_page()
751 mutex_lock(&mdev_state->ops_lock); in mbochs_get_page()
753 mutex_unlock(&mdev_state->ops_lock); in mbochs_get_page()
760 struct device *dev = mdev_dev(mdev_state->mdev); in mbochs_put_pages()
763 WARN_ON(!mutex_is_locked(&mdev_state->ops_lock)); in mbochs_put_pages()
765 for (i = 0; i < mdev_state->pagecount; i++) { in mbochs_put_pages()
766 if (!mdev_state->pages[i]) in mbochs_put_pages()
768 put_page(mdev_state->pages[i]); in mbochs_put_pages()
769 mdev_state->pages[i] = NULL; in mbochs_put_pages()
777 struct vm_area_struct *vma = vmf->vma; in mbochs_region_vm_fault()
778 struct mdev_state *mdev_state = vma->vm_private_data; in mbochs_region_vm_fault()
779 pgoff_t page_offset = (vmf->address - vma->vm_start) >> PAGE_SHIFT; in mbochs_region_vm_fault()
781 if (page_offset >= mdev_state->pagecount) in mbochs_region_vm_fault()
784 vmf->page = mbochs_get_page(mdev_state, page_offset); in mbochs_region_vm_fault()
785 if (!vmf->page) in mbochs_region_vm_fault()
800 if (vma->vm_pgoff != MBOCHS_MEMORY_BAR_OFFSET >> PAGE_SHIFT) in mbochs_mmap()
801 return -EINVAL; in mbochs_mmap()
802 if (vma->vm_end < vma->vm_start) in mbochs_mmap()
803 return -EINVAL; in mbochs_mmap()
804 if (vma->vm_end - vma->vm_start > mdev_state->memsize) in mbochs_mmap()
805 return -EINVAL; in mbochs_mmap()
806 if ((vma->vm_flags & VM_SHARED) == 0) in mbochs_mmap()
807 return -EINVAL; in mbochs_mmap()
809 vma->vm_ops = &mbochs_region_vm_ops; in mbochs_mmap()
810 vma->vm_private_data = mdev_state; in mbochs_mmap()
816 struct vm_area_struct *vma = vmf->vma; in mbochs_dmabuf_vm_fault()
817 struct mbochs_dmabuf *dmabuf = vma->vm_private_data; in mbochs_dmabuf_vm_fault()
819 if (WARN_ON(vmf->pgoff >= dmabuf->pagecount)) in mbochs_dmabuf_vm_fault()
822 vmf->page = dmabuf->pages[vmf->pgoff]; in mbochs_dmabuf_vm_fault()
823 get_page(vmf->page); in mbochs_dmabuf_vm_fault()
833 struct mbochs_dmabuf *dmabuf = buf->priv; in mbochs_mmap_dmabuf()
834 struct device *dev = mdev_dev(dmabuf->mdev_state->mdev); in mbochs_mmap_dmabuf()
836 dev_dbg(dev, "%s: %d\n", __func__, dmabuf->id); in mbochs_mmap_dmabuf()
838 if ((vma->vm_flags & VM_SHARED) == 0) in mbochs_mmap_dmabuf()
839 return -EINVAL; in mbochs_mmap_dmabuf()
841 vma->vm_ops = &mbochs_dmabuf_vm_ops; in mbochs_mmap_dmabuf()
842 vma->vm_private_data = dmabuf; in mbochs_mmap_dmabuf()
849 struct device *dev = mdev_dev(dmabuf->mdev_state->mdev); in mbochs_print_dmabuf()
850 u32 fourcc = dmabuf->mode.drm_format; in mbochs_print_dmabuf()
853 prefix, dmabuf->id, in mbochs_print_dmabuf()
854 fourcc ? ((fourcc >> 0) & 0xff) : '-', in mbochs_print_dmabuf()
855 fourcc ? ((fourcc >> 8) & 0xff) : '-', in mbochs_print_dmabuf()
856 fourcc ? ((fourcc >> 16) & 0xff) : '-', in mbochs_print_dmabuf()
857 fourcc ? ((fourcc >> 24) & 0xff) : '-', in mbochs_print_dmabuf()
858 dmabuf->mode.width, dmabuf->mode.height, dmabuf->mode.stride, in mbochs_print_dmabuf()
859 dmabuf->mode.offset, dmabuf->mode.size, dmabuf->pagecount); in mbochs_print_dmabuf()
865 struct mbochs_dmabuf *dmabuf = at->dmabuf->priv; in mbochs_map_dmabuf()
866 struct device *dev = mdev_dev(dmabuf->mdev_state->mdev); in mbochs_map_dmabuf()
869 dev_dbg(dev, "%s: %d\n", __func__, dmabuf->id); in mbochs_map_dmabuf()
874 if (sg_alloc_table_from_pages(sg, dmabuf->pages, dmabuf->pagecount, in mbochs_map_dmabuf()
875 0, dmabuf->mode.size, GFP_KERNEL) < 0) in mbochs_map_dmabuf()
877 if (dma_map_sgtable(at->dev, sg, direction, 0)) in mbochs_map_dmabuf()
887 return ERR_PTR(-ENOMEM); in mbochs_map_dmabuf()
894 struct mbochs_dmabuf *dmabuf = at->dmabuf->priv; in mbochs_unmap_dmabuf()
895 struct device *dev = mdev_dev(dmabuf->mdev_state->mdev); in mbochs_unmap_dmabuf()
897 dev_dbg(dev, "%s: %d\n", __func__, dmabuf->id); in mbochs_unmap_dmabuf()
899 dma_unmap_sgtable(at->dev, sg, direction, 0); in mbochs_unmap_dmabuf()
906 struct mbochs_dmabuf *dmabuf = buf->priv; in mbochs_release_dmabuf()
907 struct mdev_state *mdev_state = dmabuf->mdev_state; in mbochs_release_dmabuf()
908 struct device *dev = mdev_dev(mdev_state->mdev); in mbochs_release_dmabuf()
911 dev_dbg(dev, "%s: %d\n", __func__, dmabuf->id); in mbochs_release_dmabuf()
913 for (pg = 0; pg < dmabuf->pagecount; pg++) in mbochs_release_dmabuf()
914 put_page(dmabuf->pages[pg]); in mbochs_release_dmabuf()
916 mutex_lock(&mdev_state->ops_lock); in mbochs_release_dmabuf()
917 dmabuf->buf = NULL; in mbochs_release_dmabuf()
918 if (dmabuf->unlinked) in mbochs_release_dmabuf()
920 mutex_unlock(&mdev_state->ops_lock); in mbochs_release_dmabuf()
936 WARN_ON(!mutex_is_locked(&mdev_state->ops_lock)); in mbochs_dmabuf_alloc()
942 dmabuf->mode = *mode; in mbochs_dmabuf_alloc()
943 dmabuf->id = mdev_state->next_id++; in mbochs_dmabuf_alloc()
944 dmabuf->pagecount = DIV_ROUND_UP(mode->size, PAGE_SIZE); in mbochs_dmabuf_alloc()
945 dmabuf->pages = kcalloc(dmabuf->pagecount, sizeof(struct page *), in mbochs_dmabuf_alloc()
947 if (!dmabuf->pages) in mbochs_dmabuf_alloc()
950 page_offset = dmabuf->mode.offset >> PAGE_SHIFT; in mbochs_dmabuf_alloc()
951 for (pg = 0; pg < dmabuf->pagecount; pg++) { in mbochs_dmabuf_alloc()
952 dmabuf->pages[pg] = __mbochs_get_page(mdev_state, in mbochs_dmabuf_alloc()
954 if (!dmabuf->pages[pg]) in mbochs_dmabuf_alloc()
958 dmabuf->mdev_state = mdev_state; in mbochs_dmabuf_alloc()
959 list_add(&dmabuf->next, &mdev_state->dmabufs); in mbochs_dmabuf_alloc()
966 put_page(dmabuf->pages[--pg]); in mbochs_dmabuf_alloc()
967 kfree(dmabuf->pages); in mbochs_dmabuf_alloc()
979 WARN_ON(!mutex_is_locked(&mdev_state->ops_lock)); in mbochs_dmabuf_find_by_mode()
981 list_for_each_entry(dmabuf, &mdev_state->dmabufs, next) in mbochs_dmabuf_find_by_mode()
982 if (mbochs_modes_equal(&dmabuf->mode, mode)) in mbochs_dmabuf_find_by_mode()
993 WARN_ON(!mutex_is_locked(&mdev_state->ops_lock)); in mbochs_dmabuf_find_by_id()
995 list_for_each_entry(dmabuf, &mdev_state->dmabufs, next) in mbochs_dmabuf_find_by_id()
996 if (dmabuf->id == id) in mbochs_dmabuf_find_by_id()
1004 struct mdev_state *mdev_state = dmabuf->mdev_state; in mbochs_dmabuf_export()
1005 struct device *dev = mdev_state->vdev.dev; in mbochs_dmabuf_export()
1009 WARN_ON(!mutex_is_locked(&mdev_state->ops_lock)); in mbochs_dmabuf_export()
1011 if (!IS_ALIGNED(dmabuf->mode.offset, PAGE_SIZE)) { in mbochs_dmabuf_export()
1012 dev_info_ratelimited(dev, "%s: framebuffer not page-aligned\n", in mbochs_dmabuf_export()
1014 return -EINVAL; in mbochs_dmabuf_export()
1018 exp_info.size = dmabuf->mode.size; in mbochs_dmabuf_export()
1028 dmabuf->buf = buf; in mbochs_dmabuf_export()
1029 dev_dbg(dev, "%s: %d\n", __func__, dmabuf->id); in mbochs_dmabuf_export()
1034 struct vfio_region_info_ext *ext) in mbochs_get_region_info() argument
1036 struct vfio_region_info *region_info = &ext->base; in mbochs_get_region_info()
1038 if (region_info->index >= MBOCHS_NUM_REGIONS) in mbochs_get_region_info()
1039 return -EINVAL; in mbochs_get_region_info()
1041 switch (region_info->index) { in mbochs_get_region_info()
1043 region_info->offset = 0; in mbochs_get_region_info()
1044 region_info->size = MBOCHS_CONFIG_SPACE_SIZE; in mbochs_get_region_info()
1045 region_info->flags = (VFIO_REGION_INFO_FLAG_READ | in mbochs_get_region_info()
1049 region_info->offset = MBOCHS_MEMORY_BAR_OFFSET; in mbochs_get_region_info()
1050 region_info->size = mdev_state->memsize; in mbochs_get_region_info()
1051 region_info->flags = (VFIO_REGION_INFO_FLAG_READ | in mbochs_get_region_info()
1056 region_info->offset = MBOCHS_MMIO_BAR_OFFSET; in mbochs_get_region_info()
1057 region_info->size = MBOCHS_MMIO_BAR_SIZE; in mbochs_get_region_info()
1058 region_info->flags = (VFIO_REGION_INFO_FLAG_READ | in mbochs_get_region_info()
1062 ext->base.argsz = sizeof(*ext); in mbochs_get_region_info()
1063 ext->base.offset = MBOCHS_EDID_OFFSET; in mbochs_get_region_info()
1064 ext->base.size = MBOCHS_EDID_SIZE; in mbochs_get_region_info()
1065 ext->base.flags = (VFIO_REGION_INFO_FLAG_READ | in mbochs_get_region_info()
1068 ext->base.cap_offset = offsetof(typeof(*ext), type); in mbochs_get_region_info()
1069 ext->type.header.id = VFIO_REGION_INFO_CAP_TYPE; in mbochs_get_region_info()
1070 ext->type.header.version = 1; in mbochs_get_region_info()
1071 ext->type.header.next = 0; in mbochs_get_region_info()
1072 ext->type.type = VFIO_REGION_TYPE_GFX; in mbochs_get_region_info()
1073 ext->type.subtype = VFIO_REGION_SUBTYPE_GFX_EDID; in mbochs_get_region_info()
1076 region_info->size = 0; in mbochs_get_region_info()
1077 region_info->offset = 0; in mbochs_get_region_info()
1078 region_info->flags = 0; in mbochs_get_region_info()
1086 irq_info->count = 0; in mbochs_get_irq_info()
1092 dev_info->flags = VFIO_DEVICE_FLAGS_PCI; in mbochs_get_device_info()
1093 dev_info->num_regions = MBOCHS_NUM_REGIONS; in mbochs_get_device_info()
1094 dev_info->num_irqs = VFIO_PCI_NUM_IRQS; in mbochs_get_device_info()
1105 if (plane->flags & VFIO_GFX_PLANE_TYPE_PROBE) { in mbochs_query_gfx_plane()
1106 if (plane->flags == (VFIO_GFX_PLANE_TYPE_PROBE | in mbochs_query_gfx_plane()
1109 return -EINVAL; in mbochs_query_gfx_plane()
1112 if (plane->flags != VFIO_GFX_PLANE_TYPE_DMABUF) in mbochs_query_gfx_plane()
1113 return -EINVAL; in mbochs_query_gfx_plane()
1115 plane->drm_format_mod = 0; in mbochs_query_gfx_plane()
1116 plane->x_pos = 0; in mbochs_query_gfx_plane()
1117 plane->y_pos = 0; in mbochs_query_gfx_plane()
1118 plane->x_hot = 0; in mbochs_query_gfx_plane()
1119 plane->y_hot = 0; in mbochs_query_gfx_plane()
1121 mutex_lock(&mdev_state->ops_lock); in mbochs_query_gfx_plane()
1123 ret = -EINVAL; in mbochs_query_gfx_plane()
1124 if (plane->drm_plane_type == DRM_PLANE_TYPE_PRIMARY) in mbochs_query_gfx_plane()
1127 plane->drm_format = 0; in mbochs_query_gfx_plane()
1128 plane->width = 0; in mbochs_query_gfx_plane()
1129 plane->height = 0; in mbochs_query_gfx_plane()
1130 plane->stride = 0; in mbochs_query_gfx_plane()
1131 plane->size = 0; in mbochs_query_gfx_plane()
1132 plane->dmabuf_id = 0; in mbochs_query_gfx_plane()
1140 mutex_unlock(&mdev_state->ops_lock); in mbochs_query_gfx_plane()
1141 return -ENOMEM; in mbochs_query_gfx_plane()
1144 plane->drm_format = dmabuf->mode.drm_format; in mbochs_query_gfx_plane()
1145 plane->width = dmabuf->mode.width; in mbochs_query_gfx_plane()
1146 plane->height = dmabuf->mode.height; in mbochs_query_gfx_plane()
1147 plane->stride = dmabuf->mode.stride; in mbochs_query_gfx_plane()
1148 plane->size = dmabuf->mode.size; in mbochs_query_gfx_plane()
1149 plane->dmabuf_id = dmabuf->id; in mbochs_query_gfx_plane()
1152 if (plane->drm_plane_type == DRM_PLANE_TYPE_PRIMARY && in mbochs_query_gfx_plane()
1153 mdev_state->active_id != plane->dmabuf_id) { in mbochs_query_gfx_plane()
1154 dev_dbg(mdev_state->vdev.dev, "%s: primary: %d => %d\n", in mbochs_query_gfx_plane()
1155 __func__, mdev_state->active_id, plane->dmabuf_id); in mbochs_query_gfx_plane()
1156 mdev_state->active_id = plane->dmabuf_id; in mbochs_query_gfx_plane()
1158 mutex_unlock(&mdev_state->ops_lock); in mbochs_query_gfx_plane()
1166 mutex_lock(&mdev_state->ops_lock); in mbochs_get_gfx_dmabuf()
1170 mutex_unlock(&mdev_state->ops_lock); in mbochs_get_gfx_dmabuf()
1171 return -ENOENT; in mbochs_get_gfx_dmabuf()
1174 if (!dmabuf->buf) in mbochs_get_gfx_dmabuf()
1177 mutex_unlock(&mdev_state->ops_lock); in mbochs_get_gfx_dmabuf()
1179 if (!dmabuf->buf) in mbochs_get_gfx_dmabuf()
1180 return -EINVAL; in mbochs_get_gfx_dmabuf()
1182 return dma_buf_fd(dmabuf->buf, 0); in mbochs_get_gfx_dmabuf()
1201 return -EFAULT; in mbochs_ioctl()
1204 return -EINVAL; in mbochs_ioctl()
1211 return -EFAULT; in mbochs_ioctl()
1222 return -EFAULT; in mbochs_ioctl()
1226 return -EINVAL; in mbochs_ioctl()
1228 return -EINVAL; in mbochs_ioctl()
1235 return -EFAULT; in mbochs_ioctl()
1247 return -EFAULT; in mbochs_ioctl()
1251 return -EINVAL; in mbochs_ioctl()
1258 return -EFAULT; in mbochs_ioctl()
1271 return -EFAULT; in mbochs_ioctl()
1274 return -EINVAL; in mbochs_ioctl()
1281 return -EFAULT; in mbochs_ioctl()
1291 return -EFAULT; in mbochs_ioctl()
1297 return -EINVAL; in mbochs_ioctl()
1302 return -ENOTTY; in mbochs_ioctl()
1311 mutex_lock(&mdev_state->ops_lock); in mbochs_close_device()
1313 list_for_each_entry_safe(dmabuf, tmp, &mdev_state->dmabufs, next) { in mbochs_close_device()
1314 list_del(&dmabuf->next); in mbochs_close_device()
1315 if (dmabuf->buf) { in mbochs_close_device()
1317 dmabuf->unlinked = true; in mbochs_close_device()
1324 mutex_unlock(&mdev_state->ops_lock); in mbochs_close_device()
1333 return sprintf(buf, "%d MB\n", mdev_state->type->mbytes); in memory_show()
1358 type ? type->mbytes : 0); in mbochs_show_description()
1366 return atomic_read(&mbochs_avail_mbytes) / type->mbytes; in mbochs_get_available()