€•ù-Œsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ/translations/zh_CN/gpu/v3d”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ/translations/zh_TW/gpu/v3d”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ/translations/it_IT/gpu/v3d”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ/translations/ja_JP/gpu/v3d”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ/translations/ko_KR/gpu/v3d”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ/translations/sp_SP/gpu/v3d”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒ$drm/v3d Broadcom V3D Graphics Driver”h]”hŒ$drm/v3d Broadcom V3D Graphics Driver”…””}”(hh¨hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hh£hžhhŸŒ5/var/lib/git/docbuild/linux/Documentation/gpu/v3d.rst”h KubhŒ paragraph”“”)”}”(hŒjThis driver supports the Broadcom V3D 3.3 and 4.1 OpenGL ES GPUs. For V3D 2.x support, see the VC4 driver.”h]”hŒjThis driver supports the Broadcom V3D 3.3 and 4.1 OpenGL ES GPUs. For V3D 2.x support, see the VC4 driver.”…””}”(hh¹hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸŒT/var/lib/git/docbuild/linux/Documentation/gpu/v3d:5: ./drivers/gpu/drm/v3d/v3d_drv.c”h Khh£hžhubh¸)”}”(hŒ—The V3D GPU includes a tiled render (composed of a bin and render pipelines), the TFU (texture formatting unit), and the CSD (compute shader dispatch).”h]”hŒ—The V3D GPU includes a tiled render (composed of a bin and render pipelines), the TFU (texture formatting unit), and the CSD (compute shader dispatch).”…””}”(hhÈhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸŒT/var/lib/git/docbuild/linux/Documentation/gpu/v3d:5: ./drivers/gpu/drm/v3d/v3d_drv.c”h Khh£hžhubh¢)”}”(hhh]”(h§)”}”(hŒ!GPU buffer object (BO) management”h]”hŒ!GPU buffer object (BO) management”…””}”(hhÚhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hh×hžhhŸh¶h K ubh¸)”}”(hŒ’Compared to VC4 (V3D 2.x), V3D 3.3 introduces an MMU between the GPU and the bus, allowing us to use shmem objects for our storage instead of CMA.”h]”hŒ’Compared to VC4 (V3D 2.x), V3D 3.3 introduces an MMU between the GPU and the bus, allowing us to use shmem objects for our storage instead of CMA.”…””}”(hhèhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸŒT/var/lib/git/docbuild/linux/Documentation/gpu/v3d:11: ./drivers/gpu/drm/v3d/v3d_bo.c”h Khh×hžhubh¸)”}”(hX>Physically contiguous objects may still be imported to V3D, but the driver doesn't allocate physically contiguous objects on its own. Display engines requiring physically contiguous allocations should look into Mesa's "renderonly" support (as used by the Mesa pl111 driver) for an example of how to integrate with V3D.”h]”hXFPhysically contiguous objects may still be imported to V3D, but the driver doesn’t allocate physically contiguous objects on its own. Display engines requiring physically contiguous allocations should look into Mesa’s “renderonly†support (as used by the Mesa pl111 driver) for an example of how to integrate with V3D.”…””}”(hh÷hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸŒT/var/lib/git/docbuild/linux/Documentation/gpu/v3d:11: ./drivers/gpu/drm/v3d/v3d_bo.c”h K hh×hžhubh¢)”}”(hhh]”(h§)”}”(hŒAddress space management”h]”hŒAddress space management”…””}”(hj hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hjhžhhŸh¶h Kubh¸)”}”(hŒíThe V3D 3.x hardware (compared to VC4) now includes an MMU. It has a single level of page tables for the V3D's 4GB address space to map to AXI bus addresses, thus it could need up to 4MB of physically contiguous memory to store the PTEs.”h]”hŒïThe V3D 3.x hardware (compared to VC4) now includes an MMU. It has a single level of page tables for the V3D’s 4GB address space to map to AXI bus addresses, thus it could need up to 4MB of physically contiguous memory to store the PTEs.”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸŒU/var/lib/git/docbuild/linux/Documentation/gpu/v3d:16: ./drivers/gpu/drm/v3d/v3d_mmu.c”h Khjhžhubh¸)”}”(hŒ›Because the 4MB of contiguous memory for page tables is precious, and switching between them is expensive, we load all BOs into the same 4GB address space.”h]”hŒ›Because the 4MB of contiguous memory for page tables is precious, and switching between them is expensive, we load all BOs into the same 4GB address space.”…””}”(hj&hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸŒU/var/lib/git/docbuild/linux/Documentation/gpu/v3d:16: ./drivers/gpu/drm/v3d/v3d_mmu.c”h K hjhžhubh¸)”}”(hŒªTo protect clients from each other, we should use the GMP to quickly mask out (at 128kb granularity) what pages are available to each client. This is not yet implemented.”h]”hŒªTo protect clients from each other, we should use the GMP to quickly mask out (at 128kb granularity) what pages are available to each client. This is not yet implemented.”…””}”(hj5hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸŒU/var/lib/git/docbuild/linux/Documentation/gpu/v3d:16: ./drivers/gpu/drm/v3d/v3d_mmu.c”h Khjhžhubeh}”(h]”Œaddress-space-management”ah ]”h"]”Œaddress space management”ah$]”h&]”uh1h¡hh×hžhhŸh¶h Kubh¢)”}”(hhh]”(h§)”}”(hŒGPU Scheduling”h]”hŒGPU Scheduling”…””}”(hjOhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hjLhžhhŸh¶h Kubh¸)”}”(hX The shared DRM GPU scheduler is used to coordinate submitting jobs to the hardware. Each DRM fd (roughly a client process) gets its own scheduler entity, which will process jobs in order. The GPU scheduler will schedule the clients with a FIFO scheduling algorithm.”h]”hX The shared DRM GPU scheduler is used to coordinate submitting jobs to the hardware. Each DRM fd (roughly a client process) gets its own scheduler entity, which will process jobs in order. The GPU scheduler will schedule the clients with a FIFO scheduling algorithm.”…””}”(hj]hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸŒW/var/lib/git/docbuild/linux/Documentation/gpu/v3d:21: ./drivers/gpu/drm/v3d/v3d_sched.c”h KhjLhžhubh¸)”}”(hX«For simplicity, and in order to keep latency low for interactive jobs when bulk background jobs are queued up, we submit a new job to the HW only when it has completed the last one, instead of filling up the CT[01]Q FIFOs with jobs. Similarly, we use `drm_sched_job_add_dependency()` to manage the dependency between bin and render, instead of having the clients submit jobs using the HW's semaphores to interlock between them.”h]”(hŒûFor simplicity, and in order to keep latency low for interactive jobs when bulk background jobs are queued up, we submit a new job to the HW only when it has completed the last one, instead of filling up the CT[01]Q FIFOs with jobs. Similarly, we use ”…””}”(hjlhžhhŸNh NubhŒtitle_reference”“”)”}”(hŒ `drm_sched_job_add_dependency()`”h]”hŒdrm_sched_job_add_dependency()”…””}”(hjvhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jthjlubhŒ’ to manage the dependency between bin and render, instead of having the clients submit jobs using the HW’s semaphores to interlock between them.”…””}”(hjlhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸŒW/var/lib/git/docbuild/linux/Documentation/gpu/v3d:21: ./drivers/gpu/drm/v3d/v3d_sched.c”h K hjLhžhubeh}”(h]”Œgpu-scheduling”ah ]”h"]”Œgpu scheduling”ah$]”h&]”uh1h¡hh×hžhhŸh¶h Kubeh}”(h]”Œgpu-buffer-object-bo-management”ah ]”h"]”Œ!gpu buffer object (bo) management”ah$]”h&]”uh1h¡hh£hžhhŸh¶h K ubh¢)”}”(hhh]”(h§)”}”(hŒ Interrupts”h]”hŒ Interrupts”…””}”(hj¢hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hjŸhžhhŸh¶h Kubh¸)”}”(hŒ®When we take a bin, render, TFU done, or CSD done interrupt, we need to signal the fence for that job so that the scheduler can queue up the next one and unblock any waiters.”h]”hŒ®When we take a bin, render, TFU done, or CSD done interrupt, we need to signal the fence for that job so that the scheduler can queue up the next one and unblock any waiters.”…””}”(hj°hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸŒU/var/lib/git/docbuild/linux/Documentation/gpu/v3d:27: ./drivers/gpu/drm/v3d/v3d_irq.c”h KhjŸhžhubh¸)”}”(hŒ™When we take the binner out of memory interrupt, we need to allocate some new memory and pass it to the binner so that the current job can make progress.”h]”hŒ™When we take the binner out of memory interrupt, we need to allocate some new memory and pass it to the binner so that the current job can make progress.”…””}”(hj¿hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸŒU/var/lib/git/docbuild/linux/Documentation/gpu/v3d:27: ./drivers/gpu/drm/v3d/v3d_irq.c”h K hjŸhžhubeh}”(h]”Œ interrupts”ah ]”h"]”Œ interrupts”ah$]”h&]”uh1h¡hh£hžhhŸh¶h Kubeh}”(h]”Œ$drm-v3d-broadcom-v3d-graphics-driver”ah ]”h"]”Œ$drm/v3d broadcom v3d graphics driver”ah$]”h&]”uh1h¡hhhžhhŸh¶h Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”h¶uh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(h¦NŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jŒerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”h¶Œ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(jÛjØjœj™jIjFj”j‘jÓjÐuŒ nametypes”}”(jÛ‰jœ‰jI‰j”‰jÓ‰uh}”(jØh£j™h×jFjj‘jLjÐjŸuŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nhžhub.