Lines Matching +full:gamma +full:- +full:lut

1 // SPDX-License-Identifier: GPL-2.0-only
12 #include <linux/iosys-map.h>
40 switch (format->format) { in mgag200_crtc_set_gamma_linear()
64 drm_warn_once(&mdev->base, "Unsupported format %p4cc for gamma correction\n", in mgag200_crtc_set_gamma_linear()
65 &format->format); in mgag200_crtc_set_gamma_linear()
72 struct drm_color_lut *lut) in mgag200_crtc_set_gamma() argument
78 switch (format->format) { in mgag200_crtc_set_gamma()
80 /* Use better interpolation, to take 32 values from lut[0] to lut[255] */ in mgag200_crtc_set_gamma()
82 WREG8(DAC_INDEX + MGA1064_COL_PAL, lut[i * 8 + i / 4].red >> 8); in mgag200_crtc_set_gamma()
83 WREG8(DAC_INDEX + MGA1064_COL_PAL, lut[i * 4 + i / 16].green >> 8); in mgag200_crtc_set_gamma()
84 WREG8(DAC_INDEX + MGA1064_COL_PAL, lut[i * 8 + i / 4].blue >> 8); in mgag200_crtc_set_gamma()
89 WREG8(DAC_INDEX + MGA1064_COL_PAL, lut[i * 4 + i / 16].green >> 8); in mgag200_crtc_set_gamma()
96 WREG8(DAC_INDEX + MGA1064_COL_PAL, lut[i].red >> 8); in mgag200_crtc_set_gamma()
97 WREG8(DAC_INDEX + MGA1064_COL_PAL, lut[i].green >> 8); in mgag200_crtc_set_gamma()
98 WREG8(DAC_INDEX + MGA1064_COL_PAL, lut[i].blue >> 8); in mgag200_crtc_set_gamma()
102 drm_warn_once(&mdev->base, "Unsupported format %p4cc for gamma correction\n", in mgag200_crtc_set_gamma()
103 &format->format); in mgag200_crtc_set_gamma()
139 * addr<20> -> CRTCEXT0<6>
140 * addr<19-16> -> CRTCEXT0<3-0>
141 * addr<15-8> -> CRTCC<7-0>
142 * addr<7-0> -> CRTCD<7-0>
150 struct drm_device *dev = &mdev->base; in mgag200_set_startadd()
157 drm_WARN_ON_ONCE(dev, mdev->info->bug_no_startadd); in mgag200_set_startadd()
212 hdispend = mode->crtc_hdisplay / 8 - 1; in mgag200_set_mode_regs()
213 hsyncstr = mode->crtc_hsync_start / 8 - 1; in mgag200_set_mode_regs()
214 hsyncend = mode->crtc_hsync_end / 8 - 1; in mgag200_set_mode_regs()
215 htotal = mode->crtc_htotal / 8 - 1; in mgag200_set_mode_regs()
219 hblkstr = mode->crtc_hblank_start / 8 - 1; in mgag200_set_mode_regs()
222 vdispend = mode->crtc_vdisplay - 1; in mgag200_set_mode_regs()
223 vsyncstr = mode->crtc_vsync_start - 1; in mgag200_set_mode_regs()
224 vsyncend = mode->crtc_vsync_end - 1; in mgag200_set_mode_regs()
225 vtotal = mode->crtc_vtotal - 2; in mgag200_set_mode_regs()
226 vblkstr = mode->crtc_vblank_start - 1; in mgag200_set_mode_regs()
233 if (mode->flags & DRM_MODE_FLAG_NHSYNC) in mgag200_set_mode_regs()
238 if (mode->flags & DRM_MODE_FLAG_NVSYNC) in mgag200_set_mode_regs()
243 crtcext1 = (((htotal - 4) & 0x100) >> 8) | in mgag200_set_mode_regs()
258 WREG_CRT(0x00, htotal - 4); in mgag200_set_mode_regs()
295 return bpp_shift[format->cpp[0] - 1]; in mgag200_get_bpp_shift()
306 u32 offset = fb->pitches[0] / fb->format->cpp[0]; in mgag200_calculate_offset()
307 u8 bppshift = mgag200_get_bpp_shift(fb->format); in mgag200_calculate_offset()
309 if (fb->format->cpp[0] * 8 == 24) in mgag200_calculate_offset()
310 offset = (offset * 3) >> (4 - bppshift); in mgag200_calculate_offset()
312 offset = offset >> (4 - bppshift); in mgag200_calculate_offset()
336 struct drm_device *dev = &mdev->base; in mgag200_set_format_regs()
340 bpp = format->cpp[0] * 8; in mgag200_set_format_regs()
345 scale = ((1 << bppshift) * 3) - 1; in mgag200_set_format_regs()
348 scale = (1 << bppshift) - 1; in mgag200_set_format_regs()
359 if (format->depth == 15) in mgag200_set_format_regs()
443 struct iosys_map dst = IOSYS_MAP_INIT_VADDR_IOMEM(mdev->vram); in mgag200_handle_damage()
445 iosys_map_incr(&dst, drm_fb_clip_offset(fb->pitches[0], fb->format, clip)); in mgag200_handle_damage()
446 drm_fb_memcpy(&dst, fb->pitches, vmap, fb, clip); in mgag200_handle_damage()
470 struct drm_framebuffer *new_fb = new_plane_state->fb; in mgag200_primary_plane_helper_atomic_check()
472 struct drm_crtc *new_crtc = new_plane_state->crtc; in mgag200_primary_plane_helper_atomic_check()
486 else if (!new_plane_state->visible) in mgag200_primary_plane_helper_atomic_check()
489 if (plane->state) in mgag200_primary_plane_helper_atomic_check()
490 fb = plane->state->fb; in mgag200_primary_plane_helper_atomic_check()
492 if (!fb || (fb->format != new_fb->format)) in mgag200_primary_plane_helper_atomic_check()
493 new_crtc_state->mode_changed = true; /* update PLL settings */ in mgag200_primary_plane_helper_atomic_check()
496 new_mgag200_crtc_state->format = new_fb->format; in mgag200_primary_plane_helper_atomic_check()
504 struct drm_device *dev = plane->dev; in mgag200_primary_plane_helper_atomic_update()
506 struct drm_plane_state *plane_state = plane->state; in mgag200_primary_plane_helper_atomic_update()
509 struct drm_framebuffer *fb = plane_state->fb; in mgag200_primary_plane_helper_atomic_update()
515 mgag200_handle_damage(mdev, shadow_plane_state->data, fb, &damage); in mgag200_primary_plane_helper_atomic_update()
526 struct drm_device *dev = plane->dev; in mgag200_primary_plane_helper_atomic_enable()
539 struct drm_device *dev = plane->dev; in mgag200_primary_plane_helper_atomic_disable()
552 struct mga_device *mdev = to_mga_device(plane->dev); in mgag200_primary_plane_helper_get_scanout_buffer()
553 struct iosys_map map = IOSYS_MAP_INIT_VADDR_IOMEM(mdev->vram); in mgag200_primary_plane_helper_get_scanout_buffer()
555 if (plane->state && plane->state->fb) { in mgag200_primary_plane_helper_get_scanout_buffer()
556 sb->format = plane->state->fb->format; in mgag200_primary_plane_helper_get_scanout_buffer()
557 sb->width = plane->state->fb->width; in mgag200_primary_plane_helper_get_scanout_buffer()
558 sb->height = plane->state->fb->height; in mgag200_primary_plane_helper_get_scanout_buffer()
559 sb->pitch[0] = plane->state->fb->pitches[0]; in mgag200_primary_plane_helper_get_scanout_buffer()
560 sb->map[0] = map; in mgag200_primary_plane_helper_get_scanout_buffer()
563 return -ENODEV; in mgag200_primary_plane_helper_get_scanout_buffer()
573 struct mga_device *mdev = to_mga_device(crtc->dev); in mgag200_crtc_helper_mode_valid()
574 const struct mgag200_device_info *info = mdev->info; in mgag200_crtc_helper_mode_valid()
580 if (mode->hdisplay > info->max_hdisplay) in mgag200_crtc_helper_mode_valid()
582 if (mode->vdisplay > info->max_vdisplay) in mgag200_crtc_helper_mode_valid()
585 if ((mode->hdisplay % 8) != 0 || (mode->hsync_start % 8) != 0 || in mgag200_crtc_helper_mode_valid()
586 (mode->hsync_end % 8) != 0 || (mode->htotal % 8) != 0) { in mgag200_crtc_helper_mode_valid()
590 if (mode->crtc_hdisplay > 2048 || mode->crtc_hsync_start > 4096 || in mgag200_crtc_helper_mode_valid()
591 mode->crtc_hsync_end > 4096 || mode->crtc_htotal > 4096 || in mgag200_crtc_helper_mode_valid()
592 mode->crtc_vdisplay > 2048 || mode->crtc_vsync_start > 4096 || in mgag200_crtc_helper_mode_valid()
593 mode->crtc_vsync_end > 4096 || mode->crtc_vtotal > 4096) { in mgag200_crtc_helper_mode_valid()
602 struct drm_device *dev = crtc->dev; in mgag200_crtc_helper_atomic_check()
604 const struct mgag200_device_funcs *funcs = mdev->funcs; in mgag200_crtc_helper_atomic_check()
606 struct drm_property_blob *new_gamma_lut = new_crtc_state->gamma_lut; in mgag200_crtc_helper_atomic_check()
609 if (!new_crtc_state->enable) in mgag200_crtc_helper_atomic_check()
616 if (new_crtc_state->mode_changed) { in mgag200_crtc_helper_atomic_check()
617 if (funcs->pixpllc_atomic_check) { in mgag200_crtc_helper_atomic_check()
618 ret = funcs->pixpllc_atomic_check(crtc, new_state); in mgag200_crtc_helper_atomic_check()
624 if (new_crtc_state->color_mgmt_changed && new_gamma_lut) { in mgag200_crtc_helper_atomic_check()
625 if (new_gamma_lut->length != MGAG200_LUT_SIZE * sizeof(struct drm_color_lut)) { in mgag200_crtc_helper_atomic_check()
626 drm_dbg(dev, "Wrong size for gamma_lut %zu\n", new_gamma_lut->length); in mgag200_crtc_helper_atomic_check()
627 return -EINVAL; in mgag200_crtc_helper_atomic_check()
636 struct drm_crtc_state *crtc_state = crtc->state; in mgag200_crtc_helper_atomic_flush()
638 struct drm_device *dev = crtc->dev; in mgag200_crtc_helper_atomic_flush()
641 if (crtc_state->enable && crtc_state->color_mgmt_changed) { in mgag200_crtc_helper_atomic_flush()
642 const struct drm_format_info *format = mgag200_crtc_state->format; in mgag200_crtc_helper_atomic_flush()
644 if (crtc_state->gamma_lut) in mgag200_crtc_helper_atomic_flush()
645 mgag200_crtc_set_gamma(mdev, format, crtc_state->gamma_lut->data); in mgag200_crtc_helper_atomic_flush()
653 struct drm_device *dev = crtc->dev; in mgag200_crtc_helper_atomic_enable()
655 const struct mgag200_device_funcs *funcs = mdev->funcs; in mgag200_crtc_helper_atomic_enable()
656 struct drm_crtc_state *crtc_state = crtc->state; in mgag200_crtc_helper_atomic_enable()
657 struct drm_display_mode *adjusted_mode = &crtc_state->adjusted_mode; in mgag200_crtc_helper_atomic_enable()
659 const struct drm_format_info *format = mgag200_crtc_state->format; in mgag200_crtc_helper_atomic_enable()
662 mgag200_set_mode_regs(mdev, adjusted_mode, mgag200_crtc_state->set_vidrst); in mgag200_crtc_helper_atomic_enable()
664 if (funcs->pixpllc_atomic_update) in mgag200_crtc_helper_atomic_enable()
665 funcs->pixpllc_atomic_update(crtc, old_state); in mgag200_crtc_helper_atomic_enable()
667 if (crtc_state->gamma_lut) in mgag200_crtc_helper_atomic_enable()
668 mgag200_crtc_set_gamma(mdev, format, crtc_state->gamma_lut->data); in mgag200_crtc_helper_atomic_enable()
677 struct mga_device *mdev = to_mga_device(crtc->dev); in mgag200_crtc_helper_atomic_disable()
686 if (crtc->state) in mgag200_crtc_reset()
687 crtc->funcs->atomic_destroy_state(crtc, crtc->state); in mgag200_crtc_reset()
691 __drm_atomic_helper_crtc_reset(crtc, &mgag200_crtc_state->base); in mgag200_crtc_reset()
698 struct drm_crtc_state *crtc_state = crtc->state; in mgag200_crtc_atomic_duplicate_state()
708 __drm_atomic_helper_crtc_duplicate_state(crtc, &new_mgag200_crtc_state->base); in mgag200_crtc_atomic_duplicate_state()
710 new_mgag200_crtc_state->format = mgag200_crtc_state->format; in mgag200_crtc_atomic_duplicate_state()
711 memcpy(&new_mgag200_crtc_state->pixpllc, &mgag200_crtc_state->pixpllc, in mgag200_crtc_atomic_duplicate_state()
712 sizeof(new_mgag200_crtc_state->pixpllc)); in mgag200_crtc_atomic_duplicate_state()
713 new_mgag200_crtc_state->set_vidrst = mgag200_crtc_state->set_vidrst; in mgag200_crtc_atomic_duplicate_state()
715 return &new_mgag200_crtc_state->base; in mgag200_crtc_atomic_duplicate_state()
722 __drm_atomic_helper_crtc_destroy_state(&mgag200_crtc_state->base); in mgag200_crtc_atomic_destroy_state()
732 struct mga_device *mdev = to_mga_device(state->dev); in mgag200_mode_config_helper_atomic_commit_tail()
738 * the I/O-register lock. in mgag200_mode_config_helper_atomic_commit_tail()
740 mutex_lock(&mdev->rmmio_lock); in mgag200_mode_config_helper_atomic_commit_tail()
742 mutex_unlock(&mdev->rmmio_lock); in mgag200_mode_config_helper_atomic_commit_tail()
759 if (!mode->htotal || !mode->vtotal || !mode->clock) in mgag200_calculate_mode_bandwidth()
762 active_area = mode->hdisplay * mode->vdisplay; in mgag200_calculate_mode_bandwidth()
763 total_area = mode->htotal * mode->vtotal; in mgag200_calculate_mode_bandwidth()
765 pixels_per_second = active_area * mode->clock * 1000; in mgag200_calculate_mode_bandwidth()
780 const struct mgag200_device_info *info = mdev->info; in mgag200_mode_config_mode_valid()
782 max_fbpages = mdev->vram_available >> PAGE_SHIFT; in mgag200_mode_config_mode_valid()
784 fbsize = mode->hdisplay * mode->vdisplay * max_bpp; in mgag200_mode_config_mode_valid()
794 if (info->max_mem_bandwidth) { in mgag200_mode_config_mode_valid()
797 if (mode_bandwidth > (info->max_mem_bandwidth * 1024)) in mgag200_mode_config_mode_valid()
813 struct drm_device *dev = &mdev->base; in mgag200_mode_config_init()
816 mdev->vram_available = vram_available; in mgag200_mode_config_init()
824 dev->mode_config.max_width = MGAG200_MAX_FB_WIDTH; in mgag200_mode_config_init()
825 dev->mode_config.max_height = MGAG200_MAX_FB_HEIGHT; in mgag200_mode_config_init()
826 dev->mode_config.preferred_depth = 24; in mgag200_mode_config_init()
827 dev->mode_config.funcs = &mgag200_mode_config_funcs; in mgag200_mode_config_init()
828 dev->mode_config.helper_private = &mgag200_mode_config_helper_funcs; in mgag200_mode_config_init()