|
@@ -77,6 +77,30 @@ static void cam_cpas_process_bw_overrides(
|
|
bus_client->common_data.name, *ab, *ib, curr_ab, curr_ib);
|
|
bus_client->common_data.name, *ab, *ib, curr_ab, curr_ib);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+int cam_cpas_util_reg_read(struct cam_hw_info *cpas_hw,
|
|
|
|
+ enum cam_cpas_reg_base reg_base, struct cam_cpas_reg *reg_info)
|
|
|
|
+{
|
|
|
|
+ struct cam_cpas *cpas_core = (struct cam_cpas *) cpas_hw->core_info;
|
|
|
|
+ struct cam_hw_soc_info *soc_info = &cpas_hw->soc_info;
|
|
|
|
+ uint32_t value;
|
|
|
|
+ int reg_base_index;
|
|
|
|
+
|
|
|
|
+ if (!reg_info->enable)
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+ reg_base_index = cpas_core->regbase_index[reg_base];
|
|
|
|
+ if (reg_base_index == -1)
|
|
|
|
+ return -EINVAL;
|
|
|
|
+
|
|
|
|
+ value = cam_io_r_mb(
|
|
|
|
+ soc_info->reg_map[reg_base_index].mem_base + reg_info->offset);
|
|
|
|
+
|
|
|
|
+ CAM_INFO(CAM_CPAS, "Base[%d] Offset[0x%08x] Value[0x%08x]",
|
|
|
|
+ reg_base, reg_info->offset, value);
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
int cam_cpas_util_reg_update(struct cam_hw_info *cpas_hw,
|
|
int cam_cpas_util_reg_update(struct cam_hw_info *cpas_hw,
|
|
enum cam_cpas_reg_base reg_base, struct cam_cpas_reg *reg_info)
|
|
enum cam_cpas_reg_base reg_base, struct cam_cpas_reg *reg_info)
|
|
{
|
|
{
|
|
@@ -1089,10 +1113,6 @@ static int cam_cpas_hw_update_axi_vote(struct cam_hw_info *cpas_hw,
|
|
cam_cpas_dump_axi_vote_info(cpas_core->cpas_client[client_indx],
|
|
cam_cpas_dump_axi_vote_info(cpas_core->cpas_client[client_indx],
|
|
"Translated Vote", axi_vote);
|
|
"Translated Vote", axi_vote);
|
|
|
|
|
|
- /* Log an entry whenever there is an AXI update - before updating */
|
|
|
|
- cam_cpas_update_monitor_array(cpas_hw, "CPAS AXI pre-update",
|
|
|
|
- client_indx);
|
|
|
|
-
|
|
|
|
rc = cam_cpas_util_apply_client_axi_vote(cpas_hw,
|
|
rc = cam_cpas_util_apply_client_axi_vote(cpas_hw,
|
|
cpas_core->cpas_client[client_indx], axi_vote);
|
|
cpas_core->cpas_client[client_indx], axi_vote);
|
|
|
|
|
|
@@ -1917,6 +1937,11 @@ static int cam_cpas_log_vote(struct cam_hw_info *cpas_hw)
|
|
|
|
|
|
cam_cpas_dump_monitor_array(cpas_core);
|
|
cam_cpas_dump_monitor_array(cpas_core);
|
|
|
|
|
|
|
|
+ if (cpas_core->internal_ops.print_poweron_settings)
|
|
|
|
+ cpas_core->internal_ops.print_poweron_settings(cpas_hw);
|
|
|
|
+ else
|
|
|
|
+ CAM_DBG(CAM_CPAS, "No ops for print_poweron_settings");
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1930,6 +1955,7 @@ static void cam_cpas_update_monitor_array(struct cam_hw_info *cpas_hw,
|
|
struct cam_cpas_monitor *entry;
|
|
struct cam_cpas_monitor *entry;
|
|
int iterator;
|
|
int iterator;
|
|
int i;
|
|
int i;
|
|
|
|
+ int reg_camnoc = cpas_core->regbase_index[CAM_CPAS_REG_CAMNOC];
|
|
|
|
|
|
CAM_CPAS_INC_MONITOR_HEAD(&cpas_core->monitor_head, &iterator);
|
|
CAM_CPAS_INC_MONITOR_HEAD(&cpas_core->monitor_head, &iterator);
|
|
|
|
|
|
@@ -1985,6 +2011,20 @@ static void cam_cpas_update_monitor_array(struct cam_hw_info *cpas_hw,
|
|
entry->be_ddr = cam_io_r_mb(rpmh_base + be_ddr_offset);
|
|
entry->be_ddr = cam_io_r_mb(rpmh_base + be_ddr_offset);
|
|
entry->be_mnoc = cam_io_r_mb(rpmh_base + be_mnoc_offset);
|
|
entry->be_mnoc = cam_io_r_mb(rpmh_base + be_mnoc_offset);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ entry->camnoc_fill_level[0] = cam_io_r_mb(
|
|
|
|
+ soc_info->reg_map[reg_camnoc].mem_base + 0xA20);
|
|
|
|
+ entry->camnoc_fill_level[1] = cam_io_r_mb(
|
|
|
|
+ soc_info->reg_map[reg_camnoc].mem_base + 0x1420);
|
|
|
|
+ entry->camnoc_fill_level[2] = cam_io_r_mb(
|
|
|
|
+ soc_info->reg_map[reg_camnoc].mem_base + 0x1A20);
|
|
|
|
+
|
|
|
|
+ if (cpas_hw->soc_info.hw_version == CAM_CPAS_TITAN_580_V100) {
|
|
|
|
+ entry->camnoc_fill_level[3] = cam_io_r_mb(
|
|
|
|
+ soc_info->reg_map[reg_camnoc].mem_base + 0x7620);
|
|
|
|
+ entry->camnoc_fill_level[4] = cam_io_r_mb(
|
|
|
|
+ soc_info->reg_map[reg_camnoc].mem_base + 0x7420);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
static void cam_cpas_dump_monitor_array(
|
|
static void cam_cpas_dump_monitor_array(
|
|
@@ -1995,6 +2035,7 @@ static void cam_cpas_dump_monitor_array(
|
|
uint32_t index, num_entries, oldest_entry;
|
|
uint32_t index, num_entries, oldest_entry;
|
|
uint64_t ms, tmp, hrs, min, sec;
|
|
uint64_t ms, tmp, hrs, min, sec;
|
|
struct cam_cpas_monitor *entry;
|
|
struct cam_cpas_monitor *entry;
|
|
|
|
+ struct timespec64 curr_timestamp;
|
|
|
|
|
|
if (!cpas_core->full_state_dump)
|
|
if (!cpas_core->full_state_dump)
|
|
return;
|
|
return;
|
|
@@ -2013,7 +2054,17 @@ static void cam_cpas_dump_monitor_array(
|
|
CAM_CPAS_MONITOR_MAX_ENTRIES, &oldest_entry);
|
|
CAM_CPAS_MONITOR_MAX_ENTRIES, &oldest_entry);
|
|
}
|
|
}
|
|
|
|
|
|
- CAM_INFO(CAM_CPAS, "======== Dumping monitor information ===========");
|
|
|
|
|
|
+
|
|
|
|
+ ktime_get_real_ts64(&curr_timestamp);
|
|
|
|
+ tmp = curr_timestamp.tv_sec;
|
|
|
|
+ ms = (curr_timestamp.tv_nsec) / 1000000;
|
|
|
|
+ sec = do_div(tmp, 60);
|
|
|
|
+ min = do_div(tmp, 60);
|
|
|
|
+ hrs = do_div(tmp, 24);
|
|
|
|
+
|
|
|
|
+ CAM_INFO(CAM_CPAS,
|
|
|
|
+ "**** %llu:%llu:%llu.%llu : ======== Dumping monitor information ===========",
|
|
|
|
+ hrs, min, sec, ms);
|
|
|
|
|
|
index = oldest_entry;
|
|
index = oldest_entry;
|
|
|
|
|
|
@@ -2048,6 +2099,19 @@ static void cam_cpas_dump_monitor_array(
|
|
entry->be_ddr, entry->be_mnoc);
|
|
entry->be_ddr, entry->be_mnoc);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ CAM_INFO(CAM_CPAS,
|
|
|
|
+ "CAMNOC REG[Queued Pending] linear[%d %d] rdi0_wr[%d %d] ubwc_stats0[%d %d] ubwc_stats1[%d %d] rdi1_wr[%d %d]",
|
|
|
|
+ (entry->camnoc_fill_level[0] & 0x7FF),
|
|
|
|
+ (entry->camnoc_fill_level[0] & 0x7F0000) >> 16,
|
|
|
|
+ (entry->camnoc_fill_level[1] & 0x7FF),
|
|
|
|
+ (entry->camnoc_fill_level[1] & 0x7F0000) >> 16,
|
|
|
|
+ (entry->camnoc_fill_level[2] & 0x7FF),
|
|
|
|
+ (entry->camnoc_fill_level[2] & 0x7F0000) >> 16,
|
|
|
|
+ (entry->camnoc_fill_level[3] & 0x7FF),
|
|
|
|
+ (entry->camnoc_fill_level[3] & 0x7F0000) >> 16,
|
|
|
|
+ (entry->camnoc_fill_level[4] & 0x7FF),
|
|
|
|
+ (entry->camnoc_fill_level[4] & 0x7F0000) >> 16);
|
|
|
|
+
|
|
index = (index + 1) % CAM_CPAS_MONITOR_MAX_ENTRIES;
|
|
index = (index + 1) % CAM_CPAS_MONITOR_MAX_ENTRIES;
|
|
}
|
|
}
|
|
}
|
|
}
|