Lines Matching refs:bochs

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