Lines Matching full:cirrus
14 * drivers/video/cirrusfb.c - driver for Cirrus Logic chipsets
24 #include <video/cirrus.h>
46 #define DRIVER_NAME "cirrus"
47 #define DRIVER_DESC "qemu cirrus vga"
80 static u8 rreg_seq(struct cirrus_device *cirrus, u8 reg) in rreg_seq() argument
82 iowrite8(reg, cirrus->mmio + SEQ_INDEX); in rreg_seq()
83 return ioread8(cirrus->mmio + SEQ_DATA); in rreg_seq()
86 static void wreg_seq(struct cirrus_device *cirrus, u8 reg, u8 val) in wreg_seq() argument
88 iowrite8(reg, cirrus->mmio + SEQ_INDEX); in wreg_seq()
89 iowrite8(val, cirrus->mmio + SEQ_DATA); in wreg_seq()
95 static u8 rreg_crt(struct cirrus_device *cirrus, u8 reg) in rreg_crt() argument
97 iowrite8(reg, cirrus->mmio + CRT_INDEX); in rreg_crt()
98 return ioread8(cirrus->mmio + CRT_DATA); in rreg_crt()
101 static void wreg_crt(struct cirrus_device *cirrus, u8 reg, u8 val) in wreg_crt() argument
103 iowrite8(reg, cirrus->mmio + CRT_INDEX); in wreg_crt()
104 iowrite8(val, cirrus->mmio + CRT_DATA); in wreg_crt()
110 static void wreg_gfx(struct cirrus_device *cirrus, u8 reg, u8 val) in wreg_gfx() argument
112 iowrite8(reg, cirrus->mmio + GFX_INDEX); in wreg_gfx()
113 iowrite8(val, cirrus->mmio + GFX_DATA); in wreg_gfx()
118 static void wreg_hdr(struct cirrus_device *cirrus, u8 val) in wreg_hdr() argument
120 ioread8(cirrus->mmio + VGA_DAC_MASK); in wreg_hdr()
121 ioread8(cirrus->mmio + VGA_DAC_MASK); in wreg_hdr()
122 ioread8(cirrus->mmio + VGA_DAC_MASK); in wreg_hdr()
123 ioread8(cirrus->mmio + VGA_DAC_MASK); in wreg_hdr()
124 iowrite8(val, cirrus->mmio + VGA_DAC_MASK); in wreg_hdr()
158 static void cirrus_set_start_address(struct cirrus_device *cirrus, u32 offset) in cirrus_set_start_address() argument
164 if (!drm_dev_enter(&cirrus->dev, &idx)) in cirrus_set_start_address()
168 wreg_crt(cirrus, 0x0c, (u8)((addr >> 8) & 0xff)); in cirrus_set_start_address()
169 wreg_crt(cirrus, 0x0d, (u8)(addr & 0xff)); in cirrus_set_start_address()
171 tmp = rreg_crt(cirrus, 0x1b); in cirrus_set_start_address()
175 wreg_crt(cirrus, 0x1b, tmp); in cirrus_set_start_address()
177 tmp = rreg_crt(cirrus, 0x1d); in cirrus_set_start_address()
180 wreg_crt(cirrus, 0x1d, tmp); in cirrus_set_start_address()
185 static int cirrus_mode_set(struct cirrus_device *cirrus, in cirrus_mode_set() argument
194 if (!drm_dev_enter(&cirrus->dev, &idx)) in cirrus_mode_set()
213 wreg_crt(cirrus, VGA_CRTC_V_SYNC_END, 0x20); in cirrus_mode_set()
214 wreg_crt(cirrus, VGA_CRTC_H_TOTAL, htotal); in cirrus_mode_set()
215 wreg_crt(cirrus, VGA_CRTC_H_DISP, hdispend); in cirrus_mode_set()
216 wreg_crt(cirrus, VGA_CRTC_H_SYNC_START, hsyncstart); in cirrus_mode_set()
217 wreg_crt(cirrus, VGA_CRTC_H_SYNC_END, hsyncend); in cirrus_mode_set()
218 wreg_crt(cirrus, VGA_CRTC_V_TOTAL, vtotal & 0xff); in cirrus_mode_set()
219 wreg_crt(cirrus, VGA_CRTC_V_DISP_END, vdispend & 0xff); in cirrus_mode_set()
224 wreg_crt(cirrus, VGA_CRTC_MAX_SCAN, tmp); in cirrus_mode_set()
240 wreg_crt(cirrus, VGA_CRTC_OVERFLOW, tmp); in cirrus_mode_set()
255 wreg_crt(cirrus, CL_CRT1A, tmp); in cirrus_mode_set()
258 wreg_crt(cirrus, VGA_CRTC_MODE, 0x03); in cirrus_mode_set()
260 sr07 = rreg_seq(cirrus, 0x07); in cirrus_mode_set()
264 cirrus->cpp = cirrus_cpp(fb); in cirrus_mode_set()
265 switch (cirrus->cpp * 8) { in cirrus_mode_set()
286 wreg_seq(cirrus, 0x7, sr07); in cirrus_mode_set()
289 cirrus->pitch = cirrus_pitch(fb); in cirrus_mode_set()
290 tmp = cirrus->pitch / 8; in cirrus_mode_set()
291 wreg_crt(cirrus, VGA_CRTC_OFFSET, tmp); in cirrus_mode_set()
295 tmp |= (cirrus->pitch >> 7) & 0x10; in cirrus_mode_set()
296 tmp |= (cirrus->pitch >> 6) & 0x40; in cirrus_mode_set()
297 wreg_crt(cirrus, 0x1b, tmp); in cirrus_mode_set()
300 wreg_gfx(cirrus, VGA_GFX_MODE, 0x40); in cirrus_mode_set()
303 wreg_gfx(cirrus, VGA_GFX_MISC, 0x01); in cirrus_mode_set()
305 wreg_hdr(cirrus, hdr); in cirrus_mode_set()
307 cirrus_set_start_address(cirrus, 0); in cirrus_mode_set()
319 struct cirrus_device *cirrus = to_cirrus(fb->dev); in cirrus_fb_blit_rect() local
323 if (!drm_dev_enter(&cirrus->dev, &idx)) in cirrus_fb_blit_rect()
326 if (cirrus->cpp == fb->format->cpp[0]) in cirrus_fb_blit_rect()
327 drm_fb_memcpy_dstclip(cirrus->vram, fb->pitches[0], in cirrus_fb_blit_rect()
330 else if (fb->format->cpp[0] == 4 && cirrus->cpp == 2) in cirrus_fb_blit_rect()
331 drm_fb_xrgb8888_to_rgb565_dstclip(cirrus->vram, in cirrus_fb_blit_rect()
332 cirrus->pitch, in cirrus_fb_blit_rect()
335 else if (fb->format->cpp[0] == 4 && cirrus->cpp == 3) in cirrus_fb_blit_rect()
336 drm_fb_xrgb8888_to_rgb888_dstclip(cirrus->vram, in cirrus_fb_blit_rect()
337 cirrus->pitch, in cirrus_fb_blit_rect()
375 /* cirrus connector */
400 static int cirrus_conn_init(struct cirrus_device *cirrus) in cirrus_conn_init() argument
402 drm_connector_helper_add(&cirrus->conn, &cirrus_conn_helper_funcs); in cirrus_conn_init()
403 return drm_connector_init(&cirrus->dev, &cirrus->conn, in cirrus_conn_init()
409 /* cirrus (simple) display pipe */
434 struct cirrus_device *cirrus = to_cirrus(pipe->crtc.dev); in cirrus_pipe_enable() local
437 cirrus_mode_set(cirrus, &crtc_state->mode, plane_state->fb); in cirrus_pipe_enable()
444 struct cirrus_device *cirrus = to_cirrus(pipe->crtc.dev); in cirrus_pipe_update() local
450 if (state->fb && cirrus->cpp != cirrus_cpp(state->fb)) in cirrus_pipe_update()
451 cirrus_mode_set(cirrus, &crtc->mode, state->fb); in cirrus_pipe_update()
476 static int cirrus_pipe_init(struct cirrus_device *cirrus) in cirrus_pipe_init() argument
478 return drm_simple_display_pipe_init(&cirrus->dev, in cirrus_pipe_init()
479 &cirrus->pipe, in cirrus_pipe_init()
484 &cirrus->conn); in cirrus_pipe_init()
488 /* cirrus framebuffers & mode config */
509 static int cirrus_mode_config_init(struct cirrus_device *cirrus) in cirrus_mode_config_init() argument
511 struct drm_device *dev = &cirrus->dev; in cirrus_mode_config_init()
550 struct cirrus_device *cirrus; in cirrus_pci_probe() local
566 cirrus = devm_drm_dev_alloc(&pdev->dev, &cirrus_driver, in cirrus_pci_probe()
568 if (IS_ERR(cirrus)) in cirrus_pci_probe()
569 return PTR_ERR(cirrus); in cirrus_pci_probe()
571 dev = &cirrus->dev; in cirrus_pci_probe()
573 cirrus->vram = devm_ioremap(&pdev->dev, pci_resource_start(pdev, 0), in cirrus_pci_probe()
575 if (cirrus->vram == NULL) in cirrus_pci_probe()
578 cirrus->mmio = devm_ioremap(&pdev->dev, pci_resource_start(pdev, 1), in cirrus_pci_probe()
580 if (cirrus->mmio == NULL) in cirrus_pci_probe()
583 ret = cirrus_mode_config_init(cirrus); in cirrus_pci_probe()
587 ret = cirrus_conn_init(cirrus); in cirrus_pci_probe()
591 ret = cirrus_pipe_init(cirrus); in cirrus_pci_probe()
618 /* only bind to the cirrus chip in qemu */