@@ -1767,13 +1767,38 @@ static const struct drm_encoder_funcs ast_bmc_encoder_funcs = {
1767
1767
.destroy = drm_encoder_cleanup ,
1768
1768
};
1769
1769
1770
+ static int ast_bmc_connector_helper_detect_ctx (struct drm_connector * connector ,
1771
+ struct drm_modeset_acquire_ctx * ctx ,
1772
+ bool force )
1773
+ {
1774
+ struct ast_bmc_connector * bmc_connector = to_ast_bmc_connector (connector );
1775
+ struct drm_connector * physical_connector = bmc_connector -> physical_connector ;
1776
+
1777
+ /*
1778
+ * Most user-space compositors cannot handle more than one connected
1779
+ * connector per CRTC. Hence, we only mark the BMC as connected if the
1780
+ * physical connector is disconnected. If the physical connector's status
1781
+ * is connected or unknown, the BMC remains disconnected. This has no
1782
+ * effect on the output of the BMC.
1783
+ *
1784
+ * FIXME: Remove this logic once user-space compositors can handle more
1785
+ * than one connector per CRTC. The BMC should always be connected.
1786
+ */
1787
+
1788
+ if (physical_connector && physical_connector -> status == connector_status_disconnected )
1789
+ return connector_status_connected ;
1790
+
1791
+ return connector_status_disconnected ;
1792
+ }
1793
+
1770
1794
static int ast_bmc_connector_helper_get_modes (struct drm_connector * connector )
1771
1795
{
1772
1796
return drm_add_modes_noedid (connector , 4096 , 4096 );
1773
1797
}
1774
1798
1775
1799
static const struct drm_connector_helper_funcs ast_bmc_connector_helper_funcs = {
1776
1800
.get_modes = ast_bmc_connector_helper_get_modes ,
1801
+ .detect_ctx = ast_bmc_connector_helper_detect_ctx ,
1777
1802
};
1778
1803
1779
1804
static const struct drm_connector_funcs ast_bmc_connector_funcs = {
@@ -1784,12 +1809,33 @@ static const struct drm_connector_funcs ast_bmc_connector_funcs = {
1784
1809
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state ,
1785
1810
};
1786
1811
1787
- static int ast_bmc_output_init (struct ast_device * ast )
1812
+ static int ast_bmc_connector_init (struct drm_device * dev ,
1813
+ struct ast_bmc_connector * bmc_connector ,
1814
+ struct drm_connector * physical_connector )
1815
+ {
1816
+ struct drm_connector * connector = & bmc_connector -> base ;
1817
+ int ret ;
1818
+
1819
+ ret = drm_connector_init (dev , connector , & ast_bmc_connector_funcs ,
1820
+ DRM_MODE_CONNECTOR_VIRTUAL );
1821
+ if (ret )
1822
+ return ret ;
1823
+
1824
+ drm_connector_helper_add (connector , & ast_bmc_connector_helper_funcs );
1825
+
1826
+ bmc_connector -> physical_connector = physical_connector ;
1827
+
1828
+ return 0 ;
1829
+ }
1830
+
1831
+ static int ast_bmc_output_init (struct ast_device * ast ,
1832
+ struct drm_connector * physical_connector )
1788
1833
{
1789
1834
struct drm_device * dev = & ast -> base ;
1790
1835
struct drm_crtc * crtc = & ast -> crtc ;
1791
1836
struct drm_encoder * encoder = & ast -> output .bmc .encoder ;
1792
- struct drm_connector * connector = & ast -> output .bmc .connector ;
1837
+ struct ast_bmc_connector * bmc_connector = & ast -> output .bmc .bmc_connector ;
1838
+ struct drm_connector * connector = & bmc_connector -> base ;
1793
1839
int ret ;
1794
1840
1795
1841
ret = drm_encoder_init (dev , encoder ,
@@ -1799,13 +1845,10 @@ static int ast_bmc_output_init(struct ast_device *ast)
1799
1845
return ret ;
1800
1846
encoder -> possible_crtcs = drm_crtc_mask (crtc );
1801
1847
1802
- ret = drm_connector_init (dev , connector , & ast_bmc_connector_funcs ,
1803
- DRM_MODE_CONNECTOR_VIRTUAL );
1848
+ ret = ast_bmc_connector_init (dev , bmc_connector , physical_connector );
1804
1849
if (ret )
1805
1850
return ret ;
1806
1851
1807
- drm_connector_helper_add (connector , & ast_bmc_connector_helper_funcs );
1808
-
1809
1852
ret = drm_connector_attach_encoder (connector , encoder );
1810
1853
if (ret )
1811
1854
return ret ;
@@ -1864,6 +1907,7 @@ static const struct drm_mode_config_funcs ast_mode_config_funcs = {
1864
1907
int ast_mode_config_init (struct ast_device * ast )
1865
1908
{
1866
1909
struct drm_device * dev = & ast -> base ;
1910
+ struct drm_connector * physical_connector = NULL ;
1867
1911
int ret ;
1868
1912
1869
1913
ret = drmm_mode_config_init (dev );
@@ -1904,23 +1948,27 @@ int ast_mode_config_init(struct ast_device *ast)
1904
1948
ret = ast_vga_output_init (ast );
1905
1949
if (ret )
1906
1950
return ret ;
1951
+ physical_connector = & ast -> output .vga .vga_connector .base ;
1907
1952
}
1908
1953
if (ast -> tx_chip_types & AST_TX_SIL164_BIT ) {
1909
1954
ret = ast_sil164_output_init (ast );
1910
1955
if (ret )
1911
1956
return ret ;
1957
+ physical_connector = & ast -> output .sil164 .sil164_connector .base ;
1912
1958
}
1913
1959
if (ast -> tx_chip_types & AST_TX_DP501_BIT ) {
1914
1960
ret = ast_dp501_output_init (ast );
1915
1961
if (ret )
1916
1962
return ret ;
1963
+ physical_connector = & ast -> output .dp501 .connector ;
1917
1964
}
1918
1965
if (ast -> tx_chip_types & AST_TX_ASTDP_BIT ) {
1919
1966
ret = ast_astdp_output_init (ast );
1920
1967
if (ret )
1921
1968
return ret ;
1969
+ physical_connector = & ast -> output .astdp .connector ;
1922
1970
}
1923
- ret = ast_bmc_output_init (ast );
1971
+ ret = ast_bmc_output_init (ast , physical_connector );
1924
1972
if (ret )
1925
1973
return ret ;
1926
1974
0 commit comments