1c349dbc7Sjsg /* 25ca02815Sjsg * Copyright 2018 Advanced Micro Devices, Inc. 3c349dbc7Sjsg * 4c349dbc7Sjsg * Permission is hereby granted, free of charge, to any person obtaining a 5c349dbc7Sjsg * copy of this software and associated documentation files (the "Software"), 6c349dbc7Sjsg * to deal in the Software without restriction, including without limitation 7c349dbc7Sjsg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8c349dbc7Sjsg * and/or sell copies of the Software, and to permit persons to whom the 9c349dbc7Sjsg * Software is furnished to do so, subject to the following conditions: 10c349dbc7Sjsg * 11c349dbc7Sjsg * The above copyright notice and this permission notice shall be included in 12c349dbc7Sjsg * all copies or substantial portions of the Software. 13c349dbc7Sjsg * 14c349dbc7Sjsg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15c349dbc7Sjsg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16c349dbc7Sjsg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17c349dbc7Sjsg * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18c349dbc7Sjsg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19c349dbc7Sjsg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20c349dbc7Sjsg * OTHER DEALINGS IN THE SOFTWARE. 21c349dbc7Sjsg * 22c349dbc7Sjsg * Authors: AMD 23c349dbc7Sjsg * 24c349dbc7Sjsg */ 25c349dbc7Sjsg 26c349dbc7Sjsg #ifndef MOD_HDCP_H_ 27c349dbc7Sjsg #define MOD_HDCP_H_ 28c349dbc7Sjsg 29c349dbc7Sjsg #include "os_types.h" 30c349dbc7Sjsg #include "signal_types.h" 31c349dbc7Sjsg 32c349dbc7Sjsg /* Forward Declarations */ 33c349dbc7Sjsg struct mod_hdcp; 34c349dbc7Sjsg 35c349dbc7Sjsg #define MAX_NUM_OF_DISPLAYS 6 36c349dbc7Sjsg #define MAX_NUM_OF_ATTEMPTS 4 37c349dbc7Sjsg #define MAX_NUM_OF_ERROR_TRACE 10 38c349dbc7Sjsg 39c349dbc7Sjsg /* detailed return status */ 40c349dbc7Sjsg enum mod_hdcp_status { 41c349dbc7Sjsg MOD_HDCP_STATUS_SUCCESS = 0, 42c349dbc7Sjsg MOD_HDCP_STATUS_FAILURE, 43c349dbc7Sjsg MOD_HDCP_STATUS_RESET_NEEDED, 44c349dbc7Sjsg MOD_HDCP_STATUS_DISPLAY_OUT_OF_BOUND, 45c349dbc7Sjsg MOD_HDCP_STATUS_DISPLAY_NOT_FOUND, 46c349dbc7Sjsg MOD_HDCP_STATUS_INVALID_STATE, 47c349dbc7Sjsg MOD_HDCP_STATUS_NOT_IMPLEMENTED, 48c349dbc7Sjsg MOD_HDCP_STATUS_INTERNAL_POLICY_FAILURE, 49c349dbc7Sjsg MOD_HDCP_STATUS_UPDATE_TOPOLOGY_FAILURE, 50c349dbc7Sjsg MOD_HDCP_STATUS_CREATE_PSP_SERVICE_FAILURE, 51c349dbc7Sjsg MOD_HDCP_STATUS_DESTROY_PSP_SERVICE_FAILURE, 52c349dbc7Sjsg MOD_HDCP_STATUS_HDCP1_CREATE_SESSION_FAILURE, 53c349dbc7Sjsg MOD_HDCP_STATUS_HDCP1_DESTROY_SESSION_FAILURE, 54c349dbc7Sjsg MOD_HDCP_STATUS_HDCP1_VALIDATE_ENCRYPTION_FAILURE, 55c349dbc7Sjsg MOD_HDCP_STATUS_HDCP1_NOT_HDCP_REPEATER, 56c349dbc7Sjsg MOD_HDCP_STATUS_HDCP1_NOT_CAPABLE, 57c349dbc7Sjsg MOD_HDCP_STATUS_HDCP1_R0_PRIME_PENDING, 58c349dbc7Sjsg MOD_HDCP_STATUS_HDCP1_VALIDATE_RX_FAILURE, 59c349dbc7Sjsg MOD_HDCP_STATUS_HDCP1_BKSV_REVOKED, 60c349dbc7Sjsg MOD_HDCP_STATUS_HDCP1_KSV_LIST_NOT_READY, 61c349dbc7Sjsg MOD_HDCP_STATUS_HDCP1_VALIDATE_KSV_LIST_FAILURE, 62c349dbc7Sjsg MOD_HDCP_STATUS_HDCP1_KSV_LIST_REVOKED, 63ad8b1aafSjsg MOD_HDCP_STATUS_HDCP1_ENABLE_ENCRYPTION_FAILURE, 64c349dbc7Sjsg MOD_HDCP_STATUS_HDCP1_ENABLE_STREAM_ENCRYPTION_FAILURE, 65c349dbc7Sjsg MOD_HDCP_STATUS_HDCP1_MAX_CASCADE_EXCEEDED_FAILURE, 66c349dbc7Sjsg MOD_HDCP_STATUS_HDCP1_MAX_DEVS_EXCEEDED_FAILURE, 67c349dbc7Sjsg MOD_HDCP_STATUS_HDCP1_DEVICE_COUNT_MISMATCH_FAILURE, 68c349dbc7Sjsg MOD_HDCP_STATUS_HDCP1_LINK_INTEGRITY_FAILURE, 69c349dbc7Sjsg MOD_HDCP_STATUS_HDCP1_REAUTH_REQUEST_ISSUED, 70c349dbc7Sjsg MOD_HDCP_STATUS_HDCP1_LINK_MAINTENANCE_FAILURE, 71c349dbc7Sjsg MOD_HDCP_STATUS_HDCP1_INVALID_BKSV, 72c349dbc7Sjsg MOD_HDCP_STATUS_DDC_FAILURE, /* TODO: specific errors */ 73c349dbc7Sjsg MOD_HDCP_STATUS_INVALID_OPERATION, 74c349dbc7Sjsg MOD_HDCP_STATUS_HDCP2_NOT_CAPABLE, 75c349dbc7Sjsg MOD_HDCP_STATUS_HDCP2_CREATE_SESSION_FAILURE, 76c349dbc7Sjsg MOD_HDCP_STATUS_HDCP2_DESTROY_SESSION_FAILURE, 77c349dbc7Sjsg MOD_HDCP_STATUS_HDCP2_PREP_AKE_INIT_FAILURE, 78c349dbc7Sjsg MOD_HDCP_STATUS_HDCP2_AKE_CERT_PENDING, 79c349dbc7Sjsg MOD_HDCP_STATUS_HDCP2_H_PRIME_PENDING, 80c349dbc7Sjsg MOD_HDCP_STATUS_HDCP2_PAIRING_INFO_PENDING, 81c349dbc7Sjsg MOD_HDCP_STATUS_HDCP2_VALIDATE_AKE_CERT_FAILURE, 82c349dbc7Sjsg MOD_HDCP_STATUS_HDCP2_AKE_CERT_REVOKED, 83c349dbc7Sjsg MOD_HDCP_STATUS_HDCP2_VALIDATE_H_PRIME_FAILURE, 84c349dbc7Sjsg MOD_HDCP_STATUS_HDCP2_VALIDATE_PAIRING_INFO_FAILURE, 85c349dbc7Sjsg MOD_HDCP_STATUS_HDCP2_PREP_LC_INIT_FAILURE, 86c349dbc7Sjsg MOD_HDCP_STATUS_HDCP2_L_PRIME_PENDING, 87c349dbc7Sjsg MOD_HDCP_STATUS_HDCP2_VALIDATE_L_PRIME_FAILURE, 88c349dbc7Sjsg MOD_HDCP_STATUS_HDCP2_PREP_EKS_FAILURE, 89c349dbc7Sjsg MOD_HDCP_STATUS_HDCP2_ENABLE_ENCRYPTION_FAILURE, 90c349dbc7Sjsg MOD_HDCP_STATUS_HDCP2_RX_ID_LIST_NOT_READY, 91c349dbc7Sjsg MOD_HDCP_STATUS_HDCP2_VALIDATE_RX_ID_LIST_FAILURE, 92c349dbc7Sjsg MOD_HDCP_STATUS_HDCP2_RX_ID_LIST_REVOKED, 93ad8b1aafSjsg MOD_HDCP_STATUS_HDCP2_ENABLE_STREAM_ENCRYPTION_FAILURE, 94c349dbc7Sjsg MOD_HDCP_STATUS_HDCP2_STREAM_READY_PENDING, 95c349dbc7Sjsg MOD_HDCP_STATUS_HDCP2_VALIDATE_STREAM_READY_FAILURE, 96c349dbc7Sjsg MOD_HDCP_STATUS_HDCP2_PREPARE_STREAM_MANAGEMENT_FAILURE, 97c349dbc7Sjsg MOD_HDCP_STATUS_HDCP2_REAUTH_REQUEST, 98c349dbc7Sjsg MOD_HDCP_STATUS_HDCP2_REAUTH_LINK_INTEGRITY_FAILURE, 99c349dbc7Sjsg MOD_HDCP_STATUS_HDCP2_DEVICE_COUNT_MISMATCH_FAILURE, 1005ca02815Sjsg MOD_HDCP_STATUS_UNSUPPORTED_PSP_VER_FAILURE, 101c349dbc7Sjsg }; 102c349dbc7Sjsg 103c349dbc7Sjsg struct mod_hdcp_displayport { 104c349dbc7Sjsg uint8_t rev; 1055ca02815Sjsg uint8_t assr_enabled; 1065ca02815Sjsg uint8_t mst_enabled; 107*f005ef32Sjsg uint8_t dp2_enabled; 1081bb76ff1Sjsg uint8_t usb4_enabled; 109c349dbc7Sjsg }; 110c349dbc7Sjsg 111c349dbc7Sjsg struct mod_hdcp_hdmi { 112c349dbc7Sjsg uint8_t reserved; 113c349dbc7Sjsg }; 114c349dbc7Sjsg enum mod_hdcp_operation_mode { 115c349dbc7Sjsg MOD_HDCP_MODE_OFF, 116c349dbc7Sjsg MOD_HDCP_MODE_DEFAULT, 117c349dbc7Sjsg MOD_HDCP_MODE_DP 118c349dbc7Sjsg }; 119c349dbc7Sjsg 120c349dbc7Sjsg enum mod_hdcp_display_state { 121c349dbc7Sjsg MOD_HDCP_DISPLAY_INACTIVE = 0, 122c349dbc7Sjsg MOD_HDCP_DISPLAY_ACTIVE, 123c349dbc7Sjsg MOD_HDCP_DISPLAY_ENCRYPTION_ENABLED 124c349dbc7Sjsg }; 125c349dbc7Sjsg 1265ca02815Sjsg struct mod_hdcp_psp_caps { 1275ca02815Sjsg uint8_t dtm_v3_supported; 1285ca02815Sjsg }; 1295ca02815Sjsg 1305ca02815Sjsg enum mod_hdcp_display_disable_option { 1315ca02815Sjsg MOD_HDCP_DISPLAY_NOT_DISABLE = 0, 1325ca02815Sjsg MOD_HDCP_DISPLAY_DISABLE_AUTHENTICATION, 1335ca02815Sjsg MOD_HDCP_DISPLAY_DISABLE_ENCRYPTION, 1345ca02815Sjsg }; 1355ca02815Sjsg 136c349dbc7Sjsg struct mod_hdcp_ddc { 137c349dbc7Sjsg void *handle; 138c349dbc7Sjsg struct { 139c349dbc7Sjsg bool (*read_i2c)(void *handle, 140c349dbc7Sjsg uint32_t address, 141c349dbc7Sjsg uint8_t offset, 142c349dbc7Sjsg uint8_t *data, 143c349dbc7Sjsg uint32_t size); 144c349dbc7Sjsg bool (*write_i2c)(void *handle, 145c349dbc7Sjsg uint32_t address, 146c349dbc7Sjsg const uint8_t *data, 147c349dbc7Sjsg uint32_t size); 148c349dbc7Sjsg bool (*read_dpcd)(void *handle, 149c349dbc7Sjsg uint32_t address, 150c349dbc7Sjsg uint8_t *data, 151c349dbc7Sjsg uint32_t size); 152c349dbc7Sjsg bool (*write_dpcd)(void *handle, 153c349dbc7Sjsg uint32_t address, 154c349dbc7Sjsg const uint8_t *data, 155c349dbc7Sjsg uint32_t size); 156c349dbc7Sjsg } funcs; 157c349dbc7Sjsg }; 158c349dbc7Sjsg 159c349dbc7Sjsg struct mod_hdcp_psp { 160c349dbc7Sjsg void *handle; 161c349dbc7Sjsg void *funcs; 1625ca02815Sjsg struct mod_hdcp_psp_caps caps; 163c349dbc7Sjsg }; 164c349dbc7Sjsg 165c349dbc7Sjsg struct mod_hdcp_display_adjustment { 1665ca02815Sjsg uint8_t disable : 2; 1675ca02815Sjsg uint8_t reserved : 6; 168c349dbc7Sjsg }; 169c349dbc7Sjsg 170c349dbc7Sjsg struct mod_hdcp_link_adjustment_hdcp1 { 171c349dbc7Sjsg uint8_t disable : 1; 172c349dbc7Sjsg uint8_t postpone_encryption : 1; 173c349dbc7Sjsg uint8_t min_auth_retries_wa : 1; 174c349dbc7Sjsg uint8_t reserved : 5; 175c349dbc7Sjsg }; 176c349dbc7Sjsg 177c349dbc7Sjsg enum mod_hdcp_force_hdcp_type { 178c349dbc7Sjsg MOD_HDCP_FORCE_TYPE_MAX = 0, 179c349dbc7Sjsg MOD_HDCP_FORCE_TYPE_0, 180c349dbc7Sjsg MOD_HDCP_FORCE_TYPE_1 181c349dbc7Sjsg }; 182c349dbc7Sjsg 183c349dbc7Sjsg struct mod_hdcp_link_adjustment_hdcp2 { 184c349dbc7Sjsg uint8_t disable : 1; 185c349dbc7Sjsg uint8_t force_type : 2; 186c349dbc7Sjsg uint8_t force_no_stored_km : 1; 187c349dbc7Sjsg uint8_t increase_h_prime_timeout: 1; 188c349dbc7Sjsg uint8_t reserved : 3; 189c349dbc7Sjsg }; 190c349dbc7Sjsg 191c349dbc7Sjsg struct mod_hdcp_link_adjustment { 192c349dbc7Sjsg uint8_t auth_delay; 193c349dbc7Sjsg struct mod_hdcp_link_adjustment_hdcp1 hdcp1; 194c349dbc7Sjsg struct mod_hdcp_link_adjustment_hdcp2 hdcp2; 195c349dbc7Sjsg }; 196c349dbc7Sjsg 197c349dbc7Sjsg struct mod_hdcp_error { 198c349dbc7Sjsg enum mod_hdcp_status status; 199c349dbc7Sjsg uint8_t state_id; 200c349dbc7Sjsg }; 201c349dbc7Sjsg 202c349dbc7Sjsg struct mod_hdcp_trace { 203c349dbc7Sjsg struct mod_hdcp_error errors[MAX_NUM_OF_ERROR_TRACE]; 204c349dbc7Sjsg uint8_t error_count; 205c349dbc7Sjsg }; 206c349dbc7Sjsg 207c349dbc7Sjsg enum mod_hdcp_encryption_status { 208c349dbc7Sjsg MOD_HDCP_ENCRYPTION_STATUS_HDCP_OFF = 0, 209c349dbc7Sjsg MOD_HDCP_ENCRYPTION_STATUS_HDCP1_ON, 210c349dbc7Sjsg MOD_HDCP_ENCRYPTION_STATUS_HDCP2_TYPE0_ON, 211c349dbc7Sjsg MOD_HDCP_ENCRYPTION_STATUS_HDCP2_TYPE1_ON, 212c349dbc7Sjsg MOD_HDCP_ENCRYPTION_STATUS_HDCP2_ON 213c349dbc7Sjsg }; 214c349dbc7Sjsg 215c349dbc7Sjsg /* per link events dm has to notify to hdcp module */ 216c349dbc7Sjsg enum mod_hdcp_event { 217c349dbc7Sjsg MOD_HDCP_EVENT_CALLBACK = 0, 218c349dbc7Sjsg MOD_HDCP_EVENT_WATCHDOG_TIMEOUT, 219c349dbc7Sjsg MOD_HDCP_EVENT_CPIRQ 220c349dbc7Sjsg }; 221c349dbc7Sjsg 222c349dbc7Sjsg /* output flags from module requesting timer operations */ 223c349dbc7Sjsg struct mod_hdcp_output { 224c349dbc7Sjsg uint8_t callback_needed; 225c349dbc7Sjsg uint8_t callback_stop; 226c349dbc7Sjsg uint8_t watchdog_timer_needed; 227c349dbc7Sjsg uint8_t watchdog_timer_stop; 228c349dbc7Sjsg uint16_t callback_delay; 229c349dbc7Sjsg uint16_t watchdog_timer_delay; 2305ca02815Sjsg uint8_t auth_complete; 231c349dbc7Sjsg }; 232c349dbc7Sjsg 233c349dbc7Sjsg /* used to represent per display info */ 234c349dbc7Sjsg struct mod_hdcp_display { 235c349dbc7Sjsg enum mod_hdcp_display_state state; 236c349dbc7Sjsg uint8_t index; 237c349dbc7Sjsg uint8_t controller; 238c349dbc7Sjsg uint8_t dig_fe; 2395ca02815Sjsg uint8_t stream_enc_idx; 240c349dbc7Sjsg union { 241c349dbc7Sjsg uint8_t vc_id; 242c349dbc7Sjsg }; 243c349dbc7Sjsg struct mod_hdcp_display_adjustment adjust; 244c349dbc7Sjsg }; 245c349dbc7Sjsg 246c349dbc7Sjsg /* used to represent per link info */ 247c349dbc7Sjsg /* in case a link has multiple displays, they share the same link info */ 248c349dbc7Sjsg struct mod_hdcp_link { 249c349dbc7Sjsg enum mod_hdcp_operation_mode mode; 250c349dbc7Sjsg uint8_t dig_be; 251c349dbc7Sjsg uint8_t ddc_line; 2525ca02815Sjsg uint8_t link_enc_idx; 2535ca02815Sjsg uint8_t phy_idx; 2541bb76ff1Sjsg uint8_t dio_output_id; 2555ca02815Sjsg uint8_t hdcp_supported_informational; 256c349dbc7Sjsg union { 257c349dbc7Sjsg struct mod_hdcp_displayport dp; 258c349dbc7Sjsg struct mod_hdcp_hdmi hdmi; 259c349dbc7Sjsg }; 260c349dbc7Sjsg struct mod_hdcp_link_adjustment adjust; 261c349dbc7Sjsg }; 262c349dbc7Sjsg 263c349dbc7Sjsg /* a query structure for a display's hdcp information */ 264c349dbc7Sjsg struct mod_hdcp_display_query { 265c349dbc7Sjsg const struct mod_hdcp_display *display; 266c349dbc7Sjsg const struct mod_hdcp_link *link; 267c349dbc7Sjsg const struct mod_hdcp_trace *trace; 268c349dbc7Sjsg enum mod_hdcp_encryption_status encryption_status; 269c349dbc7Sjsg }; 270c349dbc7Sjsg 271c349dbc7Sjsg /* contains values per on external display configuration change */ 272c349dbc7Sjsg struct mod_hdcp_config { 273c349dbc7Sjsg struct mod_hdcp_psp psp; 274c349dbc7Sjsg struct mod_hdcp_ddc ddc; 275c349dbc7Sjsg uint8_t index; 276c349dbc7Sjsg }; 277c349dbc7Sjsg 278c349dbc7Sjsg /* dm allocates memory of mod_hdcp per dc_link on dm init based on memory size*/ 279c349dbc7Sjsg size_t mod_hdcp_get_memory_size(void); 280c349dbc7Sjsg 281c349dbc7Sjsg /* called per link on link creation */ 282c349dbc7Sjsg enum mod_hdcp_status mod_hdcp_setup(struct mod_hdcp *hdcp, 283c349dbc7Sjsg struct mod_hdcp_config *config); 284c349dbc7Sjsg 285c349dbc7Sjsg /* called per link on link destroy */ 286c349dbc7Sjsg enum mod_hdcp_status mod_hdcp_teardown(struct mod_hdcp *hdcp); 287c349dbc7Sjsg 2885ca02815Sjsg /* called per display after stream is enabled */ 289c349dbc7Sjsg enum mod_hdcp_status mod_hdcp_add_display(struct mod_hdcp *hdcp, 290c349dbc7Sjsg struct mod_hdcp_link *link, struct mod_hdcp_display *display, 291c349dbc7Sjsg struct mod_hdcp_output *output); 292c349dbc7Sjsg 2935ca02815Sjsg /* called per display before stream is disabled */ 294c349dbc7Sjsg enum mod_hdcp_status mod_hdcp_remove_display(struct mod_hdcp *hdcp, 295c349dbc7Sjsg uint8_t index, struct mod_hdcp_output *output); 296c349dbc7Sjsg 2975ca02815Sjsg /* called per display to apply new authentication adjustment */ 2981bb76ff1Sjsg enum mod_hdcp_status mod_hdcp_update_display(struct mod_hdcp *hdcp, 2995ca02815Sjsg uint8_t index, 3005ca02815Sjsg struct mod_hdcp_link_adjustment *link_adjust, 3015ca02815Sjsg struct mod_hdcp_display_adjustment *display_adjust, 3025ca02815Sjsg struct mod_hdcp_output *output); 3035ca02815Sjsg 304c349dbc7Sjsg /* called to query hdcp information on a specific index */ 305c349dbc7Sjsg enum mod_hdcp_status mod_hdcp_query_display(struct mod_hdcp *hdcp, 306c349dbc7Sjsg uint8_t index, struct mod_hdcp_display_query *query); 307c349dbc7Sjsg 308c349dbc7Sjsg /* called per link on connectivity change */ 309c349dbc7Sjsg enum mod_hdcp_status mod_hdcp_reset_connection(struct mod_hdcp *hdcp, 310c349dbc7Sjsg struct mod_hdcp_output *output); 311c349dbc7Sjsg 312c349dbc7Sjsg /* called per link on events (i.e. callback, watchdog, CP_IRQ) */ 313c349dbc7Sjsg enum mod_hdcp_status mod_hdcp_process_event(struct mod_hdcp *hdcp, 314c349dbc7Sjsg enum mod_hdcp_event event, struct mod_hdcp_output *output); 315c349dbc7Sjsg 316c349dbc7Sjsg /* called to convert enum mod_hdcp_status to c string */ 317c349dbc7Sjsg char *mod_hdcp_status_to_str(int32_t status); 318c349dbc7Sjsg 319c349dbc7Sjsg /* called to convert state id to c string */ 320c349dbc7Sjsg char *mod_hdcp_state_id_to_str(int32_t id); 321c349dbc7Sjsg 322c349dbc7Sjsg /* called to convert signal type to operation mode */ 323c349dbc7Sjsg enum mod_hdcp_operation_mode mod_hdcp_signal_type_to_operation_mode( 324c349dbc7Sjsg enum amd_signal_type signal); 325c349dbc7Sjsg #endif /* MOD_HDCP_H_ */ 326