Lines Matching refs:bochs

110 static __always_inline bool bochs_uses_mmio(struct bochs_device *bochs)  in bochs_uses_mmio()  argument
112 return !IS_ENABLED(CONFIG_HAS_IOPORT) || bochs->mmio; in bochs_uses_mmio()
115 static void bochs_vga_writeb(struct bochs_device *bochs, u16 ioport, u8 val) in bochs_vga_writeb() argument
120 if (bochs_uses_mmio(bochs)) { in bochs_vga_writeb()
123 writeb(val, bochs->mmio + offset); in bochs_vga_writeb()
129 static u8 bochs_vga_readb(struct bochs_device *bochs, u16 ioport) in bochs_vga_readb() argument
134 if (bochs_uses_mmio(bochs)) { in bochs_vga_readb()
137 return readb(bochs->mmio + offset); in bochs_vga_readb()
143 static u16 bochs_dispi_read(struct bochs_device *bochs, u16 reg) in bochs_dispi_read() argument
147 if (bochs_uses_mmio(bochs)) { in bochs_dispi_read()
150 ret = readw(bochs->mmio + offset); in bochs_dispi_read()
158 static void bochs_dispi_write(struct bochs_device *bochs, u16 reg, u16 val) in bochs_dispi_write() argument
160 if (bochs_uses_mmio(bochs)) { in bochs_dispi_write()
163 writew(val, bochs->mmio + offset); in bochs_dispi_write()
170 static void bochs_hw_set_big_endian(struct bochs_device *bochs) in bochs_hw_set_big_endian() argument
172 if (bochs->qext_size < 8) in bochs_hw_set_big_endian()
175 writel(0xbebebebe, bochs->mmio + 0x604); in bochs_hw_set_big_endian()
178 static void bochs_hw_set_little_endian(struct bochs_device *bochs) in bochs_hw_set_little_endian() argument
180 if (bochs->qext_size < 8) in bochs_hw_set_little_endian()
183 writel(0x1e1e1e1e, bochs->mmio + 0x604); in bochs_hw_set_little_endian()
194 struct bochs_device *bochs = data; in bochs_get_edid_block() local
197 if (!bochs->mmio) in bochs_get_edid_block()
204 buf[i] = readb(bochs->mmio + start + i); in bochs_get_edid_block()
212 struct bochs_device *bochs = to_bochs_device(dev); in bochs_hw_read_edid() local
216 bochs_get_edid_block(bochs, header, 0, ARRAY_SIZE(header)); in bochs_hw_read_edid()
222 return drm_edid_read_custom(connector, bochs_get_edid_block, bochs); in bochs_hw_read_edid()
225 static int bochs_hw_init(struct bochs_device *bochs) in bochs_hw_init() argument
227 struct drm_device *dev = &bochs->dev; 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()
252 bochs->ioports = 1; in bochs_hw_init()
258 id = bochs_dispi_read(bochs, VBE_DISPI_INDEX_ID); in bochs_hw_init()
259 mem = bochs_dispi_read(bochs, VBE_DISPI_INDEX_VIDEO_MEMORY_64K) 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()
286 bochs->fb_base = addr; in bochs_hw_init()
287 bochs->fb_size = size; 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()
303 bochs_hw_set_native_endian(bochs); in bochs_hw_init()
310 static void bochs_hw_blank(struct bochs_device *bochs, bool blank) in bochs_hw_blank() argument
314 bochs_vga_writeb(bochs, VGA_MIS_W, VGA_MIS_COLOR); in bochs_hw_blank()
316 (void)bochs_vga_readb(bochs, VGA_IS1_RC); in bochs_hw_blank()
318 bochs_vga_writeb(bochs, VGA_ATT_W, blank ? 0 : 0x20); in bochs_hw_blank()
321 static void bochs_hw_setmode(struct bochs_device *bochs, struct drm_display_mode *mode) in bochs_hw_setmode() argument
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()
338 bochs_dispi_write(bochs, VBE_DISPI_INDEX_ENABLE, 0); 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()
342 bochs_dispi_write(bochs, VBE_DISPI_INDEX_BANK, 0); in bochs_hw_setmode()
343 bochs_dispi_write(bochs, VBE_DISPI_INDEX_VIRT_WIDTH, bochs->xres); in bochs_hw_setmode()
344 bochs_dispi_write(bochs, VBE_DISPI_INDEX_VIRT_HEIGHT, in bochs_hw_setmode()
345 bochs->yres_virtual); in bochs_hw_setmode()
346 bochs_dispi_write(bochs, VBE_DISPI_INDEX_X_OFFSET, 0); in bochs_hw_setmode()
347 bochs_dispi_write(bochs, VBE_DISPI_INDEX_Y_OFFSET, 0); in bochs_hw_setmode()
349 bochs_dispi_write(bochs, VBE_DISPI_INDEX_ENABLE, in bochs_hw_setmode()
355 static void bochs_hw_setformat(struct bochs_device *bochs, const struct drm_format_info *format) in bochs_hw_setformat() argument
359 if (!drm_dev_enter(&bochs->dev, &idx)) in bochs_hw_setformat()
370 bochs_hw_set_little_endian(bochs); in bochs_hw_setformat()
373 bochs_hw_set_big_endian(bochs); in bochs_hw_setformat()
385 static void bochs_hw_setbase(struct bochs_device *bochs, int x, int y, int stride, u64 addr) in bochs_hw_setbase() argument
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()
403 bochs_dispi_write(bochs, VBE_DISPI_INDEX_VIRT_WIDTH, vwidth); in bochs_hw_setbase()
404 bochs_dispi_write(bochs, VBE_DISPI_INDEX_X_OFFSET, vx); in bochs_hw_setbase()
405 bochs_dispi_write(bochs, VBE_DISPI_INDEX_Y_OFFSET, vy); in bochs_hw_setbase()
444 struct bochs_device *bochs = to_bochs_device(dev); in bochs_primary_plane_helper_atomic_update() local
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()
464 bochs_hw_setbase(bochs, 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() local
490 bochs_hw_setmode(bochs, &crtc_state->mode); in bochs_crtc_helper_mode_set_nofb()
507 struct bochs_device *bochs = to_bochs_device(crtc->dev); in bochs_crtc_helper_atomic_enable() local
509 bochs_hw_blank(bochs, false); in bochs_crtc_helper_atomic_enable()
515 struct bochs_device *bochs = to_bochs_device(crtc->dev); in bochs_crtc_helper_atomic_disable() local
517 bochs_hw_blank(bochs, true); in bochs_crtc_helper_atomic_disable()
575 struct bochs_device *bochs = to_bochs_device(dev); in bochs_mode_config_mode_valid() local
585 if (mode->vdisplay > DIV_ROUND_DOWN_ULL(bochs->fb_size, pitch)) in bochs_mode_config_mode_valid()
598 static int bochs_kms_init(struct bochs_device *bochs) in bochs_kms_init() argument
600 struct drm_device *dev = &bochs->dev; 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()
645 connector = &bochs->connector; in bochs_kms_init()
662 static int bochs_load(struct bochs_device *bochs) in bochs_load() argument
666 ret = bochs_hw_init(bochs); in bochs_load()
670 ret = bochs_kms_init(bochs); in bochs_load()
719 struct bochs_device *bochs; in bochs_pci_probe() local
727 bochs = devm_drm_dev_alloc(&pdev->dev, &bochs_driver, struct bochs_device, dev); in bochs_pci_probe()
728 if (IS_ERR(bochs)) in bochs_pci_probe()
729 return PTR_ERR(bochs); in bochs_pci_probe()
730 dev = &bochs->dev; in bochs_pci_probe()
738 ret = bochs_load(bochs); in bochs_pci_probe()