Lines Matching refs:bochs
94 static void bochs_vga_writeb(struct bochs_device *bochs, u16 ioport, u8 val) in bochs_vga_writeb() argument
99 if (bochs->mmio) { in bochs_vga_writeb()
102 writeb(val, bochs->mmio + offset); in bochs_vga_writeb()
108 static u8 bochs_vga_readb(struct bochs_device *bochs, u16 ioport) in bochs_vga_readb() argument
113 if (bochs->mmio) { in bochs_vga_readb()
116 return readb(bochs->mmio + offset); in bochs_vga_readb()
122 static u16 bochs_dispi_read(struct bochs_device *bochs, u16 reg) in bochs_dispi_read() argument
126 if (bochs->mmio) { in bochs_dispi_read()
129 ret = readw(bochs->mmio + offset); in bochs_dispi_read()
137 static void bochs_dispi_write(struct bochs_device *bochs, u16 reg, u16 val) in bochs_dispi_write() argument
139 if (bochs->mmio) { in bochs_dispi_write()
142 writew(val, bochs->mmio + offset); in bochs_dispi_write()
149 static void bochs_hw_set_big_endian(struct bochs_device *bochs) in bochs_hw_set_big_endian() argument
151 if (bochs->qext_size < 8) in bochs_hw_set_big_endian()
154 writel(0xbebebebe, bochs->mmio + 0x604); in bochs_hw_set_big_endian()
157 static void bochs_hw_set_little_endian(struct bochs_device *bochs) in bochs_hw_set_little_endian() argument
159 if (bochs->qext_size < 8) in bochs_hw_set_little_endian()
162 writel(0x1e1e1e1e, bochs->mmio + 0x604); in bochs_hw_set_little_endian()
174 struct bochs_device *bochs = data; in bochs_get_edid_block() local
181 buf[i] = readb(bochs->mmio + start + i); in bochs_get_edid_block()
186 static int bochs_hw_load_edid(struct bochs_device *bochs) in bochs_hw_load_edid() argument
190 if (!bochs->mmio) in bochs_hw_load_edid()
194 bochs_get_edid_block(bochs, header, 0, ARRAY_SIZE(header)); 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()
200 bochs_get_edid_block, bochs); in bochs_hw_load_edid()
201 if (bochs->edid == NULL) in bochs_hw_load_edid()
209 struct bochs_device *bochs = dev->dev_private; in bochs_hw_init() local
222 bochs->mmio = ioremap(ioaddr, iosize); in bochs_hw_init()
223 if (bochs->mmio == NULL) { in bochs_hw_init()
234 bochs->ioports = 1; in bochs_hw_init()
237 id = bochs_dispi_read(bochs, VBE_DISPI_INDEX_ID); in bochs_hw_init()
238 mem = bochs_dispi_read(bochs, VBE_DISPI_INDEX_VIDEO_MEMORY_64K) 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()
265 bochs->fb_base = addr; in bochs_hw_init()
266 bochs->fb_size = size; 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()
282 bochs_hw_set_native_endian(bochs); in bochs_hw_init()
291 struct bochs_device *bochs = dev->dev_private; in bochs_hw_fini() local
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()
302 kfree(bochs->edid); in bochs_hw_fini()
305 static void bochs_hw_blank(struct bochs_device *bochs, bool blank) in bochs_hw_blank() argument
309 (void)bochs_vga_readb(bochs, VGA_IS1_RC); in bochs_hw_blank()
311 bochs_vga_writeb(bochs, VGA_ATT_W, blank ? 0 : 0x20); in bochs_hw_blank()
314 static void bochs_hw_setmode(struct bochs_device *bochs, struct drm_display_mode *mode) in bochs_hw_setmode() argument
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()
331 bochs_hw_blank(bochs, false); in bochs_hw_setmode()
333 bochs_dispi_write(bochs, VBE_DISPI_INDEX_ENABLE, 0); 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()
337 bochs_dispi_write(bochs, VBE_DISPI_INDEX_BANK, 0); in bochs_hw_setmode()
338 bochs_dispi_write(bochs, VBE_DISPI_INDEX_VIRT_WIDTH, bochs->xres); in bochs_hw_setmode()
339 bochs_dispi_write(bochs, VBE_DISPI_INDEX_VIRT_HEIGHT, in bochs_hw_setmode()
340 bochs->yres_virtual); in bochs_hw_setmode()
341 bochs_dispi_write(bochs, VBE_DISPI_INDEX_X_OFFSET, 0); in bochs_hw_setmode()
342 bochs_dispi_write(bochs, VBE_DISPI_INDEX_Y_OFFSET, 0); in bochs_hw_setmode()
344 bochs_dispi_write(bochs, VBE_DISPI_INDEX_ENABLE, in bochs_hw_setmode()
350 static void bochs_hw_setformat(struct bochs_device *bochs, const struct drm_format_info *format) in bochs_hw_setformat() argument
354 if (!drm_dev_enter(bochs->dev, &idx)) in bochs_hw_setformat()
365 bochs_hw_set_little_endian(bochs); in bochs_hw_setformat()
368 bochs_hw_set_big_endian(bochs); in bochs_hw_setformat()
380 static void bochs_hw_setbase(struct bochs_device *bochs, int x, int y, int stride, u64 addr) in bochs_hw_setbase() argument
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()
398 bochs_dispi_write(bochs, VBE_DISPI_INDEX_VIRT_WIDTH, vwidth); in bochs_hw_setbase()
399 bochs_dispi_write(bochs, VBE_DISPI_INDEX_X_OFFSET, vx); in bochs_hw_setbase()
400 bochs_dispi_write(bochs, VBE_DISPI_INDEX_Y_OFFSET, vy); in bochs_hw_setbase()
412 static void bochs_plane_update(struct bochs_device *bochs, struct drm_plane_state *state) in bochs_plane_update() argument
417 if (!state->fb || !bochs->stride) in bochs_plane_update()
425 bochs_hw_setbase(bochs, 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() local
439 bochs_hw_setmode(bochs, &crtc_state->mode); in bochs_pipe_enable()
440 bochs_plane_update(bochs, plane_state); in bochs_pipe_enable()
445 struct bochs_device *bochs = pipe->crtc.dev->dev_private; in bochs_pipe_disable() local
447 bochs_hw_blank(bochs, true); in bochs_pipe_disable()
453 struct bochs_device *bochs = pipe->crtc.dev->dev_private; in bochs_pipe_update() local
455 bochs_plane_update(bochs, pipe->plane.state); in bochs_pipe_update()
468 struct bochs_device *bochs = in bochs_connector_get_modes() local
472 if (bochs->edid) in bochs_connector_get_modes()
473 count = drm_add_edid_modes(connector, bochs->edid); in bochs_connector_get_modes()
496 struct bochs_device *bochs = dev->dev_private; in bochs_connector_init() local
497 struct drm_connector *connector = &bochs->connector; in bochs_connector_init()
503 bochs_hw_load_edid(bochs); in bochs_connector_init()
504 if (bochs->edid) { in bochs_connector_init()
507 drm_connector_update_edid_property(connector, bochs->edid); in bochs_connector_init()
529 static int bochs_kms_init(struct bochs_device *bochs) in bochs_kms_init() argument
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()
567 struct bochs_device *bochs; in bochs_load() local
570 bochs = drmm_kzalloc(dev, sizeof(*bochs), GFP_KERNEL); in bochs_load()
571 if (bochs == NULL) 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()
584 ret = bochs_kms_init(bochs); in bochs_load()