Lines Matching +full:count +full:- +full:width
1 // SPDX-License-Identifier: GPL-2.0
5 * See mdpy-defs.h for device specs
30 #include "mdpy-defs.h"
54 u32 width; member
59 .type.pretty_name = MDPY_CLASS_NAME "-" MDPY_TYPE_1,
62 .width = 640,
66 .type.pretty_name = MDPY_CLASS_NAME "-" MDPY_TYPE_2,
69 .width = 1024,
73 .type.pretty_name = MDPY_CLASS_NAME "-" MDPY_TYPE_3,
76 .width = 1920,
112 STORE_LE16((u16 *) &mdev_state->vconfig[PCI_VENDOR_ID], in mdpy_create_config_space()
114 STORE_LE16((u16 *) &mdev_state->vconfig[PCI_DEVICE_ID], in mdpy_create_config_space()
116 STORE_LE16((u16 *) &mdev_state->vconfig[PCI_SUBSYSTEM_VENDOR_ID], in mdpy_create_config_space()
118 STORE_LE16((u16 *) &mdev_state->vconfig[PCI_SUBSYSTEM_ID], in mdpy_create_config_space()
121 STORE_LE16((u16 *) &mdev_state->vconfig[PCI_COMMAND], in mdpy_create_config_space()
123 STORE_LE16((u16 *) &mdev_state->vconfig[PCI_STATUS], in mdpy_create_config_space()
125 STORE_LE16((u16 *) &mdev_state->vconfig[PCI_CLASS_DEVICE], in mdpy_create_config_space()
127 mdev_state->vconfig[PCI_CLASS_REVISION] = 0x01; in mdpy_create_config_space()
129 STORE_LE32((u32 *) &mdev_state->vconfig[PCI_BASE_ADDRESS_0], in mdpy_create_config_space()
133 mdev_state->bar_mask = ~(mdev_state->memsize) + 1; in mdpy_create_config_space()
136 mdev_state->vconfig[PCI_CAPABILITY_LIST] = MDPY_VENDORCAP_OFFSET; in mdpy_create_config_space()
137 mdev_state->vconfig[MDPY_VENDORCAP_OFFSET + 0] = 0x09; /* vendor cap */ in mdpy_create_config_space()
138 mdev_state->vconfig[MDPY_VENDORCAP_OFFSET + 1] = 0x00; /* next ptr */ in mdpy_create_config_space()
139 mdev_state->vconfig[MDPY_VENDORCAP_OFFSET + 2] = MDPY_VENDORCAP_SIZE; in mdpy_create_config_space()
140 STORE_LE32((u32 *) &mdev_state->vconfig[MDPY_FORMAT_OFFSET], in mdpy_create_config_space()
141 mdev_state->type->format); in mdpy_create_config_space()
142 STORE_LE32((u32 *) &mdev_state->vconfig[MDPY_WIDTH_OFFSET], in mdpy_create_config_space()
143 mdev_state->type->width); in mdpy_create_config_space()
144 STORE_LE32((u32 *) &mdev_state->vconfig[MDPY_HEIGHT_OFFSET], in mdpy_create_config_space()
145 mdev_state->type->height); in mdpy_create_config_space()
149 char *buf, u32 count) in handle_pci_cfg_write() argument
151 struct device *dev = mdev_dev(mdev_state->mdev); in handle_pci_cfg_write()
159 cfg_addr = (cfg_addr & mdev_state->bar_mask); in handle_pci_cfg_write()
166 cfg_addr |= (mdev_state->vconfig[offset] & in handle_pci_cfg_write()
168 STORE_LE32(&mdev_state->vconfig[offset], cfg_addr); in handle_pci_cfg_write()
174 size_t count, loff_t pos, bool is_write) in mdev_access() argument
178 mutex_lock(&mdev_state->ops_lock); in mdev_access()
182 handle_pci_cfg_write(mdev_state, pos, buf, count); in mdev_access()
184 memcpy(buf, (mdev_state->vconfig + pos), count); in mdev_access()
187 (pos + count <= in mdev_access()
188 MDPY_MEMORY_BAR_OFFSET + mdev_state->memsize)) { in mdev_access()
189 pos -= MDPY_MEMORY_BAR_OFFSET; in mdev_access()
191 memcpy(mdev_state->memblk, buf, count); in mdev_access()
193 memcpy(buf, mdev_state->memblk, count); in mdev_access()
196 dev_info(mdev_state->vdev.dev, in mdev_access()
199 ret = -1; in mdev_access()
203 ret = count; in mdev_access()
207 mutex_unlock(&mdev_state->ops_lock); in mdev_access()
217 stride = mdev_state->type->width * mdev_state->type->bytepp; in mdpy_reset()
218 for (i = 0; i < mdev_state->type->height; i++) in mdpy_reset()
219 memset(mdev_state->memblk + i * stride, in mdpy_reset()
220 i * 255 / mdev_state->type->height, in mdpy_reset()
229 struct mdev_device *mdev = to_mdev_device(vdev->dev); in mdpy_init_dev()
231 container_of(mdev->type, struct mdpy_type, type); in mdpy_init_dev()
233 int ret = -ENOMEM; in mdpy_init_dev()
235 mdev_state->vconfig = kzalloc(MDPY_CONFIG_SPACE_SIZE, GFP_KERNEL); in mdpy_init_dev()
236 if (!mdev_state->vconfig) in mdpy_init_dev()
239 fbsize = roundup_pow_of_two(type->width * type->height * type->bytepp); in mdpy_init_dev()
241 mdev_state->memblk = vmalloc_user(fbsize); in mdpy_init_dev()
242 if (!mdev_state->memblk) in mdpy_init_dev()
245 mutex_init(&mdev_state->ops_lock); in mdpy_init_dev()
246 mdev_state->mdev = mdev; in mdpy_init_dev()
247 mdev_state->type = type; in mdpy_init_dev()
248 mdev_state->memsize = fbsize; in mdpy_init_dev()
252 dev_info(vdev->dev, "%s: %s (%dx%d)\n", __func__, type->type.pretty_name, in mdpy_init_dev()
253 type->width, type->height); in mdpy_init_dev()
257 kfree(mdev_state->vconfig); in mdpy_init_dev()
266 mdev_state = vfio_alloc_device(mdev_state, vdev, &mdev->dev, in mdpy_probe()
271 ret = vfio_register_emulated_iommu_dev(&mdev_state->vdev); in mdpy_probe()
274 dev_set_drvdata(&mdev->dev, mdev_state); in mdpy_probe()
278 vfio_put_device(&mdev_state->vdev); in mdpy_probe()
287 vfree(mdev_state->memblk); in mdpy_release_dev()
288 kfree(mdev_state->vconfig); in mdpy_release_dev()
293 struct mdev_state *mdev_state = dev_get_drvdata(&mdev->dev); in mdpy_remove()
295 dev_info(&mdev->dev, "%s\n", __func__); in mdpy_remove()
297 vfio_unregister_group_dev(&mdev_state->vdev); in mdpy_remove()
298 vfio_put_device(&mdev_state->vdev); in mdpy_remove()
302 size_t count, loff_t *ppos) in mdpy_read() argument
309 while (count) { in mdpy_read()
312 if (count >= 4 && !(*ppos % 4)) { in mdpy_read()
324 } else if (count >= 2 && !(*ppos % 2)) { in mdpy_read()
350 count -= filled; in mdpy_read()
359 return -EFAULT; in mdpy_read()
363 size_t count, loff_t *ppos) in mdpy_write() argument
370 while (count) { in mdpy_write()
373 if (count >= 4 && !(*ppos % 4)) { in mdpy_write()
385 } else if (count >= 2 && !(*ppos % 2)) { in mdpy_write()
410 count -= filled; in mdpy_write()
418 return -EFAULT; in mdpy_write()
426 if (vma->vm_pgoff != MDPY_MEMORY_BAR_OFFSET >> PAGE_SHIFT) in mdpy_mmap()
427 return -EINVAL; in mdpy_mmap()
428 if (vma->vm_end < vma->vm_start) in mdpy_mmap()
429 return -EINVAL; in mdpy_mmap()
430 if (vma->vm_end - vma->vm_start > mdev_state->memsize) in mdpy_mmap()
431 return -EINVAL; in mdpy_mmap()
432 if ((vma->vm_flags & VM_SHARED) == 0) in mdpy_mmap()
433 return -EINVAL; in mdpy_mmap()
435 return remap_vmalloc_range(vma, mdev_state->memblk, 0); in mdpy_mmap()
442 if (region_info->index >= VFIO_PCI_NUM_REGIONS && in mdpy_get_region_info()
443 region_info->index != MDPY_DISPLAY_REGION) in mdpy_get_region_info()
444 return -EINVAL; in mdpy_get_region_info()
446 switch (region_info->index) { in mdpy_get_region_info()
448 region_info->offset = 0; in mdpy_get_region_info()
449 region_info->size = MDPY_CONFIG_SPACE_SIZE; in mdpy_get_region_info()
450 region_info->flags = (VFIO_REGION_INFO_FLAG_READ | in mdpy_get_region_info()
455 region_info->offset = MDPY_MEMORY_BAR_OFFSET; in mdpy_get_region_info()
456 region_info->size = mdev_state->memsize; in mdpy_get_region_info()
457 region_info->flags = (VFIO_REGION_INFO_FLAG_READ | in mdpy_get_region_info()
462 region_info->size = 0; in mdpy_get_region_info()
463 region_info->offset = 0; in mdpy_get_region_info()
464 region_info->flags = 0; in mdpy_get_region_info()
472 irq_info->count = 0; in mdpy_get_irq_info()
478 dev_info->flags = VFIO_DEVICE_FLAGS_PCI; in mdpy_get_device_info()
479 dev_info->num_regions = VFIO_PCI_NUM_REGIONS; in mdpy_get_device_info()
480 dev_info->num_irqs = VFIO_PCI_NUM_IRQS; in mdpy_get_device_info()
487 if (plane->flags & VFIO_GFX_PLANE_TYPE_PROBE) { in mdpy_query_gfx_plane()
488 if (plane->flags == (VFIO_GFX_PLANE_TYPE_PROBE | in mdpy_query_gfx_plane()
491 return -EINVAL; in mdpy_query_gfx_plane()
494 if (plane->flags != VFIO_GFX_PLANE_TYPE_REGION) in mdpy_query_gfx_plane()
495 return -EINVAL; in mdpy_query_gfx_plane()
497 plane->drm_format = mdev_state->type->format; in mdpy_query_gfx_plane()
498 plane->width = mdev_state->type->width; in mdpy_query_gfx_plane()
499 plane->height = mdev_state->type->height; in mdpy_query_gfx_plane()
500 plane->stride = (mdev_state->type->width * in mdpy_query_gfx_plane()
501 mdev_state->type->bytepp); in mdpy_query_gfx_plane()
502 plane->size = mdev_state->memsize; in mdpy_query_gfx_plane()
503 plane->region_index = MDPY_DISPLAY_REGION; in mdpy_query_gfx_plane()
506 plane->drm_format_mod = 0; in mdpy_query_gfx_plane()
507 plane->x_pos = 0; in mdpy_query_gfx_plane()
508 plane->y_pos = 0; in mdpy_query_gfx_plane()
509 plane->x_hot = 0; in mdpy_query_gfx_plane()
510 plane->y_hot = 0; in mdpy_query_gfx_plane()
531 return -EFAULT; in mdpy_ioctl()
534 return -EINVAL; in mdpy_ioctl()
540 memcpy(&mdev_state->dev_info, &info, sizeof(info)); in mdpy_ioctl()
543 return -EFAULT; in mdpy_ioctl()
556 return -EFAULT; in mdpy_ioctl()
559 return -EINVAL; in mdpy_ioctl()
567 return -EFAULT; in mdpy_ioctl()
576 minsz = offsetofend(struct vfio_irq_info, count); in mdpy_ioctl()
579 return -EFAULT; in mdpy_ioctl()
582 (info.index >= mdev_state->dev_info.num_irqs)) in mdpy_ioctl()
583 return -EINVAL; in mdpy_ioctl()
590 return -EFAULT; in mdpy_ioctl()
603 return -EFAULT; in mdpy_ioctl()
606 return -EINVAL; in mdpy_ioctl()
613 return -EFAULT; in mdpy_ioctl()
619 return -EINVAL; in mdpy_ioctl()
624 return -ENOTTY; in mdpy_ioctl()
634 mdev_state->type->width, in resolution_show()
635 mdev_state->type->height); in resolution_show()
659 type->width, type->height); in mdpy_show_description()
759 module_param_named(count, mdpy_driver.max_instances, int, 0444);
760 MODULE_PARM_DESC(count, "number of " MDPY_NAME " devices");