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

3  * Parts based on xf86-video-ast
16 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
54 #define AST_PRIMARY_PLANE_MAX_OFFSET (BIT(16) - 1)
63 struct drm_device *dev = &ast->base; in ast_fb_vram_size()
68 cursor_offset = ast->vram_size; // no cursor; it's all ours in ast_fb_vram_size()
71 return cursor_offset - offset; in ast_fb_vram_size()
77 struct drm_device *dev = crtc->dev; in ast_set_gamma_lut()
100 struct drm_crtc *crtc = &ast->crtc; in ast_crtc_fill_gamma()
102 switch (format->format) { in ast_crtc_fill_gamma()
104 /* gamma table is used as color palette */ in ast_crtc_fill_gamma()
108 /* also uses 8-bit gamma ramp on low-color modes */ in ast_crtc_fill_gamma()
114 drm_warn_once(&ast->base, "Unsupported format %p4cc for gamma correction\n", in ast_crtc_fill_gamma()
115 &format->format); in ast_crtc_fill_gamma()
122 struct drm_color_lut *lut) in ast_crtc_load_gamma() argument
124 struct drm_crtc *crtc = &ast->crtc; in ast_crtc_load_gamma()
126 switch (format->format) { in ast_crtc_load_gamma()
128 /* gamma table is used as color palette */ in ast_crtc_load_gamma()
129 drm_crtc_load_palette_8(crtc, lut, ast_set_gamma_lut); in ast_crtc_load_gamma()
132 /* also uses 8-bit gamma ramp on low-color modes */ in ast_crtc_load_gamma()
135 drm_crtc_load_gamma_888(crtc, lut, ast_set_gamma_lut); in ast_crtc_load_gamma()
138 drm_warn_once(&ast->base, "Unsupported format %p4cc for gamma correction\n", in ast_crtc_load_gamma()
139 &format->format); in ast_crtc_load_gamma()
150 switch (format->cpp[0]) { in ast_set_vbios_color_reg()
152 color_index = VGAModeIndex - 1; in ast_set_vbios_color_reg()
169 if (vmode->flags & NewModeInfo) { in ast_set_vbios_color_reg()
171 ast_set_index_reg(ast, AST_IO_VGACRI, 0x92, format->cpp[0] * 8); in ast_set_vbios_color_reg()
181 refresh_rate_index = vmode->refresh_rate_index; in ast_set_vbios_mode_reg()
182 mode_id = vmode->mode_id; in ast_set_vbios_mode_reg()
189 if (vmode->flags & NewModeInfo) { in ast_set_vbios_mode_reg()
191 ast_set_index_reg(ast, AST_IO_VGACRI, 0x93, adjusted_mode->clock / 1000); in ast_set_vbios_mode_reg()
192 ast_set_index_reg(ast, AST_IO_VGACRI, 0x94, adjusted_mode->crtc_hdisplay); in ast_set_vbios_mode_reg()
193 ast_set_index_reg(ast, AST_IO_VGACRI, 0x95, adjusted_mode->crtc_hdisplay >> 8); in ast_set_vbios_mode_reg()
194 ast_set_index_reg(ast, AST_IO_VGACRI, 0x96, adjusted_mode->crtc_vdisplay); in ast_set_vbios_mode_reg()
195 ast_set_index_reg(ast, AST_IO_VGACRI, 0x97, adjusted_mode->crtc_vdisplay >> 8); in ast_set_vbios_mode_reg()
206 jreg = stdtable->misc; in ast_set_std_reg()
211 ast_set_index_reg_mask(ast, AST_IO_VGASRI, 0x01, 0x20, stdtable->seq[0]); in ast_set_std_reg()
213 jreg = stdtable->seq[i]; in ast_set_std_reg()
220 ast_set_index_reg(ast, AST_IO_VGACRI, i, stdtable->crtc[i]); in ast_set_std_reg()
222 ast_set_index_reg(ast, AST_IO_VGACRI, i, stdtable->crtc[i]); in ast_set_std_reg()
224 ast_set_index_reg(ast, AST_IO_VGACRI, i, stdtable->crtc[i]); in ast_set_std_reg()
229 jreg = stdtable->ar[i]; in ast_set_std_reg()
241 ast_set_index_reg(ast, AST_IO_VGAGRI, i, stdtable->gr[i]); in ast_set_std_reg()
252 (vmode->flags & AST2500PreCatchCRT)) in ast_set_crtc_reg()
257 temp = (mode->crtc_htotal >> 3) - 5; in ast_set_crtc_reg()
262 temp = (mode->crtc_hdisplay >> 3) - 1; in ast_set_crtc_reg()
267 temp = (mode->crtc_hblank_start >> 3) - 1; in ast_set_crtc_reg()
272 temp = ((mode->crtc_hblank_end >> 3) - 1) & 0x7f; in ast_set_crtc_reg()
279 temp = ((mode->crtc_hsync_start-precache) >> 3) - 1; in ast_set_crtc_reg()
284 temp = (((mode->crtc_hsync_end-precache) >> 3) - 1) & 0x3f; in ast_set_crtc_reg()
293 if (IS_AST_GEN7(ast) && (mode->crtc_vdisplay == 1080)) in ast_set_crtc_reg()
299 temp = (mode->crtc_vtotal) - 2; in ast_set_crtc_reg()
308 temp = (mode->crtc_vsync_start) - 1; in ast_set_crtc_reg()
317 temp = (mode->crtc_vsync_end - 1) & 0x3f; in ast_set_crtc_reg()
324 temp = mode->crtc_vdisplay - 1; in ast_set_crtc_reg()
333 temp = mode->crtc_vblank_start - 1; in ast_set_crtc_reg()
342 temp = mode->crtc_vblank_end - 1; in ast_set_crtc_reg()
364 offset = fb->pitches[0] >> 3; in ast_set_offset_reg()
376 clk_info = &dclk_table_ast2500[vmode->dclk_index]; in ast_set_dclk_reg()
378 clk_info = &dclk_table[vmode->dclk_index]; in ast_set_dclk_reg()
380 ast_set_index_reg_mask(ast, AST_IO_VGACRI, 0xc0, 0x00, clk_info->param1); in ast_set_dclk_reg()
381 ast_set_index_reg_mask(ast, AST_IO_VGACRI, 0xc1, 0x00, clk_info->param2); in ast_set_dclk_reg()
383 (clk_info->param3 & 0xc0) | in ast_set_dclk_reg()
384 ((clk_info->param3 & 0x3) << 4)); in ast_set_dclk_reg()
392 switch (format->cpp[0] * 8) { in ast_set_color_reg()
442 if (vmode->flags & NVSync) in ast_set_sync_reg()
444 if (vmode->flags & NHSync) in ast_set_sync_reg()
483 struct drm_plane *plane = &ast_plane->base; in ast_plane_init()
485 ast_plane->offset = offset; in ast_plane_init()
486 ast_plane->size = size; in ast_plane_init()
495 struct ast_device *ast = to_ast_device(ast_plane->base.dev); in ast_plane_vaddr()
497 return ast->vram + ast_plane->offset; in ast_plane_vaddr()
513 struct drm_device *dev = plane->dev; in ast_primary_plane_helper_atomic_check()
519 if (new_plane_state->crtc) in ast_primary_plane_helper_atomic_check()
520 new_crtc_state = drm_atomic_get_new_crtc_state(state, new_plane_state->crtc); in ast_primary_plane_helper_atomic_check()
528 } else if (!new_plane_state->visible) { in ast_primary_plane_helper_atomic_check()
529 if (drm_WARN_ON(dev, new_plane_state->crtc)) /* cannot legally happen */ in ast_primary_plane_helper_atomic_check()
530 return -EINVAL; in ast_primary_plane_helper_atomic_check()
537 new_ast_crtc_state->format = new_plane_state->fb->format; in ast_primary_plane_helper_atomic_check()
548 iosys_map_incr(&dst, drm_fb_clip_offset(fb->pitches[0], fb->format, clip)); in ast_handle_damage()
549 drm_fb_memcpy(&dst, fb->pitches, src, fb, clip); in ast_handle_damage()
555 struct drm_device *dev = plane->dev; in ast_primary_plane_helper_atomic_update()
559 struct drm_framebuffer *fb = plane_state->fb; in ast_primary_plane_helper_atomic_update()
561 struct drm_framebuffer *old_fb = old_plane_state->fb; in ast_primary_plane_helper_atomic_update()
563 struct drm_crtc *crtc = plane_state->crtc; in ast_primary_plane_helper_atomic_update()
568 if (!old_fb || (fb->format != old_fb->format) || crtc_state->mode_changed) { in ast_primary_plane_helper_atomic_update()
571 ast_set_color_reg(ast, fb->format); in ast_primary_plane_helper_atomic_update()
572 ast_set_vbios_color_reg(ast, fb->format, ast_crtc_state->vmode); in ast_primary_plane_helper_atomic_update()
577 ast_handle_damage(ast_plane, shadow_plane_state->data, fb, &damage); in ast_primary_plane_helper_atomic_update()
586 if (!old_fb || old_fb->pitches[0] != fb->pitches[0]) in ast_primary_plane_helper_atomic_update()
593 struct ast_device *ast = to_ast_device(plane->dev); in ast_primary_plane_helper_atomic_enable()
602 ast_set_start_address_crt1(ast, (u32)ast_plane->offset); in ast_primary_plane_helper_atomic_enable()
619 if (plane->state && plane->state->fb) { in ast_primary_plane_helper_get_scanout_buffer()
620 sb->format = plane->state->fb->format; in ast_primary_plane_helper_get_scanout_buffer()
621 sb->width = plane->state->fb->width; in ast_primary_plane_helper_get_scanout_buffer()
622 sb->height = plane->state->fb->height; in ast_primary_plane_helper_get_scanout_buffer()
623 sb->pitch[0] = plane->state->fb->pitches[0]; in ast_primary_plane_helper_get_scanout_buffer()
624 iosys_map_set_vaddr_iomem(&sb->map[0], ast_plane_vaddr(ast_plane)); in ast_primary_plane_helper_get_scanout_buffer()
627 return -ENODEV; in ast_primary_plane_helper_get_scanout_buffer()
648 struct drm_device *dev = &ast->base; in ast_primary_plane_init()
649 struct ast_plane *ast_primary_plane = &ast->primary_plane; in ast_primary_plane_init()
650 struct drm_plane *primary_plane = &ast_primary_plane->base; in ast_primary_plane_init()
676 struct ast_device *ast = to_ast_device(crtc->dev); in ast_crtc_helper_mode_valid()
688 struct drm_device *dev = crtc->dev; in ast_crtc_helper_mode_set_nofb()
690 struct drm_crtc_state *crtc_state = crtc->state; in ast_crtc_helper_mode_set_nofb()
692 const struct ast_vbios_stdtable *std_table = ast_crtc_state->std_table; in ast_crtc_helper_mode_set_nofb()
693 const struct ast_vbios_enhtable *vmode = ast_crtc_state->vmode; in ast_crtc_helper_mode_set_nofb()
694 struct drm_display_mode *adjusted_mode = &crtc_state->adjusted_mode; in ast_crtc_helper_mode_set_nofb()
717 struct drm_display_mode *adjusted_mode = &crtc_state->adjusted_mode; in ast_crtc_helper_atomic_check()
720 struct drm_device *dev = crtc->dev; in ast_crtc_helper_atomic_check()
729 if (!crtc_state->enable) in ast_crtc_helper_atomic_check()
738 format = ast_state->format; in ast_crtc_helper_atomic_check()
740 return -EINVAL; /* BUG: We didn't set format in primary check(). */ in ast_crtc_helper_atomic_check()
743 * The gamma LUT has to be reloaded after changing the primary in ast_crtc_helper_atomic_check()
746 if (old_ast_crtc_state->format != format) in ast_crtc_helper_atomic_check()
747 crtc_state->color_mgmt_changed = true; in ast_crtc_helper_atomic_check()
749 if (crtc_state->color_mgmt_changed && crtc_state->gamma_lut) { in ast_crtc_helper_atomic_check()
750 if (crtc_state->gamma_lut->length != in ast_crtc_helper_atomic_check()
753 crtc_state->gamma_lut->length); in ast_crtc_helper_atomic_check()
754 return -EINVAL; in ast_crtc_helper_atomic_check()
764 switch (format->format) { in ast_crtc_helper_atomic_check()
766 ast_state->std_table = &vbios_stdtable[VGAModeIndex]; in ast_crtc_helper_atomic_check()
769 ast_state->std_table = &vbios_stdtable[HiCModeIndex]; in ast_crtc_helper_atomic_check()
773 ast_state->std_table = &vbios_stdtable[TrueCModeIndex]; in ast_crtc_helper_atomic_check()
776 return -EINVAL; in ast_crtc_helper_atomic_check()
784 vmode = ast_vbios_find_mode(ast, &crtc_state->mode); in ast_crtc_helper_atomic_check()
786 return -EINVAL; in ast_crtc_helper_atomic_check()
787 ast_state->vmode = vmode; in ast_crtc_helper_atomic_check()
789 if (vmode->flags & HBorder) in ast_crtc_helper_atomic_check()
791 if (vmode->flags & VBorder) in ast_crtc_helper_atomic_check()
794 adjusted_mode->crtc_hdisplay = vmode->hde; in ast_crtc_helper_atomic_check()
795 adjusted_mode->crtc_hblank_start = vmode->hde + hborder; in ast_crtc_helper_atomic_check()
796 adjusted_mode->crtc_hblank_end = vmode->ht - hborder; in ast_crtc_helper_atomic_check()
797 adjusted_mode->crtc_hsync_start = vmode->hde + hborder + vmode->hfp; in ast_crtc_helper_atomic_check()
798 adjusted_mode->crtc_hsync_end = vmode->hde + hborder + vmode->hfp + vmode->hsync; in ast_crtc_helper_atomic_check()
799 adjusted_mode->crtc_htotal = vmode->ht; in ast_crtc_helper_atomic_check()
801 adjusted_mode->crtc_vdisplay = vmode->vde; in ast_crtc_helper_atomic_check()
802 adjusted_mode->crtc_vblank_start = vmode->vde + vborder; in ast_crtc_helper_atomic_check()
803 adjusted_mode->crtc_vblank_end = vmode->vt - vborder; in ast_crtc_helper_atomic_check()
804 adjusted_mode->crtc_vsync_start = vmode->vde + vborder + vmode->vfp; in ast_crtc_helper_atomic_check()
805 adjusted_mode->crtc_vsync_end = vmode->vde + vborder + vmode->vfp + vmode->vsync; in ast_crtc_helper_atomic_check()
806 adjusted_mode->crtc_vtotal = vmode->vt; in ast_crtc_helper_atomic_check()
818 struct drm_device *dev = crtc->dev; in ast_crtc_helper_atomic_flush()
823 * The gamma LUT has to be reloaded after changing the primary in ast_crtc_helper_atomic_flush()
826 if (crtc_state->enable && crtc_state->color_mgmt_changed) { in ast_crtc_helper_atomic_flush()
827 if (crtc_state->gamma_lut) in ast_crtc_helper_atomic_flush()
829 ast_crtc_state->format, in ast_crtc_helper_atomic_flush()
830 crtc_state->gamma_lut->data); in ast_crtc_helper_atomic_flush()
832 ast_crtc_fill_gamma(ast, ast_crtc_state->format); in ast_crtc_helper_atomic_flush()
838 struct ast_device *ast = to_ast_device(crtc->dev); in ast_crtc_helper_atomic_enable()
852 struct ast_device *ast = to_ast_device(crtc->dev); in ast_crtc_helper_atomic_disable()
863 * helper will re-enable it if necessary. in ast_crtc_helper_atomic_disable()
885 if (crtc->state) in ast_crtc_reset()
886 crtc->funcs->atomic_destroy_state(crtc, crtc->state); in ast_crtc_reset()
889 __drm_atomic_helper_crtc_reset(crtc, &ast_state->base); in ast_crtc_reset()
898 struct drm_device *dev = crtc->dev; in ast_crtc_atomic_duplicate_state()
900 if (drm_WARN_ON(dev, !crtc->state)) in ast_crtc_atomic_duplicate_state()
906 __drm_atomic_helper_crtc_duplicate_state(crtc, &new_ast_state->base); in ast_crtc_atomic_duplicate_state()
908 ast_state = to_ast_crtc_state(crtc->state); in ast_crtc_atomic_duplicate_state()
910 new_ast_state->format = ast_state->format; in ast_crtc_atomic_duplicate_state()
911 new_ast_state->std_table = ast_state->std_table; in ast_crtc_atomic_duplicate_state()
912 new_ast_state->vmode = ast_state->vmode; in ast_crtc_atomic_duplicate_state()
914 return &new_ast_state->base; in ast_crtc_atomic_duplicate_state()
922 __drm_atomic_helper_crtc_destroy_state(&ast_state->base); in ast_crtc_atomic_destroy_state()
937 struct drm_device *dev = &ast->base; in ast_crtc_init()
938 struct drm_crtc *crtc = &ast->crtc; in ast_crtc_init()
941 ret = drm_crtc_init_with_planes(dev, crtc, &ast->primary_plane.base, in ast_crtc_init()
942 &ast->cursor_plane.base.base, &ast_crtc_funcs, in ast_crtc_init()
961 struct ast_device *ast = to_ast_device(state->dev); in ast_mode_config_helper_atomic_commit_tail()
969 mutex_lock(&ast->modeset_lock); in ast_mode_config_helper_atomic_commit_tail()
971 mutex_unlock(&ast->modeset_lock); in ast_mode_config_helper_atomic_commit_tail()
989 pitch = drm_format_info_min_pitch(info, 0, mode->hdisplay); in ast_mode_config_mode_valid()
994 if (pitch > max_fb_size / mode->vdisplay) in ast_mode_config_mode_valid()
1009 struct drm_device *dev = &ast->base; in ast_mode_config_init()
1012 ret = drmm_mutex_init(dev, &ast->modeset_lock); in ast_mode_config_init()
1020 dev->mode_config.funcs = &ast_mode_config_funcs; in ast_mode_config_init()
1021 dev->mode_config.min_width = 0; in ast_mode_config_init()
1022 dev->mode_config.min_height = 0; in ast_mode_config_init()
1023 dev->mode_config.preferred_depth = 24; in ast_mode_config_init()
1025 if (ast->support_fullhd) { in ast_mode_config_init()
1026 dev->mode_config.max_width = 1920; in ast_mode_config_init()
1027 dev->mode_config.max_height = 2048; in ast_mode_config_init()
1029 dev->mode_config.max_width = 1600; in ast_mode_config_init()
1030 dev->mode_config.max_height = 1200; in ast_mode_config_init()
1033 dev->mode_config.helper_private = &ast_mode_config_helper_funcs; in ast_mode_config_init()
1047 switch (ast->tx_chip) { in ast_mode_config_init()