mirror of
git://nv-tegra.nvidia.com/linux-hwpm.git
synced 2025-12-24 02:07:34 +03:00
tegra: hwpm: t234: add generated hw headers
- Generate HWPM hw headers using register generator tool. - Add required hw headers to include/hw/ path - Update driver code to replace static hw defines with hw header definitions. - Remove unused static hw defines. THWPM-39 Change-Id: I57566d51657bb6b22c4b581acd257f1871438adf Signed-off-by: Vedashree Vidwans <vvidwans@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvidia/+/2552741 Tested-by: mobile promotions <svcmobile_promotions@nvidia.com> Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
This commit is contained in:
committed by
mobile promotions
parent
78465d56ca
commit
0cb6f6b48f
@@ -31,6 +31,10 @@
|
||||
|
||||
#include <uapi/linux/tegra-soc-hwpm-uapi.h>
|
||||
|
||||
#include "include/hw/t234/hw_pmasys_soc_hwpm.h"
|
||||
#include "include/hw/t234/hw_pmmsys_soc_hwpm.h"
|
||||
#include "include/hw/t234/hw_addr_map_soc_hwpm.h"
|
||||
|
||||
#include "tegra-soc-hwpm.h"
|
||||
#include "tegra-soc-hwpm-io.h"
|
||||
|
||||
@@ -139,37 +143,37 @@ static u32 **get_mc_fake_regs(struct tegra_soc_hwpm *hwpm,
|
||||
}
|
||||
|
||||
switch (aperture->start_pa) {
|
||||
case NV_ADDRESS_MAP_MC0_BASE:
|
||||
case addr_map_mc0_base_r():
|
||||
return &mc_fake_regs[0];
|
||||
case NV_ADDRESS_MAP_MC1_BASE:
|
||||
case addr_map_mc1_base_r():
|
||||
return &mc_fake_regs[1];
|
||||
case NV_ADDRESS_MAP_MC2_BASE:
|
||||
case addr_map_mc2_base_r():
|
||||
return &mc_fake_regs[2];
|
||||
case NV_ADDRESS_MAP_MC3_BASE:
|
||||
case addr_map_mc3_base_r():
|
||||
return &mc_fake_regs[3];
|
||||
case NV_ADDRESS_MAP_MC4_BASE:
|
||||
case addr_map_mc4_base_r():
|
||||
return &mc_fake_regs[4];
|
||||
case NV_ADDRESS_MAP_MC5_BASE:
|
||||
case addr_map_mc5_base_r():
|
||||
return &mc_fake_regs[5];
|
||||
case NV_ADDRESS_MAP_MC6_BASE:
|
||||
case addr_map_mc6_base_r():
|
||||
return &mc_fake_regs[6];
|
||||
case NV_ADDRESS_MAP_MC7_BASE:
|
||||
case addr_map_mc7_base_r():
|
||||
return &mc_fake_regs[7];
|
||||
case NV_ADDRESS_MAP_MC8_BASE:
|
||||
case addr_map_mc8_base_r():
|
||||
return &mc_fake_regs[8];
|
||||
case NV_ADDRESS_MAP_MC9_BASE:
|
||||
case addr_map_mc9_base_r():
|
||||
return &mc_fake_regs[9];
|
||||
case NV_ADDRESS_MAP_MC10_BASE:
|
||||
case addr_map_mc10_base_r():
|
||||
return &mc_fake_regs[10];
|
||||
case NV_ADDRESS_MAP_MC11_BASE:
|
||||
case addr_map_mc11_base_r():
|
||||
return &mc_fake_regs[11];
|
||||
case NV_ADDRESS_MAP_MC12_BASE:
|
||||
case addr_map_mc12_base_r():
|
||||
return &mc_fake_regs[12];
|
||||
case NV_ADDRESS_MAP_MC13_BASE:
|
||||
case addr_map_mc13_base_r():
|
||||
return &mc_fake_regs[13];
|
||||
case NV_ADDRESS_MAP_MC14_BASE:
|
||||
case addr_map_mc14_base_r():
|
||||
return &mc_fake_regs[14];
|
||||
case NV_ADDRESS_MAP_MC15_BASE:
|
||||
case addr_map_mc15_base_r():
|
||||
return &mc_fake_regs[15];
|
||||
default:
|
||||
return NULL;
|
||||
@@ -188,99 +192,99 @@ static void set_mc_fake_regs(struct tegra_soc_hwpm *hwpm,
|
||||
}
|
||||
|
||||
switch (aperture->start_pa) {
|
||||
case NV_ADDRESS_MAP_MC0_BASE:
|
||||
case addr_map_mc0_base_r():
|
||||
fake_regs = (!hwpm->fake_registers_enabled || set_null) ?
|
||||
NULL : mc_fake_regs[0];
|
||||
mss_channel_map[0].fake_registers = fake_regs;
|
||||
mss_iso_niso_hub_map[0].fake_registers = fake_regs;
|
||||
mss_mcf_map[0].fake_registers = fake_regs;
|
||||
break;
|
||||
case NV_ADDRESS_MAP_MC1_BASE:
|
||||
case addr_map_mc1_base_r():
|
||||
fake_regs = (!hwpm->fake_registers_enabled || set_null) ?
|
||||
NULL : mc_fake_regs[1];
|
||||
mss_channel_map[1].fake_registers = fake_regs;
|
||||
mss_iso_niso_hub_map[1].fake_registers = fake_regs;
|
||||
mss_mcf_map[1].fake_registers = fake_regs;
|
||||
break;
|
||||
case NV_ADDRESS_MAP_MC2_BASE:
|
||||
case addr_map_mc2_base_r():
|
||||
fake_regs = (!hwpm->fake_registers_enabled || set_null) ?
|
||||
NULL : mc_fake_regs[2];
|
||||
mss_channel_map[2].fake_registers = fake_regs;
|
||||
mss_iso_niso_hub_map[2].fake_registers = fake_regs;
|
||||
mss_mcf_map[2].fake_registers = fake_regs;
|
||||
break;
|
||||
case NV_ADDRESS_MAP_MC3_BASE:
|
||||
case addr_map_mc3_base_r():
|
||||
fake_regs = (!hwpm->fake_registers_enabled || set_null) ?
|
||||
NULL : mc_fake_regs[3];
|
||||
mss_channel_map[3].fake_registers = fake_regs;
|
||||
mss_iso_niso_hub_map[3].fake_registers = fake_regs;
|
||||
mss_mcf_map[3].fake_registers = fake_regs;
|
||||
break;
|
||||
case NV_ADDRESS_MAP_MC4_BASE:
|
||||
case addr_map_mc4_base_r():
|
||||
fake_regs = (!hwpm->fake_registers_enabled || set_null) ?
|
||||
NULL : mc_fake_regs[4];
|
||||
mss_channel_map[4].fake_registers = fake_regs;
|
||||
mss_iso_niso_hub_map[4].fake_registers = fake_regs;
|
||||
mss_mcf_map[4].fake_registers = fake_regs;
|
||||
break;
|
||||
case NV_ADDRESS_MAP_MC5_BASE:
|
||||
case addr_map_mc5_base_r():
|
||||
fake_regs = (!hwpm->fake_registers_enabled || set_null) ?
|
||||
NULL : mc_fake_regs[5];
|
||||
mss_channel_map[5].fake_registers = fake_regs;
|
||||
mss_iso_niso_hub_map[5].fake_registers = fake_regs;
|
||||
mss_mcf_map[5].fake_registers = fake_regs;
|
||||
break;
|
||||
case NV_ADDRESS_MAP_MC6_BASE:
|
||||
case addr_map_mc6_base_r():
|
||||
fake_regs = (!hwpm->fake_registers_enabled || set_null) ?
|
||||
NULL : mc_fake_regs[6];
|
||||
mss_channel_map[6].fake_registers = fake_regs;
|
||||
mss_iso_niso_hub_map[6].fake_registers = fake_regs;
|
||||
mss_mcf_map[6].fake_registers = fake_regs;
|
||||
break;
|
||||
case NV_ADDRESS_MAP_MC7_BASE:
|
||||
case addr_map_mc7_base_r():
|
||||
fake_regs = (!hwpm->fake_registers_enabled || set_null) ?
|
||||
NULL : mc_fake_regs[7];
|
||||
mss_channel_map[7].fake_registers = fake_regs;
|
||||
mss_iso_niso_hub_map[7].fake_registers = fake_regs;
|
||||
mss_mcf_map[7].fake_registers = fake_regs;
|
||||
break;
|
||||
case NV_ADDRESS_MAP_MC8_BASE:
|
||||
case addr_map_mc8_base_r():
|
||||
fake_regs = (!hwpm->fake_registers_enabled || set_null) ?
|
||||
NULL : mc_fake_regs[8];
|
||||
mss_channel_map[8].fake_registers = fake_regs;
|
||||
mss_iso_niso_hub_map[8].fake_registers = fake_regs;
|
||||
break;
|
||||
case NV_ADDRESS_MAP_MC9_BASE:
|
||||
case addr_map_mc9_base_r():
|
||||
fake_regs = (!hwpm->fake_registers_enabled || set_null) ?
|
||||
NULL : mc_fake_regs[9];
|
||||
mss_channel_map[9].fake_registers = fake_regs;
|
||||
break;
|
||||
case NV_ADDRESS_MAP_MC10_BASE:
|
||||
case addr_map_mc10_base_r():
|
||||
fake_regs = (!hwpm->fake_registers_enabled || set_null) ?
|
||||
NULL : mc_fake_regs[10];
|
||||
mss_channel_map[10].fake_registers = fake_regs;
|
||||
break;
|
||||
case NV_ADDRESS_MAP_MC11_BASE:
|
||||
case addr_map_mc11_base_r():
|
||||
fake_regs = (!hwpm->fake_registers_enabled || set_null) ?
|
||||
NULL : mc_fake_regs[11];
|
||||
mss_channel_map[11].fake_registers = fake_regs;
|
||||
break;
|
||||
case NV_ADDRESS_MAP_MC12_BASE:
|
||||
case addr_map_mc12_base_r():
|
||||
fake_regs = (!hwpm->fake_registers_enabled || set_null) ?
|
||||
NULL : mc_fake_regs[12];
|
||||
mss_channel_map[12].fake_registers = fake_regs;
|
||||
break;
|
||||
case NV_ADDRESS_MAP_MC13_BASE:
|
||||
case addr_map_mc13_base_r():
|
||||
fake_regs = (!hwpm->fake_registers_enabled || set_null) ?
|
||||
NULL : mc_fake_regs[13];
|
||||
mss_channel_map[13].fake_registers = fake_regs;
|
||||
break;
|
||||
case NV_ADDRESS_MAP_MC14_BASE:
|
||||
case addr_map_mc14_base_r():
|
||||
fake_regs = (!hwpm->fake_registers_enabled || set_null) ?
|
||||
NULL : mc_fake_regs[14];
|
||||
mss_channel_map[14].fake_registers = fake_regs;
|
||||
break;
|
||||
case NV_ADDRESS_MAP_MC15_BASE:
|
||||
case addr_map_mc15_base_r():
|
||||
fake_regs = (!hwpm->fake_registers_enabled || set_null) ?
|
||||
NULL : mc_fake_regs[15];
|
||||
mss_channel_map[15].fake_registers = fake_regs;
|
||||
@@ -517,84 +521,61 @@ static int alloc_pma_stream_ioctl(struct tegra_soc_hwpm *hwpm,
|
||||
}
|
||||
hwpm->mem_bytes_kernel = dma_buf_vmap(hwpm->mem_bytes_dma_buf);
|
||||
if (!hwpm->mem_bytes_kernel) {
|
||||
tegra_soc_hwpm_err("Unable to map mem_bytes buffer into kernel VA space");
|
||||
tegra_soc_hwpm_err(
|
||||
"Unable to map mem_bytes buffer into kernel VA space");
|
||||
ret = -ENOMEM;
|
||||
goto fail;
|
||||
}
|
||||
memset(hwpm->mem_bytes_kernel, 0, 32);
|
||||
|
||||
outbase_lo = alloc_pma_stream->stream_buf_pma_va & 0xffffffffULL;
|
||||
outbase_lo >>= NV_PERF_PMASYS_CHANNEL_OUTBASE_PTR_SHIFT;
|
||||
reg_val = HWPM_REG_F(NV_PERF_PMASYS_CHANNEL_OUTBASE_PTR,
|
||||
outbase_lo);
|
||||
hwpm_writel(hwpm,
|
||||
TEGRA_SOC_HWPM_PMA_DT,
|
||||
NV_PERF_PMASYS_CHANNEL_OUTBASE_CH0,
|
||||
reg_val);
|
||||
outbase_lo = alloc_pma_stream->stream_buf_pma_va &
|
||||
pmasys_channel_outbase_ptr_m();
|
||||
hwpm_writel(hwpm, TEGRA_SOC_HWPM_PMA_DT,
|
||||
pmasys_channel_outbase_r(0) - addr_map_pma_base_r(),
|
||||
outbase_lo);
|
||||
tegra_soc_hwpm_dbg("OUTBASE = 0x%x", reg_val);
|
||||
|
||||
outbase_hi = (alloc_pma_stream->stream_buf_pma_va >> 32) & 0xff;
|
||||
outbase_hi >>= NV_PERF_PMASYS_CHANNEL_OUTBASEUPPER_PTR_SHIFT;
|
||||
reg_val = HWPM_REG_F(NV_PERF_PMASYS_CHANNEL_OUTBASEUPPER_PTR,
|
||||
outbase_hi);
|
||||
hwpm_writel(hwpm,
|
||||
TEGRA_SOC_HWPM_PMA_DT,
|
||||
NV_PERF_PMASYS_CHANNEL_OUTBASEUPPER_CH0,
|
||||
reg_val);
|
||||
outbase_hi = (alloc_pma_stream->stream_buf_pma_va >> 32) &
|
||||
pmasys_channel_outbaseupper_ptr_m();
|
||||
hwpm_writel(hwpm, TEGRA_SOC_HWPM_PMA_DT,
|
||||
pmasys_channel_outbaseupper_r(0) - addr_map_pma_base_r(),
|
||||
outbase_hi);
|
||||
tegra_soc_hwpm_dbg("OUTBASEUPPER = 0x%x", reg_val);
|
||||
|
||||
outsize = alloc_pma_stream->stream_buf_size >>
|
||||
NV_PERF_PMASYS_CHANNEL_OUTSIZE_NUMBYTES_SHIFT;
|
||||
reg_val = HWPM_REG_F(NV_PERF_PMASYS_CHANNEL_OUTSIZE_NUMBYTES,
|
||||
outsize);
|
||||
hwpm_writel(hwpm,
|
||||
TEGRA_SOC_HWPM_PMA_DT,
|
||||
NV_PERF_PMASYS_CHANNEL_OUTSIZE_CH0,
|
||||
reg_val);
|
||||
outsize = alloc_pma_stream->stream_buf_size &
|
||||
pmasys_channel_outsize_numbytes_m();
|
||||
hwpm_writel(hwpm, TEGRA_SOC_HWPM_PMA_DT,
|
||||
pmasys_channel_outsize_r(0) - addr_map_pma_base_r(),
|
||||
outsize);
|
||||
tegra_soc_hwpm_dbg("OUTSIZE = 0x%x", reg_val);
|
||||
|
||||
mem_bytes_addr = sg_dma_address(hwpm->mem_bytes_sgt->sgl) & 0xffffffffULL;
|
||||
mem_bytes_addr >>= NV_PERF_PMASYS_CHANNEL_MEM_BYTES_ADDR_PTR_SHIFT;
|
||||
reg_val = HWPM_REG_F(NV_PERF_PMASYS_CHANNEL_MEM_BYTES_ADDR_PTR,
|
||||
mem_bytes_addr);
|
||||
hwpm_writel(hwpm,
|
||||
TEGRA_SOC_HWPM_PMA_DT,
|
||||
NV_PERF_PMASYS_CHANNEL_MEM_BYTES_ADDR_CH0,
|
||||
reg_val);
|
||||
mem_bytes_addr = sg_dma_address(hwpm->mem_bytes_sgt->sgl) &
|
||||
pmasys_channel_mem_bytes_addr_ptr_m();
|
||||
hwpm_writel(hwpm, TEGRA_SOC_HWPM_PMA_DT,
|
||||
pmasys_channel_mem_bytes_addr_r(0) - addr_map_pma_base_r(),
|
||||
mem_bytes_addr);
|
||||
tegra_soc_hwpm_dbg("MEM_BYTES_ADDR = 0x%x", reg_val);
|
||||
|
||||
reg_val = HWPM_REG_F(NV_PERF_PMASYS_CHANNEL_MEM_BLOCK_VALID,
|
||||
NV_PERF_PMASYS_CHANNEL_MEM_BLOCK_VALID_TRUE);
|
||||
hwpm_writel(hwpm,
|
||||
TEGRA_SOC_HWPM_PMA_DT,
|
||||
NV_PERF_PMASYS_CHANNEL_MEM_BLOCK_CH0,
|
||||
reg_val);
|
||||
hwpm_writel(hwpm, TEGRA_SOC_HWPM_PMA_DT,
|
||||
pmasys_channel_mem_block_r(0) - addr_map_pma_base_r(),
|
||||
pmasys_channel_mem_block_valid_f(
|
||||
pmasys_channel_mem_block_valid_true_v()));
|
||||
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
reg_val = HWPM_REG_F(NV_PERF_PMASYS_CHANNEL_MEM_BLOCK_VALID,
|
||||
NV_PERF_PMASYS_CHANNEL_MEM_BLOCK_VALID_FALSE);
|
||||
hwpm_writel(hwpm,
|
||||
TEGRA_SOC_HWPM_PMA_DT,
|
||||
NV_PERF_PMASYS_CHANNEL_MEM_BLOCK_CH0,
|
||||
reg_val);
|
||||
hwpm_writel(hwpm,
|
||||
TEGRA_SOC_HWPM_PMA_DT,
|
||||
NV_PERF_PMASYS_CHANNEL_OUTBASE_CH0,
|
||||
0);
|
||||
hwpm_writel(hwpm,
|
||||
TEGRA_SOC_HWPM_PMA_DT,
|
||||
NV_PERF_PMASYS_CHANNEL_OUTBASEUPPER_CH0,
|
||||
0);
|
||||
hwpm_writel(hwpm,
|
||||
TEGRA_SOC_HWPM_PMA_DT,
|
||||
NV_PERF_PMASYS_CHANNEL_OUTSIZE_CH0,
|
||||
0);
|
||||
hwpm_writel(hwpm,
|
||||
TEGRA_SOC_HWPM_PMA_DT,
|
||||
NV_PERF_PMASYS_CHANNEL_MEM_BYTES_ADDR_CH0,
|
||||
0);
|
||||
hwpm_writel(hwpm, TEGRA_SOC_HWPM_PMA_DT,
|
||||
pmasys_channel_mem_block_r(0) - addr_map_pma_base_r(),
|
||||
pmasys_channel_mem_block_valid_f(
|
||||
pmasys_channel_mem_block_valid_false_v()));
|
||||
hwpm_writel(hwpm, TEGRA_SOC_HWPM_PMA_DT,
|
||||
pmasys_channel_outbase_r(0) - addr_map_pma_base_r(), 0);
|
||||
hwpm_writel(hwpm, TEGRA_SOC_HWPM_PMA_DT,
|
||||
pmasys_channel_outbaseupper_r(0) - addr_map_pma_base_r(), 0);
|
||||
hwpm_writel(hwpm, TEGRA_SOC_HWPM_PMA_DT,
|
||||
pmasys_channel_outsize_r(0) - addr_map_pma_base_r(), 0);
|
||||
hwpm_writel(hwpm, TEGRA_SOC_HWPM_PMA_DT,
|
||||
pmasys_channel_mem_bytes_addr_r(0) - addr_map_pma_base_r(), 0);
|
||||
|
||||
alloc_pma_stream->stream_buf_pma_va = 0;
|
||||
|
||||
@@ -686,12 +667,12 @@ static int bind_ioctl(struct tegra_soc_hwpm *hwpm,
|
||||
tegra_soc_hwpm_dbg("Found PERFMON(0x%llx - 0x%llx)",
|
||||
aperture->start_pa,
|
||||
aperture->end_pa);
|
||||
ret = DRIVER_REG_RMW(hwpm,
|
||||
aperture->dt_aperture,
|
||||
NV_PERF_PMMSYS_SYS0_ENGINESTATUS,
|
||||
NV_PERF_PMMSYS_SYS0_ENGINESTATUS_ENABLE,
|
||||
NV_PERF_PMMSYS_SYS0_ENGINESTATUS_ENABLE_OUT,
|
||||
false);
|
||||
ret = reg_rmw(hwpm, NULL, aperture->dt_aperture,
|
||||
pmmsys_sys0_enginestatus_r(0) -
|
||||
addr_map_rpg_pm_base_r(),
|
||||
pmmsys_sys0_enginestatus_enable_m(),
|
||||
pmmsys_sys0_enginestatus_enable_out_f(),
|
||||
false, false);
|
||||
if (ret < 0) {
|
||||
tegra_soc_hwpm_err("Unable to set PMM ENGINESTATUS_ENABLE"
|
||||
" for PERFMON(0x%llx - 0x%llx)",
|
||||
@@ -918,11 +899,9 @@ static int exec_reg_ops_ioctl(struct tegra_soc_hwpm *hwpm,
|
||||
|
||||
/* Read Modify Write operation */
|
||||
case TEGRA_SOC_HWPM_REG_OP_CMD_WR32:
|
||||
ret = IOCTL_REG_RMW(hwpm,
|
||||
aperture,
|
||||
reg_op->phys_addr,
|
||||
reg_op->mask_lo,
|
||||
reg_op->reg_val_lo);
|
||||
ret = reg_rmw(hwpm, aperture, aperture->dt_aperture,
|
||||
reg_op->phys_addr, reg_op->mask_lo,
|
||||
reg_op->reg_val_lo, true, aperture->is_ip);
|
||||
if (ret < 0) {
|
||||
REG_OP_FAIL(INVALID,
|
||||
"WR32 REGOP failed for register(0x%llx)",
|
||||
@@ -935,11 +914,9 @@ static int exec_reg_ops_ioctl(struct tegra_soc_hwpm *hwpm,
|
||||
/* Read Modify Write operation */
|
||||
case TEGRA_SOC_HWPM_REG_OP_CMD_WR64:
|
||||
/* Lower 32 bits */
|
||||
ret = IOCTL_REG_RMW(hwpm,
|
||||
aperture,
|
||||
reg_op->phys_addr,
|
||||
reg_op->mask_lo,
|
||||
reg_op->reg_val_lo);
|
||||
ret = reg_rmw(hwpm, aperture, aperture->dt_aperture,
|
||||
reg_op->phys_addr, reg_op->mask_lo,
|
||||
reg_op->reg_val_lo, true, aperture->is_ip);
|
||||
if (ret < 0) {
|
||||
REG_OP_FAIL(INVALID,
|
||||
"WR64 REGOP failed for register(0x%llx)",
|
||||
@@ -948,11 +925,9 @@ static int exec_reg_ops_ioctl(struct tegra_soc_hwpm *hwpm,
|
||||
}
|
||||
|
||||
/* Upper 32 bits */
|
||||
ret = IOCTL_REG_RMW(hwpm,
|
||||
aperture,
|
||||
reg_op->phys_addr + 4,
|
||||
reg_op->mask_hi,
|
||||
reg_op->reg_val_hi);
|
||||
ret = reg_rmw(hwpm, aperture, aperture->dt_aperture,
|
||||
reg_op->phys_addr + 4, reg_op->mask_hi,
|
||||
reg_op->reg_val_hi, true, aperture->is_ip);
|
||||
if (ret < 0) {
|
||||
REG_OP_FAIL(INVALID,
|
||||
"WR64 REGOP failed for register(0x%llx)",
|
||||
@@ -997,21 +972,19 @@ static int update_get_put_ioctl(struct tegra_soc_hwpm *hwpm,
|
||||
}
|
||||
|
||||
/* Update SW get pointer */
|
||||
hwpm_writel(hwpm,
|
||||
TEGRA_SOC_HWPM_PMA_DT,
|
||||
NV_PERF_PMASYS_CHANNEL_MEM_BUMP_CH0,
|
||||
update_get_put->mem_bump);
|
||||
hwpm_writel(hwpm, TEGRA_SOC_HWPM_PMA_DT,
|
||||
pmasys_channel_mem_bump_r(0) - addr_map_pma_base_r(),
|
||||
update_get_put->mem_bump);
|
||||
|
||||
/* Stream MEM_BYTES value to MEM_BYTES buffer */
|
||||
if (update_get_put->b_stream_mem_bytes) {
|
||||
mem_bytes_kernel_u32 = (u32 *)(hwpm->mem_bytes_kernel);
|
||||
*mem_bytes_kernel_u32 = TEGRA_SOC_HWPM_MEM_BYTES_INVALID;
|
||||
ret = DRIVER_REG_RMW(hwpm,
|
||||
TEGRA_SOC_HWPM_PMA_DT,
|
||||
NV_PERF_PMASYS_CHANNEL_CONTROL_USER_CH0,
|
||||
NV_PERF_PMASYS_CHANNEL_CONTROL_USER_UPDATE_BYTES,
|
||||
NV_PERF_PMASYS_CHANNEL_CONTROL_USER_UPDATE_BYTES_DOIT,
|
||||
false);
|
||||
ret = reg_rmw(hwpm, NULL, TEGRA_SOC_HWPM_PMA_DT,
|
||||
pmasys_channel_control_user_r(0) - addr_map_pma_base_r(),
|
||||
pmasys_channel_control_user_update_bytes_m(),
|
||||
pmasys_channel_control_user_update_bytes_doit_f(),
|
||||
false, false);
|
||||
if (ret < 0) {
|
||||
tegra_soc_hwpm_err("Failed to stream mem_bytes to buffer");
|
||||
return -EIO;
|
||||
@@ -1020,25 +993,22 @@ static int update_get_put_ioctl(struct tegra_soc_hwpm *hwpm,
|
||||
|
||||
/* Read HW put pointer */
|
||||
if (update_get_put->b_read_mem_head) {
|
||||
update_get_put->mem_head =
|
||||
hwpm_readl(hwpm,
|
||||
TEGRA_SOC_HWPM_PMA_DT,
|
||||
NV_PERF_PMASYS_CHANNEL_MEM_HEAD_CH0);
|
||||
update_get_put->mem_head = hwpm_readl(hwpm,
|
||||
TEGRA_SOC_HWPM_PMA_DT,
|
||||
pmasys_channel_mem_head_r(0) - addr_map_pma_base_r());
|
||||
tegra_soc_hwpm_dbg("MEM_HEAD = 0x%llx",
|
||||
update_get_put->mem_head);
|
||||
}
|
||||
|
||||
/* Check overflow error status */
|
||||
if (update_get_put->b_check_overflow) {
|
||||
reg_val = hwpm_readl(hwpm,
|
||||
TEGRA_SOC_HWPM_PMA_DT,
|
||||
NV_PERF_PMASYS_CHANNEL_STATUS_SECURE_CH0);
|
||||
field_val =
|
||||
HWPM_REG_V(NV_PERF_PMASYS_CHANNEL_STATUS_SECURE_MEMBUF_STATUS,
|
||||
reg_val);
|
||||
update_get_put->b_overflowed =
|
||||
(field_val ==
|
||||
NV_PERF_PMASYS_CHANNEL_STATUS_SECURE_MEMBUF_STATUS_OVERFLOWED);
|
||||
reg_val = hwpm_readl(hwpm, TEGRA_SOC_HWPM_PMA_DT,
|
||||
pmasys_channel_status_secure_r(0) -
|
||||
addr_map_pma_base_r());
|
||||
field_val = pmasys_channel_status_secure_membuf_status_v(
|
||||
reg_val);
|
||||
update_get_put->b_overflowed = (field_val ==
|
||||
pmasys_channel_status_secure_membuf_status_overflowed_v());
|
||||
tegra_soc_hwpm_dbg("OVERFLOWED = %u",
|
||||
update_get_put->b_overflowed);
|
||||
}
|
||||
@@ -1264,23 +1234,21 @@ static int tegra_soc_hwpm_open(struct inode *inode, struct file *filp)
|
||||
|
||||
/* FIXME: Remove after verification */
|
||||
/* Disable SLCG */
|
||||
ret = DRIVER_REG_RMW(hwpm,
|
||||
TEGRA_SOC_HWPM_PMA_DT,
|
||||
NV_PERF_PMASYS_CG2,
|
||||
NV_PERF_PMASYS_CG2_SLCG,
|
||||
NV_PERF_PMASYS_CG2_SLCG_DISABLED,
|
||||
false);
|
||||
ret = reg_rmw(hwpm, NULL, TEGRA_SOC_HWPM_PMA_DT,
|
||||
pmasys_cg2_r() - addr_map_pma_base_r(),
|
||||
pmasys_cg2_slcg_m(), pmasys_cg2_slcg_disabled_f(),
|
||||
false, false);
|
||||
if (ret < 0) {
|
||||
tegra_soc_hwpm_err("Unable to disable PMA SLCG");
|
||||
ret = -EIO;
|
||||
goto fail;
|
||||
}
|
||||
ret = DRIVER_REG_RMW(hwpm,
|
||||
TEGRA_SOC_HWPM_RTR_DT,
|
||||
NV_PERF_PMMSYS_SYS0ROUTER_CG2,
|
||||
NV_PERF_PMMSYS_SYS0ROUTER_CG2_SLCG,
|
||||
NV_PERF_PMMSYS_SYS0ROUTER_CG2_SLCG_DISABLED,
|
||||
false);
|
||||
|
||||
ret = reg_rmw(hwpm, NULL, TEGRA_SOC_HWPM_RTR_DT,
|
||||
pmmsys_sys0router_cg2_r() - addr_map_rtr_base_r(),
|
||||
pmmsys_sys0router_cg2_slcg_m(),
|
||||
pmmsys_sys0router_cg2_slcg_disabled_f(),
|
||||
false, false);
|
||||
if (ret < 0) {
|
||||
tegra_soc_hwpm_err("Unable to disable ROUTER SLCG");
|
||||
ret = -EIO;
|
||||
@@ -1288,23 +1256,22 @@ static int tegra_soc_hwpm_open(struct inode *inode, struct file *filp)
|
||||
}
|
||||
|
||||
/* Program PROD values */
|
||||
ret = DRIVER_REG_RMW(hwpm,
|
||||
TEGRA_SOC_HWPM_PMA_DT,
|
||||
NV_PERF_PMASYS_CONTROLB,
|
||||
NV_PERF_PMASYS_CONTROLB_COALESCE_TIMEOUT_CYCLES,
|
||||
NV_PERF_PMASYS_CONTROLB_COALESCE_TIMEOUT_CYCLES__PROD,
|
||||
false);
|
||||
ret = reg_rmw(hwpm, NULL, TEGRA_SOC_HWPM_PMA_DT,
|
||||
pmasys_controlb_r() - addr_map_pma_base_r(),
|
||||
pmasys_controlb_coalesce_timeout_cycles_m(),
|
||||
pmasys_controlb_coalesce_timeout_cycles__prod_f(),
|
||||
false, false);
|
||||
if (ret < 0) {
|
||||
tegra_soc_hwpm_err("Unable to program PROD value");
|
||||
ret = -EIO;
|
||||
goto fail;
|
||||
}
|
||||
ret = DRIVER_REG_RMW(hwpm,
|
||||
TEGRA_SOC_HWPM_PMA_DT,
|
||||
NV_PERF_PMASYS_CHANNEL_CONFIG_USER_CH0,
|
||||
NV_PERF_PMASYS_CHANNEL_CONFIG_USER_COALESCE_TIMEOUT_CYCLES,
|
||||
NV_PERF_PMASYS_CHANNEL_CONFIG_USER_COALESCE_TIMEOUT_CYCLES__PROD,
|
||||
false);
|
||||
|
||||
ret = reg_rmw(hwpm, NULL, TEGRA_SOC_HWPM_PMA_DT,
|
||||
pmasys_channel_config_user_r(0) - addr_map_pma_base_r(),
|
||||
pmasys_channel_config_user_coalesce_timeout_cycles_m(),
|
||||
pmasys_channel_config_user_coalesce_timeout_cycles__prod_f(),
|
||||
false, false);
|
||||
if (ret < 0) {
|
||||
tegra_soc_hwpm_err("Unable to program PROD value");
|
||||
ret = -EIO;
|
||||
@@ -1394,62 +1361,50 @@ static int tegra_soc_hwpm_release(struct inode *inode, struct file *filp)
|
||||
}
|
||||
|
||||
/* Disable PMA triggers */
|
||||
err = DRIVER_REG_RMW(hwpm,
|
||||
TEGRA_SOC_HWPM_PMA_DT,
|
||||
NV_PERF_PMASYS_TRIGGER_CONFIG_USER_CH0,
|
||||
NV_PERF_PMASYS_TRIGGER_CONFIG_USER_PMA_PULSE,
|
||||
NV_PERF_PMASYS_TRIGGER_CONFIG_USER_PMA_PULSE_DISABLE,
|
||||
false);
|
||||
err = reg_rmw(hwpm, NULL, TEGRA_SOC_HWPM_PMA_DT,
|
||||
pmasys_trigger_config_user_r(0) - addr_map_pma_base_r(),
|
||||
pmasys_trigger_config_user_pma_pulse_m(),
|
||||
pmasys_trigger_config_user_pma_pulse_disable_f(),
|
||||
false, false);
|
||||
RELEASE_FAIL("Unable to disable PMA triggers");
|
||||
|
||||
hwpm_writel(hwpm,
|
||||
TEGRA_SOC_HWPM_PMA_DT,
|
||||
NV_PERF_PMASYS_SYS_TRIGGER_START_MASK,
|
||||
0);
|
||||
hwpm_writel(hwpm,
|
||||
TEGRA_SOC_HWPM_PMA_DT,
|
||||
NV_PERF_PMASYS_SYS_TRIGGER_START_MASKB,
|
||||
0);
|
||||
hwpm_writel(hwpm,
|
||||
TEGRA_SOC_HWPM_PMA_DT,
|
||||
NV_PERF_PMASYS_SYS_TRIGGER_STOP_MASK,
|
||||
0);
|
||||
hwpm_writel(hwpm,
|
||||
TEGRA_SOC_HWPM_PMA_DT,
|
||||
NV_PERF_PMASYS_SYS_TRIGGER_STOP_MASKB,
|
||||
0);
|
||||
hwpm_writel(hwpm, TEGRA_SOC_HWPM_PMA_DT,
|
||||
pmasys_sys_trigger_start_mask_r() - addr_map_pma_base_r(), 0);
|
||||
hwpm_writel(hwpm, TEGRA_SOC_HWPM_PMA_DT,
|
||||
pmasys_sys_trigger_start_maskb_r() - addr_map_pma_base_r(), 0);
|
||||
hwpm_writel(hwpm, TEGRA_SOC_HWPM_PMA_DT,
|
||||
pmasys_sys_trigger_stop_mask_r() - addr_map_pma_base_r(), 0);
|
||||
hwpm_writel(hwpm, TEGRA_SOC_HWPM_PMA_DT,
|
||||
pmasys_sys_trigger_stop_maskb_r() - addr_map_pma_base_r(), 0);
|
||||
|
||||
/* Wait for PERFMONs, ROUTER, and PMA to idle */
|
||||
timeout = HWPM_TIMEOUT(HWPM_REG_CHECK_F(hwpm_readl(hwpm,
|
||||
TEGRA_SOC_HWPM_RTR_DT,
|
||||
NV_PERF_PMMSYS_SYS0ROUTER_PERFMONSTATUS),
|
||||
NV_PERF_PMMSYS_SYS0ROUTER_PERFMONSTATUS_MERGED,
|
||||
NV_PERF_PMMSYS_SYS0ROUTER_PERFMONSTATUS_MERGED_EMPTY),
|
||||
"NV_PERF_PMMSYS_SYS0ROUTER_PERFMONSTATUS_MERGED_EMPTY");
|
||||
timeout = HWPM_TIMEOUT(pmmsys_sys0router_perfmonstatus_merged_v(
|
||||
hwpm_readl(hwpm, TEGRA_SOC_HWPM_RTR_DT,
|
||||
pmmsys_sys0router_perfmonstatus_r() -
|
||||
addr_map_rtr_base_r())) == 0U,
|
||||
"NV_PERF_PMMSYS_SYS0ROUTER_PERFMONSTATUS_MERGED_EMPTY");
|
||||
if (timeout && ret == 0) {
|
||||
ret = -EIO;
|
||||
}
|
||||
timeout = HWPM_TIMEOUT(HWPM_REG_CHECK_F(hwpm_readl(hwpm,
|
||||
TEGRA_SOC_HWPM_RTR_DT,
|
||||
NV_PERF_PMMSYS_SYS0ROUTER_ENGINESTATUS),
|
||||
NV_PERF_PMMSYS_SYS0ROUTER_ENGINESTATUS_STATUS,
|
||||
NV_PERF_PMMSYS_SYS0ROUTER_ENGINESTATUS_STATUS_EMPTY),
|
||||
"NV_PERF_PMMSYS_SYS0ROUTER_ENGINESTATUS_STATUS_EMPTY");
|
||||
|
||||
timeout = HWPM_TIMEOUT(pmmsys_sys0router_enginestatus_status_v(
|
||||
hwpm_readl(hwpm, TEGRA_SOC_HWPM_RTR_DT,
|
||||
pmmsys_sys0router_enginestatus_r() -
|
||||
addr_map_rtr_base_r())) ==
|
||||
pmmsys_sys0router_enginestatus_status_empty_v(),
|
||||
"NV_PERF_PMMSYS_SYS0ROUTER_ENGINESTATUS_STATUS_EMPTY");
|
||||
if (timeout && ret == 0) {
|
||||
ret = -EIO;
|
||||
}
|
||||
field_mask = NV_PERF_PMASYS_ENGINESTATUS_STATUS_MASK |
|
||||
NV_PERF_PMASYS_ENGINESTATUS_RBUFEMPTY_MASK;
|
||||
field_val = HWPM_REG_F(NV_PERF_PMASYS_ENGINESTATUS_STATUS,
|
||||
NV_PERF_PMASYS_ENGINESTATUS_STATUS_EMPTY);
|
||||
field_val |= HWPM_REG_F(NV_PERF_PMASYS_ENGINESTATUS_RBUFEMPTY,
|
||||
NV_PERF_PMASYS_ENGINESTATUS_RBUFEMPTY_EMPTY);
|
||||
timeout = HWPM_TIMEOUT(HWPM_REG_CHECK(hwpm_readl(hwpm,
|
||||
TEGRA_SOC_HWPM_PMA_DT,
|
||||
NV_PERF_PMASYS_ENGINESTATUS),
|
||||
field_mask,
|
||||
field_val),
|
||||
"NV_PERF_PMASYS_ENGINESTATUS");
|
||||
|
||||
field_mask = pmasys_enginestatus_status_m() |
|
||||
pmasys_enginestatus_rbufempty_m();
|
||||
field_val = pmasys_enginestatus_status_empty_f() ||
|
||||
pmasys_enginestatus_rbufempty_empty_f();
|
||||
timeout = HWPM_TIMEOUT((hwpm_readl(hwpm, TEGRA_SOC_HWPM_PMA_DT,
|
||||
pmasys_enginestatus_r() -
|
||||
addr_map_pma_base_r()) & field_mask) == field_val,
|
||||
"NV_PERF_PMASYS_ENGINESTATUS");
|
||||
if (timeout && ret == 0) {
|
||||
ret = -EIO;
|
||||
}
|
||||
@@ -1469,12 +1424,11 @@ static int tegra_soc_hwpm_release(struct inode *inode, struct file *filp)
|
||||
tegra_soc_hwpm_dbg("Found PERFMON(0x%llx - 0x%llx)",
|
||||
aperture->start_pa,
|
||||
aperture->end_pa);
|
||||
err = DRIVER_REG_RMW(hwpm,
|
||||
aperture->dt_aperture,
|
||||
NV_PERF_PMMSYS_CONTROL,
|
||||
NV_PERF_PMMSYS_CONTROL_MODE,
|
||||
NV_PERF_PMMSYS_CONTROL_MODE_DISABLE,
|
||||
false);
|
||||
err = reg_rmw(hwpm, NULL, aperture->dt_aperture,
|
||||
pmmsys_control_r(0) - addr_map_rpg_pm_base_r(),
|
||||
pmmsys_control_mode_m(),
|
||||
pmmsys_control_mode_disable_f(),
|
||||
false, false);
|
||||
RELEASE_FAIL("Unable to disable PERFMON(0x%llx - 0x%llx)",
|
||||
aperture->start_pa,
|
||||
aperture->end_pa);
|
||||
@@ -1486,12 +1440,11 @@ static int tegra_soc_hwpm_release(struct inode *inode, struct file *filp)
|
||||
if (hwpm->mem_bytes_kernel) {
|
||||
mem_bytes_kernel_u32 = (u32 *)(hwpm->mem_bytes_kernel);
|
||||
*mem_bytes_kernel_u32 = TEGRA_SOC_HWPM_MEM_BYTES_INVALID;
|
||||
err = DRIVER_REG_RMW(hwpm,
|
||||
TEGRA_SOC_HWPM_PMA_DT,
|
||||
NV_PERF_PMASYS_CHANNEL_CONTROL_USER_CH0,
|
||||
NV_PERF_PMASYS_CHANNEL_CONTROL_USER_UPDATE_BYTES,
|
||||
NV_PERF_PMASYS_CHANNEL_CONTROL_USER_UPDATE_BYTES_DOIT,
|
||||
false);
|
||||
err = reg_rmw(hwpm, NULL, TEGRA_SOC_HWPM_PMA_DT,
|
||||
pmasys_channel_control_user_r(0) - addr_map_pma_base_r(),
|
||||
pmasys_channel_control_user_update_bytes_m(),
|
||||
pmasys_channel_control_user_update_bytes_doit_f(),
|
||||
false, false);
|
||||
RELEASE_FAIL("Unable to stream MEM_BYTES");
|
||||
timeout = HWPM_TIMEOUT(*mem_bytes_kernel_u32 !=
|
||||
TEGRA_SOC_HWPM_MEM_BYTES_INVALID,
|
||||
@@ -1501,38 +1454,29 @@ static int tegra_soc_hwpm_release(struct inode *inode, struct file *filp)
|
||||
}
|
||||
|
||||
/* Disable PMA streaming */
|
||||
err = DRIVER_REG_RMW(hwpm,
|
||||
TEGRA_SOC_HWPM_PMA_DT,
|
||||
NV_PERF_PMASYS_TRIGGER_CONFIG_USER_CH0,
|
||||
NV_PERF_PMASYS_TRIGGER_CONFIG_USER_RECORD_STREAM,
|
||||
NV_PERF_PMASYS_TRIGGER_CONFIG_USER_RECORD_STREAM_DISABLE,
|
||||
false);
|
||||
err = reg_rmw(hwpm, NULL, TEGRA_SOC_HWPM_PMA_DT,
|
||||
pmasys_trigger_config_user_r(0) - addr_map_pma_base_r(),
|
||||
pmasys_trigger_config_user_record_stream_m(),
|
||||
pmasys_trigger_config_user_record_stream_disable_f(),
|
||||
false, false);
|
||||
RELEASE_FAIL("Unable to disable PMA streaming");
|
||||
err = DRIVER_REG_RMW(hwpm,
|
||||
TEGRA_SOC_HWPM_PMA_DT,
|
||||
NV_PERF_PMASYS_CHANNEL_CONTROL_USER_CH0,
|
||||
NV_PERF_PMASYS_CHANNEL_CONTROL_USER_STREAM,
|
||||
NV_PERF_PMASYS_CHANNEL_CONTROL_USER_STREAM_DISABLE,
|
||||
false);
|
||||
|
||||
err = reg_rmw(hwpm, NULL, TEGRA_SOC_HWPM_PMA_DT,
|
||||
pmasys_channel_control_user_r(0) - addr_map_pma_base_r(),
|
||||
pmasys_channel_control_user_stream_m(),
|
||||
pmasys_channel_control_user_stream_disable_f(),
|
||||
false, false);
|
||||
RELEASE_FAIL("Unable to disable PMA streaming");
|
||||
|
||||
/* Memory Management */
|
||||
hwpm_writel(hwpm,
|
||||
TEGRA_SOC_HWPM_PMA_DT,
|
||||
NV_PERF_PMASYS_CHANNEL_OUTBASE_CH0,
|
||||
0);
|
||||
hwpm_writel(hwpm,
|
||||
TEGRA_SOC_HWPM_PMA_DT,
|
||||
NV_PERF_PMASYS_CHANNEL_OUTBASEUPPER_CH0,
|
||||
0);
|
||||
hwpm_writel(hwpm,
|
||||
TEGRA_SOC_HWPM_PMA_DT,
|
||||
NV_PERF_PMASYS_CHANNEL_OUTSIZE_CH0,
|
||||
0);
|
||||
hwpm_writel(hwpm,
|
||||
TEGRA_SOC_HWPM_PMA_DT,
|
||||
NV_PERF_PMASYS_CHANNEL_MEM_BYTES_ADDR_CH0,
|
||||
0);
|
||||
hwpm_writel(hwpm, TEGRA_SOC_HWPM_PMA_DT,
|
||||
pmasys_channel_outbase_r(0) - addr_map_pma_base_r(), 0);
|
||||
hwpm_writel(hwpm, TEGRA_SOC_HWPM_PMA_DT,
|
||||
pmasys_channel_outbaseupper_r(0) - addr_map_pma_base_r(), 0);
|
||||
hwpm_writel(hwpm, TEGRA_SOC_HWPM_PMA_DT,
|
||||
pmasys_channel_outsize_r(0) - addr_map_pma_base_r(), 0);
|
||||
hwpm_writel(hwpm, TEGRA_SOC_HWPM_PMA_DT,
|
||||
pmasys_channel_mem_bytes_addr_r(0) - addr_map_pma_base_r(), 0);
|
||||
|
||||
if (hwpm->stream_sgt && (!IS_ERR(hwpm->stream_sgt))) {
|
||||
dma_buf_unmap_attachment(hwpm->stream_attach,
|
||||
@@ -1586,19 +1530,16 @@ static int tegra_soc_hwpm_release(struct inode *inode, struct file *filp)
|
||||
|
||||
/* FIXME: Remove after verification */
|
||||
/* Enable SLCG */
|
||||
err = DRIVER_REG_RMW(hwpm,
|
||||
TEGRA_SOC_HWPM_PMA_DT,
|
||||
NV_PERF_PMASYS_CG2,
|
||||
NV_PERF_PMASYS_CG2_SLCG,
|
||||
NV_PERF_PMASYS_CG2_SLCG_ENABLED,
|
||||
false);
|
||||
err = reg_rmw(hwpm, NULL, TEGRA_SOC_HWPM_PMA_DT,
|
||||
pmasys_cg2_r() - addr_map_pma_base_r(),
|
||||
pmasys_cg2_slcg_m(),
|
||||
pmasys_cg2_slcg_enabled_f(), false, false);
|
||||
RELEASE_FAIL("Unable to enable PMA SLCG");
|
||||
err = DRIVER_REG_RMW(hwpm,
|
||||
TEGRA_SOC_HWPM_RTR_DT,
|
||||
NV_PERF_PMMSYS_SYS0ROUTER_CG2,
|
||||
NV_PERF_PMMSYS_SYS0ROUTER_CG2_SLCG,
|
||||
NV_PERF_PMMSYS_SYS0ROUTER_CG2_SLCG_ENABLED,
|
||||
false);
|
||||
|
||||
err = reg_rmw(hwpm, NULL, TEGRA_SOC_HWPM_RTR_DT,
|
||||
pmmsys_sys0router_cg2_r() - addr_map_rtr_base_r(),
|
||||
pmmsys_sys0router_cg2_slcg_m(),
|
||||
pmmsys_sys0router_cg2_slcg_enabled_f(), false, false);
|
||||
RELEASE_FAIL("Unable to enable ROUTER SLCG");
|
||||
|
||||
/* Unmap PMA and RTR apertures */
|
||||
@@ -1632,7 +1573,6 @@ static int tegra_soc_hwpm_release(struct inode *inode, struct file *filp)
|
||||
for (res_idx = 0; res_idx < TERGA_SOC_HWPM_NUM_RESOURCES; res_idx++) {
|
||||
if (!hwpm_resources[res_idx].reserved)
|
||||
continue;
|
||||
tegra_soc_hwpm_dbg("Found reserved IP(%d)", res_idx);
|
||||
hwpm_resources[res_idx].reserved = false;
|
||||
|
||||
for (aprt_idx = 0;
|
||||
@@ -1665,7 +1605,6 @@ static int tegra_soc_hwpm_release(struct inode *inode, struct file *filp)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user