Lines Matching refs:bochs
98 static void bochs_vga_writeb(struct bochs_device *bochs, u16 ioport, u8 val)
103 if (bochs->mmio) {
106 writeb(val, bochs->mmio + offset);
112 static u8 bochs_vga_readb(struct bochs_device *bochs, u16 ioport)
117 if (bochs->mmio) {
120 return readb(bochs->mmio + offset);
126 static u16 bochs_dispi_read(struct bochs_device *bochs, u16 reg)
130 if (bochs->mmio) {
133 ret = readw(bochs->mmio + offset);
141 static void bochs_dispi_write(struct bochs_device *bochs, u16 reg, u16 val)
143 if (bochs->mmio) {
146 writew(val, bochs->mmio + offset);
153 static void bochs_hw_set_big_endian(struct bochs_device *bochs)
155 if (bochs->qext_size < 8)
158 writel(0xbebebebe, bochs->mmio + 0x604);
161 static void bochs_hw_set_little_endian(struct bochs_device *bochs)
163 if (bochs->qext_size < 8)
166 writel(0x1e1e1e1e, bochs->mmio + 0x604);
178 struct bochs_device *bochs = data;
185 buf[i] = readb(bochs->mmio + start + i);
190 static int bochs_hw_load_edid(struct bochs_device *bochs)
194 if (!bochs->mmio)
198 bochs_get_edid_block(bochs, header, 0, ARRAY_SIZE(header));
202 kfree(bochs->edid);
203 bochs->edid = drm_do_get_edid(&bochs->connector,
204 bochs_get_edid_block, bochs);
205 if (bochs->edid == NULL)
213 struct bochs_device *bochs = dev->dev_private;
219 /* mmio bar with vga and bochs registers present */
220 if (pci_request_region(pdev, 2, "bochs-drm") != 0) {
226 bochs->mmio = ioremap(ioaddr, iosize);
227 if (bochs->mmio == NULL) {
234 if (!request_region(ioaddr, iosize, "bochs-drm")) {
238 bochs->ioports = 1;
241 id = bochs_dispi_read(bochs, VBE_DISPI_INDEX_ID);
242 mem = bochs_dispi_read(bochs, VBE_DISPI_INDEX_VIDEO_MEMORY_64K)
256 DRM_ERROR("Size mismatch: pci=%ld, bochs=%ld\n",
261 if (pci_request_region(pdev, 0, "bochs-drm") != 0)
264 bochs->fb_map = ioremap(addr, size);
265 if (bochs->fb_map == NULL) {
269 bochs->fb_base = addr;
270 bochs->fb_size = size;
272 DRM_INFO("Found bochs VGA, ID 0x%x.\n", id);
275 bochs->ioports ? "ioports" : "mmio",
278 if (bochs->mmio && pdev->revision >= 2) {
279 bochs->qext_size = readl(bochs->mmio + 0x600);
280 if (bochs->qext_size < 4 || bochs->qext_size > iosize) {
281 bochs->qext_size = 0;
285 bochs->qext_size);
286 bochs_hw_set_native_endian(bochs);
295 struct bochs_device *bochs = dev->dev_private;
299 if (bochs->mmio)
300 iounmap(bochs->mmio);
301 if (bochs->ioports)
303 if (bochs->fb_map)
304 iounmap(bochs->fb_map);
306 kfree(bochs->edid);
309 static void bochs_hw_blank(struct bochs_device *bochs, bool blank)
313 bochs_vga_writeb(bochs, VGA_MIS_W, VGA_MIS_COLOR);
315 (void)bochs_vga_readb(bochs, VGA_IS1_RC);
317 bochs_vga_writeb(bochs, VGA_ATT_W, blank ? 0 : 0x20);
320 static void bochs_hw_setmode(struct bochs_device *bochs, struct drm_display_mode *mode)
324 if (!drm_dev_enter(bochs->dev, &idx))
327 bochs->xres = mode->hdisplay;
328 bochs->yres = mode->vdisplay;
329 bochs->bpp = 32;
330 bochs->stride = mode->hdisplay * (bochs->bpp / 8);
331 bochs->yres_virtual = bochs->fb_size / bochs->stride;
334 bochs->xres, bochs->yres, bochs->bpp,
335 bochs->yres_virtual);
337 bochs_hw_blank(bochs, false);
339 bochs_dispi_write(bochs, VBE_DISPI_INDEX_ENABLE, 0);
340 bochs_dispi_write(bochs, VBE_DISPI_INDEX_BPP, bochs->bpp);
341 bochs_dispi_write(bochs, VBE_DISPI_INDEX_XRES, bochs->xres);
342 bochs_dispi_write(bochs, VBE_DISPI_INDEX_YRES, bochs->yres);
343 bochs_dispi_write(bochs, VBE_DISPI_INDEX_BANK, 0);
344 bochs_dispi_write(bochs, VBE_DISPI_INDEX_VIRT_WIDTH, bochs->xres);
345 bochs_dispi_write(bochs, VBE_DISPI_INDEX_VIRT_HEIGHT,
346 bochs->yres_virtual);
347 bochs_dispi_write(bochs, VBE_DISPI_INDEX_X_OFFSET, 0);
348 bochs_dispi_write(bochs, VBE_DISPI_INDEX_Y_OFFSET, 0);
350 bochs_dispi_write(bochs, VBE_DISPI_INDEX_ENABLE,
356 static void bochs_hw_setformat(struct bochs_device *bochs, const struct drm_format_info *format)
360 if (!drm_dev_enter(bochs->dev, &idx))
371 bochs_hw_set_little_endian(bochs);
374 bochs_hw_set_big_endian(bochs);
386 static void bochs_hw_setbase(struct bochs_device *bochs, int x, int y, int stride, u64 addr)
391 if (!drm_dev_enter(bochs->dev, &idx))
394 bochs->stride = stride;
396 y * bochs->stride +
397 x * (bochs->bpp / 8);
398 vy = offset / bochs->stride;
399 vx = (offset % bochs->stride) * 8 / bochs->bpp;
400 vwidth = stride * 8 / bochs->bpp;
404 bochs_dispi_write(bochs, VBE_DISPI_INDEX_VIRT_WIDTH, vwidth);
405 bochs_dispi_write(bochs, VBE_DISPI_INDEX_X_OFFSET, vx);
406 bochs_dispi_write(bochs, VBE_DISPI_INDEX_Y_OFFSET, vy);
418 static void bochs_plane_update(struct bochs_device *bochs, struct drm_plane_state *state)
423 if (!state->fb || !bochs->stride)
431 bochs_hw_setbase(bochs,
436 bochs_hw_setformat(bochs, state->fb->format);
443 struct bochs_device *bochs = pipe->crtc.dev->dev_private;
445 bochs_hw_setmode(bochs, &crtc_state->mode);
446 bochs_plane_update(bochs, plane_state);
451 struct bochs_device *bochs = pipe->crtc.dev->dev_private;
453 bochs_hw_blank(bochs, true);
459 struct bochs_device *bochs = pipe->crtc.dev->dev_private;
461 bochs_plane_update(bochs, pipe->plane.state);
474 struct bochs_device *bochs =
478 if (bochs->edid)
479 count = drm_add_edid_modes(connector, bochs->edid);
502 struct bochs_device *bochs = dev->dev_private;
503 struct drm_connector *connector = &bochs->connector;
509 bochs_hw_load_edid(bochs);
510 if (bochs->edid) {
513 drm_connector_update_edid_property(connector, bochs->edid);
535 static int bochs_kms_init(struct bochs_device *bochs)
539 ret = drmm_mode_config_init(bochs->dev);
543 bochs->dev->mode_config.max_width = 8192;
544 bochs->dev->mode_config.max_height = 8192;
546 bochs->dev->mode_config.preferred_depth = 24;
547 bochs->dev->mode_config.prefer_shadow = 0;
548 bochs->dev->mode_config.quirk_addfb_prefer_host_byte_order = true;
550 bochs->dev->mode_config.funcs = &bochs_mode_funcs;
552 bochs_connector_init(bochs->dev);
553 drm_simple_display_pipe_init(bochs->dev,
554 &bochs->pipe,
559 &bochs->connector);
561 drm_mode_config_reset(bochs->dev);
571 struct bochs_device *bochs;
574 bochs = drmm_kzalloc(dev, sizeof(*bochs), GFP_KERNEL);
575 if (bochs == NULL)
577 dev->dev_private = bochs;
578 bochs->dev = dev;
584 ret = drmm_vram_helper_init(dev, bochs->fb_base, bochs->fb_size);
588 ret = bochs_kms_init(bochs);
604 .name = "bochs-drm",
605 .desc = "bochs dispi vga interface (qemu stdvga)",
719 .name = "bochs-drm",