[PATCH v2 16/42] misc/mei/hdcp: Prepare Session Key
Request to ME to prepare the encrypted session key. On Success, ME provides Encrypted session key. Functions populates the HDCP2.2 authentication msg SKE_Send_Eks. v2: Rebased. Signed-off-by: Ramalingam C--- drivers/misc/mei/hdcp/mei_hdcp.c | 67 include/linux/mei_hdcp.h | 8 + 2 files changed, 75 insertions(+) diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c index c3c8b9a28498..fbb88a56e10c 100644 --- a/drivers/misc/mei/hdcp/mei_hdcp.c +++ b/drivers/misc/mei/hdcp/mei_hdcp.c @@ -468,6 +468,73 @@ int mei_verify_lprime(struct mei_hdcp_data *data, } EXPORT_SYMBOL(mei_verify_lprime); +/** + * mei_get_session_key: + * Function to prepare SKE_Send_Eks. + * + * @data : Intel HW specific Data + * @ske_data : Pointer for SKE_Send_Eks. + * + * Returns 0 on Success, <0 on Failure + */ +int mei_get_session_key(struct mei_hdcp_data *data, + struct hdcp2_ske_send_eks *ske_data) +{ + struct wired_cmd_get_session_key_in get_skey_in = { { 0 } }; + struct wired_cmd_get_session_key_out get_skey_out = { { 0 } }; + enum me_hdcp_status status; + struct device *dev; + ssize_t byte; + + if (!data || !ske_data) + return -EINVAL; + + /* check for the mei_device enabled or not */ + if (!mei_cldev_active_and_enabled(data->cldev)) + return -ENODEV; + + dev = >cldev->dev; + + get_skey_in.header.api_version = HDCP_API_VERSION; + get_skey_in.header.command_id = WIRED_GET_SESSION_KEY; + get_skey_in.header.status = ME_HDCP_STATUS_SUCCESS; + get_skey_in.header.buffer_len = WIRED_CMD_BUF_LEN_GET_SESSION_KEY_IN; + + get_skey_in.port.integrated_port_type = data->port_type; + get_skey_in.port.physical_port = data->port; + + /* Request to ME */ + byte = mei_cldev_send(data->cldev, (u8 *)_skey_in, + sizeof(get_skey_in)); + if (byte < 0) { + dev_err(dev, "mei_cldev_send failed. %d\n", (int)byte); + return byte; + } + + /* Response from ME */ + byte = mei_cldev_recv(data->cldev, (u8 *)_skey_out, + sizeof(get_skey_out)); + + if (byte < 0) { + dev_err(dev, "mei_cldev_recv failed. %d\n", (int)byte); + return byte; + } + + status = (enum me_hdcp_status)get_skey_out.header.status; + if (status != ME_HDCP_STATUS_SUCCESS) { + dev_err(dev, "ME cmd 0x%08X failed. status: 0x%X\n", + WIRED_GET_SESSION_KEY, status); + return -1; + } + + ske_data->msg_id = HDCP_2_2_SKE_SEND_EKS; + memcpy(ske_data->e_dkey_ks, get_skey_out.e_dkey_ks, + HDCP_2_2_E_DKEY_KS_LEN); + memcpy(ske_data->riv, get_skey_out.r_iv, HDCP_2_2_RIV_LEN); + return 0; +} +EXPORT_SYMBOL(mei_get_session_key); + static int mei_hdcp_probe(struct mei_cl_device *cldev, const struct mei_cl_device_id *id) { diff --git a/include/linux/mei_hdcp.h b/include/linux/mei_hdcp.h index d8c2b440cd81..193f23ba8fbc 100644 --- a/include/linux/mei_hdcp.h +++ b/include/linux/mei_hdcp.h @@ -119,6 +119,8 @@ int mei_initiate_locality_check(struct mei_hdcp_data *data, struct hdcp2_lc_init *lc_init_data); int mei_verify_lprime(struct mei_hdcp_data *data, struct hdcp2_lc_send_lprime *rx_lprime); +int mei_get_session_key(struct mei_hdcp_data *data, + struct hdcp2_ske_send_eks *ske_data); #else static inline int mei_hdcp_cldev_get_reference(void *client_data, @@ -172,5 +174,11 @@ int mei_verify_lprime(struct mei_hdcp_data *data, { return -ENODEV; } +static inline +int mei_get_session_key(struct mei_hdcp_data *data, + struct hdcp2_ske_send_eks *ske_data) +{ + return -ENODEV; +} #endif /* defined (CONFIG_INTEL_MEI_HDCP) */ #endif /* defined (_LINUX_MEI_HDCP_H) */ -- 2.7.4 ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
[PATCH v2 17/42] misc/mei/hdcp: Repeater topology verifcation and ack
Request ot ME to verify the downatream topology information received. ME FW will validate the Repeaters receiver id list and downstream topology. On Success ME FW will provide the Least Significant 128bits of VPrime, which forms the repeater ack. v2: Rebased. Signed-off-by: Ramalingam C--- drivers/misc/mei/hdcp/mei_hdcp.c | 84 include/linux/mei_hdcp.h | 13 +++ 2 files changed, 97 insertions(+) diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c index fbb88a56e10c..02c90770dcb6 100644 --- a/drivers/misc/mei/hdcp/mei_hdcp.c +++ b/drivers/misc/mei/hdcp/mei_hdcp.c @@ -535,6 +535,90 @@ int mei_get_session_key(struct mei_hdcp_data *data, } EXPORT_SYMBOL(mei_get_session_key); +/** + * mei_repeater_check_flow_prepare_ack: + * Function to validate the Downstream topology and prepare rep_ack. + * + * @data : Intel HW specific Data + * @rep_topology : Pointer for Receiver Id List to be validated. + * @rep_send_ack : Pointer for repeater ack + * + * Returns 0 on Success, <0 on Failure + */ + +int +mei_repeater_check_flow_prepare_ack(struct mei_hdcp_data *data, + struct hdcp2_rep_send_receiverid_list + *rep_topology, + struct hdcp2_rep_send_ack *rep_send_ack) +{ + struct wired_cmd_verify_repeater_in verify_repeater_in = { { 0 } }; + struct wired_cmd_verify_repeater_out verify_repeater_out = { { 0 } }; + enum me_hdcp_status status; + struct device *dev; + ssize_t byte; + + if (!rep_topology || !rep_send_ack || !data) + return -EINVAL; + + /* check for the mei_device enabled or not */ + if (!mei_cldev_active_and_enabled(data->cldev)) + return -ENODEV; + + dev = >cldev->dev; + + verify_repeater_in.header.api_version = HDCP_API_VERSION; + verify_repeater_in.header.command_id = WIRED_VERIFY_REPEATER; + verify_repeater_in.header.status = ME_HDCP_STATUS_SUCCESS; + verify_repeater_in.header.buffer_len = + WIRED_CMD_BUF_LEN_VERIFY_REPEATER_IN; + + verify_repeater_in.port.integrated_port_type = data->port_type; + verify_repeater_in.port.physical_port = data->port; + + memcpy(verify_repeater_in.rx_info, rep_topology->rx_info, + HDCP_2_2_RXINFO_LEN); + memcpy(verify_repeater_in.seq_num_v, rep_topology->seq_num_v, + HDCP_2_2_SEQ_NUM_LEN); + memcpy(verify_repeater_in.v_prime, rep_topology->v_prime, + HDCP_2_2_LPRIME_HALF_LEN); + memcpy(verify_repeater_in.receiver_ids, rep_topology->receiver_ids, + HDCP_2_2_RECEIVER_IDS_MAX_LEN); + + /* Request to ME */ + byte = mei_cldev_send(data->cldev, (u8 *)_repeater_in, + sizeof(verify_repeater_in)); + if (byte < 0) { + dev_err(dev, "mei_cldev_send failed. %d\n", (int)byte); + return byte; + } + + /* Response from ME */ + byte = mei_cldev_recv(data->cldev, (u8 *)_repeater_out, + sizeof(verify_repeater_out)); + if (byte < 0) { + dev_err(dev, "mei_cldev_recv failed. %d\n", (int)byte); + return byte; + } + + status = (enum me_hdcp_status)verify_repeater_out.header.status; + if (status != ME_HDCP_STATUS_SUCCESS) { + dev_err(dev, "ME cmd 0x%08X failed. status: 0x%X\n", + WIRED_VERIFY_REPEATER, status); + return -1; + } + + /* +* Need to send the last byte of the V prime back to +* the Repeater +*/ + memcpy(rep_send_ack->v, verify_repeater_out.v, + HDCP_2_2_LPRIME_HALF_LEN); + rep_send_ack->msg_id = HDCP_2_2_REP_SEND_ACK; + return 0; +} +EXPORT_SYMBOL(mei_repeater_check_flow_prepare_ack); + static int mei_hdcp_probe(struct mei_cl_device *cldev, const struct mei_cl_device_id *id) { diff --git a/include/linux/mei_hdcp.h b/include/linux/mei_hdcp.h index 193f23ba8fbc..c8f6fc90f475 100644 --- a/include/linux/mei_hdcp.h +++ b/include/linux/mei_hdcp.h @@ -121,6 +121,11 @@ int mei_verify_lprime(struct mei_hdcp_data *data, struct hdcp2_lc_send_lprime *rx_lprime); int mei_get_session_key(struct mei_hdcp_data *data, struct hdcp2_ske_send_eks *ske_data); +int +mei_repeater_check_flow_prepare_ack(struct mei_hdcp_data *data, + struct hdcp2_rep_send_receiverid_list + *rep_topology, + struct hdcp2_rep_send_ack *rep_send_ack); #else static inline int mei_hdcp_cldev_get_reference(void *client_data, @@ -180,5 +185,13 @@ int
[PATCH v2 13/42] misc/mei/hdcp: Store the HDCP Pairing info
Provides Pairing info to ME to store. Pairing is a process to fast track the subsequent authentication with the same HDCP sink. On Success, received HDCP pairing info is stored in non-volatile memory of ME. v2: Rebased. Signed-off-by: Ramalingam C--- drivers/misc/mei/hdcp/mei_hdcp.c | 66 include/linux/mei_hdcp.h | 8 + 2 files changed, 74 insertions(+) diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c index 37faca9a3cc8..753a6a466611 100644 --- a/drivers/misc/mei/hdcp/mei_hdcp.c +++ b/drivers/misc/mei/hdcp/mei_hdcp.c @@ -273,6 +273,72 @@ int mei_verify_hprime(struct mei_hdcp_data *data, } EXPORT_SYMBOL(mei_verify_hprime); +/** + * mei_store_pairing_info: + * Function to store pairing info received from panel + * + * @data : Intel HW specific Data + * @pairing_info : Pointer for AKE_Send_Pairing_Info + * + * Returns 0 on Success, <0 on Failure + */ + +int mei_store_pairing_info(struct mei_hdcp_data *data, + struct hdcp2_ake_send_pairing_info *pairing_info) +{ + struct wired_cmd_ake_send_pairing_info_in pairing_info_in = { { 0 } }; + struct wired_cmd_ake_send_pairing_info_out pairing_info_out = { { 0 } }; + enum me_hdcp_status status = ME_HDCP_STATUS_UNKNOWN_ERROR; + struct device *dev; + ssize_t byte; + + if (!data || !pairing_info) + return -EINVAL; + + /* check for the mei_device enabled or not */ + if (!mei_cldev_active_and_enabled(data->cldev)) + return -ENODEV; + + dev = >cldev->dev; + + pairing_info_in.header.api_version = HDCP_API_VERSION; + pairing_info_in.header.command_id = WIRED_AKE_SEND_PAIRING_INFO; + pairing_info_in.header.status = ME_HDCP_STATUS_SUCCESS; + pairing_info_in.header.buffer_len = + WIRED_CMD_BUF_LEN_SEND_PAIRING_INFO_IN; + + pairing_info_in.port.integrated_port_type = data->port_type; + pairing_info_in.port.physical_port = data->port; + + memcpy(pairing_info_in.e_kh_km, pairing_info->e_kh_km, + sizeof(pairing_info_in.e_kh_km)); + + /* Request to ME */ + byte = mei_cldev_send(data->cldev, (u8 *)_info_in, + sizeof(pairing_info_in)); + if (byte < 0) { + dev_err(dev, "mei_cldev_send failed. %d\n", (int)byte); + return byte; + } + + /* Response from ME */ + byte = mei_cldev_recv(data->cldev, (u8 *)_info_out, + sizeof(pairing_info_out)); + if (byte < 0) { + dev_err(dev, "mei_cldev_recv failed. %d\n", (int)byte); + return byte; + } + + status = (enum me_hdcp_status)pairing_info_out.header.status; + if (status != ME_HDCP_STATUS_SUCCESS) { + dev_err(dev, "ME cmd 0x%08X failed. Status: 0x%X\n", + WIRED_AKE_SEND_PAIRING_INFO, status); + return -1; + } + return 0; +} +EXPORT_SYMBOL(mei_store_pairing_info); + static int mei_hdcp_probe(struct mei_cl_device *cldev, const struct mei_cl_device_id *id) { diff --git a/include/linux/mei_hdcp.h b/include/linux/mei_hdcp.h index 3590e3421134..449ac3af4d53 100644 --- a/include/linux/mei_hdcp.h +++ b/include/linux/mei_hdcp.h @@ -113,6 +113,8 @@ mei_verify_receiver_cert_prepare_km(struct mei_hdcp_data *data, size_t *msg_sz); int mei_verify_hprime(struct mei_hdcp_data *data, struct hdcp2_ake_send_hprime *rx_hprime); +int mei_store_pairing_info(struct mei_hdcp_data *data, + struct hdcp2_ake_send_pairing_info *pairing_info); #else static inline int mei_hdcp_cldev_get_reference(void *client_data, @@ -148,5 +150,11 @@ int mei_verify_hprime(struct mei_hdcp_data *data, { return -ENODEV; } +static inline +int mei_store_pairing_info(struct mei_hdcp_data *data, + struct hdcp2_ake_send_pairing_info *pairing_info) +{ + return -ENODEV; +} #endif /* defined (CONFIG_INTEL_MEI_HDCP) */ #endif /* defined (_LINUX_MEI_HDCP_H) */ -- 2.7.4 ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
[PATCH v2 12/42] misc/mei/hdcp: Verify H_prime
Requests for the verifcation of AKE_Send_H_prime. ME will calculation the H and comparing it with received H_Prime. Here AKE_Send_H_prime is a HDCP2.2 Authentication msg. v2: Rebased. Signed-off-by: Ramalingam C--- drivers/misc/mei/hdcp/mei_hdcp.c | 65 include/linux/mei_hdcp.h | 8 + 2 files changed, 73 insertions(+) diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c index 7c3f02c2e324..37faca9a3cc8 100644 --- a/drivers/misc/mei/hdcp/mei_hdcp.c +++ b/drivers/misc/mei/hdcp/mei_hdcp.c @@ -208,6 +208,71 @@ mei_verify_receiver_cert_prepare_km(struct mei_hdcp_data *data, } EXPORT_SYMBOL(mei_verify_receiver_cert_prepare_km); +/** + * mei_verify_hprime: + * Function to verify AKE_Send_H_prime received + * + * @data : Intel HW specific Data + * @rx_hprime : Pointer for AKE_Send_H_prime + * @hprime_sz : Input buffer size + * + * Returns 0 on Success, <0 on Failure + */ +int mei_verify_hprime(struct mei_hdcp_data *data, + struct hdcp2_ake_send_hprime *rx_hprime) +{ + struct wired_cmd_ake_send_hprime_in send_hprime_in = { { 0 } }; + struct wired_cmd_ake_send_hprime_out send_hprime_out = { { 0 } }; + enum me_hdcp_status status; + struct device *dev; + ssize_t byte; + + if (!data || !rx_hprime) + return -EINVAL; + + /* check for the mei_device enabled or not */ + if (!mei_cldev_active_and_enabled(data->cldev)) + return -ENODEV; + + dev = >cldev->dev; + + send_hprime_in.header.api_version = HDCP_API_VERSION; + send_hprime_in.header.command_id = WIRED_AKE_SEND_HPRIME; + send_hprime_in.header.status = ME_HDCP_STATUS_SUCCESS; + send_hprime_in.header.buffer_len = WIRED_CMD_BUF_LEN_AKE_SEND_HPRIME_IN; + + send_hprime_in.port.integrated_port_type = data->port_type; + send_hprime_in.port.physical_port = data->port; + + memcpy(send_hprime_in.h_prime, rx_hprime->h_prime, + sizeof(rx_hprime->h_prime)); + + /* Request to ME */ + byte = mei_cldev_send(data->cldev, (u8 *)_hprime_in, + sizeof(send_hprime_in)); + if (byte < 0) { + dev_err(dev, "mei_cldev_send failed. %d\n", (int)byte); + return byte; + } + + /* Response from ME */ + byte = mei_cldev_recv(data->cldev, (u8 *)_hprime_out, + sizeof(send_hprime_out)); + if (byte < 0) { + dev_err(dev, "mei_cldev_recv failed. %d\n", (int)byte); + return byte; + } + + status = (enum me_hdcp_status)send_hprime_out.header.status; + if (status != ME_HDCP_STATUS_SUCCESS) { + dev_err(dev, "ME cmd 0x%08X Failed. Status: 0x%X\n", + WIRED_AKE_SEND_HPRIME, status); + return -1; + } + return 0; +} +EXPORT_SYMBOL(mei_verify_hprime); + static int mei_hdcp_probe(struct mei_cl_device *cldev, const struct mei_cl_device_id *id) { diff --git a/include/linux/mei_hdcp.h b/include/linux/mei_hdcp.h index 510a5c1ff1ff..3590e3421134 100644 --- a/include/linux/mei_hdcp.h +++ b/include/linux/mei_hdcp.h @@ -111,6 +111,8 @@ mei_verify_receiver_cert_prepare_km(struct mei_hdcp_data *data, bool *km_stored, struct hdcp2_ake_no_stored_km *ek_pub_km, size_t *msg_sz); +int mei_verify_hprime(struct mei_hdcp_data *data, + struct hdcp2_ake_send_hprime *rx_hprime); #else static inline int mei_hdcp_cldev_get_reference(void *client_data, @@ -140,5 +142,11 @@ mei_verify_receiver_cert_prepare_km(struct mei_hdcp_data *data, { return -ENODEV; } +static inline +int mei_verify_hprime(struct mei_hdcp_data *data, + struct hdcp2_ake_send_hprime *rx_hprime) +{ + return -ENODEV; +} #endif /* defined (CONFIG_INTEL_MEI_HDCP) */ #endif /* defined (_LINUX_MEI_HDCP_H) */ -- 2.7.4 ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
[PATCH v2 15/42] misc/mei/hdcp: Verify L_prime
Request to ME to verify the LPrime received from HDCP sink. On Success, ME FW will verify the received Lprime by calculating and comparing with L. This represents the completion of Locality Check. v2: Rebased. Signed-off-by: Ramalingam C--- drivers/misc/mei/hdcp/mei_hdcp.c | 65 include/linux/mei_hdcp.h | 8 + 2 files changed, 73 insertions(+) diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c index ff19de58222f..c3c8b9a28498 100644 --- a/drivers/misc/mei/hdcp/mei_hdcp.c +++ b/drivers/misc/mei/hdcp/mei_hdcp.c @@ -403,6 +403,71 @@ int mei_initiate_locality_check(struct mei_hdcp_data *data, } EXPORT_SYMBOL(mei_initiate_locality_check); +/** + * mei_verify_lprime: + * Function to verify lprime. + * + * @data : Intel HW specific Data + * @rx_lprime : Pointer for LC_Send_L_prime + * + * Returns 0 on Success, <0 on Failure + */ +int mei_verify_lprime(struct mei_hdcp_data *data, + struct hdcp2_lc_send_lprime *rx_lprime) +{ + struct wired_cmd_validate_locality_in verify_lprime_in = { { 0 } }; + struct wired_cmd_validate_locality_out verify_lprime_out = { { 0 } }; + enum me_hdcp_status status; + struct device *dev; + ssize_t byte; + + if (!data || !rx_lprime) + return -EINVAL; + + /* check for the mei_device enabled or not */ + if (!mei_cldev_active_and_enabled(data->cldev)) + return -ENODEV; + + dev = >cldev->dev; + + verify_lprime_in.header.api_version = HDCP_API_VERSION; + verify_lprime_in.header.command_id = WIRED_VALIDATE_LOCALITY; + verify_lprime_in.header.status = ME_HDCP_STATUS_SUCCESS; + verify_lprime_in.header.buffer_len = + WIRED_CMD_BUF_LEN_VALIDATE_LOCALITY_IN; + + verify_lprime_in.port.integrated_port_type = data->port_type; + verify_lprime_in.port.physical_port = data->port; + + memcpy(verify_lprime_in.l_prime, rx_lprime->l_prime, + sizeof(rx_lprime->l_prime)); + + /* Request to ME */ + byte = mei_cldev_send(data->cldev, (u8 *)_lprime_in, + sizeof(verify_lprime_in)); + if (byte < 0) { + dev_err(dev, "mei_cldev_send failed. %d\n", (int)byte); + return byte; + } + + /* Response from ME */ + byte = mei_cldev_recv(data->cldev, (u8 *)_lprime_out, + sizeof(verify_lprime_out)); + if (byte < 0) { + dev_err(dev, "mei_cldev_recv failed. %d\n", (int)byte); + return byte; + } + + status = (enum me_hdcp_status)verify_lprime_out.header.status; + if (status != ME_HDCP_STATUS_SUCCESS) { + dev_err(dev, "ME cmd 0x%08X failed. status: 0x%X\n", + WIRED_VALIDATE_LOCALITY, status); + return -1; + } + return 0; +} +EXPORT_SYMBOL(mei_verify_lprime); + static int mei_hdcp_probe(struct mei_cl_device *cldev, const struct mei_cl_device_id *id) { diff --git a/include/linux/mei_hdcp.h b/include/linux/mei_hdcp.h index fd8a26dddacb..d8c2b440cd81 100644 --- a/include/linux/mei_hdcp.h +++ b/include/linux/mei_hdcp.h @@ -117,6 +117,8 @@ int mei_store_pairing_info(struct mei_hdcp_data *data, struct hdcp2_ake_send_pairing_info *pairing_info); int mei_initiate_locality_check(struct mei_hdcp_data *data, struct hdcp2_lc_init *lc_init_data); +int mei_verify_lprime(struct mei_hdcp_data *data, + struct hdcp2_lc_send_lprime *rx_lprime); #else static inline int mei_hdcp_cldev_get_reference(void *client_data, @@ -164,5 +166,11 @@ int mei_initiate_locality_check(struct mei_hdcp_data *data, { return -ENODEV; } +static inline +int mei_verify_lprime(struct mei_hdcp_data *data, + struct hdcp2_lc_send_lprime *rx_lprime) +{ + return -ENODEV; +} #endif /* defined (CONFIG_INTEL_MEI_HDCP) */ #endif /* defined (_LINUX_MEI_HDCP_H) */ -- 2.7.4 ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
[PATCH v2 14/42] misc/mei/hdcp: Initiate Locality check
Requests ME to start the second stage of HDCP2.2 authentication, called Locality Check. On Success, ME FW will provide LC_Init message to send to hdcp sink. v2: Rebased. Signed-off-by: Ramalingam C--- drivers/misc/mei/hdcp/mei_hdcp.c | 64 include/linux/mei_hdcp.h | 8 + 2 files changed, 72 insertions(+) diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c index 753a6a466611..ff19de58222f 100644 --- a/drivers/misc/mei/hdcp/mei_hdcp.c +++ b/drivers/misc/mei/hdcp/mei_hdcp.c @@ -339,6 +339,70 @@ int mei_store_pairing_info(struct mei_hdcp_data *data, } EXPORT_SYMBOL(mei_store_pairing_info); +/** + * mei_initiate_locality_check: + * Function to prepare LC_Init. + * + * @data : Intel HW specific Data + * @hdcp2_lc_init : Pointer for storing LC_Init + * + * Returns 0 on Success, <0 on Failure + */ +int mei_initiate_locality_check(struct mei_hdcp_data *data, + struct hdcp2_lc_init *lc_init_data) +{ + struct wired_cmd_init_locality_check_in lc_init_in = { { 0 } }; + struct wired_cmd_init_locality_check_out lc_init_out = { { 0 } }; + enum me_hdcp_status status; + struct device *dev; + ssize_t byte; + + if (!data || !lc_init_data) + return -EINVAL; + + /* check for the mei_device enabled or not */ + if (!mei_cldev_active_and_enabled(data->cldev)) + return -ENODEV; + + dev = >cldev->dev; + + lc_init_in.header.api_version = HDCP_API_VERSION; + lc_init_in.header.command_id = WIRED_INIT_LOCALITY_CHECK; + lc_init_in.header.status = ME_HDCP_STATUS_SUCCESS; + lc_init_in.header.buffer_len = WIRED_CMD_BUF_LEN_INIT_LOCALITY_CHECK_IN; + + lc_init_in.port.integrated_port_type = data->port_type; + lc_init_in.port.physical_port = data->port; + + /* Request to ME */ + byte = mei_cldev_send(data->cldev, (u8 *)_init_in, + sizeof(lc_init_in)); + if (byte < 0) { + dev_err(dev, "mei_cldev_send failed. %d\n", (int)byte); + return byte; + } + + /* Response from ME */ + byte = mei_cldev_recv(data->cldev, (u8 *)_init_out, + sizeof(lc_init_out)); + if (byte < 0) { + dev_err(dev, "mei_cldev_recv failed. %d\n", (int)byte); + return byte; + } + + status = (enum me_hdcp_status)lc_init_out.header.status; + if (status != ME_HDCP_STATUS_SUCCESS) { + dev_err(dev, "ME cmd 0x%08X Failed. status: 0x%X\n", + WIRED_INIT_LOCALITY_CHECK, status); + return -1; + } + + lc_init_data->msg_id = HDCP_2_2_LC_INIT; + memcpy(lc_init_data->r_n, lc_init_out.r_n, HDCP_2_2_RN_LEN); + return 0; +} +EXPORT_SYMBOL(mei_initiate_locality_check); + static int mei_hdcp_probe(struct mei_cl_device *cldev, const struct mei_cl_device_id *id) { diff --git a/include/linux/mei_hdcp.h b/include/linux/mei_hdcp.h index 449ac3af4d53..fd8a26dddacb 100644 --- a/include/linux/mei_hdcp.h +++ b/include/linux/mei_hdcp.h @@ -115,6 +115,8 @@ int mei_verify_hprime(struct mei_hdcp_data *data, struct hdcp2_ake_send_hprime *rx_hprime); int mei_store_pairing_info(struct mei_hdcp_data *data, struct hdcp2_ake_send_pairing_info *pairing_info); +int mei_initiate_locality_check(struct mei_hdcp_data *data, + struct hdcp2_lc_init *lc_init_data); #else static inline int mei_hdcp_cldev_get_reference(void *client_data, @@ -156,5 +158,11 @@ int mei_store_pairing_info(struct mei_hdcp_data *data, { return -ENODEV; } +static inline +int mei_initiate_locality_check(struct mei_hdcp_data *data, + struct hdcp2_lc_init *lc_init_data) +{ + return -ENODEV; +} #endif /* defined (CONFIG_INTEL_MEI_HDCP) */ #endif /* defined (_LINUX_MEI_HDCP_H) */ -- 2.7.4 ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
[PATCH v2 11/42] misc/mei/hdcp: Verify Receiver Cert and prepare km
Requests for verification for receiver certification and also the preparation for next AKE auth message with km. On Success ME FW validate the HDCP2.2 receivers certificate and do the revocation check on the receiver ID. AKE_Stored_Km will be prepared if the receiver is already paired, else AKE_No_Stored_Km will be prepared. Here AKE_Stored_Km and AKE_No_Stored_Km are HDCP2.2 protocol msgs. v2: Rebased. Signed-off-by: Ramalingam C--- drivers/misc/mei/hdcp/mei_hdcp.c | 89 include/linux/mei_hdcp.h | 15 +++ 2 files changed, 104 insertions(+) diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c index 516ad6a40616..7c3f02c2e324 100644 --- a/drivers/misc/mei/hdcp/mei_hdcp.c +++ b/drivers/misc/mei/hdcp/mei_hdcp.c @@ -119,6 +119,95 @@ int mei_initiate_hdcp2_session(struct mei_hdcp_data *data, } EXPORT_SYMBOL(mei_initiate_hdcp2_session); +/** + * mei_verify_receiver_cert_prepare_km: + * Function to verify the Receiver Certificate AKE_Send_Cert + * and prepare AKE_Stored_Km or AKE_No_Stored_Km + * + * @data : Intel HW specific Data + * @rx_cert: Pointer for AKE_Send_Cert + * @km_stored : Pointer for pairing status flag + * @ek_pub_km : Pointer for output msg + * @msg_sz : Pointer for size of AKE_X_Km + * + * Returns 0 on Success, <0 on Failure + */ +int +mei_verify_receiver_cert_prepare_km(struct mei_hdcp_data *data, + struct hdcp2_ake_send_cert *rx_cert, + bool *km_stored, + struct hdcp2_ake_no_stored_km *ek_pub_km, + size_t *msg_sz) +{ + struct wired_cmd_verify_receiver_cert_in verify_rxcert_in = { { 0 } }; + struct wired_cmd_verify_receiver_cert_out verify_rxcert_out = { { 0 } }; + enum me_hdcp_status status; + struct device *dev; + ssize_t byte; + + if (!data || !rx_cert || !km_stored || !ek_pub_km || !msg_sz) + return -EINVAL; + + /* check for the mei_device enabled or not */ + if (!mei_cldev_active_and_enabled(data->cldev)) + return -ENODEV; + + dev = >cldev->dev; + + /* Fill header details */ + verify_rxcert_in.header.api_version = HDCP_API_VERSION; + verify_rxcert_in.header.command_id = WIRED_VERIFY_RECEIVER_CERT; + verify_rxcert_in.header.status = ME_HDCP_STATUS_SUCCESS; + verify_rxcert_in.header.buffer_len = + WIRED_CMD_BUF_LEN_VERIFY_RECEIVER_CERT_IN; + + /* Fill the data */ + verify_rxcert_in.port.integrated_port_type = data->port_type; + verify_rxcert_in.port.physical_port = data->port; + + memcpy(_rxcert_in.cert_rx, _cert->cert_rx, + sizeof(rx_cert->cert_rx)); + memcpy(verify_rxcert_in.r_rx, _cert->r_rx, sizeof(rx_cert->r_rx)); + memcpy(verify_rxcert_in.rx_caps, rx_cert->rx_caps, HDCP_2_2_RXCAPS_LEN); + + /* Request to ME */ + byte = mei_cldev_send(data->cldev, (u8 *)_rxcert_in, + sizeof(verify_rxcert_in)); + if (byte < 0) { + dev_err(dev, "mei_cldev_send failed: %d\n", (int)byte); + return byte; + } + + /* Response from ME */ + byte = mei_cldev_recv(data->cldev, (u8 *)_rxcert_out, + sizeof(verify_rxcert_out)); + if (byte < 0) { + dev_err(dev, "mei_cldev_recv failed: %d\n", (int)byte); + return byte; + } + + status = (enum me_hdcp_status)verify_rxcert_out.header.status; + if (status != ME_HDCP_STATUS_SUCCESS) { + dev_err(dev, "ME cmd 0x%08X Failed. Status: 0x%X\n", + WIRED_VERIFY_RECEIVER_CERT, status); + return -1; + } + + *km_stored = verify_rxcert_out.km_stored; + if (verify_rxcert_out.km_stored) { + ek_pub_km->msg_id = HDCP_2_2_AKE_STORED_KM; + *msg_sz = sizeof(struct hdcp2_ake_stored_km); + } else { + ek_pub_km->msg_id = HDCP_2_2_AKE_NO_STORED_KM; + *msg_sz = sizeof(struct hdcp2_ake_no_stored_km); + } + + memcpy(ek_pub_km->e_kpub_km, _rxcert_out.ekm_buff, + sizeof(verify_rxcert_out.ekm_buff)); + return 0; +} +EXPORT_SYMBOL(mei_verify_receiver_cert_prepare_km); + static int mei_hdcp_probe(struct mei_cl_device *cldev, const struct mei_cl_device_id *id) { diff --git a/include/linux/mei_hdcp.h b/include/linux/mei_hdcp.h index c333528b9c1e..510a5c1ff1ff 100644 --- a/include/linux/mei_hdcp.h +++ b/include/linux/mei_hdcp.h @@ -105,6 +105,12 @@ void mei_hdcp_cldev_put_reference(struct mei_cl_device *cldev); int mei_initiate_hdcp2_session(struct mei_hdcp_data *data, struct hdcp2_ake_init *ake_data); +int
[PATCH v2 10/42] misc/mei/hdcp: Initiate Wired HDCP2.2 Tx Session
Request ME FW to start the HDCP2.2 session for a intel port. Prepares payloads for command WIRED_INITIATE_HDCP2_SESSION and sent to ME FW. On Success, ME FW will start a HDCP2.2 session for the port and provides the content for HDCP2.2 AKE_Init message. v2: Rebased. Signed-off-by: Ramalingam C--- drivers/misc/mei/hdcp/mei_hdcp.c | 73 include/linux/mei_hdcp.h | 11 ++ 2 files changed, 84 insertions(+) diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c index 63f77800a6f7..516ad6a40616 100644 --- a/drivers/misc/mei/hdcp/mei_hdcp.c +++ b/drivers/misc/mei/hdcp/mei_hdcp.c @@ -29,6 +29,7 @@ #include #include #include +#include #include "mei_hdcp.h" @@ -46,6 +47,78 @@ static inline bool mei_cldev_active_and_enabled(struct mei_cl_device *cldev) return mei_cldev_enabled(cldev); } +/** + * mei_initiate_hdcp2_session: + * Function to start a Wired HDCP2.2 Tx Session with ME FW + * + * @data : Intel HW specific Data + * @ake_data : ptr to store AKE_Init + * + * Returns 0 on Success, <0 on Failure. + */ +int mei_initiate_hdcp2_session(struct mei_hdcp_data *data, + struct hdcp2_ake_init *ake_data) +{ + struct wired_cmd_initiate_hdcp2_session_in session_init_in = { { 0 } }; + struct wired_cmd_initiate_hdcp2_session_out + session_init_out = { { 0 } }; + enum me_hdcp_status status; + struct device *dev; + ssize_t byte; + + if (!data || !ake_data) + return -EINVAL; + + /* check for the mei_device enabled or not */ + if (!mei_cldev_active_and_enabled(data->cldev)) + return -ENODEV; + + dev = >cldev->dev; + + /* Fill header details */ + session_init_in.header.api_version = HDCP_API_VERSION; + session_init_in.header.command_id = WIRED_INITIATE_HDCP2_SESSION; + session_init_in.header.status = ME_HDCP_STATUS_SUCCESS; + session_init_in.header.buffer_len = + WIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_IN; + + /* Fill in the In Data */ + session_init_in.port.integrated_port_type = data->port_type; + session_init_in.port.physical_port = data->port; + session_init_in.protocol = (uint8_t)data->protocol; + + /* Request to ME */ + byte = mei_cldev_send(data->cldev, (u8 *)_init_in, + sizeof(session_init_in)); + if (byte < 0) { + dev_err(dev, "mei_cldev_send failed. %d\n", (int)byte); + return byte; + } + + /* Response from ME */ + byte = mei_cldev_recv(data->cldev, (u8 *)_init_out, + sizeof(session_init_out)); + if (byte < 0) { + dev_err(dev, "mei_cldev_recv failed. %d\n", (int)byte); + return byte; + } + + status = (enum me_hdcp_status)session_init_out.header.status; + if (status != ME_HDCP_STATUS_SUCCESS) { + dev_err(dev, "ME cmd 0x%08X Failed. Status: 0x%X\n", + WIRED_INITIATE_HDCP2_SESSION, status); + return -1; + } + + ake_data->msg_id = HDCP_2_2_AKE_INIT; + ake_data->tx_caps = session_init_out.tx_caps; + memcpy(ake_data->r_tx, session_init_out.r_tx, + sizeof(session_init_out.r_tx)); + + return 0; +} +EXPORT_SYMBOL(mei_initiate_hdcp2_session); + static int mei_hdcp_probe(struct mei_cl_device *cldev, const struct mei_cl_device_id *id) { diff --git a/include/linux/mei_hdcp.h b/include/linux/mei_hdcp.h index 9a869d1cbd5d..c333528b9c1e 100644 --- a/include/linux/mei_hdcp.h +++ b/include/linux/mei_hdcp.h @@ -24,6 +24,7 @@ #define _LINUX_MEI_HDCP_H #include +#include /* * Enumeration of the physical DDI available on the platform @@ -101,6 +102,9 @@ int mei_hdcp_cldev_get_reference(void *client_data, struct mei_cl_device *cldev)); void mei_hdcp_cldev_put_reference(struct mei_cl_device *cldev); + +int mei_initiate_hdcp2_session(struct mei_hdcp_data *data, + struct hdcp2_ake_init *ake_data); #else static inline int mei_hdcp_cldev_get_reference(void *client_data, @@ -114,5 +118,12 @@ int mei_hdcp_cldev_get_reference(void *client_data, static inline void mei_hdcp_cldev_put_reference(struct mei_cl_device *cldev) {} + +static inline +int mei_initiate_hdcp2_session(struct mei_hdcp_data *data, + struct hdcp2_ake_init *ake_data) +{ + return -ENODEV; +} #endif /* defined (CONFIG_INTEL_MEI_HDCP) */ #endif /* defined (_LINUX_MEI_HDCP_H) */ -- 2.7.4 ___ dri-devel mailing list dri-devel@lists.freedesktop.org
[PATCH v2 09/42] linux/mei: Header for mei_hdcp driver interface
Data structures and Enum for the I915-MEI_HDCP interface are defined at v2: Rebased. Signed-off-by: Ramalingam C--- include/linux/mei_hdcp.h | 71 1 file changed, 71 insertions(+) diff --git a/include/linux/mei_hdcp.h b/include/linux/mei_hdcp.h index 774b26da0c26..9a869d1cbd5d 100644 --- a/include/linux/mei_hdcp.h +++ b/include/linux/mei_hdcp.h @@ -23,6 +23,77 @@ #ifndef _LINUX_MEI_HDCP_H #define _LINUX_MEI_HDCP_H +#include + +/* + * Enumeration of the physical DDI available on the platform + */ +enum physical_port { + INVALID_PORT = 0x00,/* Not a valid port */ + + DDI_RANGE_BEGIN = 0x01, /* Beginning of the valid DDI port range */ + DDI_B = 0x01, /* Port DDI B */ + DDI_C = 0x02, /* Port DDI C */ + DDI_D = 0x03, /* Port DDI D */ + DDI_E = 0x04, /* Port DDI E */ + DDI_F = 0x05, /* Port DDI F */ + DDI_A = 0x07, /* Port DDI A */ + DDI_RANGE_END = DDI_A,/* End of the valid DDI port range */ +}; + +/* The types of HDCP 2.2 ports supported */ +enum hdcp_integrated_port_type { + HDCP_INVALID_TYPE = 0x00, + + /* HDCP 2.x ports that are integrated into Intel HW */ + INTEGRATED = 0x01, + + /* HDCP2.2 discrete wired Tx port with LSPCON (HDMI 2.0) solution */ + LSPCON = 0x02, + + /* HDCP2.2 discrete wired Tx port using the CPDP (DP 1.3) solution */ + CPDP= 0x03, +}; + +/** + * wired_protocol: Supported integrated wired HDCP protocol. + * Based on this value, Minor differenceneeded between wired specifications + * are handled. + */ +enum hdcp_protocol { + HDCP_PROTOCOL_INVALID, + HDCP_PROTOCOL_HDMI, + HDCP_PROTOCOL_DP +}; + +/** + * mei_hdcp_data: Input data to the mei_hdcp APIs. + */ +struct mei_hdcp_data { + struct mei_cl_device *cldev; + enum physical_port port; + enum hdcp_integrated_port_type port_type; + enum hdcp_protocol protocol; + + /* +* No of streams transmitted on a port. +* In case of HDMI & DP SST, single stream will be +* transmitted on a port. +*/ + uint16_t k; + + /* +* Count of RepeaterAuth_Stream_Manage msg propagated. +* Initialized to 0 on AKE_INIT. Incremented after every successful +* transmission of RepeaterAuth_Stream_Manage message. When it rolls +* over re-Auth has to be triggered. +*/ + uint32_t seq_num_m; + + /* k(No of Streams per port) x structure of wired_streamid_type */ + struct hdcp2_streamid_type *streams; +}; + #ifdef CONFIG_INTEL_MEI_HDCP int mei_hdcp_cldev_get_reference(void *client_data, struct mei_cl_device **cldev, -- 2.7.4 ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
[PATCH v2 08/42] misc/mei/hdcp: Define ME FW interface for HDCP2.2
Defines the HDCP specific ME FW interfaces such as Request CMDs, payload structure for CMDs and their response status codes. This patch defines payload size(Excluding the Header)for each WIRED HDCP2.2 CMDs. v2: Rebased. Signed-off-by: Ramalingam C--- drivers/misc/mei/hdcp/mei_hdcp.h | 525 +++ 1 file changed, 525 insertions(+) diff --git a/drivers/misc/mei/hdcp/mei_hdcp.h b/drivers/misc/mei/hdcp/mei_hdcp.h index 7d792b5ad703..32fb844554f5 100644 --- a/drivers/misc/mei/hdcp/mei_hdcp.h +++ b/drivers/misc/mei/hdcp/mei_hdcp.h @@ -24,6 +24,8 @@ #define __MEI_HDCP_H__ #include +#include +#include struct mei_hdcp { struct mei_cl_device *cldev; @@ -38,4 +40,527 @@ struct mei_hdcp { int ref_cnt; }; +/** + * @enum me_hdcp_status: Enumeration of all HDCP Status Codes + */ +enum me_hdcp_status { + ME_HDCP_STATUS_SUCCESS = 0x, + + /* WiDi Generic Status Codes */ + ME_HDCP_STATUS_INTERNAL_ERROR = 0x1000, + ME_HDCP_STATUS_UNKNOWN_ERROR= 0x1001, + ME_HDCP_STATUS_INCORRECT_API_VERSION= 0x1002, + ME_HDCP_STATUS_INVALID_FUNCTION = 0x1003, + ME_HDCP_STATUS_INVALID_BUFFER_LENGTH= 0x1004, + ME_HDCP_STATUS_INVALID_PARAMS = 0x1005, + ME_HDCP_STATUS_AUTHENTICATION_FAILED= 0x1006, + + /* WiDi Status Codes */ + ME_HDCP_INVALID_SESSION_STATE = 0x6000, + ME_HDCP_SRM_FRAGMENT_UNEXPECTED = 0x6001, + ME_HDCP_SRM_INVALID_LENGTH = 0x6002, + ME_HDCP_SRM_FRAGMENT_OFFSET_INVALID = 0x6003, + ME_HDCP_SRM_VERIFICATION_FAILED = 0x6004, + ME_HDCP_SRM_VERSION_TOO_OLD = 0x6005, + ME_HDCP_RX_CERT_VERIFICATION_FAILED = 0x6006, + ME_HDCP_RX_REVOKED = 0x6007, + ME_HDCP_H_VERIFICATION_FAILED = 0x6008, + ME_HDCP_REPEATER_CHECK_UNEXPECTED = 0x6009, + ME_HDCP_TOPOLOGY_MAX_EXCEEDED = 0x600A, + ME_HDCP_V_VERIFICATION_FAILED = 0x600B, + ME_HDCP_L_VERIFICATION_FAILED = 0x600C, + ME_HDCP_STREAM_KEY_ALLOC_FAILED = 0x600D, + ME_HDCP_BASE_KEY_RESET_FAILED = 0x600E, + ME_HDCP_NONCE_GENERATION_FAILED = 0x600F, + ME_HDCP_STATUS_INVALID_E_KEY_STATE = 0x6010, + ME_HDCP_STATUS_INVALID_CS_ICV = 0x6011, + ME_HDCP_STATUS_INVALID_KB_KEY_STATE = 0x6012, + ME_HDCP_STATUS_INVALID_PAVP_MODE_ICV= 0x6013, + ME_HDCP_STATUS_INVALID_PAVP_MODE= 0x6014, + ME_HDCP_STATUS_LC_MAX_ATTEMPTS = 0x6015, + + /* New status for HDCP 2.1 */ + ME_HDCP_STATUS_MISMATCH_IN_M= 0x6016, + + /* New status code for HDCP 2.2 Rx */ + ME_HDCP_STATUS_RX_PROV_NOT_ALLOWED = 0x6017, + ME_HDCP_STATUS_RX_PROV_WRONG_SUBJECT= 0x6018, + ME_HDCP_RX_NEEDS_PROVISIONING = 0x6019, + ME_HDCP_BKSV_ICV_AUTH_FAILED= 0x6020, + ME_HDCP_STATUS_INVALID_STREAM_ID= 0x6021, + ME_HDCP_STATUS_CHAIN_NOT_INITIALIZED= 0x6022, + ME_HDCP_FAIL_NOT_EXPECTED = 0x6023, + ME_HDCP_FAIL_HDCP_OFF = 0x6024, + ME_HDCP_FAIL_INVALID_PAVP_MEMORY_MODE = 0x6025, + ME_HDCP_FAIL_AES_ECB_FAILURE= 0x6026, + ME_HDCP_FEATURE_NOT_SUPPORTED = 0x6027, + ME_HDCP_DMA_READ_ERROR = 0x6028, + ME_HDCP_DMA_WRITE_ERROR = 0x6029, + ME_HDCP_FAIL_INVALID_PACKET_SIZE= 0x6030, + ME_HDCP_H264_PARSING_ERROR = 0x6031, + ME_HDCP_HDCP2_ERRATA_VIDEO_VIOLATION= 0x6032, + ME_HDCP_HDCP2_ERRATA_AUDIO_VIOLATION= 0x6033, + ME_HDCP_TX_ACTIVE_ERROR = 0x6034, + ME_HDCP_MODE_CHANGE_ERROR = 0x6035, + ME_HDCP_STREAM_TYPE_ERROR = 0x6036, + ME_HDCP_STREAM_MANAGE_NOT_POSSIBLE = 0x6037, + + ME_HDCP_STATUS_PORT_INVALID_COMMAND = 0x6038, + ME_HDCP_STATUS_UNSUPPORTED_PROTOCOL = 0x6039, + ME_HDCP_STATUS_INVALID_PORT_INDEX = 0x603a, + ME_HDCP_STATUS_TX_AUTH_NEEDED = 0x603b, + ME_HDCP_STATUS_NOT_INTEGRATED_PORT = 0x603c, + ME_HDCP_STATUS_SESSION_MAX_REACHED = 0x603d, + + /* hdcp capable bit is not set in rx_caps(error is unique to DP) */ + ME_HDCP_STATUS_NOT_HDCP_CAPABLE = 0x6041, + + ME_HDCP_STATUS_INVALID_STREAM_COUNT = 0x6042, +}; + +#define HDCP_API_VERSION 0x0001 + +#define HDCP_M_LEN 16 +#define HDCP_KH_LEN16 + +/* + * Payload Buffer size(Excluding Header) for each CMD and corresponding response + */ +/* Wired_Tx_AKE */ +#defineWIRED_CMD_BUF_LEN_INITIATE_HDCP2_SESSION_IN (4 + 1)
[PATCH v2 05/42] misc/mei/hdcp: Add KBuild for mei hdcp driver
v2: including the hdcp folder with a Makefile. [Tomas] Signed-off-by: Ramalingam C--- drivers/misc/mei/Kconfig | 6 ++ drivers/misc/mei/Makefile | 2 ++ drivers/misc/mei/hdcp/Makefile | 6 ++ 3 files changed, 14 insertions(+) create mode 100644 drivers/misc/mei/hdcp/Makefile diff --git a/drivers/misc/mei/Kconfig b/drivers/misc/mei/Kconfig index c49e1d2269af..90977132d1e2 100644 --- a/drivers/misc/mei/Kconfig +++ b/drivers/misc/mei/Kconfig @@ -43,3 +43,9 @@ config INTEL_MEI_TXE Supported SoCs: Intel Bay Trail + +config INTEL_MEI_HDCP + tristate "Intel HDCP2.2 services of ME Interface" + depends on INTEL_MEI && DRM_I915 + help + MEI Support for HDCP2.2 Services on Intel SoCs. diff --git a/drivers/misc/mei/Makefile b/drivers/misc/mei/Makefile index cd6825afa8e1..e64d1212fb85 100644 --- a/drivers/misc/mei/Makefile +++ b/drivers/misc/mei/Makefile @@ -23,3 +23,5 @@ mei-txe-objs += hw-txe.o mei-$(CONFIG_EVENT_TRACING) += mei-trace.o CFLAGS_mei-trace.o = -I$(src) + +obj-$(CONFIG_INTEL_MEI_HDCP) += hdcp/ diff --git a/drivers/misc/mei/hdcp/Makefile b/drivers/misc/mei/hdcp/Makefile new file mode 100644 index ..75ac50203223 --- /dev/null +++ b/drivers/misc/mei/hdcp/Makefile @@ -0,0 +1,6 @@ +# SPDX-License-Identifier: GPL-2.0 +# +# Makefile - HDCP client driver for Intel MEI Bus Driver. +# Copyright (c) 2010-2014, Intel Corporation. +# +obj-$(CONFIG_INTEL_MEI_HDCP) += mei_hdcp.o -- 2.7.4 ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
[PATCH v2 07/42] misc/mei/hdcp: Get & Put for mei cl_device
Interfaces to obtain and release the cl_device reference is developed. Using these interfaces intel hdcp driver will get the reference to the mei client devices, so that hdcp2.2 service calls can be routed to that client device. During registration, call back function will be registered with mei_hdcp driver so that when the client device is removed intel hdcp driver can be informed. At a time only one reference is allowed in this interfaces. v2: Rebased. Signed-off-by: Ramalingam C--- drivers/misc/mei/hdcp/mei_hdcp.c | 55 +++- drivers/misc/mei/hdcp/mei_hdcp.h | 9 +++ include/linux/mei_hdcp.h | 47 ++ 3 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 include/linux/mei_hdcp.h diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c index 25df7034cfb4..63f77800a6f7 100644 --- a/drivers/misc/mei/hdcp/mei_hdcp.c +++ b/drivers/misc/mei/hdcp/mei_hdcp.c @@ -55,18 +55,71 @@ static int mei_hdcp_probe(struct mei_cl_device *cldev, mei_cldev_set_drvdata(cldev, _hdcp); ret = mei_cldev_enable(cldev); - if (ret < 0) + if (ret < 0) { dev_err(>dev, "mei_cldev_enable Failed. %d\n", ret); + goto err; + } + + if (mei_hdcp.notify_on_cldev_change) + mei_hdcp.notify_on_cldev_change(mei_hdcp.client, cldev); + + return 0; +err: + if (mei_hdcp.notify_on_cldev_change) + mei_hdcp.notify_on_cldev_change(mei_hdcp.client, NULL); return ret; } static int mei_hdcp_remove(struct mei_cl_device *cldev) { + struct mei_hdcp *mei_hdcp = mei_cldev_get_drvdata(cldev); + + if (mei_hdcp->notify_on_cldev_change) + mei_hdcp->notify_on_cldev_change(mei_hdcp->client, NULL); + mei_cldev_disable(cldev); + return 0; } +int mei_hdcp_cldev_get_reference(void *client_data, +struct mei_cl_device **cldev, +void (*notify_change)(void *client, + struct mei_cl_device + *cldev)) +{ + if (!notify_change || !client_data) + return -EINVAL; + + if (mei_hdcp.ref_cnt) + return -EBUSY; + + if (!mei_cldev_active_and_enabled(mei_hdcp.cldev)) { + if (!notify_change) + return -EAGAIN; + } else { + *cldev = mei_hdcp.cldev; + } + + mei_hdcp.ref_cnt++; + mei_hdcp.client = client_data; + mei_hdcp.notify_on_cldev_change = notify_change; + + return 0; +} +EXPORT_SYMBOL(mei_hdcp_cldev_get_reference); + +void mei_hdcp_cldev_put_reference(struct mei_cl_device *cldev) +{ + if (cldev == mei_hdcp.cldev) { + mei_hdcp.ref_cnt--; + mei_hdcp.client = NULL; + mei_hdcp.notify_on_cldev_change = NULL; + } +} +EXPORT_SYMBOL(mei_hdcp_cldev_put_reference); + #define WIDI_HECI_CLIENT_GUID UUID_LE(0xB638AB7E, 0x94E2, 0x4EA2, 0xA5, \ 0x52, 0xD1, 0xC5, 0x4B, \ 0x62, 0x7F, 0x04) diff --git a/drivers/misc/mei/hdcp/mei_hdcp.h b/drivers/misc/mei/hdcp/mei_hdcp.h index c06c0d767c4f..7d792b5ad703 100644 --- a/drivers/misc/mei/hdcp/mei_hdcp.h +++ b/drivers/misc/mei/hdcp/mei_hdcp.h @@ -27,6 +27,15 @@ struct mei_hdcp { struct mei_cl_device *cldev; + + /* Reference to the HDCP2.2 service consumer */ + void *client; + + /* Callback function for the consumer on cl_device state change */ + void (*notify_on_cldev_change)(void *client, + struct mei_cl_device *cldev); + + int ref_cnt; }; #endif /* __MEI_HDCP_H__ */ diff --git a/include/linux/mei_hdcp.h b/include/linux/mei_hdcp.h new file mode 100644 index ..774b26da0c26 --- /dev/null +++ b/include/linux/mei_hdcp.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2017 Intel Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT
[PATCH v2 06/42] misc/mei/hdcp: Verify mei client device status
Checks whether mei client device for hdcp2.2 is enabled? v2: Rebased. Signed-off-by: Ramalingam C--- drivers/misc/mei/hdcp/mei_hdcp.c | 12 1 file changed, 12 insertions(+) diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c index aa211763e520..25df7034cfb4 100644 --- a/drivers/misc/mei/hdcp/mei_hdcp.c +++ b/drivers/misc/mei/hdcp/mei_hdcp.c @@ -34,6 +34,18 @@ struct mei_hdcp mei_hdcp; +/** + * mei_cldev_active_and_enabled: + * Return: true if me client for HDCP is initialized and connected + */ +static inline bool mei_cldev_active_and_enabled(struct mei_cl_device *cldev) +{ + if (!cldev) + return false; + + return mei_cldev_enabled(cldev); +} + static int mei_hdcp_probe(struct mei_cl_device *cldev, const struct mei_cl_device_id *id) { -- 2.7.4 ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
[PATCH v2 04/42] misc/mei/hdcp: Client driver for HDCP application
ME FW is contributes a vital role in HDCP2.2 authentication. HDCP2.2 driver needs to communicate to ME FW for each step of the HDCP2.2 authentication. ME FW prepare and HDCP2.2 authentication parameters and encrypt them as per spec. With such parameter Driver prepares HDCP2.2 auth messages and communicate with HDCP2.2 sink. Similarly HDCP2. sink's response is shared with ME FW for decrypt and verification. Once All the steps of HDCP2.2 authentications are complete on driver's request ME FW will configure the port as authenticated and supply the HDCP keys to the Gen HW for encryption. Only after this stage HDCP2.2 driver can start the HDCP2.2 encryption for a port. ME FW is interfaced to kernel through MEI Bus Driver. To obtain the HDCP2.2 services from the ME FW through MEI Bus driver MEI Client Driver is developed. v2: hdcp files are moved to drivers/misc/mei/hdcp/ [Tomas] Signed-off-by: Ramalingam CSigned-off-by: Tomas Winkler --- drivers/misc/mei/hdcp/mei_hdcp.c | 80 drivers/misc/mei/hdcp/mei_hdcp.h | 32 2 files changed, 112 insertions(+) create mode 100644 drivers/misc/mei/hdcp/mei_hdcp.c create mode 100644 drivers/misc/mei/hdcp/mei_hdcp.h diff --git a/drivers/misc/mei/hdcp/mei_hdcp.c b/drivers/misc/mei/hdcp/mei_hdcp.c new file mode 100644 index ..aa211763e520 --- /dev/null +++ b/drivers/misc/mei/hdcp/mei_hdcp.c @@ -0,0 +1,80 @@ +/* + * Copyright © 2017 Intel Corporation + * + * Mei_hdcp.c: client driver for mei bus driver + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Authors: + * Ramalingam C + */ + +#include +#include +#include + +#include "mei_hdcp.h" + +struct mei_hdcp mei_hdcp; + +static int mei_hdcp_probe(struct mei_cl_device *cldev, + const struct mei_cl_device_id *id) +{ + int ret; + + mei_hdcp.cldev = cldev; + mei_cldev_set_drvdata(cldev, _hdcp); + + ret = mei_cldev_enable(cldev); + if (ret < 0) + dev_err(>dev, "mei_cldev_enable Failed. %d\n", ret); + + return ret; +} + +static int mei_hdcp_remove(struct mei_cl_device *cldev) +{ + mei_cldev_disable(cldev); + return 0; +} + +#define WIDI_HECI_CLIENT_GUID UUID_LE(0xB638AB7E, 0x94E2, 0x4EA2, 0xA5, \ + 0x52, 0xD1, 0xC5, 0x4B, \ + 0x62, 0x7F, 0x04) +#define MEI_HDCP2_2_UUID WIDI_HECI_CLIENT_GUID + +static struct mei_cl_device_id mei_hdcp_tbl[] = { + { .uuid = MEI_HDCP2_2_UUID, .version = MEI_CL_VERSION_ANY }, + { } +}; +MODULE_DEVICE_TABLE(mei, mei_hdcp_tbl); + +static struct mei_cl_driver mei_hdcp_driver = { + .id_table = mei_hdcp_tbl, + .name = KBUILD_MODNAME, + .probe = mei_hdcp_probe, + .remove = mei_hdcp_remove, +}; + +module_mei_cl_driver(mei_hdcp_driver); + +MODULE_AUTHOR("Intel Corporation"); +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("HDCP"); diff --git a/drivers/misc/mei/hdcp/mei_hdcp.h b/drivers/misc/mei/hdcp/mei_hdcp.h new file mode 100644 index ..c06c0d767c4f --- /dev/null +++ b/drivers/misc/mei/hdcp/mei_hdcp.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2017 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies
[PATCH v2 00/42] drm/i915: Implement HDCP2.2
Based on HDCP1.4 framework introduced by Sean Paul, this series implements the HDCP2.2 in I915. The sequence for HDCP2.2 authentication and encryption is implemented in I915. Encoder specific implementations are moved into hdcp_shim. Intel HWs supports HDCP2.2 through ME FW. Hence this series introduces a client driver for mei bus, so that for HDCP2.2 authentication, HDCP2.2 stack in I915 can avail the services from ME FW. Userspace interface remains unchanged as version agnostic. When userspace request for HDCP enable, Kernel will detect the HDCP source and sink's HDCP version(1.4/2.2)capability and enable the best capable version for that combination. This series enables the HDCP2.2 for Type0 content streams. Yes its bit lengthy series. Please tolerate. Thanks Major Changes in v2: - Synchronous implementation of HDCP authentication [SeanPaul] - Removal of bit-fields usage.[Tomas and Jani] - Protecting the mei_interface handle with mutex [Chris] - Droped, added and squashed few patches - Extended hdcp_shim to support hdcp2.2 operations too. [SeanPaul] - Used Intel_wait_for_registers(), Where ever it is applicable.[Chris] - mei_hdcp driver is moved into drivers/misc/mei/hdcp/ [Tomas] - Adapted the static declaration for struct intel_hdcp and mei_hdcp_data. [SeanPaul] Sincere thanks for Sean Paul, Jani Nikula, Chris Wilson and Tomas Winkler for the review comments on v1 series. Ramalingam C (41): drm: hdcp2.2 authentication msg definitions drm: HDMI and DP specific HDCP2.2 defines misc/mei/hdcp: Client driver for HDCP application misc/mei/hdcp: Add KBuild for mei hdcp driver misc/mei/hdcp: Verify mei client device status misc/mei/hdcp: Get & Put for mei cl_device misc/mei/hdcp: Define ME FW interface for HDCP2.2 linux/mei: Header for mei_hdcp driver interface misc/mei/hdcp: Initiate Wired HDCP2.2 Tx Session misc/mei/hdcp: Verify Receiver Cert and prepare km misc/mei/hdcp: Verify H_prime misc/mei/hdcp: Store the HDCP Pairing info misc/mei/hdcp: Initiate Locality check misc/mei/hdcp: Verify L_prime misc/mei/hdcp: Prepare Session Key misc/mei/hdcp: Repeater topology verifcation and ack misc/mei/hdcp: Verify M_prime misc/mei/hdcp: Enabling the HDCP authentication misc/mei/hdcp: Closing wired HDCP2.2 Tx Session drm/i915: wrapping all hdcp var into intel_hdcp drm/i915: Define HDCP2.2 related variables drm/i915: Define Intel HDCP2.2 registers drm/i915: Wrappers for mei HDCP2.2 services drm/i915: Implement HDCP2.2 receiver authentication drm/i915: Implement HDCP2.2 repeater authentication drm/i915: Enable and Disable HDCP2.2 port encryption drm/i915: Implement HDCP2.2 En/Dis-able drm/i915: Implement HDCP2.2 link integrity check drm/i915: Handle HDCP2.2 downstream topology change drm/i915: Pullout the bksv read and validation drm/i915: Initialize HDCP2.2 and its MEI interface drm/i915: Schedule hdcp_check_link in _intel_hdcp_enable drm/i915: Enable superior HDCP ver that is capable drm/i915: Enable HDCP1.4 incase of HDCP2.2 failure drm/i915: hdcp_check_link only on CP_IRQ drm/i915: Check HDCP 1.4 and 2.2 link on CP_IRQ drm/i915: Implement gmbus burst read drm/i915: Implement the HDCP2.2 support for DP drm/i915: Implement the HDCP2.2 support for HDMI drm/i915: Add HDCP2.2 support for DP connectors drm/i915: Add HDCP2.2 support for HDMI connectors Tomas Winkler (1): mei: bus: whitelist hdcp client drivers/gpu/drm/i915/i915_drv.c |1 + drivers/gpu/drm/i915/i915_drv.h |9 + drivers/gpu/drm/i915/i915_reg.h | 35 ++ drivers/gpu/drm/i915/intel_display.c |7 +- drivers/gpu/drm/i915/intel_dp.c | 362 ++- drivers/gpu/drm/i915/intel_drv.h | 81 ++- drivers/gpu/drm/i915/intel_hdcp.c| 1107 -- drivers/gpu/drm/i915/intel_hdmi.c| 206 ++- drivers/gpu/drm/i915/intel_i2c.c | 124 +++- drivers/misc/mei/Kconfig |6 + drivers/misc/mei/Makefile|2 + drivers/misc/mei/bus-fixup.c | 16 + drivers/misc/mei/hdcp/Makefile |6 + drivers/misc/mei/hdcp/mei_hdcp.c | 927 drivers/misc/mei/hdcp/mei_hdcp.h | 566 + include/drm/drm_dp_helper.h | 54 ++ include/drm/drm_hdcp.h | 220 +++ include/linux/mei_hdcp.h | 215 +++ 18 files changed, 3846 insertions(+), 98 deletions(-) create mode 100644 drivers/misc/mei/hdcp/Makefile create mode 100644 drivers/misc/mei/hdcp/mei_hdcp.c create mode 100644 drivers/misc/mei/hdcp/mei_hdcp.h create mode 100644 include/linux/mei_hdcp.h -- 2.7.4 ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
[PATCH v2 03/42] mei: bus: whitelist hdcp client
From: Tomas WinklerWhitelist HDCP client for in kernel drm use v2: Rebased. Signed-off-by: Tomas Winkler --- drivers/misc/mei/bus-fixup.c | 16 1 file changed, 16 insertions(+) diff --git a/drivers/misc/mei/bus-fixup.c b/drivers/misc/mei/bus-fixup.c index 0208c4b027c5..3df2a69fddfb 100644 --- a/drivers/misc/mei/bus-fixup.c +++ b/drivers/misc/mei/bus-fixup.c @@ -41,6 +41,9 @@ static const uuid_le mei_nfc_info_guid = MEI_UUID_NFC_INFO; #define MEI_UUID_MKHIF_FIX UUID_LE(0x55213584, 0x9a29, 0x4916, \ 0xba, 0xdf, 0xf, 0xb7, 0xed, 0x68, 0x2a, 0xeb) +#define MEI_UUID_HDCP UUID_LE(0xB638AB7E, 0x94E2, 0x4EA2, \ + 0xA5, 0x52, 0xD1, 0xC5, 0x4B, 0x62, 0x7F, 0x04) + #define MEI_UUID_ANY NULL_UUID_LE /** @@ -72,6 +75,18 @@ static void blacklist(struct mei_cl_device *cldev) cldev->do_match = 0; } +/** + * whitelist - forcefully whitelist client + * + * @cldev: me clients device + */ +static void whitelist(struct mei_cl_device *cldev) +{ + dev_dbg(>dev, "running hook %s\n", __func__); + + cldev->do_match = 1; +} + #define OSTYPE_LINUX2 struct mei_os_ver { __le16 build; @@ -399,6 +414,7 @@ static struct mei_fixup { MEI_FIXUP(MEI_UUID_NFC_HCI, mei_nfc), MEI_FIXUP(MEI_UUID_WD, mei_wd), MEI_FIXUP(MEI_UUID_MKHIF_FIX, mei_mkhi_fix), + MEI_FIXUP(MEI_UUID_HDCP, whitelist), }; /** -- 2.7.4 ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
[PATCH v2 02/42] drm: HDMI and DP specific HDCP2.2 defines
In preparation for implementing HDCP2.2 in I915, this patch adds HDCP register definitions for HDMI and DP HDCP adaptations. HDMI specific HDCP2.2 register definitions are added into drm_hdcp.h, where are HDCP2.2 register offsets in DPCD offsets are defined at drm_dp_helper.h. v2: bit_field definitions are replaced by macros. [Tomas and Jany] Signed-off-by: Ramalingam C--- include/drm/drm_dp_helper.h | 54 + include/drm/drm_hdcp.h | 29 2 files changed, 83 insertions(+) diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h index 4de97e94ef9d..2185b3a88911 100644 --- a/include/drm/drm_dp_helper.h +++ b/include/drm/drm_dp_helper.h @@ -887,6 +887,60 @@ #define DP_AUX_HDCP_KSV_FIFO 0x6802C #define DP_AUX_HDCP_AINFO 0x6803B +/** + * DP HDCP2.2 parameter offsets in DPCD address space + */ +#define DP_HDCP_2_2_REG_RTX_OFFSET 0x69000 +#define DP_HDCP_2_2_REG_TXCAPS_OFFSET 0x69008 +#define DP_HDCP_2_2_REG_CERT_RX_OFFSET 0x6900B +#define DP_HDCP_2_2_REG_RRX_OFFSET 0x69215 +#define DP_HDCP_2_2_REG_RX_CAPS_OFFSET 0x6921D +#define DP_HDCP_2_2_REG_EKPUB_KM_OFFSET0x69220 +#define DP_HDCP_2_2_REG_EKH_KM_OFFSET 0x692A0 +#define DP_HDCP_2_2_REG_M_OFFSET 0x692B0 +#define DP_HDCP_2_2_REG_HPRIME_OFFSET 0x692C0 +#define DP_HDCP_2_2_REG_EKH_KM_RD_OFFSET 0x692E0 +#define DP_HDCP_2_2_REG_RN_OFFSET 0x692F0 +#define DP_HDCP_2_2_REG_LPRIME_OFFSET 0x692F8 +#define DP_HDCP_2_2_REG_EDKEY_KS_OFFSET0x69318 +#defineDP_HDCP_2_2_REG_RIV_OFFSET 0x69328 +#define DP_HDCP_2_2_REG_RXINFO_OFFSET 0x69330 +#define DP_HDCP_2_2_REG_SEQ_NUM_V_OFFSET 0x69332 +#define DP_HDCP_2_2_REG_VPRIME_OFFSET 0x69335 +#define DP_HDCP_2_2_REG_RECV_ID_LIST_OFFSET0x69345 +#define DP_HDCP_2_2_REG_V_OFFSET 0x693E0 +#define DP_HDCP_2_2_REG_SEQ_NUM_M_OFFSET 0x693F0 +#define DP_HDCP_2_2_REG_K_OFFSET 0x693F3 +#define DP_HDCP_2_2_REG_STREAM_ID_TYPE_OFFSET 0x693F5 +#define DP_HDCP_2_2_REG_MPRIME_OFFSET 0x69473 +#define DP_HDCP_2_2_REG_RXSTATUS_OFFSET0x69493 +#define DP_HDCP_2_2_REG_STREAM_TYPE_OFFSET 0x69494 +#define DP_HDCP_2_2_REG_DBG_OFFSET 0x69518 + +/** + * DP HDCP message start offsets in DPCD address space + */ +#define DP_HDCP_2_2_AKE_INIT_OFFSETDP_HDCP_2_2_REG_RTX_OFFSET +#define DP_HDCP_2_2_AKE_SEND_CERT_OFFSET DP_HDCP_2_2_REG_CERT_RX_OFFSET +#define DP_HDCP_2_2_AKE_NO_STORED_KM_OFFSETDP_HDCP_2_2_REG_EKPUB_KM_OFFSET +#define DP_HDCP_2_2_AKE_STORED_KM_OFFSET DP_HDCP_2_2_REG_EKH_KM_OFFSET +#define DP_HDCP_2_2_AKE_SEND_HPRIME_OFFSET DP_HDCP_2_2_REG_HPRIME_OFFSET +#define DP_HDCP_2_2_AKE_SEND_PARING_INFO_OFFSET DP_HDCP_2_2_REG_EKH_KM_RD_OFFSET +#define DP_HDCP_2_2_LC_INIT_OFFSET DP_HDCP_2_2_REG_RN_OFFSET +#define DP_HDCP_2_2_LC_SEND_LPRIME_OFFSET DP_HDCP_2_2_REG_LPRIME_OFFSET +#define DP_HDCP_2_2_SKE_SEND_EKS_OFFSET DP_HDCP_2_2_REG_EDKEY_KS_OFFSET +#define DP_HDCP_2_2_REP_SEND_RECVID_LIST_OFFSET DP_HDCP_2_2_REG_RXINFO_OFFSET +#define DP_HDCP_2_2_REP_SEND_ACK_OFFSETDP_HDCP_2_2_REG_V_OFFSET +#define DP_HDCP_2_2_REP_STREAM_MANAGE_OFFSET DP_HDCP_2_2_REG_SEQ_NUM_M_OFFSET +#define DP_HDCP_2_2_REP_STREAM_READY_OFFSETDP_HDCP_2_2_REG_MPRIME_OFFSET + +#define HDCP_2_2_DP_RXSTATUS_LEN 1 +#define HDCP_2_2_DP_RXSTATUS_READY(x) (x & BIT(0)) +#define HDCP_2_2_DP_RXSTATUS_H_PRIME(x)(x & BIT(1)) +#define HDCP_2_2_DP_RXSTATUS_PAIRING(x)(x & BIT(2)) +#define HDCP_2_2_DP_RXSTATUS_REAUTH_REQ(x) (x & BIT(3)) +#define HDCP_2_2_DP_RXSTATUS_LINK_FAILED(x)(x & BIT(4)) + /* DP 1.2 Sideband message defines */ /* peer device type - DP 1.2a Table 2-92 */ #define DP_PEER_DEVICE_NONE0x0 diff --git a/include/drm/drm_hdcp.h b/include/drm/drm_hdcp.h index 5e0a5ed1a08e..f3f28414b189 100644 --- a/include/drm/drm_hdcp.h +++ b/include/drm/drm_hdcp.h @@ -221,4 +221,33 @@ struct hdcp2_dp_errata_stream_type { uint8_t stream_type; } __packed; +/* HDCP2.2 TIMEOUTs in mSec */ +#define HDCP_2_2_CERT_TIMEOUT 100 +#define HDCP_2_2_HPRIME_NO_PAIRED_TIMEOUT 1000 +#define HDCP_2_2_HPRIME_PAIRED_TIMEOUT 200 +#define HDCP_2_2_PAIRING_TIMEOUT 200 +#defineHDCP_2_2_HDMI_LPRIME_TIMEOUT20 +#define HDCP_2_2_DP_LPRIME_TIMEOUT 7 +#define HDCP_2_2_RECVID_LIST_TIMEOUT 3000 +#define HDCP_2_2_STREAM_READY_TIMEOUT 100 + +/* HDMI HDCP2.2 Register Offsets */ +#define HDCP_2_2_HDMI_REG_VER_OFFSET 0x50 +#define HDCP_2_2_HDMI_REG_WR_MSG_OFFSET0x60 +#define HDCP_2_2_HDMI_REG_RXSTATUS_OFFSET 0x70 +#define
[PATCH v2 01/42] drm: hdcp2.2 authentication msg definitions
This patch defines the hdcp2.2 protocol messages for the HDCP2.2 authentication. v2: bit_fields are removed. Instead bitmasking used. [Tomas and Jani] prefix HDCP_2_2_ is added to the macros. [Tomas] Signed-off-by: Ramalingam C--- include/drm/drm_hdcp.h | 183 + 1 file changed, 183 insertions(+) diff --git a/include/drm/drm_hdcp.h b/include/drm/drm_hdcp.h index 562fa7df2637..5e0a5ed1a08e 100644 --- a/include/drm/drm_hdcp.h +++ b/include/drm/drm_hdcp.h @@ -38,4 +38,187 @@ #define DRM_HDCP_DDC_BSTATUS 0x41 #define DRM_HDCP_DDC_KSV_FIFO 0x43 +#define DRM_HDCP_1_4_SRM_ID0x8 +#define DRM_HDCP_1_4_VRL_LENGTH_SIZE 3 +#define DRM_HDCP_1_4_DCP_SIG_SIZE 40 + +/** + * Protocol message definition for HDCP2.2 specification + */ + +#define HDCP_STREAM_TYPE0 0x00 +#define HDCP_STREAM_TYPE1 0x01 + +/* HDCP2.2 Msg IDs */ +#define HDCP_2_2_NULL_MSG 1 +#define HDCP_2_2_AKE_INIT 2 +#define HDCP_2_2_AKE_SEND_CERT 3 +#define HDCP_2_2_AKE_NO_STORED_KM 4 +#define HDCP_2_2_AKE_STORED_KM 5 +#define HDCP_2_2_AKE_SEND_HPRIME 7 +#define HDCP_2_2_AKE_SEND_PARING_INFO 8 +#define HDCP_2_2_LC_INIT 9 +#define HDCP_2_2_LC_SEND_LPRIME10 +#define HDCP_2_2_SKE_SEND_EKS 11 +#define HDCP_2_2_REP_SEND_RECVID_LIST 12 +#define HDCP_2_2_REP_SEND_ACK 15 +#define HDCP_2_2_REP_STREAM_MANAGE 16 +#define HDCP_2_2_REP_STREAM_READY 17 +#define HDCP_2_2_ERRATA_DP_STREAM_TYPE 50 + +#define HDCP_2_2_RTX_LEN 8 +#define HDCP_2_2_RRX_LEN 8 + +#define HDCP_2_2_K_PUB_RX_MOD_N_LEN128 +#define HDCP_2_2_K_PUB_RX_EXP_E_LEN3 +#define HDCP_2_2_K_PUB_RX_LEN (HDCP_2_2_K_PUB_RX_MOD_N_LEN + \ +HDCP_2_2_K_PUB_RX_EXP_E_LEN) + +#define HDCP_2_2_DCP_LLC_SIG_LEN 384 + +#define HDCP_2_2_E_KPUB_KM_LEN 128 +#define HDCP_2_2_E_KH_KM_M_LEN (16 + 16) +#define HDCP_2_2_H_PRIME_LEN 32 +#define HDCP_2_2_E_KH_KM_LEN 16 +#define HDCP_2_2_RN_LEN8 +#define HDCP_2_2_L_PRIME_LEN 32 +#define HDCP_2_2_E_DKEY_KS_LEN 16 +#define HDCP_2_2_RIV_LEN 8 +#define HDCP_2_2_SEQ_NUM_LEN 3 +#define HDCP_2_2_LPRIME_HALF_LEN (HDCP_2_2_L_PRIME_LEN / 2) +#define HDCP_2_2_RECEIVER_ID_LEN DRM_HDCP_KSV_LEN +#define HDCP_2_2_MAX_DEVICE_COUNT 31 +#define HDCP_2_2_RECEIVER_IDS_MAX_LEN (HDCP_2_2_RECEIVER_ID_LEN * \ +HDCP_2_2_MAX_DEVICE_COUNT) +#define HDCP_2_2_MPRIME_LEN32 + +/** + * TODO: This has to be changed for DP MST, as multiple stream on + * same port is possible. + * For HDCP2.2 on HDMI and DP SST this value is always 1. + */ +#define HDCP_2_2_MAX_CONTENT_STREAMS_CNT 1 +#define HDCP_2_2_TXCAP_MASK_LEN2 +#define HDCP_2_2_RXCAPS_LEN3 +#define HDCP_2_2_RX_REPEATER(x)(x & BIT(0)) +#define HDCP_2_2_DP_HDCP_CAPABLE(x)(x & BIT(1)) +#define HDCP_2_2_RXINFO_LEN2 + +/* HDCP1.x compliant device in downstream */ +#define HDCP_2_2_HDCP1_DEVICE_CONNECTED(x) (x & BIT(0)) + +/* HDCP2.0 Compliant repeater in downstream */ +#define HDCP_2_2_HDCP_2_0_REP_CONNECTED(x) (x & BIT(1)) +#define HDCP_2_2_MAX_CASCADE_EXCEEDED(x) (x & BIT(2)) +#define HDCP_2_2_MAX_DEVS_EXCEEDED(x) (x & BIT(3)) +#define HDCP_2_2_DEV_COUNT_LO(x) ((x & (0xF << 4)) >> 4) +#define HDCP_2_2_DEV_COUNT_HI(x) (x & BIT(0)) +#define HDCP_2_2_DEPTH(x) ((x & (0x7 << 1)) >> 1) + +struct hdcp2_cert_rx { + uint8_t receiver_id[HDCP_2_2_RECEIVER_ID_LEN]; + uint8_t kpub_rx[HDCP_2_2_K_PUB_RX_LEN]; + uint8_t reserved[2]; + uint8_t dcp_signature[HDCP_2_2_DCP_LLC_SIG_LEN]; +} __packed; + +struct hdcp2_streamid_type { + uint8_t stream_id; + uint8_t stream_type; +} __packed; + +/** + * The TxCaps field specified in the HDCP HDMI, DP specs + * This field is big endian as specified in the errata. + */ +struct hdcp2_tx_caps { + /* Transmitter must set this to 0x2 */ + uint8_t version; + + /* Reserved for HDCP and DP Spec. Read as Zero */ + uint8_t tx_cap_mask[HDCP_2_2_TXCAP_MASK_LEN]; +} __packed; + +/* + * Main structures for HDCP2.2 protocol communication + */ +struct hdcp2_ake_init { + uint8_t msg_id; + uint8_t
Re: [PATCH] video: fbdev: via_aux_vt1632: remove VLA usage
Hi Gustavo, On 7 March 2018 at 19:54, Gustavo A. R. Silvawrote: > In preparation to enabling -Wvla, remove VLA and replace it > with a fixed-length array instead. Also, remove variable 'len'. > What is the reason behind adding -Wvla? Is there a thread some that I can read up on? > Notice that no new IDs have been added in seven years. > > Signed-off-by: Gustavo A. R. Silva > --- > drivers/video/fbdev/via/via_aux_vt1632.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/drivers/video/fbdev/via/via_aux_vt1632.c > b/drivers/video/fbdev/via/via_aux_vt1632.c > index d24f4cd..0cd0d2a 100644 > --- a/drivers/video/fbdev/via/via_aux_vt1632.c > +++ b/drivers/video/fbdev/via/via_aux_vt1632.c > @@ -35,10 +35,10 @@ static void probe(struct via_aux_bus *bus, u8 addr) > .addr = addr, > .name = name}; > /* check vendor id and device id */ > - const u8 id[] = {0x06, 0x11, 0x92, 0x31}, len = ARRAY_SIZE(id); > - u8 tmp[len]; > + const u8 id[4] = {0x06, 0x11, 0x92, 0x31}; > + u8 tmp[4]; > > - if (!via_aux_read(, 0x00, tmp, len) || memcmp(id, tmp, len)) > + if (!via_aux_read(, 0x00, tmp, 4) || memcmp(id, tmp, 4)) Generally, hard coding a bunch of numbers like that makes for confusing and fragile code. A lot simpler and more obvious solution is like the following. It silences the compiler warning (-Wvla - pedantic) you while keeping the original clarity. const u8 id[] = {0x06, 0x11, 0x92, 0x31}, len = ARRAY_SIZE(id); - u8 tmp[len]; + u8 tmp[ARRAY_SIZE(id)]; // Using len causes a Wvla warning HTH Emil ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH v3 5/6] drm/i915: Introduce 'priority offset' for GPU contexts (v2)
Quoting Matt Roper (2018-03-06 23:46:59) > There are cases where a system integrator may wish to raise/lower the > priority of GPU workloads being submitted by specific OS process(es), > independently of how the software self-classifies its own priority. > Exposing "priority offset" as an i915-specific cgroup parameter will > enable such system-level configuration. > > Normally GPU contexts start with a priority value of 0 > (I915_CONTEXT_DEFAULT_PRIORITY) and then may be adjusted up/down from > there via other mechanisms. We'd like to provide a system-level input > to the priority decision that will be taken into consideration, even > when userspace later attempts to set an absolute priority value via > I915_CONTEXT_PARAM_PRIORITY. The priority offset introduced here > provides a base value that will always be added to (or subtracted from) > the software's self-assigned priority value. > > This patch makes priority offset a cgroup-specific value; contexts will > be created with a priority offset based on the cgroup membership of the > process creating the context at the time the context is created. Note > that priority offset is assigned at context creation time; migrating a > process to a different cgroup or changing the offset associated with a > cgroup will only affect new context creation and will not alter the > behavior of existing contexts previously created by the process. > > v2: > - Rebase onto new cgroup_priv API > - Use current instead of drm_file->pid to determine which process to >lookup priority for. (Chris) > - Don't forget to subtract priority offset in context_getparam ioctl to >make it match setparam behavior. (Chris) > > Signed-off-by: Matt RoperFor ctx->priority/ctx->priority_offset Reviewed-by: Chris Wilson At the end of the day, everything that is modifiable by context is going to want cgroup constraint, but like priority_offset each will require some thought as to how to express the constraint. Interesting conundrum, and still we want a consistent interface for all the gpus on a system. -Chris ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH] dt-bindings: exynos: Document #sound-dai-cells property of the HDMI node
Hi Inki, Cc: alsa-de...@alsa-project.org On 03/08/2018 09:15 AM, Inki Dae wrote: > By the way, it seems 'sound-dai-cells' property never affect Exynos4210/4212> > 5420/5433. It seems that even through ALSA TM2 audio driver(tm2_wm5110.c) > exists the driver never check the property. > > However, this patch adds below description. > > "Optional properties for Exynos 4210, 4212, 5420 and 5433" > > Is there a possibility for other boards based on Exynos4210/4212/5420/5433 > SoC to use this property later? All these SoCs have the HDMI IP block which has one input DAI, connected internally over I2S bus with the IS2 controller. I think there is no advantage in limiting ourselves now only to SoC's for which we currently rely on that DT property in current kernel code, just to update this documentation later when we actually put the property in dts files. In case of exynos5420 we already require #sound-dai-cells for Odroid and I have also a patch for exynos5420-peach-pit board which will need it as well. As far as exynos4210 and exynos4212 are concerned it's a matter of adding support for Odroid-U3, then we will also need this property because we are going to use "multi-codec" (HDMI and external I2S0 pins for CODEC are wired in parallel). In case of exynos5433 it just happens that the code in current driver doesn't require #sound-dai-cells property - one of the reasons I made it this way was to avoid dependency on dts, but it doesn't imply we should describe the HW in DT incompletely. Once the property is in dtbs we can update the driver to use more generic code, instead of open coding things. Actually I have forgotten to add also exynos5250 to the list. -- Regards, Sylwester ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [RFC][PATCH 2/2 v4] drm_hwcomposer: Add platformhisi buffer importer for hikey and hikey960
Hey John, This patch looks good to me. I have yet to build it, and I haven't brought my HiKey960 up for testing quite yet. On 03/07/2018 12:19 AM, John Stultz wrote: This allows for importing buffers allocated from the hikey and hikey960 gralloc implelementations. "implelementations" -> "implementations" Cc: Marissa WallCc: Sean Paul Cc: Dmitry Shmidt Cc: Robert Foss Cc: Matt Szczesiak Cc: Liviu Dudau Cc: David Hanna Cc: Rob Herring Cc: Alexandru-Cosmin Gheorghe Signed-off-by: John Stultz --- v2: * Make platformhisi and the generic importer exclusive in the build * Fixup vendor check v3: * Unify format conversions * Subclass the platformdrmgeneric importer implementation to reduce code duplication * Rework to avoid board specific logic (tweak gralloc to be consistent between the two) v4: * Minor cleanups as suggested by Alexandru-Cosmin Gheorghe --- Android.mk | 13 + platformdrmgeneric.h | 2 +- platformhisi.cpp | 135 +++ platformhisi.h | 48 ++ 4 files changed, 197 insertions(+), 1 deletion(-) create mode 100644 platformhisi.cpp create mode 100644 platformhisi.h diff --git a/Android.mk b/Android.mk index ee5b8bf..f37e4c3 100644 --- a/Android.mk +++ b/Android.mk @@ -74,7 +74,20 @@ LOCAL_CPPFLAGS += \ -DHWC2_USE_CPP11 \ -DHWC2_INCLUDE_STRINGIFICATION + +ifeq ($(TARGET_PRODUCT),hikey960) +LOCAL_CPPFLAGS += -DUSE_HISI_IMPORTER +LOCAL_SRC_FILES += platformhisi.cpp +LOCAL_C_INCLUDES += device/linaro/hikey/gralloc960/ +else +ifeq ($(TARGET_PRODUCT),hikey) +LOCAL_CPPFLAGS += -DUSE_HISI_IMPORTER +LOCAL_SRC_FILES += platformhisi.cpp +LOCAL_C_INCLUDES += device/linaro/hikey/gralloc/ +else LOCAL_CPPFLAGS += -DUSE_DRM_GENERIC_IMPORTER +endif +endif LOCAL_MODULE := hwcomposer.drm LOCAL_MODULE_TAGS := optional diff --git a/platformdrmgeneric.h b/platformdrmgeneric.h index 8376580..fbe059b 100644 --- a/platformdrmgeneric.h +++ b/platformdrmgeneric.h @@ -35,8 +35,8 @@ class DrmGenericImporter : public Importer { int ImportBuffer(buffer_handle_t handle, hwc_drm_bo_t *bo) override; int ReleaseBuffer(hwc_drm_bo_t *bo) override; - private: uint32_t ConvertHalFormatToDrm(uint32_t hal_format); + private: DrmResources *drm_; diff --git a/platformhisi.cpp b/platformhisi.cpp new file mode 100644 index 000..16c5e6f --- /dev/null +++ b/platformhisi.cpp @@ -0,0 +1,135 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define LOG_TAG "hwc-platform-hisi" + +#include "drmresources.h" +#include "platform.h" +#include "platformhisi.h" + + +#include +#include +#include +#include +#include + +#include +#include +#include "gralloc_priv.h" + + +namespace android { + +Importer *Importer::CreateInstance(DrmResources *drm) { + HisiImporter *importer = new HisiImporter(drm); + if (!importer) +return NULL; + + int ret = importer->Init(); + if (ret) { +ALOGE("Failed to initialize the hisi importer %d", ret); +delete importer; +return NULL; + } + return importer; +} + +HisiImporter::HisiImporter(DrmResources *drm) : DrmGenericImporter(drm), drm_(drm) { +} + +HisiImporter::~HisiImporter() { +} + +int HisiImporter::Init() { + int ret = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, + (const hw_module_t **)_); + if (ret) { +ALOGE("Failed to open gralloc module %d", ret); +return ret; + } + + if (strcasecmp(gralloc_->common.author, "ARM Ltd.")) +ALOGW("Using non-ARM gralloc module: %s/%s\n", gralloc_->common.name, + gralloc_->common.author); + + return 0; +} + +EGLImageKHR HisiImporter::ImportImage(EGLDisplay egl_display, buffer_handle_t handle) { + private_handle_t const *hnd = reinterpret_cast < private_handle_t const *>(handle); + if (!hnd) +return NULL; + + EGLint fmt = ConvertHalFormatToDrm(hnd->req_format); + if (fmt < 0) + return NULL; + + EGLint attr[] = { +EGL_WIDTH, hnd->width, +EGL_HEIGHT, hnd->height, +EGL_LINUX_DRM_FOURCC_EXT, fmt, +EGL_DMA_BUF_PLANE0_FD_EXT, hnd->share_fd, +EGL_DMA_BUF_PLANE0_OFFSET_EXT, 0, +
Re: [RFC][PATCH 1/2] drm_hwcomposer: Error out on YUV layer as it would fail for single planes
Hey John, On 03/07/2018 12:19 AM, John Stultz wrote: As suggested by Alexandru-Cosmin Gheorghe: ConvertHALFormatToDrm logic would work only for 1 plane formats, and probably gets rejected by drmModeAddFb2, but to save debugging time maybe it worth removing DRM_FORMAT_YVU420 from ConvertHALFormatToDrm and checking it's return code. So this patch tries to do this. Cc: Marissa WallCc: Sean Paul Cc: Dmitry Shmidt Cc: Robert Foss Cc: Matt Szczesiak Cc: Liviu Dudau Cc: David Hanna Cc: Rob Herring Cc: Alexandru-Cosmin Gheorghe Signed-off-by: John Stultz --- platformdrmgeneric.cpp | 15 +++ 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/platformdrmgeneric.cpp b/platformdrmgeneric.cpp index 741d42b..33f1ea0 100644 --- a/platformdrmgeneric.cpp +++ b/platformdrmgeneric.cpp @@ -76,8 +76,6 @@ uint32_t DrmGenericImporter::ConvertHalFormatToDrm(uint32_t hal_format) { return DRM_FORMAT_ABGR; case HAL_PIXEL_FORMAT_RGB_565: return DRM_FORMAT_BGR565; -case HAL_PIXEL_FORMAT_YV12: - return DRM_FORMAT_YVU420; I'm not sure I understand the rationale for removing YVU420. default: ALOGE("Cannot convert hal format to drm format %u", hal_format); return -EINVAL; @@ -88,10 +86,15 @@ EGLImageKHR DrmGenericImporter::ImportImage(EGLDisplay egl_display, buffer_handl gralloc_drm_handle_t *gr_handle = gralloc_drm_handle(handle); if (!gr_handle) return NULL; + + EGLint fmt = ConvertHalFormatToDrm(gr_handle->format); + if (fmt < 0) + return NULL; + EGLint attr[] = { EGL_WIDTH, gr_handle->width, EGL_HEIGHT, gr_handle->height, -EGL_LINUX_DRM_FOURCC_EXT, (EGLint)ConvertHalFormatToDrm(gr_handle->format), +EGL_LINUX_DRM_FOURCC_EXT, fmt, EGL_DMA_BUF_PLANE0_FD_EXT, gr_handle->prime_fd, EGL_DMA_BUF_PLANE0_OFFSET_EXT, 0, EGL_DMA_BUF_PLANE0_PITCH_EXT, gr_handle->stride, @@ -112,10 +115,14 @@ int DrmGenericImporter::ImportBuffer(buffer_handle_t handle, hwc_drm_bo_t *bo) { return ret; } + uint32_t fmt = ConvertHalFormatToDrm(gr_handle->format); + if (fmt < 0) +return fmt; + memset(bo, 0, sizeof(hwc_drm_bo_t)); bo->width = gr_handle->width; bo->height = gr_handle->height; - bo->format = ConvertHalFormatToDrm(gr_handle->format); + bo->format = fmt; bo->usage = gr_handle->usage; bo->pitches[0] = gr_handle->stride; bo->gem_handles[0] = gem_handle; ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [patch 1/1] drivers/gpu/drm/i915/intel_guc_log.c: work around gcc-4.4.4 union initializer issue
On Wed, 07 Mar 2018, a...@linux-foundation.org wrote: > From: Andrew Morton> Subject: drivers/gpu/drm/i915/intel_guc_log.c: work around gcc-4.4.4 union > initializer issue > > gcc-4.4.4 has problems with initalizers of anon unions. > > drivers/gpu/drm/i915/intel_guc_log.c: In function 'guc_log_control': > drivers/gpu/drm/i915/intel_guc_log.c:64: error: unknown field > 'logging_enabled' specified in initializer > > Work around this. Thanks for the patch, pushed to drm-intel-next-queued. That said, how long do we have to care about old compilers? I thought we were converging on at the very least GCC 4.5 being required. BR, Jani. > > Fixes: 35fe703c3161 ("drm/i915/guc: Change values for i915_guc_log_control") > Cc: Michal Wajdeczko > Cc: Sagar Arun Kamble > Cc: Daniele Ceraolo Spurio > Cc: Tvrtko Ursulin > Cc: Joonas Lahtinen > Cc: Chris Wilson > Signed-off-by: Andrew Morton > --- > > drivers/gpu/drm/i915/intel_guc_log.c |6 -- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff -puN > drivers/gpu/drm/i915/intel_guc_log.c~drivers-gpu-drm-i915-intel_guc_logc-work-around-gcc-444-union-initializer-issue > drivers/gpu/drm/i915/intel_guc_log.c > --- > a/drivers/gpu/drm/i915/intel_guc_log.c~drivers-gpu-drm-i915-intel_guc_logc-work-around-gcc-444-union-initializer-issue > +++ a/drivers/gpu/drm/i915/intel_guc_log.c > @@ -61,8 +61,10 @@ static int guc_log_flush(struct intel_gu > static int guc_log_control(struct intel_guc *guc, bool enable, u32 verbosity) > { > union guc_log_control control_val = { > - .logging_enabled = enable, > - .verbosity = verbosity, > + { > + .logging_enabled = enable, > + .verbosity = verbosity, > + }, > }; > u32 action[] = { > INTEL_GUC_ACTION_UK_LOG_ENABLE_LOGGING, > _ > ___ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel -- Jani Nikula, Intel Open Source Technology Center ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
[Bug 103234] KWin crashed when Alt+Tab-ing through open windows
https://bugs.freedesktop.org/show_bug.cgi?id=103234 --- Comment #16 from Roman Gilg--- I can't reproduce the issue currently. What is weird, since it didn't work for months. Maybe it's working now again because I deleted the $HOME/.cache content? Could someone with the same problem do the same to see if it works afterwards as well for him again? -- You are receiving this mail because: You are the assignee for the bug.___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
[Bug 28433] Mesa DRI Intel 845G GEM Drivers returning artifacts in textures that can lockup PC on glxSwapBuffers.
https://bugs.freedesktop.org/show_bug.cgi?id=28433 --- Comment #4 from Gert Wollny--- I can't see any artefacts on i915 with GM45. In fact there the rendering looks better then with the llvmpipe software renderer and r600. These two create over-bright pixels that are not present with i915. Versions tested: - i915 and llvmpipe: Mesa 13.0.6 - r600 and llvmpipe: Mesa 18.1.0-devel (git-dcd8730445 -- You are receiving this mail because: You are the assignee for the bug.___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
[Bug 105302] [DC] - Maximum pixel clock of dual-link DVI too low for some modes
https://bugs.freedesktop.org/show_bug.cgi?id=105302 --- Comment #6 from Andrew Sheldon--- (In reply to Alex Deucher from comment #5) > I'd rather not support running things out of spec in the driver. The source > is open. If you want to adjust the code allow something like that you can. Fair enough, it's simple enough to patch the source for a higher limit. -- You are receiving this mail because: You are the assignee for the bug.___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
Re: [PATCH] dt-bindings: exynos: Document #sound-dai-cells property of the HDMI node
Hi Marek, 2018년 03월 08일 16:36에 Marek Szyprowski 이(가) 쓴 글: > Hi Inki, > > On 2018-03-08 07:50, Inki Dae wrote: >> 2018년 03월 08일 15:29에 Marek Szyprowski 이(가) 쓴 글: >>> On 2018-03-08 05:01, Inki Dae wrote: 2018년 03월 08일 02:11에 Sylwester Nawrocki 이(가) 쓴 글: > The #sound-dai-cells DT property is required to describe link between > the HDMI IP block and the SoC's audio subsystem. > > Signed-off-by: Sylwester Nawrocki> --- >Documentation/devicetree/bindings/display/exynos/exynos_hdmi.txt | 3 > +++ >1 file changed, 3 insertions(+) > > diff --git > a/Documentation/devicetree/bindings/display/exynos/exynos_hdmi.txt > b/Documentation/devicetree/bindings/display/exynos/exynos_hdmi.txt > index 8715ff06c457..6b2a526ec586 100644 > --- a/Documentation/devicetree/bindings/display/exynos/exynos_hdmi.txt > +++ b/Documentation/devicetree/bindings/display/exynos/exynos_hdmi.txt > @@ -50,6 +50,9 @@ Required properties for Exynos 5433: >- clock-names: aliases for above clock specfiers. >- samsung,sysreg: handle to syscon used to control the system > registers. >+Optional properties for Exynos 4210, 4212, 5420 and 5433: > + - #sound-dai-cells: should be 0. > + Just trivial question. 'sound-dai-cells' property could affect hdmi driver? I looked into HDMI codec driver but I didn't find relevat code. I mean that if this property never affect HDMI driver then this property would be a dead thing even through this can be declared optionally. >>> This property is used by ASoC framework when it is building connections >>> between all elements of the virtual 'sound card'. It allows generic >>> code to find proper driver for the digital audio interface (DAI) object. >> I also assumed that some place of ASoC framework checks this property. For >> this I looked into HDMI codec driver(sound/soc/codecs/hdmi-codec.c) and >> relevant interfaces of ASoC framework. >> But I couldn't find it. :( Could you let me know which code of ASoC >> framework checks this? I saw this property only in 'snd_soc_of_get_dai_name' >> and 'snd_soc_of_get_dai_link_codecs' functions but seems these functions >> aren't called by the HDMI codec driver. > > It is used by snd_soc_of_get_dai_link_codecs() function, which is called > from respective board/machine driver. See sound/soc/samsung/odroid.c for > good example. It allows to automatically create connection to max98090 and > hdmi codec devices, which are specified in 'sound/codec' node (see > exynos5422-odroidxu3-audio.dtsi). Ah, sorry, I missed to check that driver and checked only DRM drivers. :) By the way, it seems 'sound-dai-cells' property never affect Exynos4210/4212/5420/5433. It seems that even through ALSA TM2 audio driver(tm2_wm5110.c) exists the driver never check the property. However, this patch adds below description. "Optional properties for Exynos 4210, 4212, 5420 and 5433" Is there a possibility for other boards based on Exynos4210/4212/5420/5433 SoC to use this property later? Thanks, Inki Dae > > Best regards ___ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel