Commit a8b53760 authored by Mustapha Ghaddar's avatar Mustapha Ghaddar Committed by Alex Deucher

drm/amd/display: Add function pointer for validate bw usb4

[WHY]
In order to follow the new protocol of calling link functions

[HOW]
Add the function pointer to the link_srv
Reviewed-by: default avatarKshitij Bhardwaj <kshitij.bhardwaj1@amd.com>
Acked-by: default avatarQingqing Zhuo <qingqing.zhuo@amd.com>
Signed-off-by: default avatarMustapha Ghaddar <mghaddar@amd.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent b5006f87
...@@ -473,3 +473,8 @@ void dc_link_enable_hpd_filter(struct dc_link *link, bool enable) ...@@ -473,3 +473,8 @@ void dc_link_enable_hpd_filter(struct dc_link *link, bool enable)
{ {
link->dc->link_srv->enable_hpd_filter(link, enable); link->dc->link_srv->enable_hpd_filter(link, enable);
} }
bool dc_link_validate(struct dc *dc, const struct dc_stream_state *streams, const unsigned int count)
{
return dc->link_srv->validate_dpia_bandwidth(streams, count);
}
...@@ -2028,6 +2028,19 @@ void dc_link_handle_usb4_bw_alloc_response(struct dc_link *link, ...@@ -2028,6 +2028,19 @@ void dc_link_handle_usb4_bw_alloc_response(struct dc_link *link,
int dc_link_dp_dpia_handle_usb4_bandwidth_allocation_for_link( int dc_link_dp_dpia_handle_usb4_bandwidth_allocation_for_link(
struct dc_link *link, int peak_bw); struct dc_link *link, int peak_bw);
/*
* Validate the BW of all the valid DPIA links to make sure it doesn't exceed
* available BW for each host router
*
* @dc: pointer to dc struct
* @stream: pointer to all possible streams
* @num_streams: number of valid DPIA streams
*
* return: TRUE if bw used by DPIAs doesn't exceed available BW else return FALSE
*/
bool dc_link_validate(struct dc *dc, const struct dc_stream_state *streams,
const unsigned int count);
/* Sink Interfaces - A sink corresponds to a display output device */ /* Sink Interfaces - A sink corresponds to a display output device */
struct dc_container_id { struct dc_container_id {
......
...@@ -144,6 +144,9 @@ struct link_service { ...@@ -144,6 +144,9 @@ struct link_service {
uint32_t (*dp_link_bandwidth_kbps)( uint32_t (*dp_link_bandwidth_kbps)(
const struct dc_link *link, const struct dc_link *link,
const struct dc_link_settings *link_settings); const struct dc_link_settings *link_settings);
bool (*validate_dpia_bandwidth)(
const struct dc_stream_state *stream,
const unsigned int num_streams);
/*************************** DPMS *************************************/ /*************************** DPMS *************************************/
......
...@@ -99,6 +99,7 @@ static void construct_link_service_validation(struct link_service *link_srv) ...@@ -99,6 +99,7 @@ static void construct_link_service_validation(struct link_service *link_srv)
{ {
link_srv->validate_mode_timing = link_validate_mode_timing; link_srv->validate_mode_timing = link_validate_mode_timing;
link_srv->dp_link_bandwidth_kbps = dp_link_bandwidth_kbps; link_srv->dp_link_bandwidth_kbps = dp_link_bandwidth_kbps;
link_srv->validate_dpia_bandwidth = link_validate_dpia_bandwidth;
} }
/* link dpms owns the programming sequence of stream's dpms state associated /* link dpms owns the programming sequence of stream's dpms state associated
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
*/ */
#include "link_validation.h" #include "link_validation.h"
#include "protocols/link_dp_capability.h" #include "protocols/link_dp_capability.h"
#include "protocols/link_dp_dpia_bw.h"
#include "resource.h" #include "resource.h"
#define DC_LOGGER_INIT(logger) #define DC_LOGGER_INIT(logger)
...@@ -343,3 +344,20 @@ enum dc_status link_validate_mode_timing( ...@@ -343,3 +344,20 @@ enum dc_status link_validate_mode_timing(
return DC_OK; return DC_OK;
} }
bool link_validate_dpia_bandwidth(const struct dc_stream_state *stream, const unsigned int num_streams)
{
bool ret = true;
int bw_needed[MAX_DPIA_NUM];
struct dc_link *link[MAX_DPIA_NUM];
if (!num_streams || num_streams > MAX_DPIA_NUM)
return ret;
for (uint8_t i = 0; i < num_streams; ++i) {
link[i] = stream[i].link;
bw_needed[i] = dc_bandwidth_in_kbps_from_timing(&stream[i].timing);
}
return ret;
}
...@@ -29,7 +29,11 @@ enum dc_status link_validate_mode_timing( ...@@ -29,7 +29,11 @@ enum dc_status link_validate_mode_timing(
const struct dc_stream_state *stream, const struct dc_stream_state *stream,
struct dc_link *link, struct dc_link *link,
const struct dc_crtc_timing *timing); const struct dc_crtc_timing *timing);
bool link_validate_dpia_bandwidth(
const struct dc_stream_state *stream,
const unsigned int num_streams);
uint32_t dp_link_bandwidth_kbps( uint32_t dp_link_bandwidth_kbps(
const struct dc_link *link, const struct dc_link *link,
const struct dc_link_settings *link_settings); const struct dc_link_settings *link_settings);
#endif /* __LINK_VALIDATION_H__ */ #endif /* __LINK_VALIDATION_H__ */
...@@ -33,10 +33,6 @@ ...@@ -33,10 +33,6 @@
#define DC_LOGGER \ #define DC_LOGGER \
link->ctx->logger link->ctx->logger
/* Number of Host Routers per motherboard is 2 */
#define MAX_HR_NUM 2
/* Number of DPIA per host router is 2 */
#define MAX_DPIA_NUM (MAX_HR_NUM * 2)
#define Kbps_TO_Gbps (1000 * 1000) #define Kbps_TO_Gbps (1000 * 1000)
// ------------------------------------------------------------------ // ------------------------------------------------------------------
...@@ -379,9 +375,8 @@ void dpia_handle_bw_alloc_response(struct dc_link *link, uint8_t bw, uint8_t res ...@@ -379,9 +375,8 @@ void dpia_handle_bw_alloc_response(struct dc_link *link, uint8_t bw, uint8_t res
// 1. If due to unplug of other sink // 1. If due to unplug of other sink
if (estimated == host_router_total_estimated_bw) { if (estimated == host_router_total_estimated_bw) {
// First update the estimated & max_bw fields // First update the estimated & max_bw fields
if (link->dpia_bw_alloc_config.estimated_bw < estimated) { if (link->dpia_bw_alloc_config.estimated_bw < estimated)
link->dpia_bw_alloc_config.estimated_bw = estimated; link->dpia_bw_alloc_config.estimated_bw = estimated;
}
} }
// 2. If due to realloc bw btw 2 dpia due to plug OR realloc unused Bw // 2. If due to realloc bw btw 2 dpia due to plug OR realloc unused Bw
else { else {
...@@ -464,7 +459,7 @@ int link_dp_dpia_allocate_usb4_bandwidth_for_stream(struct dc_link *link, int re ...@@ -464,7 +459,7 @@ int link_dp_dpia_allocate_usb4_bandwidth_for_stream(struct dc_link *link, int re
out: out:
return ret; return ret;
} }
bool dpia_validate_usb4_bw(struct dc_link **link, int *bw_needed_per_dpia, uint8_t num_dpias) bool dpia_validate_usb4_bw(struct dc_link **link, int *bw_needed_per_dpia, const unsigned int num_dpias)
{ {
bool ret = true; bool ret = true;
int bw_needed_per_hr[MAX_HR_NUM] = { 0, 0 }; int bw_needed_per_hr[MAX_HR_NUM] = { 0, 0 };
......
...@@ -28,6 +28,11 @@ ...@@ -28,6 +28,11 @@
#include "link.h" #include "link.h"
/* Number of Host Routers per motherboard is 2 */
#define MAX_HR_NUM 2
/* Number of DPIA per host router is 2 */
#define MAX_DPIA_NUM (MAX_HR_NUM * 2)
/* /*
* Host Router BW type * Host Router BW type
*/ */
...@@ -92,6 +97,6 @@ void dpia_handle_bw_alloc_response(struct dc_link *link, uint8_t bw, uint8_t res ...@@ -92,6 +97,6 @@ void dpia_handle_bw_alloc_response(struct dc_link *link, uint8_t bw, uint8_t res
* *
* return: TRUE if bw used by DPIAs doesn't exceed available BW else return FALSE * return: TRUE if bw used by DPIAs doesn't exceed available BW else return FALSE
*/ */
bool dpia_validate_usb4_bw(struct dc_link **link, int *bw_needed, uint8_t num_dpias); bool dpia_validate_usb4_bw(struct dc_link **link, int *bw_needed, const unsigned int num_dpias);
#endif /* DC_INC_LINK_DP_DPIA_BW_H_ */ #endif /* DC_INC_LINK_DP_DPIA_BW_H_ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment