diff options
Diffstat (limited to 'mali_kbase/mali_kbase_pbha.c')
-rw-r--r-- | mali_kbase/mali_kbase_pbha.c | 143 |
1 files changed, 76 insertions, 67 deletions
diff --git a/mali_kbase/mali_kbase_pbha.c b/mali_kbase/mali_kbase_pbha.c index b446bd5..341ea90 100644 --- a/mali_kbase/mali_kbase_pbha.c +++ b/mali_kbase/mali_kbase_pbha.c @@ -28,7 +28,7 @@ #define DTB_SET_SIZE 2 #endif -static bool read_setting_valid(unsigned int id, unsigned int read_setting) +static bool read_setting_valid(unsigned int prod_model, unsigned int id, unsigned int read_setting) { switch (id) { /* Valid ID - fall through all */ @@ -43,21 +43,26 @@ static bool read_setting_valid(unsigned int id, unsigned int read_setting) case SYSC_ALLOC_ID_R_ATTR: case SYSC_ALLOC_ID_R_SCM: case SYSC_ALLOC_ID_R_FSDC: - case SYSC_ALLOC_ID_R_VL: case SYSC_ALLOC_ID_R_PLR: case SYSC_ALLOC_ID_R_TEX: case SYSC_ALLOC_ID_R_LSC: - switch (read_setting) { - /* Valid setting value - fall through all */ - case SYSC_ALLOC_L2_ALLOC: - case SYSC_ALLOC_NEVER_ALLOC: - case SYSC_ALLOC_ALWAYS_ALLOC: - case SYSC_ALLOC_PTL_ALLOC: - case SYSC_ALLOC_L2_PTL_ALLOC: - return true; - default: + break; + case SYSC_ALLOC_ID_R_VL: + if (prod_model == GPU_ID_PRODUCT_TTIX) return false; - } + break; + default: + return false; + } + + switch (read_setting) { + /* Valid setting value - fall through all */ + case SYSC_ALLOC_L2_ALLOC: + case SYSC_ALLOC_NEVER_ALLOC: + case SYSC_ALLOC_ALWAYS_ALLOC: + case SYSC_ALLOC_PTL_ALLOC: + case SYSC_ALLOC_L2_PTL_ALLOC: + return true; default: return false; } @@ -66,8 +71,10 @@ static bool read_setting_valid(unsigned int id, unsigned int read_setting) return false; } -static bool write_setting_valid(unsigned int id, unsigned int write_setting) +static bool write_setting_valid(unsigned int prod_model, unsigned int id, + unsigned int write_setting) { + CSTD_UNUSED(prod_model); switch (id) { /* Valid ID - fall through all */ case SYSC_ALLOC_ID_W_OTHER: @@ -86,17 +93,19 @@ static bool write_setting_valid(unsigned int id, unsigned int write_setting) case SYSC_ALLOC_ID_W_TIB_DS_AFBCH: case SYSC_ALLOC_ID_W_TIB_DS_AFBCB: case SYSC_ALLOC_ID_W_LSC: - switch (write_setting) { - /* Valid setting value - fall through all */ - case SYSC_ALLOC_L2_ALLOC: - case SYSC_ALLOC_NEVER_ALLOC: - case SYSC_ALLOC_ALWAYS_ALLOC: - case SYSC_ALLOC_PTL_ALLOC: - case SYSC_ALLOC_L2_PTL_ALLOC: - return true; - default: - return false; - } + break; + default: + return false; + } + + switch (write_setting) { + /* Valid setting value - fall through all */ + case SYSC_ALLOC_L2_ALLOC: + case SYSC_ALLOC_NEVER_ALLOC: + case SYSC_ALLOC_ALWAYS_ALLOC: + case SYSC_ALLOC_PTL_ALLOC: + case SYSC_ALLOC_L2_PTL_ALLOC: + return true; default: return false; } @@ -115,14 +124,14 @@ struct settings_status { bool write; }; -static struct settings_status settings_valid(unsigned int id, unsigned int read_setting, - unsigned int write_setting) +static struct settings_status settings_valid(unsigned int prod_model, unsigned int id, + unsigned int read_setting, unsigned int write_setting) { - struct settings_status valid = { .overall = (id < SYSC_ALLOC_COUNT * sizeof(u32)) }; + struct settings_status valid = { .overall = (id < GPU_SYSC_ALLOC_COUNT * sizeof(u32)) }; if (valid.overall) { - valid.read = read_setting_valid(id, read_setting); - valid.write = write_setting_valid(id, write_setting); + valid.read = read_setting_valid(prod_model, id, read_setting); + valid.write = write_setting_valid(prod_model, id, write_setting); valid.overall = valid.read || valid.write; } @@ -131,32 +140,33 @@ static struct settings_status settings_valid(unsigned int id, unsigned int read_ bool kbasep_pbha_supported(struct kbase_device *kbdev) { - const u32 arch_maj_rev = - ARCH_MAJOR_REV_REG(kbdev->gpu_props.props.raw_props.gpu_id); - - return (arch_maj_rev >= GPU_ID2_ARCH_MAJOR_REV_MAKE(11, 3)); + return kbdev->gpu_props.gpu_id.arch_id >= GPU_ID_ARCH_MAKE(11, 0, 3); } -int kbase_pbha_record_settings(struct kbase_device *kbdev, bool runtime, - unsigned int id, unsigned int read_setting, - unsigned int write_setting) +int kbase_pbha_record_settings(struct kbase_device *kbdev, bool runtime, unsigned int id, + unsigned int read_setting, unsigned int write_setting) { - struct settings_status const valid = settings_valid(id, read_setting, write_setting); + struct settings_status const valid = settings_valid(kbdev->gpu_props.gpu_id.product_model, + id, read_setting, write_setting); if (valid.overall) { unsigned int const sysc_alloc_num = id / sizeof(u32); u32 modified_reg; +#if MALI_USE_CSF if (runtime) { - int i; + uint i; kbase_pm_context_active(kbdev); /* Ensure host copy of SYSC_ALLOC is up to date */ - for (i = 0; i < SYSC_ALLOC_COUNT; i++) - kbdev->sysc_alloc[i] = kbase_reg_read( - kbdev, GPU_CONTROL_REG(SYSC_ALLOC(i))); + for (i = 0; i < GPU_SYSC_ALLOC_COUNT; i++) + kbdev->sysc_alloc[i] = + kbase_reg_read32(kbdev, GPU_SYSC_ALLOC_OFFSET(i)); kbase_pm_context_idle(kbdev); } +#else + CSTD_UNUSED(runtime); +#endif /* MALI_USE_CSF */ modified_reg = kbdev->sysc_alloc[sysc_alloc_num]; @@ -164,34 +174,34 @@ int kbase_pbha_record_settings(struct kbase_device *kbdev, bool runtime, case 0: modified_reg = valid.read ? SYSC_ALLOC_R_SYSC_ALLOC0_SET(modified_reg, read_setting) : - modified_reg; + modified_reg; modified_reg = valid.write ? SYSC_ALLOC_W_SYSC_ALLOC0_SET(modified_reg, write_setting) : - modified_reg; + modified_reg; break; case 1: modified_reg = valid.read ? SYSC_ALLOC_R_SYSC_ALLOC1_SET(modified_reg, read_setting) : - modified_reg; + modified_reg; modified_reg = valid.write ? SYSC_ALLOC_W_SYSC_ALLOC1_SET(modified_reg, write_setting) : - modified_reg; + modified_reg; break; case 2: modified_reg = valid.read ? SYSC_ALLOC_R_SYSC_ALLOC2_SET(modified_reg, read_setting) : - modified_reg; + modified_reg; modified_reg = valid.write ? SYSC_ALLOC_W_SYSC_ALLOC2_SET(modified_reg, write_setting) : - modified_reg; + modified_reg; break; case 3: modified_reg = valid.read ? SYSC_ALLOC_R_SYSC_ALLOC3_SET(modified_reg, read_setting) : - modified_reg; + modified_reg; modified_reg = valid.write ? SYSC_ALLOC_W_SYSC_ALLOC3_SET(modified_reg, write_setting) : - modified_reg; + modified_reg; break; } @@ -203,20 +213,23 @@ int kbase_pbha_record_settings(struct kbase_device *kbdev, bool runtime, void kbase_pbha_write_settings(struct kbase_device *kbdev) { +#if MALI_USE_CSF if (kbasep_pbha_supported(kbdev)) { - int i; + uint i; - for (i = 0; i < SYSC_ALLOC_COUNT; ++i) - kbase_reg_write(kbdev, GPU_CONTROL_REG(SYSC_ALLOC(i)), - kbdev->sysc_alloc[i]); + for (i = 0; i < GPU_SYSC_ALLOC_COUNT; ++i) + kbase_reg_write32(kbdev, GPU_SYSC_ALLOC_OFFSET(i), kbdev->sysc_alloc[i]); } +#else + CSTD_UNUSED(kbdev); +#endif /* MALI_USE_CSF */ } #if MALI_USE_CSF static int kbase_pbha_read_int_id_override_property(struct kbase_device *kbdev, const struct device_node *pbha_node) { - u32 dtb_data[SYSC_ALLOC_COUNT * sizeof(u32) * DTB_SET_SIZE]; + u32 dtb_data[GPU_SYSC_ALLOC_COUNT * sizeof(u32) * DTB_SET_SIZE]; int sz, i; bool valid = true; @@ -236,30 +249,26 @@ static int kbase_pbha_read_int_id_override_property(struct kbase_device *kbdev, dev_err(kbdev->dev, "Bad DTB format: pbha.int_id_override\n"); return -EINVAL; } - if (of_property_read_u32_array(pbha_node, "int-id-override", dtb_data, sz) != 0) { + if (of_property_read_u32_array(pbha_node, "int-id-override", dtb_data, (size_t)sz) != 0) { /* There may be no int-id-override field. Fallback to int_id_override instead */ - if (of_property_read_u32_array(pbha_node, "int_id_override", dtb_data, sz) != 0) { + if (of_property_read_u32_array(pbha_node, "int_id_override", dtb_data, + (size_t)sz) != 0) { dev_err(kbdev->dev, "Failed to read DTB pbha.int_id_override\n"); return -EINVAL; } } for (i = 0; valid && i < sz; i = i + DTB_SET_SIZE) { - unsigned int rdset = - SYSC_ALLOC_R_SYSC_ALLOC0_GET(dtb_data[i + 1]); - unsigned int wrset = - SYSC_ALLOC_W_SYSC_ALLOC0_GET(dtb_data[i + 1]); + unsigned int rdset = SYSC_ALLOC_R_SYSC_ALLOC0_GET(dtb_data[i + 1]); + unsigned int wrset = SYSC_ALLOC_W_SYSC_ALLOC0_GET(dtb_data[i + 1]); valid = valid && - (kbase_pbha_record_settings(kbdev, false, dtb_data[i], - rdset, wrset) == 0); + (kbase_pbha_record_settings(kbdev, false, dtb_data[i], rdset, wrset) == 0); if (valid) - dev_info(kbdev->dev, - "pbha.int_id_override 0x%x r0x%x w0x%x\n", - dtb_data[i], rdset, wrset); + dev_info(kbdev->dev, "pbha.int_id_override 0x%x r0x%x w0x%x\n", dtb_data[i], + rdset, wrset); } if (i != sz || (!valid)) { - dev_err(kbdev->dev, - "Failed recording DTB data (pbha.int_id_override)\n"); + dev_err(kbdev->dev, "Failed recording DTB data (pbha.int_id_override)\n"); return -EINVAL; } return 0; |