Lines Matching refs:bochs
114 static __always_inline bool bochs_uses_mmio(struct bochs_device *bochs) in bochs_uses_mmio() argument
116 return !IS_ENABLED(CONFIG_HAS_IOPORT) || bochs->mmio; in bochs_uses_mmio()
119 static void bochs_vga_writeb(struct bochs_device *bochs, u16 ioport, u8 val) in bochs_vga_writeb() argument
124 if (bochs_uses_mmio(bochs)) { in bochs_vga_writeb()
127 writeb(val, bochs->mmio + offset); in bochs_vga_writeb()
133 static u8 bochs_vga_readb(struct bochs_device *bochs, u16 ioport) in bochs_vga_readb() argument
138 if (bochs_uses_mmio(bochs)) { in bochs_vga_readb()
141 return readb(bochs->mmio + offset); in bochs_vga_readb()
147 static u16 bochs_dispi_read(struct bochs_device *bochs, u16 reg) in bochs_dispi_read() argument
151 if (bochs_uses_mmio(bochs)) { in bochs_dispi_read()
154 ret = readw(bochs->mmio + offset); in bochs_dispi_read()
162 static void bochs_dispi_write(struct bochs_device *bochs, u16 reg, u16 val) in bochs_dispi_write() argument
164 if (bochs_uses_mmio(bochs)) { in bochs_dispi_write()
167 writew(val, bochs->mmio + offset); in bochs_dispi_write()
174 static void bochs_hw_set_big_endian(struct bochs_device *bochs) in bochs_hw_set_big_endian() argument
176 if (bochs->qext_size < 8) in bochs_hw_set_big_endian()
179 writel(0xbebebebe, bochs->mmio + 0x604); in bochs_hw_set_big_endian()
182 static void bochs_hw_set_little_endian(struct bochs_device *bochs) in bochs_hw_set_little_endian() argument
184 if (bochs->qext_size < 8) in bochs_hw_set_little_endian()
187 writel(0x1e1e1e1e, bochs->mmio + 0x604); in bochs_hw_set_little_endian()
198 struct bochs_device *bochs = data; in bochs_get_edid_block() local
201 if (!bochs->mmio) in bochs_get_edid_block()
208 buf[i] = readb(bochs->mmio + start + i); in bochs_get_edid_block()
216 struct bochs_device *bochs = to_bochs_device(dev); in bochs_hw_read_edid() local
220 bochs_get_edid_block(bochs, header, 0, ARRAY_SIZE(header)); in bochs_hw_read_edid()
226 return drm_edid_read_custom(connector, bochs_get_edid_block, bochs); in bochs_hw_read_edid()
229 static int bochs_hw_init(struct bochs_device *bochs) in bochs_hw_init() argument
231 struct drm_device *dev = &bochs->dev; in bochs_hw_init()
244 bochs->mmio = devm_ioremap(&pdev->dev, ioaddr, iosize); in bochs_hw_init()
245 if (bochs->mmio == NULL) { in bochs_hw_init()
256 bochs->ioports = 1; in bochs_hw_init()
262 id = bochs_dispi_read(bochs, VBE_DISPI_INDEX_ID); in bochs_hw_init()
263 mem = bochs_dispi_read(bochs, VBE_DISPI_INDEX_VIDEO_MEMORY_64K) in bochs_hw_init()
285 bochs->fb_map = devm_ioremap_wc(&pdev->dev, addr, size); in bochs_hw_init()
286 if (bochs->fb_map == NULL) { in bochs_hw_init()
290 bochs->fb_base = addr; in bochs_hw_init()
291 bochs->fb_size = size; in bochs_hw_init()
296 bochs->ioports ? "ioports" : "mmio", in bochs_hw_init()
299 if (bochs->mmio && pdev->revision >= 2) { in bochs_hw_init()
300 bochs->qext_size = readl(bochs->mmio + 0x600); in bochs_hw_init()
301 if (bochs->qext_size < 4 || bochs->qext_size > iosize) { in bochs_hw_init()
302 bochs->qext_size = 0; in bochs_hw_init()
306 bochs->qext_size); in bochs_hw_init()
307 bochs_hw_set_native_endian(bochs); in bochs_hw_init()
314 static void bochs_hw_blank(struct bochs_device *bochs, bool blank) in bochs_hw_blank() argument
318 bochs_vga_writeb(bochs, VGA_MIS_W, VGA_MIS_COLOR); in bochs_hw_blank()
320 (void)bochs_vga_readb(bochs, VGA_IS1_RC); in bochs_hw_blank()
322 bochs_vga_writeb(bochs, VGA_ATT_W, blank ? 0 : 0x20); in bochs_hw_blank()
325 static void bochs_hw_setmode(struct bochs_device *bochs, struct drm_display_mode *mode) in bochs_hw_setmode() argument
329 if (!drm_dev_enter(&bochs->dev, &idx)) in bochs_hw_setmode()
332 bochs->xres = mode->hdisplay; in bochs_hw_setmode()
333 bochs->yres = mode->vdisplay; in bochs_hw_setmode()
334 bochs->bpp = 32; in bochs_hw_setmode()
335 bochs->stride = mode->hdisplay * (bochs->bpp / 8); in bochs_hw_setmode()
336 bochs->yres_virtual = bochs->fb_size / bochs->stride; in bochs_hw_setmode()
339 bochs->xres, bochs->yres, bochs->bpp, in bochs_hw_setmode()
340 bochs->yres_virtual); in bochs_hw_setmode()
342 bochs_dispi_write(bochs, VBE_DISPI_INDEX_ENABLE, 0); in bochs_hw_setmode()
343 bochs_dispi_write(bochs, VBE_DISPI_INDEX_BPP, bochs->bpp); in bochs_hw_setmode()
344 bochs_dispi_write(bochs, VBE_DISPI_INDEX_XRES, bochs->xres); in bochs_hw_setmode()
345 bochs_dispi_write(bochs, VBE_DISPI_INDEX_YRES, bochs->yres); in bochs_hw_setmode()
346 bochs_dispi_write(bochs, VBE_DISPI_INDEX_BANK, 0); in bochs_hw_setmode()
347 bochs_dispi_write(bochs, VBE_DISPI_INDEX_VIRT_WIDTH, bochs->xres); in bochs_hw_setmode()
348 bochs_dispi_write(bochs, VBE_DISPI_INDEX_VIRT_HEIGHT, in bochs_hw_setmode()
349 bochs->yres_virtual); in bochs_hw_setmode()
350 bochs_dispi_write(bochs, VBE_DISPI_INDEX_X_OFFSET, 0); in bochs_hw_setmode()
351 bochs_dispi_write(bochs, VBE_DISPI_INDEX_Y_OFFSET, 0); in bochs_hw_setmode()
353 bochs_dispi_write(bochs, VBE_DISPI_INDEX_ENABLE, in bochs_hw_setmode()
359 static void bochs_hw_setformat(struct bochs_device *bochs, const struct drm_format_info *format) in bochs_hw_setformat() argument
363 if (!drm_dev_enter(&bochs->dev, &idx)) in bochs_hw_setformat()
374 bochs_hw_set_little_endian(bochs); in bochs_hw_setformat()
377 bochs_hw_set_big_endian(bochs); in bochs_hw_setformat()
389 static void bochs_hw_setbase(struct bochs_device *bochs, int x, int y, int stride, u64 addr) in bochs_hw_setbase() argument
394 if (!drm_dev_enter(&bochs->dev, &idx)) in bochs_hw_setbase()
397 bochs->stride = stride; in bochs_hw_setbase()
399 y * bochs->stride + in bochs_hw_setbase()
400 x * (bochs->bpp / 8); in bochs_hw_setbase()
401 vy = offset / bochs->stride; in bochs_hw_setbase()
402 vx = (offset % bochs->stride) * 8 / bochs->bpp; in bochs_hw_setbase()
403 vwidth = stride * 8 / bochs->bpp; in bochs_hw_setbase()
407 bochs_dispi_write(bochs, VBE_DISPI_INDEX_VIRT_WIDTH, vwidth); in bochs_hw_setbase()
408 bochs_dispi_write(bochs, VBE_DISPI_INDEX_X_OFFSET, vx); in bochs_hw_setbase()
409 bochs_dispi_write(bochs, VBE_DISPI_INDEX_Y_OFFSET, vy); in bochs_hw_setbase()
448 struct bochs_device *bochs = to_bochs_device(dev); in bochs_primary_plane_helper_atomic_update() local
456 if (!fb || !bochs->stride) in bochs_primary_plane_helper_atomic_update()
461 struct iosys_map dst = IOSYS_MAP_INIT_VADDR_IOMEM(bochs->fb_map); in bochs_primary_plane_helper_atomic_update()
468 bochs_hw_setbase(bochs, in bochs_primary_plane_helper_atomic_update()
473 bochs_hw_setformat(bochs, fb->format); in bochs_primary_plane_helper_atomic_update()
479 struct bochs_device *bochs = to_bochs_device(plane->dev); in bochs_primary_plane_helper_get_scanout_buffer() local
480 struct iosys_map map = IOSYS_MAP_INIT_VADDR_IOMEM(bochs->fb_map); in bochs_primary_plane_helper_get_scanout_buffer()
509 struct bochs_device *bochs = to_bochs_device(crtc->dev); in bochs_crtc_helper_mode_set_nofb() local
512 bochs_hw_setmode(bochs, &crtc_state->mode); in bochs_crtc_helper_mode_set_nofb()
529 struct bochs_device *bochs = to_bochs_device(crtc->dev); in bochs_crtc_helper_atomic_enable() local
531 bochs_hw_blank(bochs, false); in bochs_crtc_helper_atomic_enable()
538 struct bochs_device *bochs = to_bochs_device(crtc->dev); in bochs_crtc_helper_atomic_disable() local
541 bochs_hw_blank(bochs, true); in bochs_crtc_helper_atomic_disable()
601 struct bochs_device *bochs = to_bochs_device(dev); in bochs_mode_config_mode_valid() local
611 if (mode->vdisplay > DIV_ROUND_DOWN_ULL(bochs->fb_size, pitch)) in bochs_mode_config_mode_valid()
624 static int bochs_kms_init(struct bochs_device *bochs) in bochs_kms_init() argument
626 struct drm_device *dev = &bochs->dev; in bochs_kms_init()
645 primary_plane = &bochs->primary_plane; in bochs_kms_init()
657 crtc = &bochs->crtc; in bochs_kms_init()
664 encoder = &bochs->encoder; in bochs_kms_init()
671 connector = &bochs->connector; in bochs_kms_init()
692 static int bochs_load(struct bochs_device *bochs) in bochs_load() argument
696 ret = bochs_hw_init(bochs); in bochs_load()
700 ret = bochs_kms_init(bochs); in bochs_load()
749 struct bochs_device *bochs; in bochs_pci_probe() local
757 bochs = devm_drm_dev_alloc(&pdev->dev, &bochs_driver, struct bochs_device, dev); in bochs_pci_probe()
758 if (IS_ERR(bochs)) in bochs_pci_probe()
759 return PTR_ERR(bochs); in bochs_pci_probe()
760 dev = &bochs->dev; in bochs_pci_probe()
768 ret = bochs_load(bochs); in bochs_pci_probe()