| .. _amdgpu-mes: |
| |
| ============================= |
| MicroEngine Scheduler (MES) |
| ============================= |
| |
| .. note:: |
| Queue and ring buffer are used as a synonymous. |
| |
| .. note:: |
| This section assumes that you are familiar with the concept of Pipes, Queues, and GC. |
| If not, check :ref:`GFX, Compute, and SDMA Overall Behavior<pipes-and-queues-description>` |
| and :ref:`drm/amdgpu - Graphics and Compute (GC) <amdgpu-gc>`. |
| |
| Every GFX has a pipe component with one or more hardware queues. Pipes can |
| switch between queues depending on certain conditions, and one of the |
| components that can request a queue switch to a pipe is the MicroEngine |
| Scheduler (MES). Whenever the driver is initialized, it creates one MQD per |
| hardware queue, and then the MQDs are handed to the MES firmware for mapping |
| to: |
| |
| 1. Kernel Queues (legacy): This queue is statically mapped to HQDs and never |
| preempted. Even though this is a legacy feature, it is the current default, and |
| most existing hardware supports it. When an application submits work to the |
| kernel driver, it submits all of the application command buffers to the kernel |
| queues. The CS IOCTL takes the command buffer from the applications and |
| schedules them on the kernel queue. |
| |
| 2. User Queues: These queues are dynamically mapped to the HQDs. Regarding the |
| utilization of User Queues, the userspace application will create its user |
| queues and submit work directly to its user queues with no need to IOCTL for |
| each submission and no need to share a single kernel queue. |
| |
| In terms of User Queues, MES can dynamically map them to the HQD. If there are |
| more MQDs than HQDs, the MES firmware will preempt other user queues to make |
| sure each queues get a time slice; in other words, MES is a microcontroller |
| that handles the mapping and unmapping of MQDs into HQDs, as well as the |
| priorities and oversubscription of MQDs. |