Lines Matching +full:vga +full:- +full:connector
1 // SPDX-License-Identifier: GPL-2.0-or-later
17 #include <video/vga.h>
19 /* ---------------------------------------------------------------------- */
50 static int bochs_modeset = -1;
62 /* ---------------------------------------------------------------------- */
89 struct drm_connector connector; member
92 /* ---------------------------------------------------------------------- */
99 if (bochs->mmio) { in bochs_vga_writeb()
100 int offset = ioport - 0x3c0 + 0x400; in bochs_vga_writeb()
102 writeb(val, bochs->mmio + offset); in bochs_vga_writeb()
113 if (bochs->mmio) { in bochs_vga_readb()
114 int offset = ioport - 0x3c0 + 0x400; in bochs_vga_readb()
116 return readb(bochs->mmio + offset); in bochs_vga_readb()
126 if (bochs->mmio) { in bochs_dispi_read()
129 ret = readw(bochs->mmio + offset); in bochs_dispi_read()
139 if (bochs->mmio) { in bochs_dispi_write()
142 writew(val, bochs->mmio + offset); in bochs_dispi_write()
151 if (bochs->qext_size < 8) in bochs_hw_set_big_endian()
154 writel(0xbebebebe, bochs->mmio + 0x604); in bochs_hw_set_big_endian()
159 if (bochs->qext_size < 8) in bochs_hw_set_little_endian()
162 writel(0x1e1e1e1e, bochs->mmio + 0x604); in bochs_hw_set_little_endian()
177 if (start + len > 0x400 /* vga register offset */) in bochs_get_edid_block()
178 return -1; in bochs_get_edid_block()
181 buf[i] = readb(bochs->mmio + start + i); in bochs_get_edid_block()
190 if (!bochs->mmio) in bochs_hw_load_edid()
191 return -1; in bochs_hw_load_edid()
196 return -1; in bochs_hw_load_edid()
198 kfree(bochs->edid); in bochs_hw_load_edid()
199 bochs->edid = drm_do_get_edid(&bochs->connector, in bochs_hw_load_edid()
201 if (bochs->edid == NULL) in bochs_hw_load_edid()
202 return -1; in bochs_hw_load_edid()
209 struct bochs_device *bochs = dev->dev_private; in bochs_hw_init()
210 struct pci_dev *pdev = to_pci_dev(dev->dev); in bochs_hw_init()
214 if (pdev->resource[2].flags & IORESOURCE_MEM) { in bochs_hw_init()
215 /* mmio bar with vga and bochs registers present */ in bochs_hw_init()
216 if (pci_request_region(pdev, 2, "bochs-drm") != 0) { in bochs_hw_init()
218 return -EBUSY; in bochs_hw_init()
222 bochs->mmio = ioremap(ioaddr, iosize); in bochs_hw_init()
223 if (bochs->mmio == NULL) { in bochs_hw_init()
225 return -ENOMEM; in bochs_hw_init()
230 if (!request_region(ioaddr, iosize, "bochs-drm")) { in bochs_hw_init()
232 return -EBUSY; in bochs_hw_init()
234 bochs->ioports = 1; in bochs_hw_init()
242 return -ENODEV; in bochs_hw_init()
245 if ((pdev->resource[0].flags & IORESOURCE_MEM) == 0) in bochs_hw_init()
246 return -ENODEV; in bochs_hw_init()
250 return -ENODEV; in bochs_hw_init()
257 if (pci_request_region(pdev, 0, "bochs-drm") != 0) in bochs_hw_init()
260 bochs->fb_map = ioremap(addr, size); in bochs_hw_init()
261 if (bochs->fb_map == NULL) { in bochs_hw_init()
263 return -ENOMEM; in bochs_hw_init()
265 bochs->fb_base = addr; in bochs_hw_init()
266 bochs->fb_size = size; in bochs_hw_init()
268 DRM_INFO("Found bochs VGA, ID 0x%x.\n", id); in bochs_hw_init()
271 bochs->ioports ? "ioports" : "mmio", in bochs_hw_init()
274 if (bochs->mmio && pdev->revision >= 2) { in bochs_hw_init()
275 bochs->qext_size = readl(bochs->mmio + 0x600); in bochs_hw_init()
276 if (bochs->qext_size < 4 || bochs->qext_size > iosize) { in bochs_hw_init()
277 bochs->qext_size = 0; in bochs_hw_init()
281 bochs->qext_size); in bochs_hw_init()
291 struct bochs_device *bochs = dev->dev_private; in bochs_hw_fini()
295 if (bochs->mmio) in bochs_hw_fini()
296 iounmap(bochs->mmio); in bochs_hw_fini()
297 if (bochs->ioports) in bochs_hw_fini()
299 if (bochs->fb_map) in bochs_hw_fini()
300 iounmap(bochs->fb_map); in bochs_hw_fini()
301 pci_release_regions(to_pci_dev(dev->dev)); in bochs_hw_fini()
302 kfree(bochs->edid); in bochs_hw_fini()
318 if (!drm_dev_enter(bochs->dev, &idx)) in bochs_hw_setmode()
321 bochs->xres = mode->hdisplay; in bochs_hw_setmode()
322 bochs->yres = mode->vdisplay; in bochs_hw_setmode()
323 bochs->bpp = 32; in bochs_hw_setmode()
324 bochs->stride = mode->hdisplay * (bochs->bpp / 8); in bochs_hw_setmode()
325 bochs->yres_virtual = bochs->fb_size / bochs->stride; in bochs_hw_setmode()
328 bochs->xres, bochs->yres, bochs->bpp, in bochs_hw_setmode()
329 bochs->yres_virtual); in bochs_hw_setmode()
334 bochs_dispi_write(bochs, VBE_DISPI_INDEX_BPP, bochs->bpp); in bochs_hw_setmode()
335 bochs_dispi_write(bochs, VBE_DISPI_INDEX_XRES, bochs->xres); in bochs_hw_setmode()
336 bochs_dispi_write(bochs, VBE_DISPI_INDEX_YRES, bochs->yres); in bochs_hw_setmode()
338 bochs_dispi_write(bochs, VBE_DISPI_INDEX_VIRT_WIDTH, bochs->xres); in bochs_hw_setmode()
340 bochs->yres_virtual); in bochs_hw_setmode()
354 if (!drm_dev_enter(bochs->dev, &idx)) in bochs_hw_setformat()
358 (format->format >> 0) & 0xff, in bochs_hw_setformat()
359 (format->format >> 8) & 0xff, in bochs_hw_setformat()
360 (format->format >> 16) & 0xff, in bochs_hw_setformat()
361 (format->format >> 24) & 0xff); in bochs_hw_setformat()
363 switch (format->format) { in bochs_hw_setformat()
373 __func__, format->format); in bochs_hw_setformat()
385 if (!drm_dev_enter(bochs->dev, &idx)) in bochs_hw_setbase()
388 bochs->stride = stride; in bochs_hw_setbase()
390 y * bochs->stride + in bochs_hw_setbase()
391 x * (bochs->bpp / 8); in bochs_hw_setbase()
392 vy = offset / bochs->stride; in bochs_hw_setbase()
393 vx = (offset % bochs->stride) * 8 / bochs->bpp; in bochs_hw_setbase()
394 vwidth = stride * 8 / bochs->bpp; in bochs_hw_setbase()
396 DRM_DEBUG_DRIVER("x %d, y %d, addr %llx -> offset %lx, vx %d, vy %d\n", in bochs_hw_setbase()
405 /* ---------------------------------------------------------------------- */
417 if (!state->fb || !bochs->stride) in bochs_plane_update()
420 gbo = drm_gem_vram_of_gem(state->fb->obj[0]); in bochs_plane_update()
426 state->crtc_x, in bochs_plane_update()
427 state->crtc_y, in bochs_plane_update()
428 state->fb->pitches[0], in bochs_plane_update()
429 state->fb->offsets[0] + gpu_addr); in bochs_plane_update()
430 bochs_hw_setformat(bochs, state->fb->format); in bochs_plane_update()
437 struct bochs_device *bochs = pipe->crtc.dev->dev_private; in bochs_pipe_enable()
439 bochs_hw_setmode(bochs, &crtc_state->mode); in bochs_pipe_enable()
445 struct bochs_device *bochs = pipe->crtc.dev->dev_private; in bochs_pipe_disable()
453 struct bochs_device *bochs = pipe->crtc.dev->dev_private; in bochs_pipe_update()
455 bochs_plane_update(bochs, pipe->plane.state); in bochs_pipe_update()
466 static int bochs_connector_get_modes(struct drm_connector *connector) in bochs_connector_get_modes() argument
469 container_of(connector, struct bochs_device, connector); in bochs_connector_get_modes()
472 if (bochs->edid) in bochs_connector_get_modes()
473 count = drm_add_edid_modes(connector, bochs->edid); in bochs_connector_get_modes()
476 count = drm_add_modes_noedid(connector, 8192, 8192); in bochs_connector_get_modes()
477 drm_set_preferred_mode(connector, defx, defy); in bochs_connector_get_modes()
496 struct bochs_device *bochs = dev->dev_private; in bochs_connector_init()
497 struct drm_connector *connector = &bochs->connector; in bochs_connector_init() local
499 drm_connector_init(dev, connector, &bochs_connector_connector_funcs, in bochs_connector_init()
501 drm_connector_helper_add(connector, &bochs_connector_connector_helper_funcs); in bochs_connector_init()
504 if (bochs->edid) { in bochs_connector_init()
506 drm_connector_attach_edid_property(connector); in bochs_connector_init()
507 drm_connector_update_edid_property(connector, bochs->edid); in bochs_connector_init()
515 if (mode_cmd->pixel_format != DRM_FORMAT_XRGB8888 && in bochs_gem_fb_create()
516 mode_cmd->pixel_format != DRM_FORMAT_BGRX8888) in bochs_gem_fb_create()
517 return ERR_PTR(-EINVAL); in bochs_gem_fb_create()
533 ret = drmm_mode_config_init(bochs->dev); in bochs_kms_init()
537 bochs->dev->mode_config.max_width = 8192; in bochs_kms_init()
538 bochs->dev->mode_config.max_height = 8192; in bochs_kms_init()
540 bochs->dev->mode_config.fb_base = bochs->fb_base; in bochs_kms_init()
541 bochs->dev->mode_config.preferred_depth = 24; in bochs_kms_init()
542 bochs->dev->mode_config.prefer_shadow = 0; in bochs_kms_init()
543 bochs->dev->mode_config.prefer_shadow_fbdev = 1; in bochs_kms_init()
544 bochs->dev->mode_config.quirk_addfb_prefer_host_byte_order = true; in bochs_kms_init()
546 bochs->dev->mode_config.funcs = &bochs_mode_funcs; in bochs_kms_init()
548 bochs_connector_init(bochs->dev); in bochs_kms_init()
549 drm_simple_display_pipe_init(bochs->dev, in bochs_kms_init()
550 &bochs->pipe, in bochs_kms_init()
555 &bochs->connector); in bochs_kms_init()
557 drm_mode_config_reset(bochs->dev); in bochs_kms_init()
562 /* ---------------------------------------------------------------------- */
572 return -ENOMEM; in bochs_load()
573 dev->dev_private = bochs; in bochs_load()
574 bochs->dev = dev; in bochs_load()
580 ret = drmm_vram_helper_init(dev, bochs->fb_base, bochs->fb_size); in bochs_load()
596 .name = "bochs-drm",
597 .desc = "bochs dispi vga interface (qemu stdvga)",
604 /* ---------------------------------------------------------------------- */
628 /* ---------------------------------------------------------------------- */
640 return -ENOMEM; in bochs_pci_probe()
647 dev = drm_dev_alloc(&bochs_driver, &pdev->dev); in bochs_pci_probe()
702 .name = "bochs-drm",
709 /* ---------------------------------------------------------------------- */
714 if (vgacon_text_force() && bochs_modeset == -1) in bochs_init()
715 return -EINVAL; in bochs_init()
718 return -EINVAL; in bochs_init()