mali_bool kbasep_validate_configuration_attributes(struct kbase_device *kbdev, const struct kbase_attribute *attributes) { int i; KBASE_DEBUG_ASSERT(attributes); for (i = 0; attributes[i].id != KBASE_CONFIG_ATTR_END; i++) { if (i >= ATTRIBUTE_COUNT_MAX) { dev_warn(kbdev->dev, "More than ATTRIBUTE_COUNT_MAX=%d configuration attributes defined. Is attribute list properly terminated?", ATTRIBUTE_COUNT_MAX); return MALI_FALSE; } switch (attributes[i].id) { /* Only non-zero unsigned 32-bit values accepted */ case KBASE_CONFIG_ATTR_JS_SCHEDULING_TICK_NS: #if CSTD_CPU_64BIT if (attributes[i].data == 0u || (u64) attributes[i].data > (u64) U32_MAX) { #else if (attributes[i].data == 0u) { #endif dev_warn(kbdev->dev, "Invalid Job Scheduling Configuration attribute for " "KBASE_CONFIG_ATTR_JS_SCHEDULING_TICKS_NS: %d", (int)attributes[i].data); return MALI_FALSE; } break; /* All these Job Scheduling attributes are FALLTHROUGH: only unsigned 32-bit values accepted */ case KBASE_CONFIG_ATTR_JS_SOFT_STOP_TICKS: case KBASE_CONFIG_ATTR_JS_SOFT_STOP_TICKS_CL: case KBASE_CONFIG_ATTR_JS_HARD_STOP_TICKS_SS: case KBASE_CONFIG_ATTR_JS_HARD_STOP_TICKS_CL: case KBASE_CONFIG_ATTR_JS_HARD_STOP_TICKS_NSS: case KBASE_CONFIG_ATTR_JS_RESET_TICKS_SS: case KBASE_CONFIG_ATTR_JS_RESET_TICKS_CL: case KBASE_CONFIG_ATTR_JS_RESET_TICKS_NSS: case KBASE_CONFIG_ATTR_JS_RESET_TIMEOUT_MS: case KBASE_CONFIG_ATTR_JS_CTX_TIMESLICE_NS: #if CSTD_CPU_64BIT if ((u64) attributes[i].data > (u64) U32_MAX) { dev_warn(kbdev->dev, "Job Scheduling Configuration attribute exceeds 32-bits: " "id==%d val==%d", attributes[i].id, (int)attributes[i].data); return MALI_FALSE; } #endif break; case KBASE_CONFIG_ATTR_POWER_MANAGEMENT_CALLBACKS: if (MALI_FALSE == kbasep_validate_pm_callback((struct kbase_pm_callback_conf *)attributes[i].data, kbdev)) { /* Warning message handled by kbasep_validate_pm_callback() */ return MALI_FALSE; } break; case KBASE_CONFIG_ATTR_CPU_SPEED_FUNC: if (MALI_FALSE == kbasep_validate_cpu_speed_func((kbase_cpuprops_clock_speed_function) attributes[i].data)) { dev_warn(kbdev->dev, "Invalid function pointer in KBASE_CONFIG_ATTR_CPU_SPEED_FUNC"); return MALI_FALSE; } break; case KBASE_CONFIG_ATTR_GPU_SPEED_FUNC: if (0 == attributes[i].data) { dev_warn(kbdev->dev, "Invalid function pointer in KBASE_CONFIG_ATTR_GPU_SPEED_FUNC"); return MALI_FALSE; } break; case KBASE_CONFIG_ATTR_PLATFORM_FUNCS: /* any value is allowed */ break; case KBASE_CONFIG_ATTR_POWER_MANAGEMENT_DVFS_FREQ: #if CSTD_CPU_64BIT if ((u64) attributes[i].data > (u64) U32_MAX) { dev_warn(kbdev->dev, "PM DVFS interval exceeds 32-bits: " "id==%d val==%d", attributes[i].id, (int)attributes[i].data); return MALI_FALSE; } #endif break; case KBASE_CONFIG_ATTR_PM_GPU_POWEROFF_TICK_NS: #if CSTD_CPU_64BIT if (attributes[i].data == 0u || (u64) attributes[i].data > (u64) U32_MAX) { #else if (attributes[i].data == 0u) { #endif dev_warn(kbdev->dev, "Invalid Power Manager Configuration attribute for " "KBASE_CONFIG_ATTR_PM_GPU_POWEROFF_TICK_NS: %d", (int)attributes[i].data); return MALI_FALSE; } break; case KBASE_CONFIG_ATTR_PM_POWEROFF_TICK_SHADER: case KBASE_CONFIG_ATTR_PM_POWEROFF_TICK_GPU: #if CSTD_CPU_64BIT if ((u64) attributes[i].data > (u64) U32_MAX) { dev_warn(kbdev->dev, "Power Manager Configuration attribute exceeds 32-bits: " "id==%d val==%d", attributes[i].id, (int)attributes[i].data); return MALI_FALSE; } #endif break; case KBASE_CONFIG_ATTR_POWER_MODEL_CALLBACKS: if (0 == attributes[i].data) { dev_warn(kbdev->dev, "Power model callbacks is specified but NULL: " "id==%d val==%d", attributes[i].id, (int)attributes[i].data); return MALI_FALSE; } break; case KBASE_CONFIG_ATTR_SECURE_CALLBACKS: if (0 != attributes[i].data) { struct kbase_secure_ops* secure_ops; secure_ops = (struct kbase_secure_ops*)attributes[i].data; if (secure_ops->secure_mode_enable == NULL || secure_ops->secure_mode_disable == NULL) { dev_warn(kbdev->dev, "One or more secure callback functions are not specified"); return MALI_FALSE; } } break; default: dev_warn(kbdev->dev, "Invalid attribute found in configuration: %d", attributes[i].id); return MALI_FALSE; } } return MALI_TRUE; }
mali_bool kbasep_validate_configuration_attributes(kbase_device *kbdev, const kbase_attribute *attributes) { int i; mali_bool had_gpu_freq_min = MALI_FALSE, had_gpu_freq_max = MALI_FALSE; KBASE_DEBUG_ASSERT(attributes); for (i = 0; attributes[i].id != KBASE_CONFIG_ATTR_END; i++) { if (i >= ATTRIBUTE_COUNT_MAX) { KBASE_DEBUG_PRINT_WARN(KBASE_CORE, "More than ATTRIBUTE_COUNT_MAX=%d configuration attributes defined. Is attribute list properly terminated?", ATTRIBUTE_COUNT_MAX); return MALI_FALSE; } switch (attributes[i].id) { case KBASE_CONFIG_ATTR_GPU_FREQ_KHZ_MIN: had_gpu_freq_min = MALI_TRUE; if (MALI_FALSE == kbasep_validate_gpu_clock_freq(kbdev, attributes)) { /* Warning message handled by kbasep_validate_gpu_clock_freq() */ return MALI_FALSE; } break; case KBASE_CONFIG_ATTR_GPU_FREQ_KHZ_MAX: had_gpu_freq_max = MALI_TRUE; if (MALI_FALSE == kbasep_validate_gpu_clock_freq(kbdev, attributes)) { /* Warning message handled by kbasep_validate_gpu_clock_freq() */ return MALI_FALSE; } break; /* Only non-zero unsigned 32-bit values accepted */ case KBASE_CONFIG_ATTR_JS_SCHEDULING_TICK_NS: #if CSTD_CPU_64BIT if (attributes[i].data == 0u || (u64) attributes[i].data > (u64) U32_MAX) #else if (attributes[i].data == 0u) #endif { KBASE_DEBUG_PRINT_WARN(KBASE_CORE, "Invalid Job Scheduling Configuration attribute for " "KBASE_CONFIG_ATTR_JS_SCHEDULING_TICKS_NS: %d", (int)attributes[i].data); return MALI_FALSE; } break; /* All these Job Scheduling attributes are FALLTHROUGH: only unsigned 32-bit values accepted */ case KBASE_CONFIG_ATTR_JS_SOFT_STOP_TICKS: case KBASE_CONFIG_ATTR_JS_SOFT_STOP_TICKS_CL: case KBASE_CONFIG_ATTR_JS_HARD_STOP_TICKS_SS: case KBASE_CONFIG_ATTR_JS_HARD_STOP_TICKS_CL: case KBASE_CONFIG_ATTR_JS_HARD_STOP_TICKS_NSS: case KBASE_CONFIG_ATTR_JS_RESET_TICKS_SS: case KBASE_CONFIG_ATTR_JS_RESET_TICKS_CL: case KBASE_CONFIG_ATTR_JS_RESET_TICKS_NSS: case KBASE_CONFIG_ATTR_JS_RESET_TIMEOUT_MS: case KBASE_CONFIG_ATTR_JS_CTX_TIMESLICE_NS: case KBASE_CONFIG_ATTR_JS_CFS_CTX_RUNTIME_INIT_SLICES: case KBASE_CONFIG_ATTR_JS_CFS_CTX_RUNTIME_MIN_SLICES: #if CSTD_CPU_64BIT if ((u64) attributes[i].data > (u64) U32_MAX) { KBASE_DEBUG_PRINT_WARN(KBASE_CORE, "Job Scheduling Configuration attribute exceeds 32-bits: " "id==%d val==%d", attributes[i].id, (int)attributes[i].data); return MALI_FALSE; } #endif break; case KBASE_CONFIG_ATTR_GPU_IRQ_THROTTLE_TIME_US: #if CSTD_CPU_64BIT if ((u64) attributes[i].data > (u64) U32_MAX) { KBASE_DEBUG_PRINT_WARN(KBASE_CORE, "IRQ throttle time attribute exceeds 32-bits: " "id==%d val==%d", attributes[i].id, (int)attributes[i].data); return MALI_FALSE; } #endif break; case KBASE_CONFIG_ATTR_POWER_MANAGEMENT_CALLBACKS: if (MALI_FALSE == kbasep_validate_pm_callback((kbase_pm_callback_conf *) attributes[i].data)) { /* Warning message handled by kbasep_validate_pm_callback() */ return MALI_FALSE; } break; case KBASE_CONFIG_ATTR_SECURE_BUT_LOSS_OF_PERFORMANCE: if (attributes[i].data != MALI_TRUE && attributes[i].data != MALI_FALSE) { KBASE_DEBUG_PRINT_WARN(KBASE_CORE, "Value for KBASE_CONFIG_ATTR_SECURE_BUT_LOSS_OF_PERFORMANCE was not " "MALI_TRUE or MALI_FALSE: %u", (unsigned int)attributes[i].data); return MALI_FALSE; } break; case KBASE_CONFIG_ATTR_CPU_SPEED_FUNC: if (MALI_FALSE == kbasep_validate_cpu_speed_func((kbase_cpuprops_clock_speed_function) attributes[i].data)) { KBASE_DEBUG_PRINT_WARN(KBASE_CORE, "Invalid function pointer in KBASE_CONFIG_ATTR_CPU_SPEED_FUNC"); return MALI_FALSE; } break; case KBASE_CONFIG_ATTR_GPU_SPEED_FUNC: if (0 == attributes[i].data) { KBASE_DEBUG_PRINT_WARN(KBASE_CORE, "Invalid function pointer in KBASE_CONFIG_ATTR_GPU_SPEED_FUNC"); return MALI_FALSE; } break; case KBASE_CONFIG_ATTR_PLATFORM_FUNCS: /* any value is allowed */ break; case KBASE_CONFIG_ATTR_AWID_LIMIT: case KBASE_CONFIG_ATTR_ARID_LIMIT: if ((u32) attributes[i].data > 0x3) { KBASE_DEBUG_PRINT_WARN(KBASE_CORE, "Invalid AWID or ARID limit"); return MALI_FALSE; } break; case KBASE_CONFIG_ATTR_ALTERNATIVE_HWC: if (attributes[i].data != MALI_TRUE && attributes[i].data != MALI_FALSE) { KBASE_DEBUG_PRINT_WARN(KBASE_CORE, "Value for KBASE_CONFIG_ATTR_ALTERNATIVE_HWC was not " "MALI_TRUE or MALI_FALSE: %u", (unsigned int)attributes[i].data); return MALI_FALSE; } break; case KBASE_CONFIG_ATTR_POWER_MANAGEMENT_DVFS_FREQ: #if CSTD_CPU_64BIT if ((u64) attributes[i].data > (u64) U32_MAX) { KBASE_DEBUG_PRINT_WARN(KBASE_CORE, "PM DVFS interval exceeds 32-bits: " "id==%d val==%d", attributes[i].id, (int)attributes[i].data); return MALI_FALSE; } #endif break; case KBASE_CONFIG_ATTR_PM_SHADER_POWEROFF_TIME: #if CSTD_CPU_64BIT if ((u64) attributes[i].data > (u64) U32_MAX) { KBASE_DEBUG_PRINT_WARN(KBASE_CORE, "PM shader poweroff time exceeds 32-bits: " "id==%d val==%d", attributes[i].id, (int)attributes[i].data); return MALI_FALSE; } #endif break; default: KBASE_DEBUG_PRINT_WARN(KBASE_CORE, "Invalid attribute found in configuration: %d", attributes[i].id); return MALI_FALSE; } } if (!had_gpu_freq_min) { KBASE_DEBUG_PRINT_WARN(KBASE_CORE, "Configuration does not include mandatory attribute KBASE_CONFIG_ATTR_GPU_FREQ_KHZ_MIN"); return MALI_FALSE; } if (!had_gpu_freq_max) { KBASE_DEBUG_PRINT_WARN(KBASE_CORE, "Configuration does not include mandatory attribute KBASE_CONFIG_ATTR_GPU_FREQ_KHZ_MAX"); return MALI_FALSE; } return MALI_TRUE; }
mali_bool kbasep_validate_configuration_attributes(kbase_device *kbdev, const kbase_attribute *attributes) { int i; mali_bool had_gpu_freq_min = MALI_FALSE, had_gpu_freq_max = MALI_FALSE; KBASE_DEBUG_ASSERT(attributes); for (i = 0; attributes[i].id != KBASE_CONFIG_ATTR_END; i++) { if (i >= ATTRIBUTE_COUNT_MAX) { dev_warn(kbdev->dev, "More than ATTRIBUTE_COUNT_MAX=%d configuration attributes defined. Is attribute list properly terminated?", ATTRIBUTE_COUNT_MAX); return MALI_FALSE; } switch (attributes[i].id) { case KBASE_CONFIG_ATTR_GPU_FREQ_KHZ_MIN: had_gpu_freq_min = MALI_TRUE; if (MALI_FALSE == kbasep_validate_gpu_clock_freq(kbdev, attributes)) { /* Warning message handled by kbasep_validate_gpu_clock_freq() */ return MALI_FALSE; } break; case KBASE_CONFIG_ATTR_GPU_FREQ_KHZ_MAX: had_gpu_freq_max = MALI_TRUE; if (MALI_FALSE == kbasep_validate_gpu_clock_freq(kbdev, attributes)) { /* Warning message handled by kbasep_validate_gpu_clock_freq() */ return MALI_FALSE; } break; /* Only non-zero unsigned 32-bit values accepted */ case KBASE_CONFIG_ATTR_JS_SCHEDULING_TICK_NS: #if CSTD_CPU_64BIT if (attributes[i].data == 0u || (u64) attributes[i].data > (u64) U32_MAX) #else if (attributes[i].data == 0u) #endif { dev_warn(kbdev->dev, "Invalid Job Scheduling Configuration attribute for " "KBASE_CONFIG_ATTR_JS_SCHEDULING_TICKS_NS: %d", (int)attributes[i].data); return MALI_FALSE; } break; /* All these Job Scheduling attributes are FALLTHROUGH: only unsigned 32-bit values accepted */ case KBASE_CONFIG_ATTR_JS_SOFT_STOP_TICKS: case KBASE_CONFIG_ATTR_JS_SOFT_STOP_TICKS_CL: case KBASE_CONFIG_ATTR_JS_HARD_STOP_TICKS_SS: case KBASE_CONFIG_ATTR_JS_HARD_STOP_TICKS_CL: case KBASE_CONFIG_ATTR_JS_HARD_STOP_TICKS_NSS: case KBASE_CONFIG_ATTR_JS_RESET_TICKS_SS: case KBASE_CONFIG_ATTR_JS_RESET_TICKS_CL: case KBASE_CONFIG_ATTR_JS_RESET_TICKS_NSS: case KBASE_CONFIG_ATTR_JS_RESET_TIMEOUT_MS: case KBASE_CONFIG_ATTR_JS_CTX_TIMESLICE_NS: #if CSTD_CPU_64BIT if ((u64) attributes[i].data > (u64) U32_MAX) { dev_warn(kbdev->dev, "Job Scheduling Configuration attribute exceeds 32-bits: " "id==%d val==%d", attributes[i].id, (int)attributes[i].data); return MALI_FALSE; } #endif break; case KBASE_CONFIG_ATTR_POWER_MANAGEMENT_CALLBACKS: if (MALI_FALSE == kbasep_validate_pm_callback((kbase_pm_callback_conf *) attributes[i].data, kbdev)) { /* Warning message handled by kbasep_validate_pm_callback() */ return MALI_FALSE; } break; case KBASE_CONFIG_ATTR_CPU_SPEED_FUNC: if (MALI_FALSE == kbasep_validate_cpu_speed_func((kbase_cpuprops_clock_speed_function) attributes[i].data)) { dev_warn(kbdev->dev, "Invalid function pointer in KBASE_CONFIG_ATTR_CPU_SPEED_FUNC"); return MALI_FALSE; } break; case KBASE_CONFIG_ATTR_GPU_SPEED_FUNC: if (0 == attributes[i].data) { dev_warn(kbdev->dev, "Invalid function pointer in KBASE_CONFIG_ATTR_GPU_SPEED_FUNC"); return MALI_FALSE; } break; case KBASE_CONFIG_ATTR_PLATFORM_FUNCS: /* any value is allowed */ break; case KBASE_CONFIG_ATTR_POWER_MANAGEMENT_DVFS_FREQ: #if CSTD_CPU_64BIT if ((u64) attributes[i].data > (u64) U32_MAX) { dev_warn(kbdev->dev, "PM DVFS interval exceeds 32-bits: " "id==%d val==%d", attributes[i].id, (int)attributes[i].data); return MALI_FALSE; } #endif break; case KBASE_CONFIG_ATTR_PM_GPU_POWEROFF_TICK_NS: #if CSTD_CPU_64BIT if (attributes[i].data == 0u || (u64) attributes[i].data > (u64) U32_MAX) { #else if (attributes[i].data == 0u) { #endif dev_warn(kbdev->dev, "Invalid Power Manager Configuration attribute for " "KBASE_CONFIG_ATTR_PM_GPU_POWEROFF_TICK_NS: %d", (int)attributes[i].data); return MALI_FALSE; } break; case KBASE_CONFIG_ATTR_PM_POWEROFF_TICK_SHADER: case KBASE_CONFIG_ATTR_PM_POWEROFF_TICK_GPU: #if CSTD_CPU_64BIT if ((u64) attributes[i].data > (u64) U32_MAX) { dev_warn(kbdev->dev, "Power Manager Configuration attribute exceeds 32-bits: " "id==%d val==%d", attributes[i].id, (int)attributes[i].data); return MALI_FALSE; } #endif break; default: dev_warn(kbdev->dev, "Invalid attribute found in configuration: %d", attributes[i].id); return MALI_FALSE; } } if (!had_gpu_freq_min) { dev_warn(kbdev->dev, "Configuration does not include mandatory attribute KBASE_CONFIG_ATTR_GPU_FREQ_KHZ_MIN"); return MALI_FALSE; } if (!had_gpu_freq_max) { dev_warn(kbdev->dev, "Configuration does not include mandatory attribute KBASE_CONFIG_ATTR_GPU_FREQ_KHZ_MAX"); return MALI_FALSE; } return MALI_TRUE; }