diff options
author | Jani Nikula <jani.nikula@intel.com> | 2016-03-16 06:21:40 -0400 |
---|---|---|
committer | Jani Nikula <jani.nikula@intel.com> | 2016-03-16 11:55:52 -0400 |
commit | 1e78aa014b84ff23f99daa0e0832b01337244062 (patch) | |
tree | 195618d891b7c536205f460eb6c239a09cb708d5 | |
parent | 42c151e65e80d22b611ba07812374ed726ebb947 (diff) |
drm/i915/dsi: start using enum mipi_dsi_pixel_format
A small step moving us closer to DRM MIPI DSI code. Use enum
mipi_dsi_pixel_format instead of our own. The first benefit is being
able to use common mipi_dsi_pixel_format_to_bpp().
There's a little back and forth conversion with the VBT -> enum ->
register, since we have just shoved the VBT value into the register
directly. Longer term, all the VBT parsing and deciphering should be
done in intel_bios.c, and abstracted there.
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1458123700-16003-2-git-send-email-jani.nikula@intel.com
-rw-r--r-- | drivers/gpu/drm/i915/intel_dsi.c | 25 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_dsi.h | 10 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_dsi_panel_vbt.c | 33 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_dsi_pll.c | 30 |
4 files changed, 56 insertions, 42 deletions
diff --git a/drivers/gpu/drm/i915/intel_dsi.c b/drivers/gpu/drm/i915/intel_dsi.c index 01b8e9f4c272..ea78b0bf7e14 100644 --- a/drivers/gpu/drm/i915/intel_dsi.c +++ b/drivers/gpu/drm/i915/intel_dsi.c | |||
@@ -787,7 +787,7 @@ static void set_dsi_timings(struct drm_encoder *encoder, | |||
787 | struct drm_i915_private *dev_priv = dev->dev_private; | 787 | struct drm_i915_private *dev_priv = dev->dev_private; |
788 | struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder); | 788 | struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder); |
789 | enum port port; | 789 | enum port port; |
790 | unsigned int bpp = dsi_pixel_format_bpp(intel_dsi->pixel_format); | 790 | unsigned int bpp = mipi_dsi_pixel_format_to_bpp(intel_dsi->pixel_format); |
791 | unsigned int lane_count = intel_dsi->lane_count; | 791 | unsigned int lane_count = intel_dsi->lane_count; |
792 | 792 | ||
793 | u16 hactive, hfp, hsync, hbp, vfp, vsync, vbp; | 793 | u16 hactive, hfp, hsync, hbp, vfp, vsync, vbp; |
@@ -849,6 +849,23 @@ static void set_dsi_timings(struct drm_encoder *encoder, | |||
849 | } | 849 | } |
850 | } | 850 | } |
851 | 851 | ||
852 | static u32 pixel_format_to_reg(enum mipi_dsi_pixel_format fmt) | ||
853 | { | ||
854 | switch (fmt) { | ||
855 | case MIPI_DSI_FMT_RGB888: | ||
856 | return VID_MODE_FORMAT_RGB888; | ||
857 | case MIPI_DSI_FMT_RGB666: | ||
858 | return VID_MODE_FORMAT_RGB666; | ||
859 | case MIPI_DSI_FMT_RGB666_PACKED: | ||
860 | return VID_MODE_FORMAT_RGB666_PACKED; | ||
861 | case MIPI_DSI_FMT_RGB565: | ||
862 | return VID_MODE_FORMAT_RGB565; | ||
863 | default: | ||
864 | MISSING_CASE(fmt); | ||
865 | return VID_MODE_FORMAT_RGB666; | ||
866 | } | ||
867 | } | ||
868 | |||
852 | static void intel_dsi_prepare(struct intel_encoder *intel_encoder) | 869 | static void intel_dsi_prepare(struct intel_encoder *intel_encoder) |
853 | { | 870 | { |
854 | struct drm_encoder *encoder = &intel_encoder->base; | 871 | struct drm_encoder *encoder = &intel_encoder->base; |
@@ -858,7 +875,7 @@ static void intel_dsi_prepare(struct intel_encoder *intel_encoder) | |||
858 | struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder); | 875 | struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder); |
859 | const struct drm_display_mode *adjusted_mode = &intel_crtc->config->base.adjusted_mode; | 876 | const struct drm_display_mode *adjusted_mode = &intel_crtc->config->base.adjusted_mode; |
860 | enum port port; | 877 | enum port port; |
861 | unsigned int bpp = dsi_pixel_format_bpp(intel_dsi->pixel_format); | 878 | unsigned int bpp = mipi_dsi_pixel_format_to_bpp(intel_dsi->pixel_format); |
862 | u32 val, tmp; | 879 | u32 val, tmp; |
863 | u16 mode_hdisplay; | 880 | u16 mode_hdisplay; |
864 | 881 | ||
@@ -917,9 +934,7 @@ static void intel_dsi_prepare(struct intel_encoder *intel_encoder) | |||
917 | val |= CMD_MODE_DATA_WIDTH_8_BIT; /* XXX */ | 934 | val |= CMD_MODE_DATA_WIDTH_8_BIT; /* XXX */ |
918 | } else { | 935 | } else { |
919 | val |= intel_dsi->channel << VID_MODE_CHANNEL_NUMBER_SHIFT; | 936 | val |= intel_dsi->channel << VID_MODE_CHANNEL_NUMBER_SHIFT; |
920 | 937 | val |= pixel_format_to_reg(intel_dsi->pixel_format); | |
921 | /* XXX: cross-check bpp vs. pixel format? */ | ||
922 | val |= intel_dsi->pixel_format; | ||
923 | } | 938 | } |
924 | 939 | ||
925 | tmp = 0; | 940 | tmp = 0; |
diff --git a/drivers/gpu/drm/i915/intel_dsi.h b/drivers/gpu/drm/i915/intel_dsi.h index 92f39227b361..54f072cd78f1 100644 --- a/drivers/gpu/drm/i915/intel_dsi.h +++ b/drivers/gpu/drm/i915/intel_dsi.h | |||
@@ -34,8 +34,6 @@ | |||
34 | #define DSI_DUAL_LINK_FRONT_BACK 1 | 34 | #define DSI_DUAL_LINK_FRONT_BACK 1 |
35 | #define DSI_DUAL_LINK_PIXEL_ALT 2 | 35 | #define DSI_DUAL_LINK_PIXEL_ALT 2 |
36 | 36 | ||
37 | int dsi_pixel_format_bpp(int pixel_format); | ||
38 | |||
39 | struct intel_dsi_host; | 37 | struct intel_dsi_host; |
40 | 38 | ||
41 | struct intel_dsi { | 39 | struct intel_dsi { |
@@ -64,8 +62,12 @@ struct intel_dsi { | |||
64 | /* number of DSI lanes */ | 62 | /* number of DSI lanes */ |
65 | unsigned int lane_count; | 63 | unsigned int lane_count; |
66 | 64 | ||
67 | /* video mode pixel format for MIPI_DSI_FUNC_PRG register */ | 65 | /* |
68 | u32 pixel_format; | 66 | * video mode pixel format |
67 | * | ||
68 | * XXX: consolidate on .format in struct mipi_dsi_device. | ||
69 | */ | ||
70 | enum mipi_dsi_pixel_format pixel_format; | ||
69 | 71 | ||
70 | /* video mode format for MIPI_VIDEO_MODE_FORMAT register */ | 72 | /* video mode format for MIPI_VIDEO_MODE_FORMAT register */ |
71 | u32 video_mode_format; | 73 | u32 video_mode_format; |
diff --git a/drivers/gpu/drm/i915/intel_dsi_panel_vbt.c b/drivers/gpu/drm/i915/intel_dsi_panel_vbt.c index 7f145b4fec6a..8302a972d2d4 100644 --- a/drivers/gpu/drm/i915/intel_dsi_panel_vbt.c +++ b/drivers/gpu/drm/i915/intel_dsi_panel_vbt.c | |||
@@ -412,6 +412,25 @@ static const struct drm_panel_funcs vbt_panel_funcs = { | |||
412 | .get_modes = vbt_panel_get_modes, | 412 | .get_modes = vbt_panel_get_modes, |
413 | }; | 413 | }; |
414 | 414 | ||
415 | /* XXX: This should be done when parsing the VBT in intel_bios.c */ | ||
416 | static enum mipi_dsi_pixel_format pixel_format_from_vbt(u32 fmt) | ||
417 | { | ||
418 | /* It just so happens the VBT matches register contents. */ | ||
419 | switch (fmt) { | ||
420 | case VID_MODE_FORMAT_RGB888: | ||
421 | return MIPI_DSI_FMT_RGB888; | ||
422 | case VID_MODE_FORMAT_RGB666: | ||
423 | return MIPI_DSI_FMT_RGB666; | ||
424 | case VID_MODE_FORMAT_RGB666_PACKED: | ||
425 | return MIPI_DSI_FMT_RGB666_PACKED; | ||
426 | case VID_MODE_FORMAT_RGB565: | ||
427 | return MIPI_DSI_FMT_RGB565; | ||
428 | default: | ||
429 | MISSING_CASE(fmt); | ||
430 | return MIPI_DSI_FMT_RGB666; | ||
431 | } | ||
432 | } | ||
433 | |||
415 | struct drm_panel *vbt_panel_init(struct intel_dsi *intel_dsi, u16 panel_id) | 434 | struct drm_panel *vbt_panel_init(struct intel_dsi *intel_dsi, u16 panel_id) |
416 | { | 435 | { |
417 | struct drm_device *dev = intel_dsi->base.base.dev; | 436 | struct drm_device *dev = intel_dsi->base.base.dev; |
@@ -420,7 +439,7 @@ struct drm_panel *vbt_panel_init(struct intel_dsi *intel_dsi, u16 panel_id) | |||
420 | struct mipi_pps_data *pps = dev_priv->vbt.dsi.pps; | 439 | struct mipi_pps_data *pps = dev_priv->vbt.dsi.pps; |
421 | struct drm_display_mode *mode = dev_priv->vbt.lfp_lvds_vbt_mode; | 440 | struct drm_display_mode *mode = dev_priv->vbt.lfp_lvds_vbt_mode; |
422 | struct vbt_panel *vbt_panel; | 441 | struct vbt_panel *vbt_panel; |
423 | u32 bits_per_pixel = 24; | 442 | u32 bpp; |
424 | u32 tlpx_ns, extra_byte_count, bitrate, tlpx_ui; | 443 | u32 tlpx_ns, extra_byte_count, bitrate, tlpx_ui; |
425 | u32 ui_num, ui_den; | 444 | u32 ui_num, ui_den; |
426 | u32 prepare_cnt, exit_zero_cnt, clk_zero_cnt, trail_cnt; | 445 | u32 prepare_cnt, exit_zero_cnt, clk_zero_cnt, trail_cnt; |
@@ -436,12 +455,11 @@ struct drm_panel *vbt_panel_init(struct intel_dsi *intel_dsi, u16 panel_id) | |||
436 | intel_dsi->eotp_pkt = mipi_config->eot_pkt_disabled ? 0 : 1; | 455 | intel_dsi->eotp_pkt = mipi_config->eot_pkt_disabled ? 0 : 1; |
437 | intel_dsi->clock_stop = mipi_config->enable_clk_stop ? 1 : 0; | 456 | intel_dsi->clock_stop = mipi_config->enable_clk_stop ? 1 : 0; |
438 | intel_dsi->lane_count = mipi_config->lane_cnt + 1; | 457 | intel_dsi->lane_count = mipi_config->lane_cnt + 1; |
439 | intel_dsi->pixel_format = mipi_config->videomode_color_format << 7; | 458 | intel_dsi->pixel_format = pixel_format_from_vbt(mipi_config->videomode_color_format << 7); |
459 | bpp = mipi_dsi_pixel_format_to_bpp(intel_dsi->pixel_format); | ||
460 | |||
440 | intel_dsi->dual_link = mipi_config->dual_link; | 461 | intel_dsi->dual_link = mipi_config->dual_link; |
441 | intel_dsi->pixel_overlap = mipi_config->pixel_overlap; | 462 | intel_dsi->pixel_overlap = mipi_config->pixel_overlap; |
442 | |||
443 | bits_per_pixel = dsi_pixel_format_bpp(intel_dsi->pixel_format); | ||
444 | |||
445 | intel_dsi->operation_mode = mipi_config->is_cmd_mode; | 463 | intel_dsi->operation_mode = mipi_config->is_cmd_mode; |
446 | intel_dsi->video_mode_format = mipi_config->video_transfer_mode; | 464 | intel_dsi->video_mode_format = mipi_config->video_transfer_mode; |
447 | intel_dsi->escape_clk_div = mipi_config->byte_clk_sel; | 465 | intel_dsi->escape_clk_div = mipi_config->byte_clk_sel; |
@@ -475,8 +493,7 @@ struct drm_panel *vbt_panel_init(struct intel_dsi *intel_dsi, u16 panel_id) | |||
475 | */ | 493 | */ |
476 | if (intel_dsi->video_mode_format == VIDEO_MODE_BURST) { | 494 | if (intel_dsi->video_mode_format == VIDEO_MODE_BURST) { |
477 | if (mipi_config->target_burst_mode_freq) { | 495 | if (mipi_config->target_burst_mode_freq) { |
478 | computed_ddr = | 496 | computed_ddr = (pclk * bpp) / intel_dsi->lane_count; |
479 | (pclk * bits_per_pixel) / intel_dsi->lane_count; | ||
480 | 497 | ||
481 | if (mipi_config->target_burst_mode_freq < | 498 | if (mipi_config->target_burst_mode_freq < |
482 | computed_ddr) { | 499 | computed_ddr) { |
@@ -499,7 +516,7 @@ struct drm_panel *vbt_panel_init(struct intel_dsi *intel_dsi, u16 panel_id) | |||
499 | intel_dsi->burst_mode_ratio = burst_mode_ratio; | 516 | intel_dsi->burst_mode_ratio = burst_mode_ratio; |
500 | intel_dsi->pclk = pclk; | 517 | intel_dsi->pclk = pclk; |
501 | 518 | ||
502 | bitrate = (pclk * bits_per_pixel) / intel_dsi->lane_count; | 519 | bitrate = (pclk * bpp) / intel_dsi->lane_count; |
503 | 520 | ||
504 | switch (intel_dsi->escape_clk_div) { | 521 | switch (intel_dsi->escape_clk_div) { |
505 | case 0: | 522 | case 0: |
diff --git a/drivers/gpu/drm/i915/intel_dsi_pll.c b/drivers/gpu/drm/i915/intel_dsi_pll.c index 9ef0f7806e4a..e3e343c80221 100644 --- a/drivers/gpu/drm/i915/intel_dsi_pll.c +++ b/drivers/gpu/drm/i915/intel_dsi_pll.c | |||
@@ -30,27 +30,6 @@ | |||
30 | #include "i915_drv.h" | 30 | #include "i915_drv.h" |
31 | #include "intel_dsi.h" | 31 | #include "intel_dsi.h" |
32 | 32 | ||
33 | int dsi_pixel_format_bpp(int pixel_format) | ||
34 | { | ||
35 | int bpp; | ||
36 | |||
37 | switch (pixel_format) { | ||
38 | default: | ||
39 | case VID_MODE_FORMAT_RGB888: | ||
40 | case VID_MODE_FORMAT_RGB666: | ||
41 | bpp = 24; | ||
42 | break; | ||
43 | case VID_MODE_FORMAT_RGB666_PACKED: | ||
44 | bpp = 18; | ||
45 | break; | ||
46 | case VID_MODE_FORMAT_RGB565: | ||
47 | bpp = 16; | ||
48 | break; | ||
49 | } | ||
50 | |||
51 | return bpp; | ||
52 | } | ||
53 | |||
54 | struct dsi_mnp { | 33 | struct dsi_mnp { |
55 | u32 dsi_pll_ctrl; | 34 | u32 dsi_pll_ctrl; |
56 | u32 dsi_pll_div; | 35 | u32 dsi_pll_div; |
@@ -64,10 +43,11 @@ static const u32 lfsr_converts[] = { | |||
64 | }; | 43 | }; |
65 | 44 | ||
66 | /* Get DSI clock from pixel clock */ | 45 | /* Get DSI clock from pixel clock */ |
67 | static u32 dsi_clk_from_pclk(u32 pclk, int pixel_format, int lane_count) | 46 | static u32 dsi_clk_from_pclk(u32 pclk, enum mipi_dsi_pixel_format fmt, |
47 | int lane_count) | ||
68 | { | 48 | { |
69 | u32 dsi_clk_khz; | 49 | u32 dsi_clk_khz; |
70 | u32 bpp = dsi_pixel_format_bpp(pixel_format); | 50 | u32 bpp = mipi_dsi_pixel_format_to_bpp(fmt); |
71 | 51 | ||
72 | /* DSI data rate = pixel clock * bits per pixel / lane count | 52 | /* DSI data rate = pixel clock * bits per pixel / lane count |
73 | pixel clock is converted from KHz to Hz */ | 53 | pixel clock is converted from KHz to Hz */ |
@@ -232,9 +212,9 @@ static void bxt_disable_dsi_pll(struct intel_encoder *encoder) | |||
232 | DRM_ERROR("Timeout waiting for PLL lock deassertion\n"); | 212 | DRM_ERROR("Timeout waiting for PLL lock deassertion\n"); |
233 | } | 213 | } |
234 | 214 | ||
235 | static void assert_bpp_mismatch(int pixel_format, int pipe_bpp) | 215 | static void assert_bpp_mismatch(enum mipi_dsi_pixel_format fmt, int pipe_bpp) |
236 | { | 216 | { |
237 | int bpp = dsi_pixel_format_bpp(pixel_format); | 217 | int bpp = mipi_dsi_pixel_format_to_bpp(fmt); |
238 | 218 | ||
239 | WARN(bpp != pipe_bpp, | 219 | WARN(bpp != pipe_bpp, |
240 | "bpp match assertion failure (expected %d, current %d)\n", | 220 | "bpp match assertion failure (expected %d, current %d)\n", |