Lines Matching +full:vga +full:- +full:connector

1 // SPDX-License-Identifier: GPL-2.0-or-later
25 #include <video/vga.h>
27 /* ---------------------------------------------------------------------- */
58 static int bochs_modeset = -1;
70 /* ---------------------------------------------------------------------- */
100 struct drm_connector connector; member
108 /* ---------------------------------------------------------------------- */
112 return !IS_ENABLED(CONFIG_HAS_IOPORT) || bochs->mmio; in bochs_uses_mmio()
121 int offset = ioport - 0x3c0 + 0x400; in bochs_vga_writeb()
123 writeb(val, bochs->mmio + offset); in bochs_vga_writeb()
135 int offset = ioport - 0x3c0 + 0x400; in bochs_vga_readb()
137 return readb(bochs->mmio + offset); in bochs_vga_readb()
150 ret = readw(bochs->mmio + offset); in bochs_dispi_read()
163 writew(val, bochs->mmio + offset); in bochs_dispi_write()
172 if (bochs->qext_size < 8) in bochs_hw_set_big_endian()
175 writel(0xbebebebe, bochs->mmio + 0x604); in bochs_hw_set_big_endian()
180 if (bochs->qext_size < 8) in bochs_hw_set_little_endian()
183 writel(0x1e1e1e1e, bochs->mmio + 0x604); in bochs_hw_set_little_endian()
197 if (!bochs->mmio) in bochs_get_edid_block()
198 return -1; in bochs_get_edid_block()
200 if (start + len > 0x400 /* vga register offset */) in bochs_get_edid_block()
201 return -1; in bochs_get_edid_block()
204 buf[i] = readb(bochs->mmio + start + i); in bochs_get_edid_block()
209 static const struct drm_edid *bochs_hw_read_edid(struct drm_connector *connector) in bochs_hw_read_edid() argument
211 struct drm_device *dev = connector->dev; in bochs_hw_read_edid()
222 return drm_edid_read_custom(connector, bochs_get_edid_block, bochs); in bochs_hw_read_edid()
227 struct drm_device *dev = &bochs->dev; in bochs_hw_init()
228 struct pci_dev *pdev = to_pci_dev(dev->dev); in bochs_hw_init()
232 if (pdev->resource[2].flags & IORESOURCE_MEM) { in bochs_hw_init()
235 /* mmio bar with vga and bochs registers present */ in bochs_hw_init()
236 if (!devm_request_mem_region(&pdev->dev, ioaddr, iosize, "bochs-drm")) { in bochs_hw_init()
238 return -EBUSY; in bochs_hw_init()
240 bochs->mmio = devm_ioremap(&pdev->dev, ioaddr, iosize); in bochs_hw_init()
241 if (bochs->mmio == NULL) { in bochs_hw_init()
243 return -ENOMEM; in bochs_hw_init()
248 if (!devm_request_region(&pdev->dev, ioaddr, iosize, "bochs-drm")) { in bochs_hw_init()
250 return -EBUSY; in bochs_hw_init()
252 bochs->ioports = 1; in bochs_hw_init()
254 dev_err(dev->dev, "I/O ports are not supported\n"); in bochs_hw_init()
255 return -EIO; in bochs_hw_init()
263 return -ENODEV; in bochs_hw_init()
266 if ((pdev->resource[0].flags & IORESOURCE_MEM) == 0) in bochs_hw_init()
267 return -ENODEV; in bochs_hw_init()
271 return -ENODEV; in bochs_hw_init()
278 if (!devm_request_mem_region(&pdev->dev, addr, size, "bochs-drm")) in bochs_hw_init()
281 bochs->fb_map = devm_ioremap_wc(&pdev->dev, addr, size); in bochs_hw_init()
282 if (bochs->fb_map == NULL) { in bochs_hw_init()
284 return -ENOMEM; in bochs_hw_init()
286 bochs->fb_base = addr; in bochs_hw_init()
287 bochs->fb_size = size; in bochs_hw_init()
289 DRM_INFO("Found bochs VGA, ID 0x%x.\n", id); in bochs_hw_init()
292 bochs->ioports ? "ioports" : "mmio", in bochs_hw_init()
295 if (bochs->mmio && pdev->revision >= 2) { in bochs_hw_init()
296 bochs->qext_size = readl(bochs->mmio + 0x600); in bochs_hw_init()
297 if (bochs->qext_size < 4 || bochs->qext_size > iosize) { in bochs_hw_init()
298 bochs->qext_size = 0; in bochs_hw_init()
302 bochs->qext_size); in bochs_hw_init()
325 if (!drm_dev_enter(&bochs->dev, &idx)) in bochs_hw_setmode()
328 bochs->xres = mode->hdisplay; in bochs_hw_setmode()
329 bochs->yres = mode->vdisplay; in bochs_hw_setmode()
330 bochs->bpp = 32; in bochs_hw_setmode()
331 bochs->stride = mode->hdisplay * (bochs->bpp / 8); in bochs_hw_setmode()
332 bochs->yres_virtual = bochs->fb_size / bochs->stride; in bochs_hw_setmode()
335 bochs->xres, bochs->yres, bochs->bpp, in bochs_hw_setmode()
336 bochs->yres_virtual); in bochs_hw_setmode()
339 bochs_dispi_write(bochs, VBE_DISPI_INDEX_BPP, bochs->bpp); in bochs_hw_setmode()
340 bochs_dispi_write(bochs, VBE_DISPI_INDEX_XRES, bochs->xres); in bochs_hw_setmode()
341 bochs_dispi_write(bochs, VBE_DISPI_INDEX_YRES, bochs->yres); in bochs_hw_setmode()
343 bochs_dispi_write(bochs, VBE_DISPI_INDEX_VIRT_WIDTH, bochs->xres); in bochs_hw_setmode()
345 bochs->yres_virtual); in bochs_hw_setmode()
359 if (!drm_dev_enter(&bochs->dev, &idx)) in bochs_hw_setformat()
363 (format->format >> 0) & 0xff, in bochs_hw_setformat()
364 (format->format >> 8) & 0xff, in bochs_hw_setformat()
365 (format->format >> 16) & 0xff, in bochs_hw_setformat()
366 (format->format >> 24) & 0xff); in bochs_hw_setformat()
368 switch (format->format) { in bochs_hw_setformat()
378 __func__, format->format); in bochs_hw_setformat()
390 if (!drm_dev_enter(&bochs->dev, &idx)) in bochs_hw_setbase()
393 bochs->stride = stride; in bochs_hw_setbase()
395 y * bochs->stride + in bochs_hw_setbase()
396 x * (bochs->bpp / 8); in bochs_hw_setbase()
397 vy = offset / bochs->stride; in bochs_hw_setbase()
398 vx = (offset % bochs->stride) * 8 / bochs->bpp; in bochs_hw_setbase()
399 vwidth = stride * 8 / bochs->bpp; in bochs_hw_setbase()
401 DRM_DEBUG_DRIVER("x %d, y %d, addr %llx -> offset %lx, vx %d, vy %d\n", in bochs_hw_setbase()
410 /* ---------------------------------------------------------------------- */
421 struct drm_crtc *new_crtc = new_plane_state->crtc; in bochs_primary_plane_helper_atomic_check()
434 else if (!new_plane_state->visible) in bochs_primary_plane_helper_atomic_check()
443 struct drm_device *dev = plane->dev; in bochs_primary_plane_helper_atomic_update()
445 struct drm_plane_state *plane_state = plane->state; in bochs_primary_plane_helper_atomic_update()
448 struct drm_framebuffer *fb = plane_state->fb; in bochs_primary_plane_helper_atomic_update()
452 if (!fb || !bochs->stride) in bochs_primary_plane_helper_atomic_update()
457 struct iosys_map dst = IOSYS_MAP_INIT_VADDR_IOMEM(bochs->fb_map); in bochs_primary_plane_helper_atomic_update()
459 iosys_map_incr(&dst, drm_fb_clip_offset(fb->pitches[0], fb->format, &damage)); in bochs_primary_plane_helper_atomic_update()
460 drm_fb_memcpy(&dst, fb->pitches, shadow_plane_state->data, fb, &damage); in bochs_primary_plane_helper_atomic_update()
465 plane_state->crtc_x, in bochs_primary_plane_helper_atomic_update()
466 plane_state->crtc_y, in bochs_primary_plane_helper_atomic_update()
467 fb->pitches[0], in bochs_primary_plane_helper_atomic_update()
469 bochs_hw_setformat(bochs, fb->format); in bochs_primary_plane_helper_atomic_update()
487 struct bochs_device *bochs = to_bochs_device(crtc->dev); in bochs_crtc_helper_mode_set_nofb()
488 struct drm_crtc_state *crtc_state = crtc->state; in bochs_crtc_helper_mode_set_nofb()
490 bochs_hw_setmode(bochs, &crtc_state->mode); in bochs_crtc_helper_mode_set_nofb()
498 if (!crtc_state->enable) in bochs_crtc_helper_atomic_check()
507 struct bochs_device *bochs = to_bochs_device(crtc->dev); in bochs_crtc_helper_atomic_enable()
515 struct bochs_device *bochs = to_bochs_device(crtc->dev); in bochs_crtc_helper_atomic_disable()
540 static int bochs_connector_helper_get_modes(struct drm_connector *connector) in bochs_connector_helper_get_modes() argument
545 edid = bochs_hw_read_edid(connector); in bochs_connector_helper_get_modes()
548 drm_edid_connector_update(connector, edid); in bochs_connector_helper_get_modes()
549 count = drm_edid_connector_add_modes(connector); in bochs_connector_helper_get_modes()
552 drm_edid_connector_update(connector, NULL); in bochs_connector_helper_get_modes()
553 count = drm_add_modes_noedid(connector, 8192, 8192); in bochs_connector_helper_get_modes()
554 drm_set_preferred_mode(connector, defx, defy); in bochs_connector_helper_get_modes()
582 pitch = drm_format_info_min_pitch(format, 0, mode->hdisplay); in bochs_mode_config_mode_valid()
585 if (mode->vdisplay > DIV_ROUND_DOWN_ULL(bochs->fb_size, pitch)) in bochs_mode_config_mode_valid()
600 struct drm_device *dev = &bochs->dev; in bochs_kms_init()
603 struct drm_connector *connector; in bochs_kms_init() local
611 dev->mode_config.max_width = 8192; in bochs_kms_init()
612 dev->mode_config.max_height = 8192; in bochs_kms_init()
614 dev->mode_config.preferred_depth = 24; in bochs_kms_init()
615 dev->mode_config.quirk_addfb_prefer_host_byte_order = true; in bochs_kms_init()
617 dev->mode_config.funcs = &bochs_mode_config_funcs; in bochs_kms_init()
619 primary_plane = &bochs->primary_plane; in bochs_kms_init()
631 crtc = &bochs->crtc; in bochs_kms_init()
638 encoder = &bochs->encoder; in bochs_kms_init()
643 encoder->possible_crtcs = drm_crtc_mask(crtc); in bochs_kms_init()
645 connector = &bochs->connector; in bochs_kms_init()
646 ret = drm_connector_init(dev, connector, &bochs_connector_funcs, in bochs_kms_init()
650 drm_connector_helper_add(connector, &bochs_connector_helper_funcs); in bochs_kms_init()
651 drm_connector_attach_edid_property(connector); in bochs_kms_init()
652 drm_connector_attach_encoder(connector, encoder); in bochs_kms_init()
659 /* ---------------------------------------------------------------------- */
682 .name = "bochs-drm",
683 .desc = "bochs dispi vga interface (qemu stdvga)",
690 /* ---------------------------------------------------------------------- */
714 /* ---------------------------------------------------------------------- */
727 bochs = devm_drm_dev_alloc(&pdev->dev, &bochs_driver, struct bochs_device, dev); in bochs_pci_probe()
730 dev = &bochs->dev; in bochs_pci_probe()
794 .name = "bochs-drm",
802 /* ---------------------------------------------------------------------- */
809 MODULE_DESCRIPTION("DRM Support for bochs dispi vga interface (qemu stdvga)");