struct mali_mmu_core *mali_mmu_create(_mali_osk_resource_t *resource, struct mali_group *group, mali_bool is_virtual) { struct mali_mmu_core* mmu = NULL; MALI_DEBUG_ASSERT_POINTER(resource); MALI_DEBUG_PRINT(2, ("Mali MMU: Creating Mali MMU: %s\n", resource->description)); mmu = _mali_osk_calloc(1,sizeof(struct mali_mmu_core)); if (NULL != mmu) { if (_MALI_OSK_ERR_OK == mali_hw_core_create(&mmu->hw_core, resource, MALI_MMU_REGISTERS_SIZE)) { if (_MALI_OSK_ERR_OK == mali_group_add_mmu_core(group, mmu)) { if (is_virtual) { /* Skip reset and IRQ setup for virtual MMU */ return mmu; } if (_MALI_OSK_ERR_OK == mali_mmu_reset(mmu)) { /* Setup IRQ handlers (which will do IRQ probing if needed) */ mmu->irq = _mali_osk_irq_init(resource->irq, mali_group_upper_half_mmu, group, mali_mmu_probe_trigger, mali_mmu_probe_ack, mmu, "mali_mmu_irq_handlers"); if (NULL != mmu->irq) { return mmu; } else { MALI_PRINT_ERROR(("Mali MMU: Failed to setup interrupt handlers for MMU %s\n", mmu->hw_core.description)); } } mali_group_remove_mmu_core(group); } else { MALI_PRINT_ERROR(("Mali MMU: Failed to add core %s to group\n", mmu->hw_core.description)); } mali_hw_core_delete(&mmu->hw_core); } _mali_osk_free(mmu); } else { MALI_PRINT_ERROR(("Failed to allocate memory for MMU\n")); } return NULL; }
struct mali_mmu_core *mali_mmu_create(_mali_osk_resource_t *resource) { struct mali_mmu_core* mmu = NULL; MALI_DEBUG_ASSERT_POINTER(resource); MALI_DEBUG_PRINT(2, ("Mali MMU: Creating Mali MMU: %s\n", resource->description)); mmu = _mali_osk_calloc(1,sizeof(struct mali_mmu_core)); if (NULL != mmu) { #ifdef CONFIG_ARCH_MESON6 mmu->id = resource->mmu_id; MALI_DEBUG_PRINT(3, ("Mali MMU: mmu_id: %d\n", resource->mmu_id)); #endif if (_MALI_OSK_ERR_OK == mali_hw_core_create(&mmu->hw_core, resource, MALI_MMU_REGISTERS_SIZE)) { if (_MALI_OSK_ERR_OK == mali_mmu_reset(mmu)) { /* Setup IRQ handlers (which will do IRQ probing if needed) */ mmu->irq = _mali_osk_irq_init(resource->irq, mali_mmu_upper_half, mali_mmu_bottom_half, mali_mmu_probe_trigger, mali_mmu_probe_ack, mmu, "mali_mmu_irq_handlers"); if (NULL != mmu->irq) { return mmu; } else { MALI_PRINT_ERROR(("Failed to setup interrupt handlers for MMU %s\n", mmu->hw_core.description)); } } mali_hw_core_delete(&mmu->hw_core); } _mali_osk_free(mmu); } else { MALI_PRINT_ERROR(("Failed to allocate memory for MMU\n")); } return NULL; }
static void mali_group_recovery_reset(struct mali_group *group) { MALI_ASSERT_GROUP_LOCKED(group); /* Stop cores, bus stop */ if (NULL != group->pp_core) { mali_pp_stop_bus(group->pp_core); } if (NULL != group->gp_core) { mali_gp_stop_bus(group->gp_core); } /* Flush MMU */ mali_mmu_activate_fault_flush_page_directory(group->mmu); mali_mmu_page_fault_done(group->mmu); /* Wait for cores to stop bus */ if (NULL != group->pp_core) { mali_pp_stop_bus_wait(group->pp_core); } if (NULL != group->gp_core) { mali_gp_stop_bus_wait(group->gp_core); } /* Reset cores */ if (NULL != group->pp_core) { mali_pp_hard_reset(group->pp_core); } if (NULL != group->gp_core) { mali_gp_hard_reset(group->gp_core); } /* Reset MMU */ mali_mmu_reset(group->mmu); group->session = NULL; }
/* Called from mali_cluster_reset() when the system is re-turned on */ void mali_group_reset(struct mali_group *group) { mali_group_lock(group); group->session = NULL; if (NULL != group->mmu) { mali_mmu_reset(group->mmu); } if (NULL != group->gp_core) { mali_gp_reset(group->gp_core); } if (NULL != group->pp_core) { mali_pp_reset(group->pp_core); } mali_group_unlock(group); }