Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amd/display: Add stream and char control callback

[why & how]
Add new stream and char control functions based on DCCG spec

Reviewed-by: Muhammad Ahmed <ahmed.ahmed@amd.com>
Signed-off-by: Hansen Dsouza <Hansen.Dsouza@amd.com>
Signed-off-by: Wayne Lin <wayne.lin@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Hansen Dsouza and committed by
Alex Deucher
64a90520 507293b1

+122 -10
+122 -10
drivers/gpu/drm/amd/display/dc/dccg/dcn35/dcn35_dccg.c
··· 896 896 dccg35_set_symclk32_le_rcg(dccg, inst, true); 897 897 } 898 898 899 - static void dccg35_enable_dpp_new( 899 + static void dccg35_enable_dpp_clk_new( 900 900 struct dccg *dccg, 901 901 int inst, 902 902 enum dppclk_clock_source src) ··· 915 915 DPPCLK0_DTO_MODULO, 0xFF); 916 916 } 917 917 918 - static void dccg35_disable_dpp_new( 918 + static void dccg35_disable_dpp_clk_new( 919 919 struct dccg *dccg, 920 920 int inst) 921 921 { ··· 956 956 } 957 957 958 958 static void dccg35_disable_dtbclk_p_new(struct dccg *dccg, 959 - enum dtbclk_source src, 960 959 int inst) 961 960 { 962 961 dccg35_set_dtbclk_p_src_new(dccg, DTBCLK_REFCLK, inst); 963 962 dccg35_set_dtbclk_p_rcg(dccg, inst, true); 964 963 } 965 964 966 - static void dccg35_enable_dpstreamclk_new(struct dccg *dccg, 967 - enum dtbclk_source src, 965 + static void dccg35_disable_dpstreamclk_new(struct dccg *dccg, 968 966 int inst) 969 967 { 970 968 dccg35_set_dpstreamclk_src_new(dccg, DP_STREAM_REFCLK, inst); 971 969 dccg35_set_dpstreamclk_rcg(dccg, inst, true); 972 970 } 973 971 974 - static void dccg35_disable_dpstreamclk_new(struct dccg *dccg, 975 - enum dtbclk_source src, 972 + static void dccg35_enable_dpstreamclk_new(struct dccg *dccg, 973 + enum dp_stream_clk_source src, 976 974 int inst) 977 975 { 978 976 dccg35_set_dpstreamclk_rcg(dccg, inst, false); 979 - dccg35_set_dtbclk_p_src_new(dccg, src, inst); 977 + dccg35_set_dpstreamclk_src_new(dccg, src, inst); 980 978 } 981 979 982 980 static void dccg35_trigger_dio_fifo_resync(struct dccg *dccg) ··· 1933 1935 } 1934 1936 } 1935 1937 1938 + static void dccg35_set_dpstreamclk_cb( 1939 + struct dccg *dccg, 1940 + enum streamclk_source src, 1941 + int otg_inst, 1942 + int dp_hpo_inst) 1943 + { 1944 + 1945 + enum dtbclk_source dtb_clk_src; 1946 + enum dp_stream_clk_source dp_stream_clk_src; 1947 + 1948 + ASSERT(otg_inst >= DP_STREAM_DTBCLK_P5); 1949 + 1950 + switch (src) { 1951 + case REFCLK: 1952 + dtb_clk_src = DTBCLK_REFCLK; 1953 + dp_stream_clk_src = DP_STREAM_REFCLK; 1954 + break; 1955 + case DPREFCLK: 1956 + dtb_clk_src = DTBCLK_DPREFCLK; 1957 + dp_stream_clk_src = (enum dp_stream_clk_source)otg_inst; 1958 + break; 1959 + case DTBCLK0: 1960 + dtb_clk_src = DTBCLK_DTBCLK0; 1961 + dp_stream_clk_src = (enum dp_stream_clk_source)otg_inst; 1962 + break; 1963 + default: 1964 + BREAK_TO_DEBUGGER(); 1965 + return; 1966 + } 1967 + 1968 + if (dtb_clk_src == DTBCLK_REFCLK && 1969 + dp_stream_clk_src == DP_STREAM_REFCLK) { 1970 + dccg35_disable_dtbclk_p_new(dccg, otg_inst); 1971 + dccg35_disable_dpstreamclk_new(dccg, dp_hpo_inst); 1972 + } else { 1973 + dccg35_enable_dtbclk_p_new(dccg, dtb_clk_src, otg_inst); 1974 + dccg35_enable_dpstreamclk_new(dccg, 1975 + dp_stream_clk_src, 1976 + dp_hpo_inst); 1977 + } 1978 + } 1979 + 1980 + static void dccg35_set_dpstreamclk_root_clock_gating_cb( 1981 + struct dccg *dccg, 1982 + int dp_hpo_inst, 1983 + bool power_on) 1984 + { 1985 + /* power_on set indicates we need to ungate 1986 + * Currently called from optimize_bandwidth and prepare_bandwidth calls 1987 + * Since clock source is not passed restore to refclock on ungate 1988 + * Instance 0 is implied here since only one streamclock resource 1989 + * Redundant as gating when enabled is acheived through set_dpstreamclk 1990 + */ 1991 + if (power_on) 1992 + dccg35_enable_dpstreamclk_new(dccg, 1993 + DP_STREAM_REFCLK, 1994 + dp_hpo_inst); 1995 + else 1996 + dccg35_disable_dpstreamclk_new(dccg, dp_hpo_inst); 1997 + } 1998 + 1999 + static void dccg35_update_dpp_dto_cb(struct dccg *dccg, int dpp_inst, 2000 + int req_dppclk) 2001 + { 2002 + struct dcn_dccg *dccg_dcn = TO_DCN_DCCG(dccg); 2003 + 2004 + if (dccg->ref_dppclk && req_dppclk) { 2005 + int ref_dppclk = dccg->ref_dppclk; 2006 + int modulo, phase; 2007 + 2008 + // phase / modulo = dpp pipe clk / dpp global clk 2009 + modulo = 0xff; // use FF at the end 2010 + phase = ((modulo * req_dppclk) + ref_dppclk - 1) / ref_dppclk; 2011 + 2012 + if (phase > 0xff) { 2013 + ASSERT(false); 2014 + phase = 0xff; 2015 + } 2016 + 2017 + /* Enable DPP CLK DTO output */ 2018 + dccg35_enable_dpp_clk_new(dccg, dpp_inst, DPP_DCCG_DTO); 2019 + 2020 + /* Program DTO */ 2021 + REG_SET_2(DPPCLK_DTO_PARAM[dpp_inst], 0, 2022 + DPPCLK0_DTO_PHASE, phase, 2023 + DPPCLK0_DTO_MODULO, modulo); 2024 + } else 2025 + dccg35_disable_dpp_clk_new(dccg, dpp_inst); 2026 + 2027 + dccg->pipe_dppclk_khz[dpp_inst] = req_dppclk; 2028 + } 2029 + 2030 + static void dccg35_dpp_root_clock_control_cb( 2031 + struct dccg *dccg, 2032 + unsigned int dpp_inst, 2033 + bool power_on) 2034 + { 2035 + /* power_on set indicates we need to ungate 2036 + * Currently called from optimize_bandwidth and prepare_bandwidth calls 2037 + * Since clock source is not passed restore to refclock on ungate 2038 + * Redundant as gating when enabled is acheived through update_dpp_dto 2039 + */ 2040 + if (power_on) 2041 + dccg35_enable_dpp_clk_new(dccg, dpp_inst, DPP_REFCLK); 2042 + else 2043 + dccg35_disable_dpp_clk_new(dccg, dpp_inst); 2044 + } 2045 + 1936 2046 static const struct dccg_funcs dccg35_funcs = { 1937 2047 .update_dpp_dto = dccg35_update_dpp_dto, 1938 2048 .dpp_root_clock_control = dccg35_dpp_root_clock_control, ··· 2116 2010 (void)&dccg35_disable_symclk32_se_new; 2117 2011 (void)&dccg35_enable_symclk32_le_new; 2118 2012 (void)&dccg35_disable_symclk32_le_new; 2119 - (void)&dccg35_enable_dpp_new; 2120 - (void)&dccg35_disable_dpp_new; 2013 + (void)&dccg35_enable_dpp_clk_new; 2014 + (void)&dccg35_enable_dpp_clk_new; 2121 2015 (void)&dccg35_disable_dscclk_new; 2122 2016 (void)&dccg35_enable_dscclk_new; 2123 2017 (void)&dccg35_enable_dtbclk_p_new; 2124 2018 (void)&dccg35_disable_dtbclk_p_new; 2125 2019 (void)&dccg35_enable_dpstreamclk_new; 2126 2020 (void)&dccg35_disable_dpstreamclk_new; 2021 + (void)&dccg35_set_dpstreamclk_cb; 2022 + (void)&dccg35_dpp_root_clock_control_cb; 2023 + (void)&dccg35_set_dpstreamclk_root_clock_gating_cb; 2024 + (void)&dccg35_update_dpp_dto_cb; 2025 + (void)&dccg35_dpp_root_clock_control_cb; 2026 + 2127 2027 base = &dccg_dcn->base; 2128 2028 base->ctx = ctx; 2129 2029 base->funcs = &dccg35_funcs;