diff options
author | Samson Tam <Samson.Tam@amd.com> | 2018-05-30 15:44:50 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2018-07-05 17:38:45 -0400 |
commit | 1eeedbcc20d64ff2ef7eb9823f85bbb1c2545064 (patch) | |
tree | a04bda4497b806276a08ddefafb324e3cbf36ede /drivers/gpu | |
parent | 7f93c1de64693dc18afe55559f14cee6b5403c6c (diff) |
drm/amd/display: get board layout for edid emulation
Signed-off-by: Samson Tam <Samson.Tam@amd.com>
Reviewed-by: Aric Cyr <Aric.Cyr@amd.com>
Acked-by: Harry Wentland <harry.wentland@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/amd/display/dc/bios/bios_parser.c | 196 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c | 218 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/display/dc/dc_bios_types.h | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/display/include/grph_object_defs.h | 46 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/display/include/grph_object_id.h | 11 |
5 files changed, 474 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c b/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c index c7f0b27e457e..be8a2494355a 100644 --- a/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c +++ b/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c | |||
@@ -3762,6 +3762,200 @@ static struct integrated_info *bios_parser_create_integrated_info( | |||
3762 | return NULL; | 3762 | return NULL; |
3763 | } | 3763 | } |
3764 | 3764 | ||
3765 | enum bp_result update_slot_layout_info( | ||
3766 | struct dc_bios *dcb, | ||
3767 | unsigned int i, | ||
3768 | struct slot_layout_info *slot_layout_info, | ||
3769 | unsigned int record_offset) | ||
3770 | { | ||
3771 | unsigned int j; | ||
3772 | struct bios_parser *bp; | ||
3773 | ATOM_BRACKET_LAYOUT_RECORD *record; | ||
3774 | ATOM_COMMON_RECORD_HEADER *record_header; | ||
3775 | enum bp_result result = BP_RESULT_NORECORD; | ||
3776 | |||
3777 | bp = BP_FROM_DCB(dcb); | ||
3778 | record = NULL; | ||
3779 | record_header = NULL; | ||
3780 | |||
3781 | for (;;) { | ||
3782 | |||
3783 | record_header = (ATOM_COMMON_RECORD_HEADER *) | ||
3784 | GET_IMAGE(ATOM_COMMON_RECORD_HEADER, record_offset); | ||
3785 | if (record_header == NULL) { | ||
3786 | result = BP_RESULT_BADBIOSTABLE; | ||
3787 | break; | ||
3788 | } | ||
3789 | |||
3790 | /* the end of the list */ | ||
3791 | if (record_header->ucRecordType == 0xff || | ||
3792 | record_header->ucRecordSize == 0) { | ||
3793 | break; | ||
3794 | } | ||
3795 | |||
3796 | if (record_header->ucRecordType == | ||
3797 | ATOM_BRACKET_LAYOUT_RECORD_TYPE && | ||
3798 | sizeof(ATOM_BRACKET_LAYOUT_RECORD) | ||
3799 | <= record_header->ucRecordSize) { | ||
3800 | record = (ATOM_BRACKET_LAYOUT_RECORD *) | ||
3801 | (record_header); | ||
3802 | result = BP_RESULT_OK; | ||
3803 | break; | ||
3804 | } | ||
3805 | |||
3806 | record_offset += record_header->ucRecordSize; | ||
3807 | } | ||
3808 | |||
3809 | /* return if the record not found */ | ||
3810 | if (result != BP_RESULT_OK) | ||
3811 | return result; | ||
3812 | |||
3813 | /* get slot sizes */ | ||
3814 | slot_layout_info->length = record->ucLength; | ||
3815 | slot_layout_info->width = record->ucWidth; | ||
3816 | |||
3817 | /* get info for each connector in the slot */ | ||
3818 | slot_layout_info->num_of_connectors = record->ucConnNum; | ||
3819 | for (j = 0; j < slot_layout_info->num_of_connectors; ++j) { | ||
3820 | slot_layout_info->connectors[j].connector_type = | ||
3821 | (enum connector_layout_type) | ||
3822 | (record->asConnInfo[j].ucConnectorType); | ||
3823 | switch (record->asConnInfo[j].ucConnectorType) { | ||
3824 | case CONNECTOR_TYPE_DVI_D: | ||
3825 | slot_layout_info->connectors[j].connector_type = | ||
3826 | CONNECTOR_LAYOUT_TYPE_DVI_D; | ||
3827 | slot_layout_info->connectors[j].length = | ||
3828 | CONNECTOR_SIZE_DVI; | ||
3829 | break; | ||
3830 | |||
3831 | case CONNECTOR_TYPE_HDMI: | ||
3832 | slot_layout_info->connectors[j].connector_type = | ||
3833 | CONNECTOR_LAYOUT_TYPE_HDMI; | ||
3834 | slot_layout_info->connectors[j].length = | ||
3835 | CONNECTOR_SIZE_HDMI; | ||
3836 | break; | ||
3837 | |||
3838 | case CONNECTOR_TYPE_DISPLAY_PORT: | ||
3839 | slot_layout_info->connectors[j].connector_type = | ||
3840 | CONNECTOR_LAYOUT_TYPE_DP; | ||
3841 | slot_layout_info->connectors[j].length = | ||
3842 | CONNECTOR_SIZE_DP; | ||
3843 | break; | ||
3844 | |||
3845 | case CONNECTOR_TYPE_MINI_DISPLAY_PORT: | ||
3846 | slot_layout_info->connectors[j].connector_type = | ||
3847 | CONNECTOR_LAYOUT_TYPE_MINI_DP; | ||
3848 | slot_layout_info->connectors[j].length = | ||
3849 | CONNECTOR_SIZE_MINI_DP; | ||
3850 | break; | ||
3851 | |||
3852 | default: | ||
3853 | slot_layout_info->connectors[j].connector_type = | ||
3854 | CONNECTOR_LAYOUT_TYPE_UNKNOWN; | ||
3855 | slot_layout_info->connectors[j].length = | ||
3856 | CONNECTOR_SIZE_UNKNOWN; | ||
3857 | } | ||
3858 | |||
3859 | slot_layout_info->connectors[j].position = | ||
3860 | record->asConnInfo[j].ucPosition; | ||
3861 | slot_layout_info->connectors[j].connector_id = | ||
3862 | object_id_from_bios_object_id( | ||
3863 | record->asConnInfo[j].usConnectorObjectId); | ||
3864 | } | ||
3865 | return result; | ||
3866 | } | ||
3867 | |||
3868 | |||
3869 | enum bp_result get_bracket_layout_record( | ||
3870 | struct dc_bios *dcb, | ||
3871 | unsigned int bracket_layout_id, | ||
3872 | struct slot_layout_info *slot_layout_info) | ||
3873 | { | ||
3874 | unsigned int i; | ||
3875 | unsigned int record_offset; | ||
3876 | struct bios_parser *bp; | ||
3877 | enum bp_result result; | ||
3878 | ATOM_OBJECT *object; | ||
3879 | ATOM_OBJECT_TABLE *object_table; | ||
3880 | unsigned int genericTableOffset; | ||
3881 | |||
3882 | bp = BP_FROM_DCB(dcb); | ||
3883 | object = NULL; | ||
3884 | if (slot_layout_info == NULL) { | ||
3885 | DC_LOG_DETECTION_EDID_PARSER("Invalid slot_layout_info\n"); | ||
3886 | return BP_RESULT_BADINPUT; | ||
3887 | } | ||
3888 | |||
3889 | |||
3890 | genericTableOffset = bp->object_info_tbl_offset + | ||
3891 | bp->object_info_tbl.v1_3->usMiscObjectTableOffset; | ||
3892 | object_table = (ATOM_OBJECT_TABLE *) | ||
3893 | GET_IMAGE(ATOM_OBJECT_TABLE, genericTableOffset); | ||
3894 | if (!object_table) | ||
3895 | return BP_RESULT_FAILURE; | ||
3896 | |||
3897 | result = BP_RESULT_NORECORD; | ||
3898 | for (i = 0; i < object_table->ucNumberOfObjects; ++i) { | ||
3899 | |||
3900 | if (bracket_layout_id == | ||
3901 | object_table->asObjects[i].usObjectID) { | ||
3902 | |||
3903 | object = &object_table->asObjects[i]; | ||
3904 | record_offset = object->usRecordOffset + | ||
3905 | bp->object_info_tbl_offset; | ||
3906 | |||
3907 | result = update_slot_layout_info(dcb, i, | ||
3908 | slot_layout_info, record_offset); | ||
3909 | break; | ||
3910 | } | ||
3911 | } | ||
3912 | return result; | ||
3913 | } | ||
3914 | |||
3915 | static enum bp_result bios_get_board_layout_info( | ||
3916 | struct dc_bios *dcb, | ||
3917 | struct board_layout_info *board_layout_info) | ||
3918 | { | ||
3919 | unsigned int i; | ||
3920 | struct bios_parser *bp; | ||
3921 | enum bp_result record_result; | ||
3922 | |||
3923 | const unsigned int slot_index_to_vbios_id[MAX_BOARD_SLOTS] = { | ||
3924 | GENERICOBJECT_BRACKET_LAYOUT_ENUM_ID1, | ||
3925 | GENERICOBJECT_BRACKET_LAYOUT_ENUM_ID2, | ||
3926 | 0, 0 | ||
3927 | }; | ||
3928 | |||
3929 | bp = BP_FROM_DCB(dcb); | ||
3930 | if (board_layout_info == NULL) { | ||
3931 | DC_LOG_DETECTION_EDID_PARSER("Invalid board_layout_info\n"); | ||
3932 | return BP_RESULT_BADINPUT; | ||
3933 | } | ||
3934 | |||
3935 | board_layout_info->num_of_slots = 0; | ||
3936 | |||
3937 | for (i = 0; i < MAX_BOARD_SLOTS; ++i) { | ||
3938 | record_result = get_bracket_layout_record(dcb, | ||
3939 | slot_index_to_vbios_id[i], | ||
3940 | &board_layout_info->slots[i]); | ||
3941 | |||
3942 | if (record_result == BP_RESULT_NORECORD && i > 0) | ||
3943 | break; /* no more slots present in bios */ | ||
3944 | else if (record_result != BP_RESULT_OK) | ||
3945 | return record_result; /* fail */ | ||
3946 | |||
3947 | ++board_layout_info->num_of_slots; | ||
3948 | } | ||
3949 | |||
3950 | /* all data is valid */ | ||
3951 | board_layout_info->is_number_of_slots_valid = 1; | ||
3952 | board_layout_info->is_slots_size_valid = 1; | ||
3953 | board_layout_info->is_connector_offsets_valid = 1; | ||
3954 | board_layout_info->is_connector_lengths_valid = 1; | ||
3955 | |||
3956 | return BP_RESULT_OK; | ||
3957 | } | ||
3958 | |||
3765 | /******************************************************************************/ | 3959 | /******************************************************************************/ |
3766 | 3960 | ||
3767 | static const struct dc_vbios_funcs vbios_funcs = { | 3961 | static const struct dc_vbios_funcs vbios_funcs = { |
@@ -3836,6 +4030,8 @@ static const struct dc_vbios_funcs vbios_funcs = { | |||
3836 | .post_init = bios_parser_post_init, /* patch vbios table for mxm module by reading i2c */ | 4030 | .post_init = bios_parser_post_init, /* patch vbios table for mxm module by reading i2c */ |
3837 | 4031 | ||
3838 | .bios_parser_destroy = bios_parser_destroy, | 4032 | .bios_parser_destroy = bios_parser_destroy, |
4033 | |||
4034 | .get_board_layout_info = bios_get_board_layout_info, | ||
3839 | }; | 4035 | }; |
3840 | 4036 | ||
3841 | static bool bios_parser_construct( | 4037 | static bool bios_parser_construct( |
diff --git a/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c b/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c index b8cef7af3c4a..aeb56e402ccc 100644 --- a/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c +++ b/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c | |||
@@ -43,6 +43,29 @@ | |||
43 | #include "bios_parser_interface.h" | 43 | #include "bios_parser_interface.h" |
44 | 44 | ||
45 | #include "bios_parser_common.h" | 45 | #include "bios_parser_common.h" |
46 | |||
47 | /* Temporarily add in defines until ObjectID.h patch is updated in a few days */ | ||
48 | #ifndef GENERIC_OBJECT_ID_BRACKET_LAYOUT | ||
49 | #define GENERIC_OBJECT_ID_BRACKET_LAYOUT 0x05 | ||
50 | #endif /* GENERIC_OBJECT_ID_BRACKET_LAYOUT */ | ||
51 | |||
52 | #ifndef GENERICOBJECT_BRACKET_LAYOUT_ENUM_ID1 | ||
53 | #define GENERICOBJECT_BRACKET_LAYOUT_ENUM_ID1 \ | ||
54 | (GRAPH_OBJECT_TYPE_GENERIC << OBJECT_TYPE_SHIFT |\ | ||
55 | GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ | ||
56 | GENERIC_OBJECT_ID_BRACKET_LAYOUT << OBJECT_ID_SHIFT) | ||
57 | #endif /* GENERICOBJECT_BRACKET_LAYOUT_ENUM_ID1 */ | ||
58 | |||
59 | #ifndef GENERICOBJECT_BRACKET_LAYOUT_ENUM_ID2 | ||
60 | #define GENERICOBJECT_BRACKET_LAYOUT_ENUM_ID2 \ | ||
61 | (GRAPH_OBJECT_TYPE_GENERIC << OBJECT_TYPE_SHIFT |\ | ||
62 | GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ | ||
63 | GENERIC_OBJECT_ID_BRACKET_LAYOUT << OBJECT_ID_SHIFT) | ||
64 | #endif /* GENERICOBJECT_BRACKET_LAYOUT_ENUM_ID2 */ | ||
65 | |||
66 | #define DC_LOGGER \ | ||
67 | bp->base.ctx->logger | ||
68 | |||
46 | #define LAST_RECORD_TYPE 0xff | 69 | #define LAST_RECORD_TYPE 0xff |
47 | #define SMU9_SYSPLL0_ID 0 | 70 | #define SMU9_SYSPLL0_ID 0 |
48 | 71 | ||
@@ -86,7 +109,6 @@ static struct atom_encoder_caps_record *get_encoder_cap_record( | |||
86 | 109 | ||
87 | #define DATA_TABLES(table) (bp->master_data_tbl->listOfdatatables.table) | 110 | #define DATA_TABLES(table) (bp->master_data_tbl->listOfdatatables.table) |
88 | 111 | ||
89 | |||
90 | static void destruct(struct bios_parser *bp) | 112 | static void destruct(struct bios_parser *bp) |
91 | { | 113 | { |
92 | kfree(bp->base.bios_local_image); | 114 | kfree(bp->base.bios_local_image); |
@@ -1854,6 +1876,198 @@ static struct integrated_info *bios_parser_create_integrated_info( | |||
1854 | return NULL; | 1876 | return NULL; |
1855 | } | 1877 | } |
1856 | 1878 | ||
1879 | static enum bp_result update_slot_layout_info( | ||
1880 | struct dc_bios *dcb, | ||
1881 | unsigned int i, | ||
1882 | struct slot_layout_info *slot_layout_info) | ||
1883 | { | ||
1884 | unsigned int record_offset; | ||
1885 | unsigned int j; | ||
1886 | struct atom_display_object_path_v2 *object; | ||
1887 | struct atom_bracket_layout_record *record; | ||
1888 | struct atom_common_record_header *record_header; | ||
1889 | enum bp_result result; | ||
1890 | struct bios_parser *bp; | ||
1891 | struct object_info_table *tbl; | ||
1892 | struct display_object_info_table_v1_4 *v1_4; | ||
1893 | |||
1894 | record = NULL; | ||
1895 | record_header = NULL; | ||
1896 | result = BP_RESULT_NORECORD; | ||
1897 | |||
1898 | bp = BP_FROM_DCB(dcb); | ||
1899 | tbl = &bp->object_info_tbl; | ||
1900 | v1_4 = tbl->v1_4; | ||
1901 | |||
1902 | object = &v1_4->display_path[i]; | ||
1903 | record_offset = (unsigned int) | ||
1904 | (object->disp_recordoffset) + | ||
1905 | (unsigned int)(bp->object_info_tbl_offset); | ||
1906 | |||
1907 | for (;;) { | ||
1908 | |||
1909 | record_header = (struct atom_common_record_header *) | ||
1910 | GET_IMAGE(struct atom_common_record_header, | ||
1911 | record_offset); | ||
1912 | if (record_header == NULL) { | ||
1913 | result = BP_RESULT_BADBIOSTABLE; | ||
1914 | break; | ||
1915 | } | ||
1916 | |||
1917 | /* the end of the list */ | ||
1918 | if (record_header->record_type == 0xff || | ||
1919 | record_header->record_size == 0) { | ||
1920 | break; | ||
1921 | } | ||
1922 | |||
1923 | if (record_header->record_type == | ||
1924 | ATOM_BRACKET_LAYOUT_RECORD_TYPE && | ||
1925 | sizeof(struct atom_bracket_layout_record) | ||
1926 | <= record_header->record_size) { | ||
1927 | record = (struct atom_bracket_layout_record *) | ||
1928 | (record_header); | ||
1929 | result = BP_RESULT_OK; | ||
1930 | break; | ||
1931 | } | ||
1932 | |||
1933 | record_offset += record_header->record_size; | ||
1934 | } | ||
1935 | |||
1936 | /* return if the record not found */ | ||
1937 | if (result != BP_RESULT_OK) | ||
1938 | return result; | ||
1939 | |||
1940 | /* get slot sizes */ | ||
1941 | slot_layout_info->length = record->bracketlen; | ||
1942 | slot_layout_info->width = record->bracketwidth; | ||
1943 | |||
1944 | /* get info for each connector in the slot */ | ||
1945 | slot_layout_info->num_of_connectors = record->conn_num; | ||
1946 | for (j = 0; j < slot_layout_info->num_of_connectors; ++j) { | ||
1947 | slot_layout_info->connectors[j].connector_type = | ||
1948 | (enum connector_layout_type) | ||
1949 | (record->conn_info[j].connector_type); | ||
1950 | switch (record->conn_info[j].connector_type) { | ||
1951 | case CONNECTOR_TYPE_DVI_D: | ||
1952 | slot_layout_info->connectors[j].connector_type = | ||
1953 | CONNECTOR_LAYOUT_TYPE_DVI_D; | ||
1954 | slot_layout_info->connectors[j].length = | ||
1955 | CONNECTOR_SIZE_DVI; | ||
1956 | break; | ||
1957 | |||
1958 | case CONNECTOR_TYPE_HDMI: | ||
1959 | slot_layout_info->connectors[j].connector_type = | ||
1960 | CONNECTOR_LAYOUT_TYPE_HDMI; | ||
1961 | slot_layout_info->connectors[j].length = | ||
1962 | CONNECTOR_SIZE_HDMI; | ||
1963 | break; | ||
1964 | |||
1965 | case CONNECTOR_TYPE_DISPLAY_PORT: | ||
1966 | slot_layout_info->connectors[j].connector_type = | ||
1967 | CONNECTOR_LAYOUT_TYPE_DP; | ||
1968 | slot_layout_info->connectors[j].length = | ||
1969 | CONNECTOR_SIZE_DP; | ||
1970 | break; | ||
1971 | |||
1972 | case CONNECTOR_TYPE_MINI_DISPLAY_PORT: | ||
1973 | slot_layout_info->connectors[j].connector_type = | ||
1974 | CONNECTOR_LAYOUT_TYPE_MINI_DP; | ||
1975 | slot_layout_info->connectors[j].length = | ||
1976 | CONNECTOR_SIZE_MINI_DP; | ||
1977 | break; | ||
1978 | |||
1979 | default: | ||
1980 | slot_layout_info->connectors[j].connector_type = | ||
1981 | CONNECTOR_LAYOUT_TYPE_UNKNOWN; | ||
1982 | slot_layout_info->connectors[j].length = | ||
1983 | CONNECTOR_SIZE_UNKNOWN; | ||
1984 | } | ||
1985 | |||
1986 | slot_layout_info->connectors[j].position = | ||
1987 | record->conn_info[j].position; | ||
1988 | slot_layout_info->connectors[j].connector_id = | ||
1989 | object_id_from_bios_object_id( | ||
1990 | record->conn_info[j].connectorobjid); | ||
1991 | } | ||
1992 | return result; | ||
1993 | } | ||
1994 | |||
1995 | |||
1996 | static enum bp_result get_bracket_layout_record( | ||
1997 | struct dc_bios *dcb, | ||
1998 | unsigned int bracket_layout_id, | ||
1999 | struct slot_layout_info *slot_layout_info) | ||
2000 | { | ||
2001 | unsigned int i; | ||
2002 | struct bios_parser *bp = BP_FROM_DCB(dcb); | ||
2003 | enum bp_result result; | ||
2004 | struct object_info_table *tbl; | ||
2005 | struct display_object_info_table_v1_4 *v1_4; | ||
2006 | |||
2007 | if (slot_layout_info == NULL) { | ||
2008 | DC_LOG_DETECTION_EDID_PARSER("Invalid slot_layout_info\n"); | ||
2009 | return BP_RESULT_BADINPUT; | ||
2010 | } | ||
2011 | tbl = &bp->object_info_tbl; | ||
2012 | v1_4 = tbl->v1_4; | ||
2013 | |||
2014 | result = BP_RESULT_NORECORD; | ||
2015 | for (i = 0; i < v1_4->number_of_path; ++i) { | ||
2016 | |||
2017 | if (bracket_layout_id == | ||
2018 | v1_4->display_path[i].display_objid) { | ||
2019 | result = update_slot_layout_info(dcb, i, | ||
2020 | slot_layout_info); | ||
2021 | break; | ||
2022 | } | ||
2023 | } | ||
2024 | return result; | ||
2025 | } | ||
2026 | |||
2027 | static enum bp_result bios_get_board_layout_info( | ||
2028 | struct dc_bios *dcb, | ||
2029 | struct board_layout_info *board_layout_info) | ||
2030 | { | ||
2031 | unsigned int i; | ||
2032 | struct bios_parser *bp; | ||
2033 | enum bp_result record_result; | ||
2034 | |||
2035 | const unsigned int slot_index_to_vbios_id[MAX_BOARD_SLOTS] = { | ||
2036 | GENERICOBJECT_BRACKET_LAYOUT_ENUM_ID1, | ||
2037 | GENERICOBJECT_BRACKET_LAYOUT_ENUM_ID2, | ||
2038 | 0, 0 | ||
2039 | }; | ||
2040 | |||
2041 | bp = BP_FROM_DCB(dcb); | ||
2042 | if (board_layout_info == NULL) { | ||
2043 | DC_LOG_DETECTION_EDID_PARSER("Invalid board_layout_info\n"); | ||
2044 | return BP_RESULT_BADINPUT; | ||
2045 | } | ||
2046 | |||
2047 | board_layout_info->num_of_slots = 0; | ||
2048 | |||
2049 | for (i = 0; i < MAX_BOARD_SLOTS; ++i) { | ||
2050 | record_result = get_bracket_layout_record(dcb, | ||
2051 | slot_index_to_vbios_id[i], | ||
2052 | &board_layout_info->slots[i]); | ||
2053 | |||
2054 | if (record_result == BP_RESULT_NORECORD && i > 0) | ||
2055 | break; /* no more slots present in bios */ | ||
2056 | else if (record_result != BP_RESULT_OK) | ||
2057 | return record_result; /* fail */ | ||
2058 | |||
2059 | ++board_layout_info->num_of_slots; | ||
2060 | } | ||
2061 | |||
2062 | /* all data is valid */ | ||
2063 | board_layout_info->is_number_of_slots_valid = 1; | ||
2064 | board_layout_info->is_slots_size_valid = 1; | ||
2065 | board_layout_info->is_connector_offsets_valid = 1; | ||
2066 | board_layout_info->is_connector_lengths_valid = 1; | ||
2067 | |||
2068 | return BP_RESULT_OK; | ||
2069 | } | ||
2070 | |||
1857 | static const struct dc_vbios_funcs vbios_funcs = { | 2071 | static const struct dc_vbios_funcs vbios_funcs = { |
1858 | .get_connectors_number = bios_parser_get_connectors_number, | 2072 | .get_connectors_number = bios_parser_get_connectors_number, |
1859 | 2073 | ||
@@ -1925,6 +2139,8 @@ static const struct dc_vbios_funcs vbios_funcs = { | |||
1925 | .bios_parser_destroy = firmware_parser_destroy, | 2139 | .bios_parser_destroy = firmware_parser_destroy, |
1926 | 2140 | ||
1927 | .get_smu_clock_info = bios_parser_get_smu_clock_info, | 2141 | .get_smu_clock_info = bios_parser_get_smu_clock_info, |
2142 | |||
2143 | .get_board_layout_info = bios_get_board_layout_info, | ||
1928 | }; | 2144 | }; |
1929 | 2145 | ||
1930 | static bool bios_parser_construct( | 2146 | static bool bios_parser_construct( |
diff --git a/drivers/gpu/drm/amd/display/dc/dc_bios_types.h b/drivers/gpu/drm/amd/display/dc/dc_bios_types.h index d9b84ec7954c..90082bab71f0 100644 --- a/drivers/gpu/drm/amd/display/dc/dc_bios_types.h +++ b/drivers/gpu/drm/amd/display/dc/dc_bios_types.h | |||
@@ -198,6 +198,10 @@ struct dc_vbios_funcs { | |||
198 | void (*post_init)(struct dc_bios *bios); | 198 | void (*post_init)(struct dc_bios *bios); |
199 | 199 | ||
200 | void (*bios_parser_destroy)(struct dc_bios **dcb); | 200 | void (*bios_parser_destroy)(struct dc_bios **dcb); |
201 | |||
202 | enum bp_result (*get_board_layout_info)( | ||
203 | struct dc_bios *dcb, | ||
204 | struct board_layout_info *board_layout_info); | ||
201 | }; | 205 | }; |
202 | 206 | ||
203 | struct bios_registers { | 207 | struct bios_registers { |
diff --git a/drivers/gpu/drm/amd/display/include/grph_object_defs.h b/drivers/gpu/drm/amd/display/include/grph_object_defs.h index 2941b882b0b6..58bb42ed85ca 100644 --- a/drivers/gpu/drm/amd/display/include/grph_object_defs.h +++ b/drivers/gpu/drm/amd/display/include/grph_object_defs.h | |||
@@ -37,6 +37,10 @@ | |||
37 | * ******************************************************************** | 37 | * ******************************************************************** |
38 | */ | 38 | */ |
39 | 39 | ||
40 | #define MAX_CONNECTOR_NUMBER_PER_SLOT (16) | ||
41 | #define MAX_BOARD_SLOTS (4) | ||
42 | #define INVALID_CONNECTOR_INDEX ((unsigned int)(-1)) | ||
43 | |||
40 | /* HPD unit id - HW direct translation */ | 44 | /* HPD unit id - HW direct translation */ |
41 | enum hpd_source_id { | 45 | enum hpd_source_id { |
42 | HPD_SOURCEID1 = 0, | 46 | HPD_SOURCEID1 = 0, |
@@ -136,5 +140,47 @@ enum sync_source { | |||
136 | SYNC_SOURCE_DUAL_GPU_PIN | 140 | SYNC_SOURCE_DUAL_GPU_PIN |
137 | }; | 141 | }; |
138 | 142 | ||
143 | /* connector sizes in millimeters - from BiosParserTypes.hpp */ | ||
144 | #define CONNECTOR_SIZE_DVI 40 | ||
145 | #define CONNECTOR_SIZE_VGA 32 | ||
146 | #define CONNECTOR_SIZE_HDMI 16 | ||
147 | #define CONNECTOR_SIZE_DP 16 | ||
148 | #define CONNECTOR_SIZE_MINI_DP 9 | ||
149 | #define CONNECTOR_SIZE_UNKNOWN 30 | ||
150 | |||
151 | enum connector_layout_type { | ||
152 | CONNECTOR_LAYOUT_TYPE_UNKNOWN, | ||
153 | CONNECTOR_LAYOUT_TYPE_DVI_D, | ||
154 | CONNECTOR_LAYOUT_TYPE_DVI_I, | ||
155 | CONNECTOR_LAYOUT_TYPE_VGA, | ||
156 | CONNECTOR_LAYOUT_TYPE_HDMI, | ||
157 | CONNECTOR_LAYOUT_TYPE_DP, | ||
158 | CONNECTOR_LAYOUT_TYPE_MINI_DP, | ||
159 | }; | ||
160 | struct connector_layout_info { | ||
161 | struct graphics_object_id connector_id; | ||
162 | enum connector_layout_type connector_type; | ||
163 | unsigned int length; | ||
164 | unsigned int position; /* offset in mm from right side of the board */ | ||
165 | }; | ||
166 | |||
167 | /* length and width in mm */ | ||
168 | struct slot_layout_info { | ||
169 | unsigned int length; | ||
170 | unsigned int width; | ||
171 | unsigned int num_of_connectors; | ||
172 | struct connector_layout_info connectors[MAX_CONNECTOR_NUMBER_PER_SLOT]; | ||
173 | }; | ||
174 | |||
175 | struct board_layout_info { | ||
176 | unsigned int num_of_slots; | ||
139 | 177 | ||
178 | /* indicates valid information in bracket layout structure. */ | ||
179 | unsigned int is_number_of_slots_valid : 1; | ||
180 | unsigned int is_slots_size_valid : 1; | ||
181 | unsigned int is_connector_offsets_valid : 1; | ||
182 | unsigned int is_connector_lengths_valid : 1; | ||
183 | |||
184 | struct slot_layout_info slots[MAX_BOARD_SLOTS]; | ||
185 | }; | ||
140 | #endif | 186 | #endif |
diff --git a/drivers/gpu/drm/amd/display/include/grph_object_id.h b/drivers/gpu/drm/amd/display/include/grph_object_id.h index 92cc6c112ea6..33b3d755fe65 100644 --- a/drivers/gpu/drm/amd/display/include/grph_object_id.h +++ b/drivers/gpu/drm/amd/display/include/grph_object_id.h | |||
@@ -292,4 +292,15 @@ static inline enum engine_id dal_graphics_object_id_get_engine_id( | |||
292 | return (enum engine_id) id.id; | 292 | return (enum engine_id) id.id; |
293 | return ENGINE_ID_UNKNOWN; | 293 | return ENGINE_ID_UNKNOWN; |
294 | } | 294 | } |
295 | |||
296 | static inline bool dal_graphics_object_id_equal( | ||
297 | struct graphics_object_id id_1, | ||
298 | struct graphics_object_id id_2) | ||
299 | { | ||
300 | if ((id_1.id == id_2.id) && (id_1.enum_id == id_2.enum_id) && | ||
301 | (id_1.type == id_2.type)) { | ||
302 | return true; | ||
303 | } | ||
304 | return false; | ||
305 | } | ||
295 | #endif | 306 | #endif |