_mali_osk_errcode_t mali_create_fault_flush_pages(u32 *page_directory, u32 *page_table, u32 *data_page) { _mali_osk_errcode_t err; mali_io_address page_directory_mapping; mali_io_address page_table_mapping; mali_io_address data_page_mapping; err = mali_mmu_get_table_page(data_page, &data_page_mapping); if (_MALI_OSK_ERR_OK == err) { err = mali_mmu_get_table_page(page_table, &page_table_mapping); if (_MALI_OSK_ERR_OK == err) { err = mali_mmu_get_table_page(page_directory, &page_directory_mapping); if (_MALI_OSK_ERR_OK == err) { fill_page(data_page_mapping, 0); fill_page(page_table_mapping, *data_page | MALI_MMU_FLAGS_WRITE_PERMISSION | MALI_MMU_FLAGS_READ_PERMISSION | MALI_MMU_FLAGS_PRESENT); fill_page(page_directory_mapping, *page_table | MALI_MMU_FLAGS_PRESENT); MALI_SUCCESS; } mali_mmu_release_table_page(*page_table); *page_table = MALI_INVALID_PAGE; } mali_mmu_release_table_page(*data_page); *data_page = MALI_INVALID_PAGE; } return err; }
_mali_osk_errcode_t mali_create_fault_flush_pages(mali_dma_addr *page_directory, mali_io_address *page_directory_mapping, mali_dma_addr *page_table, mali_io_address *page_table_mapping, mali_dma_addr *data_page, mali_io_address *data_page_mapping) { _mali_osk_errcode_t err; err = mali_mmu_get_table_page(data_page, data_page_mapping); if (_MALI_OSK_ERR_OK == err) { err = mali_mmu_get_table_page(page_table, page_table_mapping); if (_MALI_OSK_ERR_OK == err) { err = mali_mmu_get_table_page(page_directory, page_directory_mapping); if (_MALI_OSK_ERR_OK == err) { fill_page(*data_page_mapping, 0); fill_page(*page_table_mapping, *data_page | MALI_MMU_FLAGS_DEFAULT); fill_page(*page_directory_mapping, *page_table | MALI_MMU_FLAGS_PRESENT); MALI_SUCCESS; } mali_mmu_release_table_page(*page_table, *page_table_mapping); *page_table = MALI_INVALID_PAGE; } mali_mmu_release_table_page(*data_page, *data_page_mapping); *data_page = MALI_INVALID_PAGE; } return err; }
void run_task(uint8_t *Task) { switch(Task[2]) { case '0': send_string("boot"); break; case '1': page_address = Task[9] << 8; page_address |= Task[8]; readFlashPage(page_address, 128); send_buff(gBuffer, 128); Task[2] = 0; break; case '2': Task[2] = 0; break; case '3': page_address = Task[9] << 8; page_address |= Task[8]; for (uint16_t i = 0; i < SPM_PAGESIZE; i++) gBuffer[i] = data_buffer[i + 16]; writeFlashPage(page_address,SPM_PAGESIZE); send_string("page done"); Task[2] = 0; break; case '4': eraseFlash(); send_string("erase ok"); Task[2] = 0; break; case '5': Task[2] = 0; break; case '6': fill_page(); send_buff(gBuffer, 256); Task[2] = 0; break; case '7': blink_led(); Task[2] = 0; break; case '8': MCUCR |= 1<<IVCE; MCUCR = 0<<IVSEL; send_string("jump ok"); jump_to_app(); // Jump to application sector Task[2] = 0; break; default: Task[2] = 0; } }
struct mali_page_directory *mali_mmu_pagedir_alloc(void) { struct mali_page_directory *pagedir; pagedir = _mali_osk_calloc(1, sizeof(struct mali_page_directory)); if(NULL == pagedir) { return NULL; } if(_MALI_OSK_ERR_OK != mali_mmu_get_table_page(&pagedir->page_directory, &pagedir->page_directory_mapped)) { _mali_osk_free(pagedir); return NULL; } /* Zero page directory */ fill_page(pagedir->page_directory_mapped, 0); return pagedir; }
u32 mali_allocate_empty_page(void) { _mali_osk_errcode_t err; mali_io_address mapping; u32 address; if(_MALI_OSK_ERR_OK != mali_mmu_get_table_page(&address, &mapping)) { /* Allocation failed */ return 0; } MALI_DEBUG_ASSERT_POINTER( mapping ); err = fill_page(mapping, 0); if (_MALI_OSK_ERR_OK != err) { mali_mmu_release_table_page(address); } return address; }
struct mali_page_directory *mali_mmu_pagedir_alloc(void) { struct mali_page_directory *pagedir; _mali_osk_errcode_t err; mali_dma_addr phys; pagedir = _mali_osk_calloc(1, sizeof(struct mali_page_directory)); if (NULL == pagedir) { return NULL; } err = mali_mmu_get_table_page(&phys, &pagedir->page_directory_mapped); if (_MALI_OSK_ERR_OK != err) { _mali_osk_free(pagedir); return NULL; } pagedir->page_directory = (u32)phys; /* Zero page directory */ fill_page(pagedir->page_directory_mapped, 0); return pagedir; }
u32 mali_allocate_empty_page(mali_io_address *virt_addr) { _mali_osk_errcode_t err; mali_io_address mapping; mali_dma_addr address; if (_MALI_OSK_ERR_OK != mali_mmu_get_table_page(&address, &mapping)) { /* Allocation failed */ MALI_DEBUG_PRINT(2, ("Mali MMU: Failed to get table page for empty pgdir\n")); return 0; } MALI_DEBUG_ASSERT_POINTER(mapping); err = fill_page(mapping, 0); if (_MALI_OSK_ERR_OK != err) { mali_mmu_release_table_page(address, mapping); MALI_DEBUG_PRINT(2, ("Mali MMU: Failed to zero page\n")); return 0; } *virt_addr = mapping; return address; }