<div dir="ltr">Hi guys,<div><br></div><div>I'm working on the Lima project for ARM mali400/450 GPU. Now lima</div><div>kernel driver uses CMA for all buffers, but mali400/450 GPU has MMU</div><div>for each vertex/fragment shader processor, so I want to refine the lima</div><div>kernel driver for non-contiguous memory support.</div><div><br></div><div>After some investigation on current available MM method used by</div><div>several linux kernel DRM driver, I can't find an exactly match one for</div><div>lima. So I'd like to hear some advise from you and see if I have some</div><div>miss understanding on current MMs and if there's better approach.</div><div>If can't use existing MM, I may have to write one for lima.</div><div><br></div><div>About Mali400/450 GPU:</div><div>1. it has separate vertex and fragment shader processors, 1 vertex</div><div>processor and 1~4 fragment processors are grouped to process an</div><div>OpenGL draw</div><div>2. each processor has an MMU work independently</div><div>3. Mali400/450 will work with different display DRM driver, some</div><div>display DRM driver support non-contiguous framebuffer and some</div><div>not</div><div><br></div><div>My requirement:</div><div>1. support non-contiguous memory allocation as GPU buffer</div><div>2. support contiguous memory allocation too for exporting to some</div><div>display DRM driver as framebuffer</div><div>3. no GPU page fault for better performance and avoid multi MMU</div><div>page fault handling, CPU page fault is OK</div><div>4. better have buffer swap to disk feature when memory is full</div><div><br></div><div>Current MM:</div><div>1. drm_gem_cma_object, only support contiguous memory</div><div>2. drm_gem_get_pages</div><div>  1) need to combine with cma method for contiguous memory</div><div>  2) when shrink is needed, swap some idle buffer to disk and put</div><div>      pages, need implement by myself</div><div>  3) additional shmem layer introduced</div><div>3. TTM TTM_PL_SYSTEM only</div><div>  1) no contiguous memory support</div><div>  2) too complicated as we don't need other functions of TTM</div><div>  3) need GPU page fault to populate memory?</div><div>  4) no page pool for cached memory</div><div><br></div><div>My plan:</div><div>1. for contiguous memory allocation use dma_alloc_*</div><div>2. for non-contiguous memory allocation, use a page pool from</div><div>alloc_page</div><div>3. buffer is not really allocated when GEM_CREATE, but in CPU</div><div>page fault handler and task submit buffer validation which make</div><div>sure no GPU page fault</div><div>4. in shrinker handler, free un-used page in the pool, if still not</div><div>enough, swap some idle buffer to disk</div><div><br></div><div>3&4 apply to both dma_alloc buffer and alloc_page buffer.</div><div><br></div><div>Thanks,</div><div>Qiang</div><div><br></div></div>