Lines Matching refs:mdev_state

135 	struct mdev_state *mdev_state;  member
141 struct mdev_state { struct
181 static struct page *__mbochs_get_page(struct mdev_state *mdev_state,
183 static struct page *mbochs_get_page(struct mdev_state *mdev_state,
196 static void mbochs_create_config_space(struct mdev_state *mdev_state) in mbochs_create_config_space() argument
198 STORE_LE16((u16 *) &mdev_state->vconfig[PCI_VENDOR_ID], in mbochs_create_config_space()
200 STORE_LE16((u16 *) &mdev_state->vconfig[PCI_DEVICE_ID], in mbochs_create_config_space()
202 STORE_LE16((u16 *) &mdev_state->vconfig[PCI_SUBSYSTEM_VENDOR_ID], in mbochs_create_config_space()
204 STORE_LE16((u16 *) &mdev_state->vconfig[PCI_SUBSYSTEM_ID], in mbochs_create_config_space()
207 STORE_LE16((u16 *) &mdev_state->vconfig[PCI_COMMAND], in mbochs_create_config_space()
209 STORE_LE16((u16 *) &mdev_state->vconfig[PCI_CLASS_DEVICE], in mbochs_create_config_space()
211 mdev_state->vconfig[PCI_CLASS_REVISION] = 0x01; in mbochs_create_config_space()
213 STORE_LE32((u32 *) &mdev_state->vconfig[PCI_BASE_ADDRESS_0], in mbochs_create_config_space()
217 mdev_state->bar_mask[0] = ~(mdev_state->memsize) + 1; in mbochs_create_config_space()
219 STORE_LE32((u32 *) &mdev_state->vconfig[PCI_BASE_ADDRESS_2], in mbochs_create_config_space()
222 mdev_state->bar_mask[2] = ~(MBOCHS_MMIO_BAR_SIZE) + 1; in mbochs_create_config_space()
225 static int mbochs_check_framebuffer(struct mdev_state *mdev_state, in mbochs_check_framebuffer() argument
228 struct device *dev = mdev_dev(mdev_state->mdev); in mbochs_check_framebuffer()
229 u16 *vbe = mdev_state->vbe; in mbochs_check_framebuffer()
232 WARN_ON(!mutex_is_locked(&mdev_state->ops_lock)); in mbochs_check_framebuffer()
264 if (mode->offset + mode->size > mdev_state->memsize) { in mbochs_check_framebuffer()
283 static void handle_pci_cfg_write(struct mdev_state *mdev_state, u16 offset, in handle_pci_cfg_write() argument
286 struct device *dev = mdev_dev(mdev_state->mdev); in handle_pci_cfg_write()
296 cfg_addr = (cfg_addr & mdev_state->bar_mask[index]); in handle_pci_cfg_write()
304 cfg_addr |= (mdev_state->vconfig[offset] & in handle_pci_cfg_write()
306 STORE_LE32(&mdev_state->vconfig[offset], cfg_addr); in handle_pci_cfg_write()
311 static void handle_mmio_write(struct mdev_state *mdev_state, u16 offset, in handle_mmio_write() argument
314 struct device *dev = mdev_dev(mdev_state->mdev); in handle_mmio_write()
326 if (index < ARRAY_SIZE(mdev_state->vbe)) in handle_mmio_write()
327 mdev_state->vbe[index] = reg16; in handle_mmio_write()
341 static void handle_mmio_read(struct mdev_state *mdev_state, u16 offset, in handle_mmio_read() argument
344 struct device *dev = mdev_dev(mdev_state->mdev); in handle_mmio_read()
353 if (index < ARRAY_SIZE(mdev_state->vbe)) in handle_mmio_read()
354 reg16 = mdev_state->vbe[index]; in handle_mmio_read()
371 struct mdev_state *mdev_state = mdev_get_drvdata(mdev); in mdev_access() local
378 mutex_lock(&mdev_state->ops_lock); in mdev_access()
382 handle_pci_cfg_write(mdev_state, pos, buf, count); in mdev_access()
384 memcpy(buf, (mdev_state->vconfig + pos), count); in mdev_access()
390 handle_mmio_write(mdev_state, pos, buf, count); in mdev_access()
392 handle_mmio_read(mdev_state, pos, buf, count); in mdev_access()
396 MBOCHS_MEMORY_BAR_OFFSET + mdev_state->memsize) { in mdev_access()
399 pg = __mbochs_get_page(mdev_state, pos >> PAGE_SHIFT); in mdev_access()
419 mutex_unlock(&mdev_state->ops_lock); in mdev_access()
426 struct mdev_state *mdev_state = mdev_get_drvdata(mdev); in mbochs_reset() local
427 u32 size64k = mdev_state->memsize / (64 * 1024); in mbochs_reset()
430 for (i = 0; i < ARRAY_SIZE(mdev_state->vbe); i++) in mbochs_reset()
431 mdev_state->vbe[i] = 0; in mbochs_reset()
432 mdev_state->vbe[VBE_DISPI_INDEX_ID] = VBE_DISPI_ID5; in mbochs_reset()
433 mdev_state->vbe[VBE_DISPI_INDEX_VIDEO_MEMORY_64K] = size64k; in mbochs_reset()
441 struct mdev_state *mdev_state; in mbochs_create() local
448 mdev_state = kzalloc(sizeof(struct mdev_state), GFP_KERNEL); in mbochs_create()
449 if (mdev_state == NULL) in mbochs_create()
452 mdev_state->vconfig = kzalloc(MBOCHS_CONFIG_SPACE_SIZE, GFP_KERNEL); in mbochs_create()
453 if (mdev_state->vconfig == NULL) in mbochs_create()
456 mdev_state->memsize = type->mbytes * 1024 * 1024; in mbochs_create()
457 mdev_state->pagecount = mdev_state->memsize >> PAGE_SHIFT; in mbochs_create()
458 mdev_state->pages = kcalloc(mdev_state->pagecount, in mbochs_create()
461 if (!mdev_state->pages) in mbochs_create()
465 kobj->name, type->mbytes, mdev_state->pagecount); in mbochs_create()
467 mutex_init(&mdev_state->ops_lock); in mbochs_create()
468 mdev_state->mdev = mdev; in mbochs_create()
469 mdev_set_drvdata(mdev, mdev_state); in mbochs_create()
470 INIT_LIST_HEAD(&mdev_state->dmabufs); in mbochs_create()
471 mdev_state->next_id = 1; in mbochs_create()
473 mdev_state->type = type; in mbochs_create()
474 mbochs_create_config_space(mdev_state); in mbochs_create()
481 kfree(mdev_state->vconfig); in mbochs_create()
482 kfree(mdev_state); in mbochs_create()
488 struct mdev_state *mdev_state = mdev_get_drvdata(mdev); in mbochs_remove() local
490 mbochs_used_mbytes -= mdev_state->type->mbytes; in mbochs_remove()
492 kfree(mdev_state->pages); in mbochs_remove()
493 kfree(mdev_state->vconfig); in mbochs_remove()
494 kfree(mdev_state); in mbochs_remove()
614 static struct page *__mbochs_get_page(struct mdev_state *mdev_state, in __mbochs_get_page() argument
617 WARN_ON(!mutex_is_locked(&mdev_state->ops_lock)); in __mbochs_get_page()
619 if (!mdev_state->pages[pgoff]) { in __mbochs_get_page()
620 mdev_state->pages[pgoff] = in __mbochs_get_page()
622 if (!mdev_state->pages[pgoff]) in __mbochs_get_page()
626 get_page(mdev_state->pages[pgoff]); in __mbochs_get_page()
627 return mdev_state->pages[pgoff]; in __mbochs_get_page()
630 static struct page *mbochs_get_page(struct mdev_state *mdev_state, in mbochs_get_page() argument
635 if (WARN_ON(pgoff >= mdev_state->pagecount)) in mbochs_get_page()
638 mutex_lock(&mdev_state->ops_lock); in mbochs_get_page()
639 page = __mbochs_get_page(mdev_state, pgoff); in mbochs_get_page()
640 mutex_unlock(&mdev_state->ops_lock); in mbochs_get_page()
645 static void mbochs_put_pages(struct mdev_state *mdev_state) in mbochs_put_pages() argument
647 struct device *dev = mdev_dev(mdev_state->mdev); in mbochs_put_pages()
650 WARN_ON(!mutex_is_locked(&mdev_state->ops_lock)); in mbochs_put_pages()
652 for (i = 0; i < mdev_state->pagecount; i++) { in mbochs_put_pages()
653 if (!mdev_state->pages[i]) in mbochs_put_pages()
655 put_page(mdev_state->pages[i]); in mbochs_put_pages()
656 mdev_state->pages[i] = NULL; in mbochs_put_pages()
665 struct mdev_state *mdev_state = vma->vm_private_data; in mbochs_region_vm_fault() local
668 if (page_offset >= mdev_state->pagecount) in mbochs_region_vm_fault()
671 vmf->page = mbochs_get_page(mdev_state, page_offset); in mbochs_region_vm_fault()
684 struct mdev_state *mdev_state = mdev_get_drvdata(mdev); in mbochs_mmap() local
690 if (vma->vm_end - vma->vm_start > mdev_state->memsize) in mbochs_mmap()
696 vma->vm_private_data = mdev_state; in mbochs_mmap()
720 struct device *dev = mdev_dev(dmabuf->mdev_state->mdev); in mbochs_mmap_dmabuf()
735 struct device *dev = mdev_dev(dmabuf->mdev_state->mdev); in mbochs_print_dmabuf()
752 struct device *dev = mdev_dev(dmabuf->mdev_state->mdev); in mbochs_map_dmabuf()
781 struct device *dev = mdev_dev(dmabuf->mdev_state->mdev); in mbochs_unmap_dmabuf()
792 struct mdev_state *mdev_state = dmabuf->mdev_state; in mbochs_release_dmabuf() local
793 struct device *dev = mdev_dev(mdev_state->mdev); in mbochs_release_dmabuf()
801 mutex_lock(&mdev_state->ops_lock); in mbochs_release_dmabuf()
805 mutex_unlock(&mdev_state->ops_lock); in mbochs_release_dmabuf()
831 static struct mbochs_dmabuf *mbochs_dmabuf_alloc(struct mdev_state *mdev_state, in mbochs_dmabuf_alloc() argument
837 WARN_ON(!mutex_is_locked(&mdev_state->ops_lock)); in mbochs_dmabuf_alloc()
844 dmabuf->id = mdev_state->next_id++; in mbochs_dmabuf_alloc()
853 dmabuf->pages[pg] = __mbochs_get_page(mdev_state, in mbochs_dmabuf_alloc()
859 dmabuf->mdev_state = mdev_state; in mbochs_dmabuf_alloc()
860 list_add(&dmabuf->next, &mdev_state->dmabufs); in mbochs_dmabuf_alloc()
875 mbochs_dmabuf_find_by_mode(struct mdev_state *mdev_state, in mbochs_dmabuf_find_by_mode() argument
880 WARN_ON(!mutex_is_locked(&mdev_state->ops_lock)); in mbochs_dmabuf_find_by_mode()
882 list_for_each_entry(dmabuf, &mdev_state->dmabufs, next) in mbochs_dmabuf_find_by_mode()
890 mbochs_dmabuf_find_by_id(struct mdev_state *mdev_state, u32 id) in mbochs_dmabuf_find_by_id() argument
894 WARN_ON(!mutex_is_locked(&mdev_state->ops_lock)); in mbochs_dmabuf_find_by_id()
896 list_for_each_entry(dmabuf, &mdev_state->dmabufs, next) in mbochs_dmabuf_find_by_id()
905 struct mdev_state *mdev_state = dmabuf->mdev_state; in mbochs_dmabuf_export() local
906 struct device *dev = mdev_dev(mdev_state->mdev); in mbochs_dmabuf_export()
910 WARN_ON(!mutex_is_locked(&mdev_state->ops_lock)); in mbochs_dmabuf_export()
938 struct mdev_state *mdev_state; in mbochs_get_region_info() local
940 mdev_state = mdev_get_drvdata(mdev); in mbochs_get_region_info()
941 if (!mdev_state) in mbochs_get_region_info()
956 region_info->size = mdev_state->memsize; in mbochs_get_region_info()
995 struct mdev_state *mdev_state = mdev_get_drvdata(mdev); in mbochs_query_gfx_plane() local
1017 mutex_lock(&mdev_state->ops_lock); in mbochs_query_gfx_plane()
1021 ret = mbochs_check_framebuffer(mdev_state, &mode); in mbochs_query_gfx_plane()
1032 dmabuf = mbochs_dmabuf_find_by_mode(mdev_state, &mode); in mbochs_query_gfx_plane()
1034 mbochs_dmabuf_alloc(mdev_state, &mode); in mbochs_query_gfx_plane()
1036 mutex_unlock(&mdev_state->ops_lock); in mbochs_query_gfx_plane()
1049 mdev_state->active_id != plane->dmabuf_id) { in mbochs_query_gfx_plane()
1051 mdev_state->active_id, plane->dmabuf_id); in mbochs_query_gfx_plane()
1052 mdev_state->active_id = plane->dmabuf_id; in mbochs_query_gfx_plane()
1054 mutex_unlock(&mdev_state->ops_lock); in mbochs_query_gfx_plane()
1061 struct mdev_state *mdev_state = mdev_get_drvdata(mdev); in mbochs_get_gfx_dmabuf() local
1064 mutex_lock(&mdev_state->ops_lock); in mbochs_get_gfx_dmabuf()
1066 dmabuf = mbochs_dmabuf_find_by_id(mdev_state, id); in mbochs_get_gfx_dmabuf()
1068 mutex_unlock(&mdev_state->ops_lock); in mbochs_get_gfx_dmabuf()
1075 mutex_unlock(&mdev_state->ops_lock); in mbochs_get_gfx_dmabuf()
1088 struct mdev_state *mdev_state; in mbochs_ioctl() local
1090 mdev_state = mdev_get_drvdata(mdev); in mbochs_ioctl()
1109 memcpy(&mdev_state->dev_info, &info, sizeof(info)); in mbochs_ioctl()
1151 (info.index >= mdev_state->dev_info.num_irqs)) in mbochs_ioctl()
1216 struct mdev_state *mdev_state = mdev_get_drvdata(mdev); in mbochs_close() local
1219 mutex_lock(&mdev_state->ops_lock); in mbochs_close()
1221 list_for_each_entry_safe(dmabuf, tmp, &mdev_state->dmabufs, next) { in mbochs_close()
1230 mbochs_put_pages(mdev_state); in mbochs_close()
1232 mutex_unlock(&mdev_state->ops_lock); in mbochs_close()
1241 struct mdev_state *mdev_state = mdev_get_drvdata(mdev); in memory_show() local
1243 return sprintf(buf, "%d MB\n", mdev_state->type->mbytes); in memory_show()