소스 검색

msm: camera: cpas: Add support for drv bw override

Add support to override ddr drv high and low bw values that
are voted to interconnect.

CRs-Fixed: 3065551
Change-Id: I3f0585f1dd0fd61fcf136487596727d890eecb65
Signed-off-by: Mukund Madhusudan Atre <[email protected]>
Mukund Madhusudan Atre 2 년 전
부모
커밋
a1ec987611
3개의 변경된 파일137개의 추가작업 그리고 12개의 파일을 삭제
  1. 90 12
      drivers/cam_cpas/cam_cpas_hw.c
  2. 31 0
      drivers/cam_utils/cam_debug_util.c
  3. 16 0
      drivers/cam_utils/cam_debug_util.h

+ 90 - 12
drivers/cam_cpas/cam_cpas_hw.c

@@ -32,6 +32,75 @@ static void cam_cpas_update_monitor_array(struct cam_hw_info *cpas_hw,
 static void cam_cpas_dump_monitor_array(
 	struct cam_hw_info *cpas_hw);
 
+static void cam_cpas_process_drv_bw_overrides(
+	struct cam_cpas_bus_client *bus_client, uint64_t *high_ab, uint64_t *high_ib,
+	uint64_t *low_ab, uint64_t *low_ib, const struct cam_cpas_debug_settings *cpas_settings)
+{
+	uint64_t curr_ab_high = *high_ab;
+	uint64_t curr_ib_high = *high_ib;
+	uint64_t curr_ab_low = *low_ab;
+	uint64_t curr_ib_low = *low_ib;
+	size_t name_len = strlen(bus_client->common_data.name);
+
+	if (!cpas_settings) {
+		CAM_ERR(CAM_CPAS, "Invalid cpas debug settings");
+		return;
+	}
+
+	if (strnstr(bus_client->common_data.name, "cam_ife_0_drv",
+		name_len)) {
+		if (cpas_settings->cam_ife_0_drv_ab_high_bw)
+			*high_ab = cpas_settings->cam_ife_0_drv_ab_high_bw;
+		if (cpas_settings->cam_ife_0_drv_ib_high_bw)
+			*high_ib = cpas_settings->cam_ife_0_drv_ib_high_bw;
+		if (cpas_settings->cam_ife_0_drv_ab_low_bw)
+			*low_ab = cpas_settings->cam_ife_0_drv_ab_low_bw;
+		if (cpas_settings->cam_ife_0_drv_ib_low_bw)
+			*low_ib = cpas_settings->cam_ife_0_drv_ib_low_bw;
+		if (cpas_settings->cam_ife_0_drv_low_set_zero) {
+			*low_ab = 0;
+			*low_ib = 0;
+		}
+	} else if (strnstr(bus_client->common_data.name, "cam_ife_1_drv",
+		name_len)) {
+		if (cpas_settings->cam_ife_1_drv_ab_high_bw)
+			*high_ab = cpas_settings->cam_ife_1_drv_ab_high_bw;
+		if (cpas_settings->cam_ife_1_drv_ib_high_bw)
+			*high_ib = cpas_settings->cam_ife_1_drv_ib_high_bw;
+		if (cpas_settings->cam_ife_1_drv_ab_low_bw)
+			*low_ab = cpas_settings->cam_ife_1_drv_ab_low_bw;
+		if (cpas_settings->cam_ife_1_drv_ib_low_bw)
+			*low_ib = cpas_settings->cam_ife_1_drv_ib_low_bw;
+		if (cpas_settings->cam_ife_1_drv_low_set_zero) {
+			*low_ab = 0;
+			*low_ib = 0;
+		}
+	} else if (strnstr(bus_client->common_data.name, "cam_ife_2_drv",
+		name_len)) {
+		if (cpas_settings->cam_ife_2_drv_ab_high_bw)
+			*high_ab = cpas_settings->cam_ife_2_drv_ab_high_bw;
+		if (cpas_settings->cam_ife_2_drv_ib_high_bw)
+			*high_ib = cpas_settings->cam_ife_2_drv_ib_high_bw;
+		if (cpas_settings->cam_ife_2_drv_ab_low_bw)
+			*low_ab = cpas_settings->cam_ife_2_drv_ab_low_bw;
+		if (cpas_settings->cam_ife_2_drv_ib_low_bw)
+			*low_ib = cpas_settings->cam_ife_2_drv_ib_low_bw;
+		if (cpas_settings->cam_ife_2_drv_low_set_zero) {
+			*low_ab = 0;
+			*low_ib = 0;
+		}
+	} else {
+		CAM_ERR(CAM_CPAS, "unknown mnoc port: %s, bw override failed",
+			bus_client->common_data.name);
+		return;
+	}
+
+	CAM_INFO(CAM_CPAS,
+		"Overriding mnoc bw for: %s with [AB IB] high: [%llu %llu], low: [%llu %llu], curr high: [%llu %llu], curr low: [%llu %llu]",
+		bus_client->common_data.name, *high_ab, *high_ib, *low_ab, *low_ib,
+		curr_ab_high, curr_ib_high, curr_ab_low, curr_ib_low);
+}
+
 static void cam_cpas_process_bw_overrides(
 	struct cam_cpas_bus_client *bus_client, uint64_t *ab, uint64_t *ib,
 	const struct cam_cpas_debug_settings *cpas_settings)
@@ -182,6 +251,7 @@ static int cam_cpas_util_vote_drv_bus_client_bw(struct cam_cpas_bus_client *bus_
 	struct cam_cpas_axi_bw_info *curr_vote, struct cam_cpas_axi_bw_info *applied_vote)
 {
 	int rc = 0;
+	const struct camera_debug_settings *cam_debug = NULL;
 
 	if (!bus_client->valid) {
 		CAM_ERR(CAM_CPAS, "bus client: %s not valid",
@@ -199,6 +269,23 @@ static int cam_cpas_util_vote_drv_bus_client_bw(struct cam_cpas_bus_client *bus_
 		(curr_vote->drv_vote.high.ib < CAM_CPAS_AXI_MIN_MNOC_IB_BW))
 		curr_vote->drv_vote.high.ib = CAM_CPAS_AXI_MIN_MNOC_IB_BW;
 
+	if ((curr_vote->drv_vote.low.ab > 0) &&
+		(curr_vote->drv_vote.low.ab < CAM_CPAS_AXI_MIN_MNOC_AB_BW))
+		curr_vote->drv_vote.low.ab = CAM_CPAS_AXI_MIN_MNOC_AB_BW;
+
+	if ((curr_vote->drv_vote.low.ib > 0) &&
+		(curr_vote->drv_vote.low.ib < CAM_CPAS_AXI_MIN_MNOC_IB_BW))
+		curr_vote->drv_vote.low.ib = CAM_CPAS_AXI_MIN_MNOC_IB_BW;
+
+	cam_debug = cam_debug_get_settings();
+
+	if ((curr_vote->drv_vote.high.ab || curr_vote->drv_vote.high.ib ||
+		curr_vote->drv_vote.low.ab || curr_vote->drv_vote.low.ib) &&
+		cam_debug && cam_debug->cpas_settings.is_updated)
+		cam_cpas_process_drv_bw_overrides(bus_client, &curr_vote->drv_vote.high.ab,
+			&curr_vote->drv_vote.high.ib, &curr_vote->drv_vote.low.ab,
+			&curr_vote->drv_vote.low.ib, &cam_debug->cpas_settings);
+
 	if (debug_drv)
 		CAM_INFO(CAM_CPAS, "Bus_client: %s, DRV vote high=[%llu %llu] low=[%llu %llu]",
 			bus_client->common_data.name, curr_vote->drv_vote.high.ab,
@@ -239,7 +326,7 @@ end:
 
 static int cam_cpas_util_vote_hlos_bus_client_bw(
 	struct cam_cpas_bus_client *bus_client, uint64_t ab, uint64_t ib,
-	bool camnoc_bw, uint64_t *applied_ab, uint64_t *applied_ib)
+	bool is_camnoc_bw, uint64_t *applied_ab, uint64_t *applied_ib)
 {
 	int rc = 0;
 	uint64_t min_camnoc_ib_bw = CAM_CPAS_AXI_MIN_CAMNOC_IB_BW;
@@ -261,7 +348,7 @@ static int cam_cpas_util_vote_hlos_bus_client_bw(
 		min_camnoc_ib_bw);
 
 	mutex_lock(&bus_client->lock);
-	if (camnoc_bw) {
+	if (is_camnoc_bw) {
 		if ((ab > 0) && (ab < CAM_CPAS_AXI_MIN_CAMNOC_AB_BW))
 			ab = CAM_CPAS_AXI_MIN_CAMNOC_AB_BW;
 
@@ -277,16 +364,7 @@ static int cam_cpas_util_vote_hlos_bus_client_bw(
 
 	cam_debug = cam_debug_get_settings();
 
-	if (cam_debug && (cam_debug->cpas_settings.mnoc_hf_0_ab_bw ||
-		cam_debug->cpas_settings.mnoc_hf_0_ib_bw ||
-		cam_debug->cpas_settings.mnoc_hf_1_ab_bw ||
-		cam_debug->cpas_settings.mnoc_hf_1_ib_bw ||
-		cam_debug->cpas_settings.mnoc_sf_0_ab_bw ||
-		cam_debug->cpas_settings.mnoc_sf_0_ib_bw ||
-		cam_debug->cpas_settings.mnoc_sf_1_ab_bw ||
-		cam_debug->cpas_settings.mnoc_sf_1_ib_bw ||
-		cam_debug->cpas_settings.mnoc_sf_icp_ab_bw ||
-		cam_debug->cpas_settings.mnoc_sf_icp_ib_bw))
+	if ((ab || ib) && cam_debug && cam_debug->cpas_settings.is_updated)
 		cam_cpas_process_bw_overrides(bus_client, &ab, &ib,
 			&cam_debug->cpas_settings);
 

+ 31 - 0
drivers/cam_utils/cam_debug_util.c

@@ -135,11 +135,42 @@ static int cam_debug_parse_cpas_settings(const char *setting, u64 value)
 		cam_debug.cpas_settings.mnoc_sf_icp_ab_bw = value;
 	} else if (!strcmp(setting, "mnoc_sf_icp_ib_bw")) {
 		cam_debug.cpas_settings.mnoc_sf_icp_ib_bw = value;
+	} else if (!strcmp(setting, "cam_ife_0_drv_ab_high_bw")) {
+		cam_debug.cpas_settings.cam_ife_0_drv_ab_high_bw = value;
+	} else if (!strcmp(setting, "cam_ife_0_drv_ib_high_bw")) {
+		cam_debug.cpas_settings.cam_ife_0_drv_ib_high_bw = value;
+	} else if (!strcmp(setting, "cam_ife_1_drv_ab_high_bw")) {
+		cam_debug.cpas_settings.cam_ife_1_drv_ab_high_bw = value;
+	} else if (!strcmp(setting, "cam_ife_1_drv_ib_high_bw")) {
+		cam_debug.cpas_settings.cam_ife_1_drv_ib_high_bw = value;
+	} else if (!strcmp(setting, "cam_ife_2_drv_ab_high_bw")) {
+		cam_debug.cpas_settings.cam_ife_2_drv_ab_high_bw = value;
+	} else if (!strcmp(setting, "cam_ife_2_drv_ib_high_bw")) {
+		cam_debug.cpas_settings.cam_ife_2_drv_ib_high_bw = value;
+	} else if (!strcmp(setting, "cam_ife_0_drv_ab_low_bw")) {
+		cam_debug.cpas_settings.cam_ife_0_drv_ab_low_bw = value;
+	} else if (!strcmp(setting, "cam_ife_0_drv_ib_low_bw")) {
+		cam_debug.cpas_settings.cam_ife_0_drv_ib_low_bw = value;
+	} else if (!strcmp(setting, "cam_ife_1_drv_ab_low_bw")) {
+		cam_debug.cpas_settings.cam_ife_1_drv_ab_low_bw = value;
+	} else if (!strcmp(setting, "cam_ife_1_drv_ib_low_bw")) {
+		cam_debug.cpas_settings.cam_ife_1_drv_ib_low_bw = value;
+	} else if (!strcmp(setting, "cam_ife_2_drv_ab_low_bw")) {
+		cam_debug.cpas_settings.cam_ife_2_drv_ab_low_bw = value;
+	} else if (!strcmp(setting, "cam_ife_2_drv_ib_low_bw")) {
+		cam_debug.cpas_settings.cam_ife_2_drv_ib_low_bw = value;
+	} else if (!strcmp(setting, "cam_ife_0_drv_low_set_zero")) {
+		cam_debug.cpas_settings.cam_ife_0_drv_low_set_zero = value;
+	} else if (!strcmp(setting, "cam_ife_1_drv_low_set_zero")) {
+		cam_debug.cpas_settings.cam_ife_1_drv_low_set_zero = value;
+	} else if (!strcmp(setting, "cam_ife_2_drv_low_set_zero")) {
+		cam_debug.cpas_settings.cam_ife_2_drv_low_set_zero = value;
 	} else {
 		CAM_ERR(CAM_UTIL, "Unsupported cpas sysfs entry");
 		return -EINVAL;
 	}
 
+	cam_debug.cpas_settings.is_updated = true;
 	return 0;
 }
 

+ 16 - 0
drivers/cam_utils/cam_debug_util.h

@@ -347,6 +347,22 @@ struct cam_cpas_debug_settings {
 	uint64_t mnoc_sf_icp_ab_bw;
 	uint64_t mnoc_sf_icp_ib_bw;
 	uint64_t camnoc_bw;
+	uint64_t cam_ife_0_drv_ab_high_bw;
+	uint64_t cam_ife_0_drv_ib_high_bw;
+	uint64_t cam_ife_1_drv_ab_high_bw;
+	uint64_t cam_ife_1_drv_ib_high_bw;
+	uint64_t cam_ife_2_drv_ab_high_bw;
+	uint64_t cam_ife_2_drv_ib_high_bw;
+	uint64_t cam_ife_0_drv_ab_low_bw;
+	uint64_t cam_ife_0_drv_ib_low_bw;
+	uint64_t cam_ife_1_drv_ab_low_bw;
+	uint64_t cam_ife_1_drv_ib_low_bw;
+	uint64_t cam_ife_2_drv_ab_low_bw;
+	uint64_t cam_ife_2_drv_ib_low_bw;
+	uint64_t cam_ife_0_drv_low_set_zero;
+	uint64_t cam_ife_1_drv_low_set_zero;
+	uint64_t cam_ife_2_drv_low_set_zero;
+	bool     is_updated;
 };
 
 /**