Lines Matching full:cirrus
14 * drivers/video/cirrusfb.c - driver for Cirrus Logic chipsets
23 #include <video/cirrus.h>
43 #define DRIVER_NAME "cirrus"
44 #define DRIVER_DESC "qemu cirrus vga"
77 static u8 rreg_seq(struct cirrus_device *cirrus, u8 reg) in rreg_seq() argument
79 iowrite8(reg, cirrus->mmio + SEQ_INDEX); in rreg_seq()
80 return ioread8(cirrus->mmio + SEQ_DATA); in rreg_seq()
83 static void wreg_seq(struct cirrus_device *cirrus, u8 reg, u8 val) in wreg_seq() argument
85 iowrite8(reg, cirrus->mmio + SEQ_INDEX); in wreg_seq()
86 iowrite8(val, cirrus->mmio + SEQ_DATA); in wreg_seq()
92 static u8 rreg_crt(struct cirrus_device *cirrus, u8 reg) in rreg_crt() argument
94 iowrite8(reg, cirrus->mmio + CRT_INDEX); in rreg_crt()
95 return ioread8(cirrus->mmio + CRT_DATA); in rreg_crt()
98 static void wreg_crt(struct cirrus_device *cirrus, u8 reg, u8 val) in wreg_crt() argument
100 iowrite8(reg, cirrus->mmio + CRT_INDEX); in wreg_crt()
101 iowrite8(val, cirrus->mmio + CRT_DATA); in wreg_crt()
107 static void wreg_gfx(struct cirrus_device *cirrus, u8 reg, u8 val) in wreg_gfx() argument
109 iowrite8(reg, cirrus->mmio + GFX_INDEX); in wreg_gfx()
110 iowrite8(val, cirrus->mmio + GFX_DATA); in wreg_gfx()
115 static void wreg_hdr(struct cirrus_device *cirrus, u8 val) in wreg_hdr() argument
117 ioread8(cirrus->mmio + VGA_DAC_MASK); in wreg_hdr()
118 ioread8(cirrus->mmio + VGA_DAC_MASK); in wreg_hdr()
119 ioread8(cirrus->mmio + VGA_DAC_MASK); in wreg_hdr()
120 ioread8(cirrus->mmio + VGA_DAC_MASK); in wreg_hdr()
121 iowrite8(val, cirrus->mmio + VGA_DAC_MASK); in wreg_hdr()
155 static void cirrus_set_start_address(struct cirrus_device *cirrus, u32 offset) in cirrus_set_start_address() argument
161 if (!drm_dev_enter(&cirrus->dev, &idx)) in cirrus_set_start_address()
165 wreg_crt(cirrus, 0x0c, (u8)((addr >> 8) & 0xff)); in cirrus_set_start_address()
166 wreg_crt(cirrus, 0x0d, (u8)(addr & 0xff)); in cirrus_set_start_address()
168 tmp = rreg_crt(cirrus, 0x1b); in cirrus_set_start_address()
172 wreg_crt(cirrus, 0x1b, tmp); in cirrus_set_start_address()
174 tmp = rreg_crt(cirrus, 0x1d); in cirrus_set_start_address()
177 wreg_crt(cirrus, 0x1d, tmp); in cirrus_set_start_address()
182 static int cirrus_mode_set(struct cirrus_device *cirrus, in cirrus_mode_set() argument
191 if (!drm_dev_enter(&cirrus->dev, &idx)) in cirrus_mode_set()
210 wreg_crt(cirrus, VGA_CRTC_V_SYNC_END, 0x20); in cirrus_mode_set()
211 wreg_crt(cirrus, VGA_CRTC_H_TOTAL, htotal); in cirrus_mode_set()
212 wreg_crt(cirrus, VGA_CRTC_H_DISP, hdispend); in cirrus_mode_set()
213 wreg_crt(cirrus, VGA_CRTC_H_SYNC_START, hsyncstart); in cirrus_mode_set()
214 wreg_crt(cirrus, VGA_CRTC_H_SYNC_END, hsyncend); in cirrus_mode_set()
215 wreg_crt(cirrus, VGA_CRTC_V_TOTAL, vtotal & 0xff); in cirrus_mode_set()
216 wreg_crt(cirrus, VGA_CRTC_V_DISP_END, vdispend & 0xff); in cirrus_mode_set()
221 wreg_crt(cirrus, VGA_CRTC_MAX_SCAN, tmp); in cirrus_mode_set()
237 wreg_crt(cirrus, VGA_CRTC_OVERFLOW, tmp); in cirrus_mode_set()
252 wreg_crt(cirrus, CL_CRT1A, tmp); in cirrus_mode_set()
255 wreg_crt(cirrus, VGA_CRTC_MODE, 0x03); in cirrus_mode_set()
257 sr07 = rreg_seq(cirrus, 0x07); in cirrus_mode_set()
261 cirrus->cpp = cirrus_cpp(fb); in cirrus_mode_set()
262 switch (cirrus->cpp * 8) { in cirrus_mode_set()
283 wreg_seq(cirrus, 0x7, sr07); in cirrus_mode_set()
286 cirrus->pitch = cirrus_pitch(fb); in cirrus_mode_set()
287 tmp = cirrus->pitch / 8; in cirrus_mode_set()
288 wreg_crt(cirrus, VGA_CRTC_OFFSET, tmp); in cirrus_mode_set()
292 tmp |= (cirrus->pitch >> 7) & 0x10; in cirrus_mode_set()
293 tmp |= (cirrus->pitch >> 6) & 0x40; in cirrus_mode_set()
294 wreg_crt(cirrus, 0x1b, tmp); in cirrus_mode_set()
297 wreg_gfx(cirrus, VGA_GFX_MODE, 0x40); in cirrus_mode_set()
300 wreg_gfx(cirrus, VGA_GFX_MISC, 0x01); in cirrus_mode_set()
302 wreg_hdr(cirrus, hdr); in cirrus_mode_set()
304 cirrus_set_start_address(cirrus, 0); in cirrus_mode_set()
316 struct cirrus_device *cirrus = to_cirrus(fb->dev); in cirrus_fb_blit_rect() local
321 if (!drm_dev_enter(&cirrus->dev, &idx)) in cirrus_fb_blit_rect()
329 if (cirrus->cpp == fb->format->cpp[0]) in cirrus_fb_blit_rect()
330 drm_fb_memcpy_dstclip(cirrus->vram, in cirrus_fb_blit_rect()
333 else if (fb->format->cpp[0] == 4 && cirrus->cpp == 2) in cirrus_fb_blit_rect()
334 drm_fb_xrgb8888_to_rgb565_dstclip(cirrus->vram, in cirrus_fb_blit_rect()
335 cirrus->pitch, in cirrus_fb_blit_rect()
338 else if (fb->format->cpp[0] == 4 && cirrus->cpp == 3) in cirrus_fb_blit_rect()
339 drm_fb_xrgb8888_to_rgb888_dstclip(cirrus->vram, in cirrus_fb_blit_rect()
340 cirrus->pitch, in cirrus_fb_blit_rect()
382 /* cirrus connector */
407 static int cirrus_conn_init(struct cirrus_device *cirrus) in cirrus_conn_init() argument
409 drm_connector_helper_add(&cirrus->conn, &cirrus_conn_helper_funcs); in cirrus_conn_init()
410 return drm_connector_init(&cirrus->dev, &cirrus->conn, in cirrus_conn_init()
416 /* cirrus (simple) display pipe */
441 struct cirrus_device *cirrus = to_cirrus(pipe->crtc.dev); in cirrus_pipe_enable() local
443 cirrus_mode_set(cirrus, &crtc_state->mode, plane_state->fb); in cirrus_pipe_enable()
450 struct cirrus_device *cirrus = to_cirrus(pipe->crtc.dev); in cirrus_pipe_update() local
456 cirrus->cpp != cirrus_cpp(pipe->plane.state->fb)) in cirrus_pipe_update()
457 cirrus_mode_set(cirrus, &crtc->mode, in cirrus_pipe_update()
482 static int cirrus_pipe_init(struct cirrus_device *cirrus) in cirrus_pipe_init() argument
484 return drm_simple_display_pipe_init(&cirrus->dev, in cirrus_pipe_init()
485 &cirrus->pipe, in cirrus_pipe_init()
490 &cirrus->conn); in cirrus_pipe_init()
494 /* cirrus framebuffers & mode config */
515 static int cirrus_mode_config_init(struct cirrus_device *cirrus) in cirrus_mode_config_init() argument
517 struct drm_device *dev = &cirrus->dev; in cirrus_mode_config_init()
556 struct cirrus_device *cirrus; in cirrus_pci_probe() local
572 cirrus = devm_drm_dev_alloc(&pdev->dev, &cirrus_driver, in cirrus_pci_probe()
574 if (IS_ERR(cirrus)) in cirrus_pci_probe()
575 return PTR_ERR(cirrus); in cirrus_pci_probe()
577 dev = &cirrus->dev; in cirrus_pci_probe()
579 cirrus->vram = devm_ioremap(&pdev->dev, pci_resource_start(pdev, 0), in cirrus_pci_probe()
581 if (cirrus->vram == NULL) in cirrus_pci_probe()
584 cirrus->mmio = devm_ioremap(&pdev->dev, pci_resource_start(pdev, 1), in cirrus_pci_probe()
586 if (cirrus->mmio == NULL) in cirrus_pci_probe()
589 ret = cirrus_mode_config_init(cirrus); in cirrus_pci_probe()
593 ret = cirrus_conn_init(cirrus); in cirrus_pci_probe()
597 ret = cirrus_pipe_init(cirrus); in cirrus_pci_probe()
625 /* only bind to the cirrus chip in qemu */