mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 01:04:41 +01:00
drm for 7.0-rc1
core:
- drop kgdb support
- replace system workqueue with percpu
- account for property blobs in memcg
- MAINTAINERS updates for xe + buddy
rust:
- Fix documentation for Registration constructors.
- Use pin_init::zeroed() for fops initialization.
- Annotate DRM helpers with __rust_helper.
- Improve safety documentation for gem::Object::new().
- Update AlwaysRefCounted imports.
- mm: Prevent integer overflow in page_align().
atomic:
- add drm_device pointer to drm_private_obj
- introduce gamma/degamma LUT size check
buddy:
- fix free_trees memory leak
- prevent BUG_ON
bridge:
- introduce drm_bridge_unplug/enter/exit
- add connector argument to .hpd_notify
- lots of recounting conversions
- convert rockchip inno hdmi to bridge
- lontium-lt9611uxc: switch to HDMI audio helpers
- dw-hdmi-qp: add support for HPD-less setups
- Algoltek AG6311 support
panels:
- edp: CSW MNE007QB3-1, AUO B140HAN06.4, AUO B140QAX01.H
- st75751: add SPI support
- Sitronix ST7920, Samsung LTL106HL02
- LG LH546WF1-ED01, HannStar HSD156J
- BOE NV130WUM-T08
- Innolux G150XGE-L05
- Anbernic RG-DS
dma-buf:
- improve sg_table debugging
- add tracepoints
- call clear_page instead of memset
- start to introduce cgroup memory accounting in heaps
- remove sysfs stats
dma-fence:
- add new helpers
dp:
- mst: avoid oob access with vcpi=0
hdmi:
- limit infoframes exposure to userspace
gem:
- reduce page table overhead with THP
- fix leak in drm_gem_get_unmapped_area
gpuvm:
- API sanitation for rust bindings
sched:
- introduce new helpers
panic:
- report invalid panic modes
- add kunit tests
i915/xe display:
- Expose sharpness only if num_scalers is >= 2
- Add initial Xe3P_LPD for NVL
- BMG FBC support
- Add MTL+ platforms to support dpll framework
_ fix DIMM_S DRM decoding on ICL
- Return to using AUX interrupts
- PSR/Panel replay refactoring
- use consolidation HDMI tables
- Xe3_LPD CD2X dividier changes
xe:
- vfio: add vfio_pci for intel GPU
- multi queue support
- dynamic pagemaps and multi-device SVM
- expose temp attribs in hwmon
- NO_COMPRESSION bo flag
- expose MERT OA unit
- sysfs survivability refactor
- SRIOV PF: add MERT support
- enable SR-IOV VF migration
- Enable I2C/NVM on Crescent Island
- Xe3p page reclaimation support
- introduce SRIOV scheduler groups
- add SoC remappt support in system controller
- insert compiler barriers in GuC code
- define NVL GuC firmware
- handle GT resume failure
- fix drm scheduler layering violations
- enable GSC loading and PXP for PTL
- disable GuC Power DCC strategy on PTL
- unregister drm device on probe error
i915:
- move to kernel standard fault injection
- bump recommended GuC version for DG2 and MTL
amdgpu:
- SMUIO 15.x, PSP 15.x support
- IH 6.1.1/7.1 support
- MMHUB 3.4/4.2 support
- GC 11.5.4/12.1 support
- SDMA 6.1.4/7.1/7.11.4 support
- JPEG 5.3 support
- UserQ updates
- GC 9 gfx queue reset support
- TTM memory ops parallelization
- convert legacy logging to new helpers
- DC analog fixes
amdkfd:
- GC 11.5.4/12.1 suppport
- SDMA 6.1.4/7.1 support
- per context support
- increase kfd process hash table
- Reserved SDMA rework
radeon:
- convert legacy logging to new helpers
- use devm for i2c adapters
msm:
- GPU
- Document a612/RGMU dt bindings
- UBWC 6.0 support (for A840 / Kaanapali)
- a225 support
- DPU:
- Switched to use virtual planes by default
- Fixed DSI CMD panels on DPU 3.x
- Rewrote format handling to remove intermediate representation
- Fixed watchdog on DPU 8.x+
- Fixed TE / Vsync source setting on DPU 8.x+
- Added 3D_Mux on SC7280
- Kaanapali platform support
- Fixed UBWC register programming
- Made RM reserve DSPP-enabled mixers for CRTCs with LMs.
- Gamma correction support
- DP:
- Enabled support for eDP 1.4+ link rate tables
- Fixed MDSS1 DP indices on SA8775P, making them to work
- Fixed msm_dp_ctrl_config_msa() to work with LLVM 20
- DSI:
- Documented QCS8300 as compatible with SA8775P
- Kaanapali platform support
- DSI PHY:
- switched to divider_determine_rate()
- MDP5:
- Dropped support for MSM8998, SDM660 and SDM630 (switched over
to DPU)
- MDSS:
- Kaanapali platform support
- Fixed UBWC register programming
nova-core:
- Prepare for Turing support. This includes parsing and handling
Turing-specific firmware headers and sections as well as a Turing
Falcon HAL implementation.
- Get rid of the Result<impl PinInit<T, E>> anti-pattern.
- Relocate initializer-specific code into the appropriate initializer.
- Use CStr::from_bytes_until_nul() to remove custom helpers.
- Improve handling of unexpected firmware values.
- Clean up redundant debug prints.
- Replace c_str!() with native Rust C-string literals.
- Update nova-core task list.
nova:
- Align GEM object size to system page size.
tyr:
- Use generated uAPI bindings for GpuInfo.
- Replace manual sleeps with read_poll_timeout().
- Replace c_str!() with native Rust C-string literals.
- Suppress warnings for unread fields.
- Fix incorrect register name in print statement.
nouveau:
- fix big page table support races in PTE management
- improve reclocking on tegra 186+
amdxdna:
- fix suspend race conditions
- improve handling of zero tail pointers
- fix cu_idx overwritten during command setup
- enable hardware context priority
- remove NPU2 support
- update message buffer allocation requirements
- update firmware version check
ast:
- support imported cursor buffers
- big endian fixes
etnaviv:
- add PPU flop reset support
imagination:
- add AM62P support
- introduce hw version checks
ivpu:
- implement warm boot flow
panfrost:
- add bo sync ioctl
- add GPU_PM_RT support for RZ/G3E SoC
panthor:
- add bo sync ioctl
- enable timestamp propagation
- scheduler robustness improvements
- VM termination fixes
- huge page support
rockchip:
- RK3368 HDMI Support
- get rid of atomic_check fixups
- RK3506 support
- RK3576/RK3588 improved HPD handling
rz-du:
- RZ/V2H(P) MIPI-DSI Support
v3d:
- fix DMA segment size
- convert to new logging helpers
mediatek:
- move DP training to hotplug thread
- convert logging to new helpers
- add support for HS speed DSI
- Genio 510/700/1200-EVK, Radxa NIO-12L HDMI support
atmel-hlcdc:
- switch to drmm resource
- support nomodeset
- use newer helpers
hisilicon:
- fix various DP bugs
renesas:
- fix kernel panic on reboot
exynos:
- fix vidi_connection_ioctl using wrong device
- fix vidi_connection deref user ptr
- fix concurrency regression with vidi_context
vkms:
- add configfs support for display configuration
-----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEEKbZHaGwW9KfbeusDHTzWXnEhr4FAmmMLAcACgkQDHTzWXnE
hr7aAw//bQ2WLhXeMqWyqrPPe51l2DmWvbdwP6TKUjzMwd9+xvs6wQcSg80Mn230
0vqSpqKq2aMB6GMmz7wdHG8JgZOvO7qDf2TZodXe5lvBiAAPjzX+UE/0bIQKuhym
Ufb7tqCIPsj6TpcD3ef/173x3BnVPA6Y7lS11KaaG5l01vUAVlTD1vfWGDQp/L6P
7g94cC+0+3eYZyKxE1+Rn7FDXdw08u+vtLchIoowcAHobgucZ8K/XtZZoqFFy3sj
ZZN580AhyZoGcgmn2KhNvU4B+3tBFFMSVZkJm7skOO0IB2AMQGdEr0uVUDzLGc7K
DrLaxYwM6HfxM4o0r0Ai0WCuoysCAJ95M2Cp58uDuNcew4lRTtIUqz32Sm2OJ8bD
Z91Rvh/kOcA0Ru11Sb/kQvy9/OJ54CqojKVaUlkFo9VhHyPCPo9hjnPvaDvCt34N
FmnhuVpZMWqcjjq5yO/192qpDJnm470eQExvkZ4YpgmWkekND0zwaT4PG4763dZJ
juPlBQ5WtUlIzlUpRxdHE7C7ht1rWRS+HdzSYPM5aHTXDvktJvcA+1b/Jyicc+x4
QZiZ/1AC0KKlLrZxpVpEcjkPdQj2CiCXHQ+0YjDfO3cHo/55EfKj4iiARzhDzokf
h7FgKwvVhc9DycSq8KPGAf09AswceGAtvB1rKk+Jh9D/GqbgGtM=
=RFJ2
-----END PGP SIGNATURE-----
Merge tag 'drm-next-2026-02-11' of https://gitlab.freedesktop.org/drm/kernel
Pull drm updates from Dave Airlie:
"Highlights:
- amdgpu support for lots of new IP blocks which means newer GPUs
- xe has a lot of SR-IOV and SVM improvements
- lots of intel display refactoring across i915/xe
- msm has more support for gen8 platforms
- Given up on kgdb/kms integration, it's too hard on modern hw
core:
- drop kgdb support
- replace system workqueue with percpu
- account for property blobs in memcg
- MAINTAINERS updates for xe + buddy
rust:
- Fix documentation for Registration constructors
- Use pin_init::zeroed() for fops initialization
- Annotate DRM helpers with __rust_helper
- Improve safety documentation for gem::Object::new()
- Update AlwaysRefCounted imports
- mm: Prevent integer overflow in page_align()
atomic:
- add drm_device pointer to drm_private_obj
- introduce gamma/degamma LUT size check
buddy:
- fix free_trees memory leak
- prevent BUG_ON
bridge:
- introduce drm_bridge_unplug/enter/exit
- add connector argument to .hpd_notify
- lots of recounting conversions
- convert rockchip inno hdmi to bridge
- lontium-lt9611uxc: switch to HDMI audio helpers
- dw-hdmi-qp: add support for HPD-less setups
- Algoltek AG6311 support
panels:
- edp: CSW MNE007QB3-1, AUO B140HAN06.4, AUO B140QAX01.H
- st75751: add SPI support
- Sitronix ST7920, Samsung LTL106HL02
- LG LH546WF1-ED01, HannStar HSD156J
- BOE NV130WUM-T08
- Innolux G150XGE-L05
- Anbernic RG-DS
dma-buf:
- improve sg_table debugging
- add tracepoints
- call clear_page instead of memset
- start to introduce cgroup memory accounting in heaps
- remove sysfs stats
dma-fence:
- add new helpers
dp:
- mst: avoid oob access with vcpi=0
hdmi:
- limit infoframes exposure to userspace
gem:
- reduce page table overhead with THP
- fix leak in drm_gem_get_unmapped_area
gpuvm:
- API sanitation for rust bindings
sched:
- introduce new helpers
panic:
- report invalid panic modes
- add kunit tests
i915/xe display:
- Expose sharpness only if num_scalers is >= 2
- Add initial Xe3P_LPD for NVL
- BMG FBC support
- Add MTL+ platforms to support dpll framework
_ fix DIMM_S DRM decoding on ICL
- Return to using AUX interrupts
- PSR/Panel replay refactoring
- use consolidation HDMI tables
- Xe3_LPD CD2X dividier changes
xe:
- vfio: add vfio_pci for intel GPU
- multi queue support
- dynamic pagemaps and multi-device SVM
- expose temp attribs in hwmon
- NO_COMPRESSION bo flag
- expose MERT OA unit
- sysfs survivability refactor
- SRIOV PF: add MERT support
- enable SR-IOV VF migration
- Enable I2C/NVM on Crescent Island
- Xe3p page reclaimation support
- introduce SRIOV scheduler groups
- add SoC remappt support in system controller
- insert compiler barriers in GuC code
- define NVL GuC firmware
- handle GT resume failure
- fix drm scheduler layering violations
- enable GSC loading and PXP for PTL
- disable GuC Power DCC strategy on PTL
- unregister drm device on probe error
i915:
- move to kernel standard fault injection
- bump recommended GuC version for DG2 and MTL
amdgpu:
- SMUIO 15.x, PSP 15.x support
- IH 6.1.1/7.1 support
- MMHUB 3.4/4.2 support
- GC 11.5.4/12.1 support
- SDMA 6.1.4/7.1/7.11.4 support
- JPEG 5.3 support
- UserQ updates
- GC 9 gfx queue reset support
- TTM memory ops parallelization
- convert legacy logging to new helpers
- DC analog fixes
amdkfd:
- GC 11.5.4/12.1 suppport
- SDMA 6.1.4/7.1 support
- per context support
- increase kfd process hash table
- Reserved SDMA rework
radeon:
- convert legacy logging to new helpers
- use devm for i2c adapters
msm:
- GPU
- Document a612/RGMU dt bindings
- UBWC 6.0 support (for A840 / Kaanapali)
- a225 support
- DPU:
- Switch to use virtual planes by default
- Fix DSI CMD panels on DPU 3.x
- Rewrite format handling to remove intermediate representation
- Fix watchdog on DPU 8.x+
- Fix TE / Vsync source setting on DPU 8.x+
- Add 3D_Mux on SC7280
- Kaanapali platform support
- Fix UBWC register programming
- Make RM reserve DSPP-enabled mixers for CRTCs with LMs
- Gamma correction support
- DP:
- Enable support for eDP 1.4+ link rate tables
- Fix MDSS1 DP indices on SA8775P, making them to work
- Fix msm_dp_ctrl_config_msa() to work with LLVM 20
- DSI:
- Document QCS8300 as compatible with SA8775P
- Kaanapali platform support
- DSI PHY:
- switch to divider_determine_rate()
- MDP5:
- Drop support for MSM8998, SDM660 and SDM630 (switch over to DPU)
- MDSS:
- Kaanapali platform support
- Fixed UBWC register programming
nova-core:
- Prepare for Turing support. This includes parsing and handling
Turing-specific firmware headers and sections as well as a Turing
Falcon HAL implementation
- Get rid of the Result<impl PinInit<T, E>> anti-pattern
- Relocate initializer-specific code into the appropriate initializer
- Use CStr::from_bytes_until_nul() to remove custom helpers
- Improve handling of unexpected firmware values
- Clean up redundant debug prints
- Replace c_str!() with native Rust C-string literals
- Update nova-core task list
nova:
- Align GEM object size to system page size
tyr:
- Use generated uAPI bindings for GpuInfo
- Replace manual sleeps with read_poll_timeout()
- Replace c_str!() with native Rust C-string literals
- Suppress warnings for unread fields
- Fix incorrect register name in print statement
nouveau:
- fix big page table support races in PTE management
- improve reclocking on tegra 186+
amdxdna:
- fix suspend race conditions
- improve handling of zero tail pointers
- fix cu_idx overwritten during command setup
- enable hardware context priority
- remove NPU2 support
- update message buffer allocation requirements
- update firmware version check
ast:
- support imported cursor buffers
- big endian fixes
etnaviv:
- add PPU flop reset support
imagination:
- add AM62P support
- introduce hw version checks
ivpu:
- implement warm boot flow
panfrost:
- add bo sync ioctl
- add GPU_PM_RT support for RZ/G3E SoC
panthor:
- add bo sync ioctl
- enable timestamp propagation
- scheduler robustness improvements
- VM termination fixes
- huge page support
rockchip:
- RK3368 HDMI Support
- get rid of atomic_check fixups
- RK3506 support
- RK3576/RK3588 improved HPD handling
rz-du:
- RZ/V2H(P) MIPI-DSI Support
v3d:
- fix DMA segment size
- convert to new logging helpers
mediatek:
- move DP training to hotplug thread
- convert logging to new helpers
- add support for HS speed DSI
- Genio 510/700/1200-EVK, Radxa NIO-12L HDMI support
atmel-hlcdc:
- switch to drmm resource
- support nomodeset
- use newer helpers
hisilicon:
- fix various DP bugs
renesas:
- fix kernel panic on reboot
exynos:
- fix vidi_connection_ioctl using wrong device
- fix vidi_connection deref user ptr
- fix concurrency regression with vidi_context
vkms:
- add configfs support for display configuration
* tag 'drm-next-2026-02-11' of https://gitlab.freedesktop.org/drm/kernel: (1610 commits)
drm/xe/pm: Disable D3Cold for BMG only on specific platforms
drm/xe: Fix kerneldoc for xe_tlb_inval_job_alloc_dep
drm/xe: Fix kerneldoc for xe_gt_tlb_inval_init_early
drm/xe: Fix kerneldoc for xe_migrate_exec_queue
drm/xe/query: Fix topology query pointer advance
drm/xe/guc: Fix kernel-doc warning in GuC scheduler ABI header
drm/xe/guc: Fix CFI violation in debugfs access.
accel/amdxdna: Move RPM resume into job run function
accel/amdxdna: Fix incorrect DPM level after suspend/resume
nouveau/vmm: start tracking if the LPT PTE is valid. (v6)
nouveau/vmm: increase size of vmm pte tracker struct to u32 (v2)
nouveau/vmm: rewrite pte tracker using a struct and bitfields.
accel/amdxdna: Fix incorrect error code returned for failed chain command
accel/amdxdna: Remove hardware context status
drm/bridge: imx8qxp-pixel-combiner: Fix bailout for imx8qxp_pc_bridge_probe()
drm/panel: ilitek-ili9882t: Remove duplicate initializers in tianma_il79900a_dsc
drm/i915/display: fix the pixel normalization handling for xe3p_lpd
drm/exynos: vidi: use ctx->lock to protect struct vidi_context member variables related to memory alloc/free
drm/exynos: vidi: fix to avoid directly dereferencing user pointer
drm/exynos: vidi: use priv->vidi_dev for ctx lookup in vidi_connection_ioctl()
...
This commit is contained in:
commit
939faf71cf
1332 changed files with 154568 additions and 23506 deletions
5
.mailmap
5
.mailmap
|
|
@ -378,7 +378,9 @@ Jesper Dangaard Brouer <hawk@kernel.org> <hawk@comx.dk>
|
|||
Jesper Dangaard Brouer <hawk@kernel.org> <jbrouer@redhat.com>
|
||||
Jesper Dangaard Brouer <hawk@kernel.org> <jdb@comx.dk>
|
||||
Jesper Dangaard Brouer <hawk@kernel.org> <netoptimizer@brouer.com>
|
||||
Jessica Zhang <quic_jesszhan@quicinc.com> <jesszhan@codeaurora.org>
|
||||
Jessica Zhang <jesszhan0024@gmail.com> <jesszhan@codeaurora.org>
|
||||
Jessica Zhang <jesszhan0024@gmail.com> <quic_jesszhan@quicinc.com>
|
||||
Jessica Zhang <jesszhan0024@gmail.com> <jessica.zhang@oss.qualcomm.com>
|
||||
Jilai Wang <quic_jilaiw@quicinc.com> <jilaiw@codeaurora.org>
|
||||
Jiri Kosina <jikos@kernel.org> <jikos@jikos.cz>
|
||||
Jiri Kosina <jikos@kernel.org> <jkosina@suse.cz>
|
||||
|
|
@ -491,6 +493,7 @@ Lorenzo Pieralisi <lpieralisi@kernel.org> <lorenzo.pieralisi@arm.com>
|
|||
Lorenzo Stoakes <lorenzo.stoakes@oracle.com> <lstoakes@gmail.com>
|
||||
Luca Ceresoli <luca.ceresoli@bootlin.com> <luca@lucaceresoli.net>
|
||||
Luca Weiss <luca@lucaweiss.eu> <luca@z3ntu.xyz>
|
||||
Lucas De Marchi <demarchi@kernel.org> <lucas.demarchi@intel.com>
|
||||
Lukasz Luba <lukasz.luba@arm.com> <l.luba@partner.samsung.com>
|
||||
Luo Jie <quic_luoj@quicinc.com> <luoj@codeaurora.org>
|
||||
Lance Yang <lance.yang@linux.dev> <ioworker0@gmail.com>
|
||||
|
|
|
|||
|
|
@ -109,6 +109,22 @@ Description: RO. Package current voltage in millivolt.
|
|||
|
||||
Only supported for particular Intel Xe graphics platforms.
|
||||
|
||||
What: /sys/bus/pci/drivers/xe/.../hwmon/hwmon<i>/temp2_crit
|
||||
Date: January 2026
|
||||
KernelVersion: 7.0
|
||||
Contact: intel-xe@lists.freedesktop.org
|
||||
Description: RO. Package critical temperature in millidegree Celsius.
|
||||
|
||||
Only supported for particular Intel Xe graphics platforms.
|
||||
|
||||
What: /sys/bus/pci/drivers/xe/.../hwmon/hwmon<i>/temp2_emergency
|
||||
Date: January 2026
|
||||
KernelVersion: 7.0
|
||||
Contact: intel-xe@lists.freedesktop.org
|
||||
Description: RO. Package shutdown temperature in millidegree Celsius.
|
||||
|
||||
Only supported for particular Intel Xe graphics platforms.
|
||||
|
||||
What: /sys/bus/pci/drivers/xe/.../hwmon/hwmon<i>/temp2_input
|
||||
Date: March 2025
|
||||
KernelVersion: 6.15
|
||||
|
|
@ -117,6 +133,30 @@ Description: RO. Package temperature in millidegree Celsius.
|
|||
|
||||
Only supported for particular Intel Xe graphics platforms.
|
||||
|
||||
What: /sys/bus/pci/drivers/xe/.../hwmon/hwmon<i>/temp2_max
|
||||
Date: January 2026
|
||||
KernelVersion: 7.0
|
||||
Contact: intel-xe@lists.freedesktop.org
|
||||
Description: RO. Package maximum temperature limit in millidegree Celsius.
|
||||
|
||||
Only supported for particular Intel Xe graphics platforms.
|
||||
|
||||
What: /sys/bus/pci/drivers/xe/.../hwmon/hwmon<i>/temp3_crit
|
||||
Date: January 2026
|
||||
KernelVersion: 7.0
|
||||
Contact: intel-xe@lists.freedesktop.org
|
||||
Description: RO. VRAM critical temperature in millidegree Celsius.
|
||||
|
||||
Only supported for particular Intel Xe graphics platforms.
|
||||
|
||||
What: /sys/bus/pci/drivers/xe/.../hwmon/hwmon<i>/temp3_emergency
|
||||
Date: January 2026
|
||||
KernelVersion: 7.0
|
||||
Contact: intel-xe@lists.freedesktop.org
|
||||
Description: RO. VRAM shutdown temperature in millidegree Celsius.
|
||||
|
||||
Only supported for particular Intel Xe graphics platforms.
|
||||
|
||||
What: /sys/bus/pci/drivers/xe/.../hwmon/hwmon<i>/temp3_input
|
||||
Date: March 2025
|
||||
KernelVersion: 6.15
|
||||
|
|
@ -125,6 +165,76 @@ Description: RO. VRAM temperature in millidegree Celsius.
|
|||
|
||||
Only supported for particular Intel Xe graphics platforms.
|
||||
|
||||
What: /sys/bus/pci/drivers/xe/.../hwmon/hwmon<i>/temp4_crit
|
||||
Date: January 2026
|
||||
KernelVersion: 7.0
|
||||
Contact: intel-xe@lists.freedesktop.org
|
||||
Description: RO. Memory controller critical temperature in millidegree Celsius.
|
||||
|
||||
Only supported for particular Intel Xe graphics platforms.
|
||||
|
||||
What: /sys/bus/pci/drivers/xe/.../hwmon/hwmon<i>/temp4_emergency
|
||||
Date: January 2026
|
||||
KernelVersion: 7.0
|
||||
Contact: intel-xe@lists.freedesktop.org
|
||||
Description: RO. Memory controller shutdown temperature in millidegree Celsius.
|
||||
|
||||
Only supported for particular Intel Xe graphics platforms.
|
||||
|
||||
What: /sys/bus/pci/drivers/xe/.../hwmon/hwmon<i>/temp4_input
|
||||
Date: January 2026
|
||||
KernelVersion: 7.0
|
||||
Contact: intel-xe@lists.freedesktop.org
|
||||
Description: RO. Memory controller average temperature in millidegree Celsius.
|
||||
|
||||
Only supported for particular Intel Xe graphics platforms.
|
||||
|
||||
What: /sys/bus/pci/drivers/xe/.../hwmon/hwmon<i>/temp5_crit
|
||||
Date: January 2026
|
||||
KernelVersion: 7.0
|
||||
Contact: intel-xe@lists.freedesktop.org
|
||||
Description: RO. GPU PCIe critical temperature in millidegree Celsius.
|
||||
|
||||
Only supported for particular Intel Xe graphics platforms.
|
||||
|
||||
What: /sys/bus/pci/drivers/xe/.../hwmon/hwmon<i>/temp5_emergency
|
||||
Date: January 2026
|
||||
KernelVersion: 7.0
|
||||
Contact: intel-xe@lists.freedesktop.org
|
||||
Description: RO. GPU PCIe shutdown temperature in millidegree Celsius.
|
||||
|
||||
Only supported for particular Intel Xe graphics platforms.
|
||||
|
||||
What: /sys/bus/pci/drivers/xe/.../hwmon/hwmon<i>/temp5_input
|
||||
Date: January 2026
|
||||
KernelVersion: 7.0
|
||||
Contact: intel-xe@lists.freedesktop.org
|
||||
Description: RO. GPU PCIe temperature in millidegree Celsius.
|
||||
|
||||
What: /sys/bus/pci/drivers/xe/.../hwmon/hwmon<i>/temp[6-21]_crit
|
||||
Date: January 2026
|
||||
KernelVersion: 7.0
|
||||
Contact: intel-xe@lists.freedesktop.org
|
||||
Description: RO. VRAM channel critical temperature in millidegree Celsius.
|
||||
|
||||
Only supported for particular Intel Xe graphics platforms.
|
||||
|
||||
What: /sys/bus/pci/drivers/xe/.../hwmon/hwmon<i>/temp[6-21]_emergency
|
||||
Date: January 2026
|
||||
KernelVersion: 7.0
|
||||
Contact: intel-xe@lists.freedesktop.org
|
||||
Description: RO. VRAM channel shutdown temperature in millidegree Celsius.
|
||||
|
||||
Only supported for particular Intel Xe graphics platforms.
|
||||
|
||||
What: /sys/bus/pci/drivers/xe/.../hwmon/hwmon<i>/temp[6-21]_input
|
||||
Date: January 2026
|
||||
KernelVersion: 7.0
|
||||
Contact: intel-xe@lists.freedesktop.org
|
||||
Description: RO. VRAM channel temperature in millidegree Celsius.
|
||||
|
||||
Only supported for particular Intel Xe graphics platforms.
|
||||
|
||||
What: /sys/bus/pci/drivers/xe/.../hwmon/hwmon<i>/fan1_input
|
||||
Date: March 2025
|
||||
KernelVersion: 6.16
|
||||
|
|
|
|||
|
|
@ -119,7 +119,7 @@ Description:
|
|||
The GT preemption timeout (PT) in [us] to be applied to all functions.
|
||||
See sriov_admin/{pf,vf<N>}/profile/preempt_timeout_us for more details.
|
||||
|
||||
sched_priority: (RW/RO) string
|
||||
sched_priority: (WO) string
|
||||
The GT scheduling priority to be applied for all functions.
|
||||
See sriov_admin/{pf,vf<N>}/profile/sched_priority for more details.
|
||||
|
||||
|
|
|
|||
|
|
@ -1,24 +0,0 @@
|
|||
What: /sys/kernel/dmabuf/buffers
|
||||
Date: May 2021
|
||||
KernelVersion: v5.13
|
||||
Contact: Hridya Valsaraju <hridya@google.com>
|
||||
Description: The /sys/kernel/dmabuf/buffers directory contains a
|
||||
snapshot of the internal state of every DMA-BUF.
|
||||
/sys/kernel/dmabuf/buffers/<inode_number> will contain the
|
||||
statistics for the DMA-BUF with the unique inode number
|
||||
<inode_number>
|
||||
Users: kernel memory tuning/debugging tools
|
||||
|
||||
What: /sys/kernel/dmabuf/buffers/<inode_number>/exporter_name
|
||||
Date: May 2021
|
||||
KernelVersion: v5.13
|
||||
Contact: Hridya Valsaraju <hridya@google.com>
|
||||
Description: This file is read-only and contains the name of the exporter of
|
||||
the DMA-BUF.
|
||||
|
||||
What: /sys/kernel/dmabuf/buffers/<inode_number>/size
|
||||
Date: May 2021
|
||||
KernelVersion: v5.13
|
||||
Contact: Hridya Valsaraju <hridya@google.com>
|
||||
Description: This file is read-only and specifies the size of the DMA-BUF in
|
||||
bytes.
|
||||
|
|
@ -14,16 +14,21 @@ description: |
|
|||
RZ/G2L alike family of SoC's. The encoder can operate in DSI mode, with
|
||||
up to four data lanes.
|
||||
|
||||
allOf:
|
||||
- $ref: /schemas/display/dsi-controller.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
oneOf:
|
||||
- items:
|
||||
- enum:
|
||||
- renesas,r9a07g044-mipi-dsi # RZ/G2{L,LC}
|
||||
- renesas,r9a07g054-mipi-dsi # RZ/V2L
|
||||
- const: renesas,rzg2l-mipi-dsi
|
||||
|
||||
- items:
|
||||
- const: renesas,r9a09g056-mipi-dsi # RZ/V2N
|
||||
- const: renesas,r9a09g057-mipi-dsi
|
||||
|
||||
- enum:
|
||||
- renesas,r9a07g044-mipi-dsi # RZ/G2{L,LC}
|
||||
- renesas,r9a07g054-mipi-dsi # RZ/V2L
|
||||
- const: renesas,rzg2l-mipi-dsi
|
||||
- renesas,r9a09g057-mipi-dsi # RZ/V2H(P)
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
|
@ -49,34 +54,56 @@ properties:
|
|||
- const: debug
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: DSI D-PHY PLL multiplied clock
|
||||
- description: DSI D-PHY system clock
|
||||
- description: DSI AXI bus clock
|
||||
- description: DSI Register access clock
|
||||
- description: DSI Video clock
|
||||
- description: DSI D-PHY Escape mode transmit clock
|
||||
oneOf:
|
||||
- items:
|
||||
- description: DSI D-PHY PLL multiplied clock
|
||||
- description: DSI D-PHY system clock
|
||||
- description: DSI AXI bus clock
|
||||
- description: DSI Register access clock
|
||||
- description: DSI Video clock
|
||||
- description: DSI D-PHY Escape mode transmit clock
|
||||
- items:
|
||||
- description: DSI D-PHY PLL reference clock
|
||||
- description: DSI AXI bus clock
|
||||
- description: DSI Register access clock
|
||||
- description: DSI Video clock
|
||||
- description: DSI D-PHY Escape mode transmit clock
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: pllclk
|
||||
- const: sysclk
|
||||
- const: aclk
|
||||
- const: pclk
|
||||
- const: vclk
|
||||
- const: lpclk
|
||||
oneOf:
|
||||
- items:
|
||||
- const: pllclk
|
||||
- const: sysclk
|
||||
- const: aclk
|
||||
- const: pclk
|
||||
- const: vclk
|
||||
- const: lpclk
|
||||
- items:
|
||||
- const: pllrefclk
|
||||
- const: aclk
|
||||
- const: pclk
|
||||
- const: vclk
|
||||
- const: lpclk
|
||||
|
||||
resets:
|
||||
items:
|
||||
- description: MIPI_DSI_CMN_RSTB
|
||||
- description: MIPI_DSI_ARESET_N
|
||||
- description: MIPI_DSI_PRESET_N
|
||||
oneOf:
|
||||
- items:
|
||||
- description: MIPI_DSI_CMN_RSTB
|
||||
- description: MIPI_DSI_ARESET_N
|
||||
- description: MIPI_DSI_PRESET_N
|
||||
- items:
|
||||
- description: MIPI_DSI_ARESET_N
|
||||
- description: MIPI_DSI_PRESET_N
|
||||
|
||||
reset-names:
|
||||
items:
|
||||
- const: rst
|
||||
- const: arst
|
||||
- const: prst
|
||||
oneOf:
|
||||
- items:
|
||||
- const: rst
|
||||
- const: arst
|
||||
- const: prst
|
||||
- items:
|
||||
- const: arst
|
||||
- const: prst
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
|
@ -130,6 +157,41 @@ required:
|
|||
|
||||
unevaluatedProperties: false
|
||||
|
||||
allOf:
|
||||
- $ref: ../dsi-controller.yaml#
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: renesas,r9a09g057-mipi-dsi
|
||||
then:
|
||||
properties:
|
||||
clocks:
|
||||
maxItems: 5
|
||||
|
||||
clock-names:
|
||||
maxItems: 5
|
||||
|
||||
resets:
|
||||
maxItems: 2
|
||||
|
||||
reset-names:
|
||||
maxItems: 2
|
||||
else:
|
||||
properties:
|
||||
clocks:
|
||||
minItems: 6
|
||||
|
||||
clock-names:
|
||||
minItems: 6
|
||||
|
||||
resets:
|
||||
minItems: 3
|
||||
|
||||
reset-names:
|
||||
minItems: 3
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/r9a07g044-cpg.h>
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@ properties:
|
|||
- const: adi,adv7123
|
||||
- enum:
|
||||
- adi,adv7123
|
||||
- algoltek,ag6311
|
||||
- asl-tek,cs5263
|
||||
- dumb-vga-dac
|
||||
- parade,ps185hdm
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@ properties:
|
|||
- items:
|
||||
- enum:
|
||||
- qcom,apq8064-dsi-ctrl
|
||||
- qcom,kaanapali-dsi-ctrl
|
||||
- qcom,msm8226-dsi-ctrl
|
||||
- qcom,msm8916-dsi-ctrl
|
||||
- qcom,msm8953-dsi-ctrl
|
||||
|
|
@ -45,6 +46,11 @@ properties:
|
|||
- qcom,sm8650-dsi-ctrl
|
||||
- qcom,sm8750-dsi-ctrl
|
||||
- const: qcom,mdss-dsi-ctrl
|
||||
- items:
|
||||
- enum:
|
||||
- qcom,qcs8300-dsi-ctrl
|
||||
- const: qcom,sa8775p-dsi-ctrl
|
||||
- const: qcom,mdss-dsi-ctrl
|
||||
- enum:
|
||||
- qcom,dsi-ctrl-6g-qcm2290
|
||||
- qcom,mdss-dsi-ctrl # This should always come with an SoC-specific compatible
|
||||
|
|
@ -369,6 +375,7 @@ allOf:
|
|||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- qcom,kaanapali-dsi-ctrl
|
||||
- qcom,sm8750-dsi-ctrl
|
||||
then:
|
||||
properties:
|
||||
|
|
|
|||
|
|
@ -14,18 +14,25 @@ allOf:
|
|||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- qcom,dsi-phy-7nm
|
||||
- qcom,dsi-phy-7nm-8150
|
||||
- qcom,sa8775p-dsi-phy-5nm
|
||||
- qcom,sar2130p-dsi-phy-5nm
|
||||
- qcom,sc7280-dsi-phy-7nm
|
||||
- qcom,sm6375-dsi-phy-7nm
|
||||
- qcom,sm8350-dsi-phy-5nm
|
||||
- qcom,sm8450-dsi-phy-5nm
|
||||
- qcom,sm8550-dsi-phy-4nm
|
||||
- qcom,sm8650-dsi-phy-4nm
|
||||
- qcom,sm8750-dsi-phy-3nm
|
||||
oneOf:
|
||||
- items:
|
||||
- enum:
|
||||
- qcom,dsi-phy-7nm
|
||||
- qcom,dsi-phy-7nm-8150
|
||||
- qcom,kaanapali-dsi-phy-3nm
|
||||
- qcom,sa8775p-dsi-phy-5nm
|
||||
- qcom,sar2130p-dsi-phy-5nm
|
||||
- qcom,sc7280-dsi-phy-7nm
|
||||
- qcom,sm6375-dsi-phy-7nm
|
||||
- qcom,sm8350-dsi-phy-5nm
|
||||
- qcom,sm8450-dsi-phy-5nm
|
||||
- qcom,sm8550-dsi-phy-4nm
|
||||
- qcom,sm8650-dsi-phy-4nm
|
||||
- qcom,sm8750-dsi-phy-3nm
|
||||
- items:
|
||||
- enum:
|
||||
- qcom,qcs8300-dsi-phy-5nm
|
||||
- const: qcom,sa8775p-dsi-phy-5nm
|
||||
|
||||
reg:
|
||||
items:
|
||||
|
|
|
|||
|
|
@ -45,11 +45,11 @@ properties:
|
|||
- const: amd,imageon
|
||||
|
||||
clocks:
|
||||
minItems: 2
|
||||
minItems: 1
|
||||
maxItems: 7
|
||||
|
||||
clock-names:
|
||||
minItems: 2
|
||||
minItems: 1
|
||||
maxItems: 7
|
||||
|
||||
reg:
|
||||
|
|
@ -378,35 +378,74 @@ allOf:
|
|||
- const: xo
|
||||
description: GPUCC clocksource clock
|
||||
|
||||
required:
|
||||
- clocks
|
||||
- clock-names
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: qcom,adreno-612.0
|
||||
then:
|
||||
properties:
|
||||
clocks:
|
||||
items:
|
||||
- description: GPU Core clock
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: core
|
||||
|
||||
reg:
|
||||
minItems: 3
|
||||
maxItems: 3
|
||||
|
||||
reg-names:
|
||||
minItems: 1
|
||||
items:
|
||||
- const: kgsl_3d0_reg_memory
|
||||
- const: cx_mem
|
||||
- const: cx_dbgc
|
||||
|
||||
required:
|
||||
- clocks
|
||||
- clock-names
|
||||
else:
|
||||
if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
oneOf:
|
||||
- pattern: '^qcom,adreno-[67][0-9][0-9]\.[0-9]+$'
|
||||
- pattern: '^qcom,adreno-[0-9a-f]{8}$'
|
||||
|
||||
then: # Starting with A6xx, the clocks are usually defined in the GMU node
|
||||
properties:
|
||||
clocks: false
|
||||
clock-names: false
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- qcom,adreno-615.0
|
||||
- qcom,adreno-618.0
|
||||
- qcom,adreno-619.0
|
||||
- qcom,adreno-621.0
|
||||
- qcom,adreno-623.0
|
||||
- qcom,adreno-630.2
|
||||
- qcom,adreno-635.0
|
||||
- qcom,adreno-640.1
|
||||
- qcom,adreno-650.2
|
||||
- qcom,adreno-660.1
|
||||
- qcom,adreno-663.0
|
||||
- qcom,adreno-680.1
|
||||
- qcom,adreno-690.0
|
||||
- qcom,adreno-730.1
|
||||
- qcom,adreno-43030c00
|
||||
- qcom,adreno-43050a01
|
||||
- qcom,adreno-43050c01
|
||||
- qcom,adreno-43051401
|
||||
|
||||
reg-names:
|
||||
minItems: 1
|
||||
items:
|
||||
- const: kgsl_3d0_reg_memory
|
||||
- const: cx_mem
|
||||
- const: cx_dbgc
|
||||
then: # Starting with A6xx, the clocks are usually defined in the GMU node
|
||||
properties:
|
||||
clocks: false
|
||||
clock-names: false
|
||||
|
||||
reg-names:
|
||||
minItems: 1
|
||||
items:
|
||||
- const: kgsl_3d0_reg_memory
|
||||
- const: cx_mem
|
||||
- const: cx_dbgc
|
||||
|
||||
examples:
|
||||
- |
|
||||
|
|
|
|||
|
|
@ -0,0 +1,126 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||
# Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
|
||||
%YAML 1.2
|
||||
---
|
||||
|
||||
$id: http://devicetree.org/schemas/display/msm/qcom,adreno-rgmu.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: RGMU attached to certain Adreno GPUs
|
||||
|
||||
maintainers:
|
||||
- Rob Clark <robin.clark@oss.qualcomm.com>
|
||||
|
||||
description:
|
||||
RGMU (Reduced Graphics Management Unit) IP is present in some GPUs that
|
||||
belong to Adreno A6xx family. It is a small state machine that helps to
|
||||
toggle the GX GDSC (connected to CX rail) to implement IFPC feature and save
|
||||
power.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
- const: qcom,adreno-rgmu-612.0
|
||||
- const: qcom,adreno-rgmu
|
||||
|
||||
reg:
|
||||
items:
|
||||
- description: Core RGMU registers
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: GMU clock
|
||||
- description: GPU CX clock
|
||||
- description: GPU AXI clock
|
||||
- description: GPU MEMNOC clock
|
||||
- description: GPU SMMU vote clock
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: gmu
|
||||
- const: cxo
|
||||
- const: axi
|
||||
- const: memnoc
|
||||
- const: smmu_vote
|
||||
|
||||
power-domains:
|
||||
items:
|
||||
- description: CX GDSC power domain
|
||||
- description: GX GDSC power domain
|
||||
|
||||
power-domain-names:
|
||||
items:
|
||||
- const: cx
|
||||
- const: gx
|
||||
|
||||
interrupts:
|
||||
items:
|
||||
- description: GMU OOB interrupt
|
||||
- description: GMU interrupt
|
||||
|
||||
interrupt-names:
|
||||
items:
|
||||
- const: oob
|
||||
- const: gmu
|
||||
|
||||
operating-points-v2: true
|
||||
opp-table:
|
||||
type: object
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
- clock-names
|
||||
- power-domains
|
||||
- power-domain-names
|
||||
- interrupts
|
||||
- interrupt-names
|
||||
- operating-points-v2
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/qcom,qcs615-gpucc.h>
|
||||
#include <dt-bindings/clock/qcom,qcs615-gcc.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/power/qcom,rpmhpd.h>
|
||||
|
||||
gmu@506a000 {
|
||||
compatible = "qcom,adreno-rgmu-612.0", "qcom,adreno-rgmu";
|
||||
|
||||
reg = <0x05000000 0x90000>;
|
||||
|
||||
clocks = <&gpucc GPU_CC_CX_GMU_CLK>,
|
||||
<&gpucc GPU_CC_CXO_CLK>,
|
||||
<&gcc GCC_DDRSS_GPU_AXI_CLK>,
|
||||
<&gcc GCC_GPU_MEMNOC_GFX_CLK>,
|
||||
<&gpucc GPU_CC_HLOS1_VOTE_GPU_SMMU_CLK>;
|
||||
clock-names = "gmu",
|
||||
"cxo",
|
||||
"axi",
|
||||
"memnoc",
|
||||
"smmu_vote";
|
||||
|
||||
power-domains = <&gpucc CX_GDSC>,
|
||||
<&gpucc GX_GDSC>;
|
||||
power-domain-names = "cx",
|
||||
"gx";
|
||||
|
||||
interrupts = <GIC_SPI 304 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 305 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "oob",
|
||||
"gmu";
|
||||
|
||||
operating-points-v2 = <&gmu_opp_table>;
|
||||
|
||||
gmu_opp_table: opp-table {
|
||||
compatible = "operating-points-v2";
|
||||
|
||||
opp-200000000 {
|
||||
opp-hz = /bits/ 64 <200000000>;
|
||||
required-opps = <&rpmhpd_opp_low_svs>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
@ -0,0 +1,297 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/display/msm/qcom,kaanapali-mdss.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Qualcomm Kaanapali Display MDSS
|
||||
|
||||
maintainers:
|
||||
- Yongxing Mou <yongxing.mou@oss.qualcomm.com>
|
||||
- Yuanjie Yang <yuanjie.yang@oss.qualcomm.com>
|
||||
|
||||
description:
|
||||
Kaanapali MSM Mobile Display Subsystem(MDSS), which encapsulates sub-blocks
|
||||
like DPU display controller, DSI and DP interfaces etc.
|
||||
|
||||
$ref: /schemas/display/msm/mdss-common.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: qcom,kaanapali-mdss
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: Display AHB
|
||||
- description: Display hf AXI
|
||||
- description: Display core
|
||||
- description: Display AHB SWI
|
||||
|
||||
iommus:
|
||||
maxItems: 1
|
||||
|
||||
interconnects:
|
||||
items:
|
||||
- description: Interconnect path from mdp0 port to the data bus
|
||||
- description: Interconnect path from CPU to the reg bus
|
||||
|
||||
interconnect-names:
|
||||
items:
|
||||
- const: mdp0-mem
|
||||
- const: cpu-cfg
|
||||
|
||||
patternProperties:
|
||||
"^display-controller@[0-9a-f]+$":
|
||||
type: object
|
||||
additionalProperties: true
|
||||
properties:
|
||||
compatible:
|
||||
const: qcom,kaanapali-dpu
|
||||
|
||||
"^dsi@[0-9a-f]+$":
|
||||
type: object
|
||||
additionalProperties: true
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: qcom,kaanapali-dsi-ctrl
|
||||
|
||||
"^phy@[0-9a-f]+$":
|
||||
type: object
|
||||
additionalProperties: true
|
||||
properties:
|
||||
compatible:
|
||||
const: qcom,kaanapali-dsi-phy-3nm
|
||||
|
||||
required:
|
||||
- compatible
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/qcom,rpmh.h>
|
||||
#include <dt-bindings/interconnect/qcom,icc.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/phy/phy-qcom-qmp.h>
|
||||
#include <dt-bindings/power/qcom,rpmhpd.h>
|
||||
|
||||
display-subsystem@9800000 {
|
||||
compatible = "qcom,kaanapali-mdss";
|
||||
reg = <0x09800000 0x1000>;
|
||||
reg-names = "mdss";
|
||||
|
||||
interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
|
||||
|
||||
clocks = <&disp_cc_mdss_ahb_clk>,
|
||||
<&gcc_disp_hf_axi_clk>,
|
||||
<&disp_cc_mdss_mdp_clk>,
|
||||
<&disp_cc_mdss_ahb_swi_clk>;
|
||||
resets = <&disp_cc_mdss_core_bcr>;
|
||||
|
||||
power-domains = <&mdss_gdsc>;
|
||||
|
||||
iommus = <&apps_smmu 0x800 0x2>;
|
||||
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <1>;
|
||||
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges;
|
||||
|
||||
display-controller@9801000 {
|
||||
compatible = "qcom,kaanapali-dpu";
|
||||
reg = <0x09801000 0x1c8000>,
|
||||
<0x09b16000 0x3000>;
|
||||
reg-names = "mdp",
|
||||
"vbif";
|
||||
|
||||
interrupts-extended = <&mdss 0>;
|
||||
|
||||
clocks = <&gcc_disp_hf_axi_clk>,
|
||||
<&disp_cc_mdss_ahb_clk>,
|
||||
<&disp_cc_mdss_mdp_lut_clk>,
|
||||
<&disp_cc_mdss_mdp_clk>,
|
||||
<&disp_cc_mdss_vsync_clk>;
|
||||
clock-names = "nrt_bus",
|
||||
"iface",
|
||||
"lut",
|
||||
"core",
|
||||
"vsync";
|
||||
|
||||
assigned-clocks = <&disp_cc_mdss_vsync_clk>;
|
||||
assigned-clock-rates = <19200000>;
|
||||
|
||||
operating-points-v2 = <&mdp_opp_table>;
|
||||
|
||||
power-domains = <&rpmhpd RPMHPD_MMCX>;
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
|
||||
dpu_intf1_out: endpoint {
|
||||
remote-endpoint = <&mdss_dsi0_in>;
|
||||
};
|
||||
};
|
||||
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
|
||||
dpu_intf2_out: endpoint {
|
||||
remote-endpoint = <&mdss_dsi1_in>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
mdp_opp_table: opp-table {
|
||||
compatible = "operating-points-v2";
|
||||
|
||||
opp-156000000 {
|
||||
opp-hz = /bits/ 64 <156000000>;
|
||||
required-opps = <&rpmhpd_opp_low_svs_d1>;
|
||||
};
|
||||
|
||||
opp-207000000 {
|
||||
opp-hz = /bits/ 64 <207000000>;
|
||||
required-opps = <&rpmhpd_opp_low_svs>;
|
||||
};
|
||||
|
||||
opp-337000000 {
|
||||
opp-hz = /bits/ 64 <337000000>;
|
||||
required-opps = <&rpmhpd_opp_svs>;
|
||||
};
|
||||
|
||||
opp-417000000 {
|
||||
opp-hz = /bits/ 64 <417000000>;
|
||||
required-opps = <&rpmhpd_opp_svs_l1>;
|
||||
};
|
||||
|
||||
opp-532000000 {
|
||||
opp-hz = /bits/ 64 <532000000>;
|
||||
required-opps = <&rpmhpd_opp_nom>;
|
||||
};
|
||||
|
||||
opp-600000000 {
|
||||
opp-hz = /bits/ 64 <600000000>;
|
||||
required-opps = <&rpmhpd_opp_nom_l1>;
|
||||
};
|
||||
|
||||
opp-650000000 {
|
||||
opp-hz = /bits/ 64 <650000000>;
|
||||
required-opps = <&rpmhpd_opp_turbo>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
dsi@9ac0000 {
|
||||
compatible = "qcom,kaanapali-dsi-ctrl", "qcom,mdss-dsi-ctrl";
|
||||
reg = <0x09ac0000 0x1000>;
|
||||
reg-names = "dsi_ctrl";
|
||||
|
||||
interrupts-extended = <&mdss 4>;
|
||||
|
||||
clocks = <&disp_cc_mdss_byte0_clk>,
|
||||
<&disp_cc_mdss_byte0_intf_clk>,
|
||||
<&disp_cc_mdss_pclk0_clk>,
|
||||
<&disp_cc_mdss_esc0_clk>,
|
||||
<&disp_cc_mdss_ahb_clk>,
|
||||
<&gcc_disp_hf_axi_clk>,
|
||||
<&mdss_dsi0_phy 1>,
|
||||
<&mdss_dsi0_phy 0>,
|
||||
<&disp_cc_esync0_clk>,
|
||||
<&disp_cc_osc_clk>,
|
||||
<&disp_cc_mdss_byte0_clk_src>,
|
||||
<&disp_cc_mdss_pclk0_clk_src>;
|
||||
clock-names = "byte",
|
||||
"byte_intf",
|
||||
"pixel",
|
||||
"core",
|
||||
"iface",
|
||||
"bus",
|
||||
"dsi_pll_pixel",
|
||||
"dsi_pll_byte",
|
||||
"esync",
|
||||
"osc",
|
||||
"byte_src",
|
||||
"pixel_src";
|
||||
|
||||
operating-points-v2 = <&mdss_dsi_opp_table>;
|
||||
|
||||
power-domains = <&rpmhpd RPMHPD_MMCX>;
|
||||
|
||||
phys = <&mdss_dsi0_phy>;
|
||||
phy-names = "dsi";
|
||||
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
|
||||
mdss_dsi0_in: endpoint {
|
||||
remote-endpoint = <&dpu_intf1_out>;
|
||||
};
|
||||
};
|
||||
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
|
||||
mdss_dsi0_out: endpoint {
|
||||
remote-endpoint = <&panel0_in>;
|
||||
data-lanes = <0 1 2 3>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
mdss_dsi_opp_table: opp-table {
|
||||
compatible = "operating-points-v2";
|
||||
|
||||
opp-187500000 {
|
||||
opp-hz = /bits/ 64 <187500000>;
|
||||
required-opps = <&rpmhpd_opp_low_svs_d1>;
|
||||
};
|
||||
|
||||
opp-250000000 {
|
||||
opp-hz = /bits/ 64 <250000000>;
|
||||
required-opps = <&rpmhpd_opp_low_svs>;
|
||||
};
|
||||
|
||||
opp-312500000 {
|
||||
opp-hz = /bits/ 64 <312500000>;
|
||||
required-opps = <&rpmhpd_opp_svs>;
|
||||
};
|
||||
|
||||
opp-358000000 {
|
||||
opp-hz = /bits/ 64 <358000000>;
|
||||
required-opps = <&rpmhpd_opp_svs_l1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
mdss_dsi0_phy: phy@9ac1000 {
|
||||
compatible = "qcom,kaanapali-dsi-phy-3nm";
|
||||
reg = <0x09ac1000 0x1cc>,
|
||||
<0x09ac1200 0x80>,
|
||||
<0x09ac1500 0x400>;
|
||||
reg-names = "dsi_phy",
|
||||
"dsi_phy_lane",
|
||||
"dsi_pll";
|
||||
|
||||
clocks = <&disp_cc_mdss_ahb_clk>,
|
||||
<&rpmhcc RPMH_CXO_CLK>;
|
||||
clock-names = "iface",
|
||||
"ref";
|
||||
|
||||
#clock-cells = <1>;
|
||||
#phy-cells = <0>;
|
||||
};
|
||||
};
|
||||
|
|
@ -53,13 +53,23 @@ patternProperties:
|
|||
contains:
|
||||
const: qcom,qcs8300-dp
|
||||
|
||||
"^dsi@[0-9a-f]+$":
|
||||
type: object
|
||||
additionalProperties: true
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: qcom,qcs8300-dsi-ctrl
|
||||
|
||||
"^phy@[0-9a-f]+$":
|
||||
type: object
|
||||
additionalProperties: true
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: qcom,qcs8300-edp-phy
|
||||
enum:
|
||||
- qcom,qcs8300-dsi-phy-5nm
|
||||
- qcom,qcs8300-edp-phy
|
||||
|
||||
required:
|
||||
- compatible
|
||||
|
|
@ -71,6 +81,7 @@ examples:
|
|||
#include <dt-bindings/interconnect/qcom,icc.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/clock/qcom,qcs8300-gcc.h>
|
||||
#include <dt-bindings/clock/qcom,rpmh.h>
|
||||
#include <dt-bindings/clock/qcom,sa8775p-dispcc.h>
|
||||
#include <dt-bindings/interconnect/qcom,qcs8300-rpmh.h>
|
||||
#include <dt-bindings/power/qcom,rpmhpd.h>
|
||||
|
|
@ -142,6 +153,13 @@ examples:
|
|||
remote-endpoint = <&mdss_dp0_in>;
|
||||
};
|
||||
};
|
||||
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
dpu_intf1_out: endpoint {
|
||||
remote-endpoint = <&mdss_dsi0_in>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
mdp_opp_table: opp-table {
|
||||
|
|
@ -169,6 +187,88 @@ examples:
|
|||
};
|
||||
};
|
||||
|
||||
dsi@ae94000 {
|
||||
compatible = "qcom,qcs8300-dsi-ctrl",
|
||||
"qcom,sa8775p-dsi-ctrl",
|
||||
"qcom,mdss-dsi-ctrl";
|
||||
reg = <0x0ae94000 0x400>;
|
||||
reg-names = "dsi_ctrl";
|
||||
|
||||
interrupt-parent = <&mdss>;
|
||||
interrupts = <4>;
|
||||
|
||||
clocks = <&dispcc MDSS_DISP_CC_MDSS_BYTE0_CLK>,
|
||||
<&dispcc MDSS_DISP_CC_MDSS_BYTE0_INTF_CLK>,
|
||||
<&dispcc MDSS_DISP_CC_MDSS_PCLK0_CLK>,
|
||||
<&dispcc MDSS_DISP_CC_MDSS_ESC0_CLK>,
|
||||
<&dispcc MDSS_DISP_CC_MDSS_AHB_CLK>,
|
||||
<&gcc GCC_DISP_HF_AXI_CLK>;
|
||||
clock-names = "byte",
|
||||
"byte_intf",
|
||||
"pixel",
|
||||
"core",
|
||||
"iface",
|
||||
"bus";
|
||||
assigned-clocks = <&dispcc MDSS_DISP_CC_MDSS_BYTE0_CLK_SRC>,
|
||||
<&dispcc MDSS_DISP_CC_MDSS_PCLK0_CLK_SRC>;
|
||||
assigned-clock-parents = <&mdss_dsi0_phy 0>, <&mdss_dsi0_phy 1>;
|
||||
phys = <&mdss_dsi0_phy>;
|
||||
|
||||
operating-points-v2 = <&dsi0_opp_table>;
|
||||
power-domains = <&rpmhpd RPMHPD_MMCX>;
|
||||
|
||||
vdda-supply = <&vreg_l5a>;
|
||||
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
mdss0_dsi0_in: endpoint {
|
||||
remote-endpoint = <&dpu_intf1_out>;
|
||||
};
|
||||
};
|
||||
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
mdss0_dsi0_out: endpoint { };
|
||||
};
|
||||
};
|
||||
|
||||
dsi0_opp_table: opp-table {
|
||||
compatible = "operating-points-v2";
|
||||
|
||||
opp-358000000 {
|
||||
opp-hz = /bits/ 64 <358000000>;
|
||||
required-opps = <&rpmhpd_opp_svs_l1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
mdss_dsi0_phy: phy@ae94400 {
|
||||
compatible = "qcom,qcs8300-dsi-phy-5nm",
|
||||
"qcom,sa8775p-dsi-phy-5nm";
|
||||
reg = <0x0ae94400 0x200>,
|
||||
<0x0ae94600 0x280>,
|
||||
<0x0ae94900 0x27c>;
|
||||
reg-names = "dsi_phy",
|
||||
"dsi_phy_lane",
|
||||
"dsi_pll";
|
||||
|
||||
#clock-cells = <1>;
|
||||
#phy-cells = <0>;
|
||||
|
||||
clocks = <&dispcc MDSS_DISP_CC_MDSS_AHB_CLK>,
|
||||
<&rpmhcc RPMH_CXO_CLK>;
|
||||
clock-names = "iface", "ref";
|
||||
|
||||
vdds-supply = <&vreg_l4a>;
|
||||
};
|
||||
|
||||
mdss_dp0_phy: phy@aec2a00 {
|
||||
compatible = "qcom,qcs8300-edp-phy", "qcom,sa8775p-edp-phy";
|
||||
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ properties:
|
|||
oneOf:
|
||||
- enum:
|
||||
- qcom,glymur-dpu
|
||||
- qcom,kaanapali-dpu
|
||||
- qcom,sa8775p-dpu
|
||||
- qcom,sm8650-dpu
|
||||
- qcom,sm8750-dpu
|
||||
|
|
|
|||
|
|
@ -16,6 +16,8 @@ properties:
|
|||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
- anbernic,rg-ds-display-bottom
|
||||
- anbernic,rg-ds-display-top
|
||||
- chongzhou,cz101b4001
|
||||
- kingdisplay,kd101ne3-40ti
|
||||
- melfas,lmfbx101117480
|
||||
|
|
|
|||
|
|
@ -4,14 +4,16 @@
|
|||
$id: http://devicetree.org/schemas/display/panel/lg,sw43408.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: LG SW43408 1080x2160 DSI panel
|
||||
title: LG SW43408 AMOLED DDIC
|
||||
|
||||
maintainers:
|
||||
- Casey Connolly <casey.connolly@linaro.org>
|
||||
|
||||
description:
|
||||
This panel is used on the Pixel 3, it is a 60hz OLED panel which
|
||||
required DSC (Display Stream Compression) and has rounded corners.
|
||||
The SW43408 is display driver IC with connected panel.
|
||||
|
||||
LG LH546WF1-ED01 panel is used on the Pixel 3, it is a 60hz OLED panel
|
||||
which required DSC (Display Stream Compression) and has rounded corners.
|
||||
|
||||
allOf:
|
||||
- $ref: panel-common.yaml#
|
||||
|
|
@ -19,6 +21,9 @@ allOf:
|
|||
properties:
|
||||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
# LG 5.46 inch, 1080x2160 pixels, 18:9 ratio
|
||||
- lg,sw43408-lh546wf1-ed01
|
||||
- const: lg,sw43408
|
||||
|
||||
reg:
|
||||
|
|
@ -46,7 +51,7 @@ examples:
|
|||
#size-cells = <0>;
|
||||
|
||||
panel@0 {
|
||||
compatible = "lg,sw43408";
|
||||
compatible = "lg,sw43408-lh546wf1-ed01", "lg,sw43408";
|
||||
reg = <0>;
|
||||
|
||||
vddi-supply = <&vreg_l14a_1p88>;
|
||||
|
|
|
|||
|
|
@ -55,6 +55,8 @@ properties:
|
|||
- panasonic,vvx10f004b00
|
||||
# Panasonic 10" WUXGA TFT LCD panel
|
||||
- panasonic,vvx10f034n00
|
||||
# Samsung ltl106hl02 10.6" Full HD TFT LCD panel
|
||||
- samsung,ltl106hl02-001
|
||||
# Samsung s6e3fa7 1080x2220 based AMS559NK06 AMOLED panel
|
||||
- samsung,s6e3fa7-ams559nk06
|
||||
# Shangai Top Display Optoelectronics 7" TL070WSH30 1024x600 TFT LCD panel
|
||||
|
|
|
|||
|
|
@ -154,6 +154,8 @@ properties:
|
|||
- hannstar,hsd070pww1
|
||||
# HannStar Display Corp. HSD100PXN1 10.1" XGA LVDS panel
|
||||
- hannstar,hsd100pxn1
|
||||
# HannStar Display Corp. HSD156JUW2 15.6" FHD (1920x1080) TFT LCD panel
|
||||
- hannstar,hsd156juw2
|
||||
# Hitachi Ltd. Corporation 9" WVGA (800x480) TFT LCD panel
|
||||
- hit,tx23d38vm0caa
|
||||
# Innolux AT043TN24 4.3" WQVGA TFT LCD panel
|
||||
|
|
@ -176,6 +178,8 @@ properties:
|
|||
- innolux,g121x1-l03
|
||||
# Innolux Corporation 12.1" G121XCE-L01 XGA (1024x768) TFT LCD panel
|
||||
- innolux,g121xce-l01
|
||||
# InnoLux 15.0" G150XGE-L05 XGA (1024x768) TFT LCD panel
|
||||
- innolux,g150xge-l05
|
||||
# InnoLux 15.6" FHD (1920x1080) TFT LCD panel
|
||||
- innolux,g156hce-l01
|
||||
# InnoLux 13.3" FHD (1920x1080) TFT LCD panel
|
||||
|
|
@ -347,7 +351,9 @@ if:
|
|||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: innolux,g101ice-l01
|
||||
enum:
|
||||
- innolux,g101ice-l01
|
||||
- yes-optoelectronics,ytc700tlag-05-201c
|
||||
then:
|
||||
properties:
|
||||
data-mapping: false
|
||||
|
|
|
|||
|
|
@ -6,11 +6,11 @@ $schema: http://devicetree.org/meta-schemas/core.yaml#
|
|||
|
||||
title: Samsung S6E3FC2X01 AMOLED DDIC
|
||||
|
||||
description: The S6E3FC2X01 is display driver IC with connected panel.
|
||||
|
||||
maintainers:
|
||||
- David Heidelberg <david@ixit.cz>
|
||||
|
||||
description: The S6E3FC2X01 is display driver IC with connected panel.
|
||||
|
||||
allOf:
|
||||
- $ref: panel-common.yaml#
|
||||
|
||||
|
|
@ -25,25 +25,21 @@ properties:
|
|||
reg:
|
||||
maxItems: 1
|
||||
|
||||
reset-gpios: true
|
||||
|
||||
port: true
|
||||
|
||||
vddio-supply:
|
||||
description: VDD regulator
|
||||
poc-supply:
|
||||
description: POC regulator
|
||||
|
||||
vci-supply:
|
||||
description: VCI regulator
|
||||
|
||||
poc-supply:
|
||||
description: POC regulator
|
||||
vddio-supply:
|
||||
description: VDD regulator
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reset-gpios
|
||||
- vddio-supply
|
||||
- vci-supply
|
||||
- poc-supply
|
||||
- vci-supply
|
||||
- vddio-supply
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@ properties:
|
|||
- rockchip,rk3228-dw-hdmi
|
||||
- rockchip,rk3288-dw-hdmi
|
||||
- rockchip,rk3328-dw-hdmi
|
||||
- rockchip,rk3368-dw-hdmi
|
||||
- rockchip,rk3399-dw-hdmi
|
||||
- rockchip,rk3568-dw-hdmi
|
||||
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ properties:
|
|||
- rockchip,rk3288-mipi-dsi
|
||||
- rockchip,rk3368-mipi-dsi
|
||||
- rockchip,rk3399-mipi-dsi
|
||||
- rockchip,rk3506-mipi-dsi
|
||||
- rockchip,rk3568-mipi-dsi
|
||||
- rockchip,rv1126-mipi-dsi
|
||||
- const: snps,dw-mipi-dsi
|
||||
|
|
@ -75,6 +76,7 @@ allOf:
|
|||
- rockchip,px30-mipi-dsi
|
||||
- rockchip,rk3128-mipi-dsi
|
||||
- rockchip,rk3368-mipi-dsi
|
||||
- rockchip,rk3506-mipi-dsi
|
||||
- rockchip,rk3568-mipi-dsi
|
||||
- rockchip,rv1126-mipi-dsi
|
||||
|
||||
|
|
|
|||
|
|
@ -69,6 +69,12 @@ properties:
|
|||
- const: main
|
||||
- const: hpd
|
||||
|
||||
no-hpd:
|
||||
type: boolean
|
||||
description:
|
||||
The HPD pin is not present or used for another purpose, and the EDID
|
||||
must be polled instead to determine if a device is attached.
|
||||
|
||||
phys:
|
||||
maxItems: 1
|
||||
description: The HDMI/eDP PHY
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@ properties:
|
|||
- rockchip,rk3368-vop
|
||||
- rockchip,rk3399-vop-big
|
||||
- rockchip,rk3399-vop-lit
|
||||
- rockchip,rk3506-vop
|
||||
- rockchip,rv1126-vop
|
||||
|
||||
reg:
|
||||
|
|
|
|||
|
|
@ -76,3 +76,28 @@ examples:
|
|||
};
|
||||
};
|
||||
};
|
||||
|
||||
spi {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
display@0 {
|
||||
compatible = "sitronix,st7571";
|
||||
reg = <0>;
|
||||
reset-gpios = <&gpio0 3 GPIO_ACTIVE_LOW>;
|
||||
width-mm = <37>;
|
||||
height-mm = <27>;
|
||||
|
||||
panel-timing {
|
||||
hactive = <128>;
|
||||
vactive = <96>;
|
||||
hback-porch = <0>;
|
||||
vback-porch = <0>;
|
||||
clock-frequency = <0>;
|
||||
hfront-porch = <0>;
|
||||
hsync-len = <0>;
|
||||
vfront-porch = <0>;
|
||||
vsync-len = <0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
|||
|
|
@ -0,0 +1,58 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/display/sitronix,st7920.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Sitronix ST7920 LCD Display Controllers
|
||||
|
||||
maintainers:
|
||||
- Iker Pedrosa <ikerpedrosam@gmail.com>
|
||||
|
||||
description:
|
||||
The Sitronix ST7920 is a controller for monochrome dot-matrix graphical LCDs,
|
||||
most commonly used for 128x64 pixel displays.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: sitronix,st7920
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
vdd-supply:
|
||||
description: Regulator that provides 5V Vdd power supply
|
||||
|
||||
reset-gpios:
|
||||
maxItems: 1
|
||||
|
||||
spi-max-frequency:
|
||||
maximum: 600000
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- spi-max-frequency
|
||||
|
||||
allOf:
|
||||
- $ref: /schemas/spi/spi-peripheral-props.yaml#
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
|
||||
spi {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
display@0 {
|
||||
compatible = "sitronix,st7920";
|
||||
reg = <0>;
|
||||
vdd-supply = <®_5v>;
|
||||
reset-gpios = <&gpio 25 GPIO_ACTIVE_LOW>;
|
||||
spi-max-frequency = <600000>;
|
||||
spi-cs-high;
|
||||
};
|
||||
};
|
||||
|
|
@ -51,6 +51,14 @@ properties:
|
|||
- stacks
|
||||
- const: stacks
|
||||
|
||||
nvmem-cells:
|
||||
items:
|
||||
- description: bitmask of functional shader cores
|
||||
|
||||
nvmem-cell-names:
|
||||
items:
|
||||
- const: shader-present
|
||||
|
||||
mali-supply: true
|
||||
|
||||
operating-points-v2: true
|
||||
|
|
@ -108,6 +116,8 @@ allOf:
|
|||
properties:
|
||||
clocks:
|
||||
minItems: 3
|
||||
nvmem-cells: false
|
||||
nvmem-cell-names: false
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
power-domain-names: false
|
||||
|
|
@ -133,6 +143,8 @@ allOf:
|
|||
- const: core
|
||||
- const: stacks
|
||||
required:
|
||||
- nvmem-cells
|
||||
- nvmem-cell-names
|
||||
- power-domains
|
||||
|
||||
examples:
|
||||
|
|
@ -179,6 +191,8 @@ examples:
|
|||
<GIC_SPI 605 IRQ_TYPE_LEVEL_HIGH 0>,
|
||||
<GIC_SPI 604 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
interrupt-names = "job", "mmu", "gpu";
|
||||
nvmem-cells = <&shader_present>;
|
||||
nvmem-cell-names = "shader-present";
|
||||
power-domains = <&gpufreq>;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -40,6 +40,7 @@ properties:
|
|||
- const: img,img-rogue
|
||||
- items:
|
||||
- enum:
|
||||
- ti,am62p-gpu
|
||||
- ti,j721s2-gpu
|
||||
- const: img,img-bxs-4-64
|
||||
- const: img,img-rogue
|
||||
|
|
@ -100,6 +101,7 @@ allOf:
|
|||
contains:
|
||||
enum:
|
||||
- ti,am62-gpu
|
||||
- ti,am62p-gpu
|
||||
- ti,j721s2-gpu
|
||||
then:
|
||||
properties:
|
||||
|
|
|
|||
|
|
@ -26,6 +26,10 @@ properties:
|
|||
- enum:
|
||||
- mediatek,mt7623-hdmi-phy
|
||||
- const: mediatek,mt2701-hdmi-phy
|
||||
- items:
|
||||
- enum:
|
||||
- mediatek,mt8188-hdmi-phy
|
||||
- const: mediatek,mt8195-hdmi-phy
|
||||
- const: mediatek,mt2701-hdmi-phy
|
||||
- const: mediatek,mt8173-hdmi-phy
|
||||
- const: mediatek,mt8195-hdmi-phy
|
||||
|
|
@ -34,16 +38,23 @@ properties:
|
|||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
minItems: 1
|
||||
items:
|
||||
- description: PLL reference clock
|
||||
- description: HDMI 26MHz clock
|
||||
- description: HDMI PLL1 clock
|
||||
- description: HDMI PLL2 clock
|
||||
|
||||
clock-names:
|
||||
minItems: 1
|
||||
items:
|
||||
- const: pll_ref
|
||||
- const: 26m
|
||||
- const: pll1
|
||||
- const: pll2
|
||||
|
||||
clock-output-names:
|
||||
items:
|
||||
- const: hdmitx_dig_cts
|
||||
maxItems: 1
|
||||
|
||||
"#phy-cells":
|
||||
const: 0
|
||||
|
|
@ -76,6 +87,20 @@ required:
|
|||
- "#phy-cells"
|
||||
- "#clock-cells"
|
||||
|
||||
allOf:
|
||||
- if:
|
||||
not:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: mediatek,mt8195-hdmi-phy
|
||||
then:
|
||||
properties:
|
||||
clocks:
|
||||
maxItems: 1
|
||||
clock-names:
|
||||
maxItems: 1
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
|
|
|
|||
|
|
@ -86,6 +86,8 @@ patternProperties:
|
|||
description: Aldec, Inc.
|
||||
"^alfa-network,.*":
|
||||
description: ALFA Network Inc.
|
||||
"^algoltek,.*":
|
||||
description: AlgolTek, Inc.
|
||||
"^allegro,.*":
|
||||
description: Allegro DVT
|
||||
"^allegromicro,.*":
|
||||
|
|
|
|||
|
|
@ -125,11 +125,6 @@ Implicit Fence Poll Support
|
|||
.. kernel-doc:: drivers/dma-buf/dma-buf.c
|
||||
:doc: implicit fence polling
|
||||
|
||||
DMA-BUF statistics
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
.. kernel-doc:: drivers/dma-buf/dma-buf-sysfs-stats.c
|
||||
:doc: overview
|
||||
|
||||
DMA Buffer ioctls
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
|
|
|||
687
Documentation/gpu/amdgpu/amd_overview_block.svg
Normal file
687
Documentation/gpu/amdgpu/amd_overview_block.svg
Normal file
|
|
@ -0,0 +1,687 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="237.4014mm"
|
||||
height="160.98259mm"
|
||||
viewBox="0 0 237.4014 160.98259"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
|
||||
sodipodi:docname="amd_overview_block.svg"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:zoom="2"
|
||||
inkscape:cx="576.75"
|
||||
inkscape:cy="313.25"
|
||||
inkscape:window-width="3840"
|
||||
inkscape:window-height="2083"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer1" />
|
||||
<defs
|
||||
id="defs1">
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="ArrowWideHeavy"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto-start-reverse"
|
||||
inkscape:stockid="Wide, heavy arrow"
|
||||
markerWidth="1"
|
||||
markerHeight="1"
|
||||
viewBox="0 0 1 1"
|
||||
inkscape:isstock="true"
|
||||
inkscape:collect="always"
|
||||
preserveAspectRatio="xMidYMid">
|
||||
<path
|
||||
style="fill:context-stroke;fill-rule:evenodd;stroke:none"
|
||||
d="m 1,0 -3,3 h -2 l 3,-3 -3,-3 h 2 z"
|
||||
id="path3" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="ArrowWideRounded"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto-start-reverse"
|
||||
inkscape:stockid="Wide, rounded arrow"
|
||||
markerWidth="1"
|
||||
markerHeight="1"
|
||||
viewBox="0 0 1 1"
|
||||
inkscape:isstock="true"
|
||||
inkscape:collect="always"
|
||||
preserveAspectRatio="xMidYMid">
|
||||
<path
|
||||
style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
|
||||
d="M 3,-3 0,0 3,3"
|
||||
transform="rotate(180,0.125,0)"
|
||||
sodipodi:nodetypes="ccc"
|
||||
id="path2" />
|
||||
</marker>
|
||||
</defs>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(9.9255824,-64.69615)">
|
||||
<rect
|
||||
style="fill:#ffffff;stroke:none;stroke-width:0.999747"
|
||||
id="rect5"
|
||||
width="239.13895"
|
||||
height="162.38739"
|
||||
x="-10.311751"
|
||||
y="63.871342" />
|
||||
<rect
|
||||
style="fill:#ffffff;stroke:#000000;stroke-width:0.79375"
|
||||
id="rect1"
|
||||
width="174.55814"
|
||||
height="140.23256"
|
||||
x="22.263056"
|
||||
y="65.093025" />
|
||||
<rect
|
||||
style="fill:#00d400;stroke:#00d400;stroke-width:0.348444;stroke-dasharray:none"
|
||||
id="rect8-5"
|
||||
width="3.8659263"
|
||||
height="4.2845292"
|
||||
x="38.69939"
|
||||
y="75.819946" />
|
||||
<rect
|
||||
style="fill:#00d400;stroke:#00d400;stroke-width:0.348444;stroke-dasharray:none"
|
||||
id="rect9"
|
||||
width="3.8659263"
|
||||
height="4.2845292"
|
||||
x="176.7458"
|
||||
y="75.68573" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.9389px;font-family:'Linux Libertine O';-inkscape-font-specification:'Linux Libertine O';text-align:start;letter-spacing:4.91331px;writing-mode:lr-tb;direction:ltr;text-anchor:start;fill:#00d400;stroke:#00d400;stroke-width:1;stroke-dasharray:none"
|
||||
x="45.418606"
|
||||
y="216.62791"
|
||||
id="text12"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan12"
|
||||
style="stroke-width:1"
|
||||
x="45.418606"
|
||||
y="216.62791" /></text>
|
||||
<g
|
||||
id="g34">
|
||||
<rect
|
||||
style="fill:#ffffff;stroke:#008033;stroke-width:1;stroke-dasharray:none"
|
||||
id="rect7"
|
||||
width="19.539951"
|
||||
height="6.9818101"
|
||||
x="22.811832"
|
||||
y="210.3201" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:6.35px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#008033;fill-opacity:1;stroke:none;stroke-width:0.0690111"
|
||||
x="52.663685"
|
||||
y="216.07796"
|
||||
id="text68"><tspan
|
||||
sodipodi:role="line"
|
||||
x="52.663685"
|
||||
y="216.07796"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#008033;stroke-width:0.0690111"
|
||||
id="tspan68">UMC</tspan></text>
|
||||
</g>
|
||||
<g
|
||||
id="g29"
|
||||
transform="translate(-0.52916667)">
|
||||
<rect
|
||||
style="fill:#00d400;stroke:#00d400;stroke-width:0.348444;stroke-dasharray:none"
|
||||
id="rect8"
|
||||
width="3.8659263"
|
||||
height="4.2845292"
|
||||
x="22.782616"
|
||||
y="220.36148" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:6.35px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0690111"
|
||||
x="48.966854"
|
||||
y="224.15474"
|
||||
id="text13"><tspan
|
||||
sodipodi:role="line"
|
||||
x="48.966854"
|
||||
y="224.15474"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#00ff00;stroke-width:0.0690111"
|
||||
id="tspan13">Memory hub</tspan></text>
|
||||
</g>
|
||||
<g
|
||||
id="g12"
|
||||
transform="translate(-1.8520837,2.3812496)">
|
||||
<g
|
||||
id="g13">
|
||||
<rect
|
||||
style="fill:#ffffff;stroke:#ffd42a;stroke-width:1;stroke-dasharray:none"
|
||||
id="rect15"
|
||||
width="28.674419"
|
||||
height="11.302325"
|
||||
x="114.87544"
|
||||
y="169.54433"
|
||||
ry="2.6458333" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:6.35px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0690111"
|
||||
x="129.06978"
|
||||
y="177.46243"
|
||||
id="text15"><tspan
|
||||
sodipodi:role="line"
|
||||
x="129.06978"
|
||||
y="177.46243"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.0690111"
|
||||
id="tspan15">PSP</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<path
|
||||
style="fill:none;stroke:#ffd42a;stroke-width:1;stroke-dasharray:8, 1;stroke-dashoffset:0"
|
||||
d="m 73.88372,201.92338 h 43.74419 V 184.5631"
|
||||
id="path16"
|
||||
sodipodi:nodetypes="ccc" />
|
||||
<rect
|
||||
style="fill:#ffffff;stroke:#00ccff;stroke-width:1;stroke-dasharray:none"
|
||||
id="rect16"
|
||||
width="40.220226"
|
||||
height="11.1272"
|
||||
x="150.82011"
|
||||
y="193.07373" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:6.35px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0690111"
|
||||
x="170.78101"
|
||||
y="200.90428"
|
||||
id="text16"><tspan
|
||||
sodipodi:role="line"
|
||||
x="170.78101"
|
||||
y="200.90428"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.0690111"
|
||||
id="tspan16">PCIe (NBIO)</tspan></text>
|
||||
<g
|
||||
id="g10"
|
||||
transform="translate(-8.807217,1.0583333)">
|
||||
<rect
|
||||
style="fill:#ffffff;stroke:#ff6600;stroke-width:1;stroke-dasharray:none"
|
||||
id="rect10"
|
||||
width="50.551014"
|
||||
height="10.992874"
|
||||
x="65.641136"
|
||||
y="122.93423" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:6.35px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0690111"
|
||||
x="91.040474"
|
||||
y="130.69762"
|
||||
id="text10"><tspan
|
||||
sodipodi:role="line"
|
||||
x="91.040474"
|
||||
y="130.69762"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.0690111"
|
||||
id="tspan10">SMU</tspan></text>
|
||||
</g>
|
||||
<rect
|
||||
style="fill:#00d400;stroke:#00d400;stroke-width:0.348444;stroke-dasharray:none"
|
||||
id="rect14"
|
||||
width="3.8659263"
|
||||
height="4.2845292"
|
||||
x="171.61417"
|
||||
y="125.16281" />
|
||||
<rect
|
||||
style="fill:#00d400;stroke:#00d400;stroke-width:0.348444;stroke-dasharray:none"
|
||||
id="rect18"
|
||||
width="3.8659263"
|
||||
height="4.2845292"
|
||||
x="67.340591"
|
||||
y="185.6201" />
|
||||
<g
|
||||
id="g25"
|
||||
transform="translate(165.76146,89.164578)">
|
||||
<g
|
||||
id="g17"
|
||||
transform="translate(-127.72192,-84.269792)">
|
||||
<rect
|
||||
style="fill:#ffffff;stroke:#ff00ff;stroke-width:1;stroke-dasharray:none"
|
||||
id="rect17"
|
||||
width="50.551014"
|
||||
height="10.992874"
|
||||
x="83.42868"
|
||||
y="140.39673" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:6.35px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0690111"
|
||||
x="108.55814"
|
||||
y="148.16011"
|
||||
id="text17"><tspan
|
||||
sodipodi:role="line"
|
||||
x="108.55814"
|
||||
y="148.16011"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.0690111"
|
||||
id="tspan17">SDMA</tspan></text>
|
||||
</g>
|
||||
<g
|
||||
id="g24">
|
||||
<rect
|
||||
style="fill:#00d400;stroke:#00d400;stroke-width:0.348444;stroke-dasharray:none"
|
||||
id="rect21"
|
||||
width="3.8659263"
|
||||
height="4.2845292"
|
||||
x="9.0765572"
|
||||
y="57.429478" />
|
||||
</g>
|
||||
</g>
|
||||
<path
|
||||
style="fill:none;stroke:#ff6600;stroke-width:1;stroke-dasharray:1, 1;stroke-dashoffset:0;marker-end:url(#ArrowWideRounded)"
|
||||
d="M 56.046208,126.07948 H 51.151416 V 110.60136"
|
||||
id="path21"
|
||||
sodipodi:nodetypes="ccc" />
|
||||
<path
|
||||
style="fill:none;stroke:#ff6600;stroke-width:1;stroke-dasharray:1,1;stroke-dashoffset:0;marker-end:url(#ArrowWideHeavy)"
|
||||
d="m 107.63996,129.38677 h 31.91723"
|
||||
id="path22" />
|
||||
<g
|
||||
id="g26"
|
||||
transform="translate(103.05521,-16.801041)">
|
||||
<path
|
||||
style="fill:none;stroke:#ff6600;stroke-width:0.684499;stroke-dasharray:0.684499, 0.684499;stroke-dashoffset:0;marker-end:url(#ArrowWideHeavy)"
|
||||
d="M 14.374335,237.26538 H 29.87027"
|
||||
id="path23" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:6.35px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff6600;fill-opacity:1;stroke:none;stroke-width:0.0690111"
|
||||
x="41.690811"
|
||||
y="239.50058"
|
||||
id="text23"><tspan
|
||||
sodipodi:role="line"
|
||||
x="41.690811"
|
||||
y="239.50058"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff6600;stroke-width:0.0690111"
|
||||
id="tspan23">Reset</tspan></text>
|
||||
</g>
|
||||
<path
|
||||
style="fill:none;stroke:#ff6600;stroke-width:1;stroke-dasharray:1, 1;stroke-dashoffset:0;marker-end:url(#ArrowWideRounded)"
|
||||
d="m 56.046208,133.69217 h -4.894792 v 58.07604"
|
||||
id="path24"
|
||||
sodipodi:nodetypes="ccc" />
|
||||
<path
|
||||
style="fill:none;stroke:#ff6600;stroke-width:1;stroke-dasharray:1,1;stroke-dashoffset:0;marker-end:url(#ArrowWideHeavy)"
|
||||
d="m 95.977781,134.7651 v 15.92063 l 23.944789,0.007"
|
||||
id="path25"
|
||||
sodipodi:nodetypes="ccc" />
|
||||
<path
|
||||
style="fill:none;stroke:#ffd42a;stroke-width:1;stroke-dasharray:8, 1;stroke-dashoffset:0"
|
||||
d="m 116.34935,212.1162 h 16.22753"
|
||||
id="path26"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:6.35px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff6600;fill-opacity:1;stroke:none;stroke-width:0.0690111"
|
||||
x="159.95955"
|
||||
y="214.49745"
|
||||
id="text26"><tspan
|
||||
sodipodi:role="line"
|
||||
x="159.95955"
|
||||
y="214.49745"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ffd42a;stroke-width:0.0690111"
|
||||
id="tspan26">PSP Interaction</tspan></text>
|
||||
<path
|
||||
style="fill:none;stroke:#ffd42a;stroke-width:1;stroke-dasharray:8, 1;stroke-dashoffset:0"
|
||||
d="m 142.93997,177.44941 12.78794,1e-5 0,-20.13841"
|
||||
id="path27"
|
||||
sodipodi:nodetypes="ccc" />
|
||||
<path
|
||||
style="fill:none;stroke:#ffd42a;stroke-width:1;stroke-dasharray:8, 1;stroke-dashoffset:0"
|
||||
d="m 154.31705,177.44941 24.03273,1e-5 v -46.34286 h -6.87917"
|
||||
id="path28"
|
||||
sodipodi:nodetypes="cccc" />
|
||||
<rect
|
||||
style="fill:#008033;stroke:#008033;stroke-width:1.12152;stroke-dasharray:none"
|
||||
id="rect31"
|
||||
width="28.449656"
|
||||
height="23.148542"
|
||||
x="-9.3648224"
|
||||
y="152.25124" />
|
||||
<rect
|
||||
style="fill:#008033;stroke:#008033;stroke-width:1.12152;stroke-dasharray:none"
|
||||
id="rect32"
|
||||
width="28.449656"
|
||||
height="23.148542"
|
||||
x="-9.3648224"
|
||||
y="71.817902" />
|
||||
<rect
|
||||
style="fill:#008033;stroke:#008033;stroke-width:1.12152;stroke-dasharray:none"
|
||||
id="rect33"
|
||||
width="28.449656"
|
||||
height="23.148542"
|
||||
x="198.46539"
|
||||
y="152.25124" />
|
||||
<rect
|
||||
style="fill:#008033;stroke:#008033;stroke-width:1.12152;stroke-dasharray:none"
|
||||
id="rect34"
|
||||
width="28.449656"
|
||||
height="23.148542"
|
||||
x="198.46539"
|
||||
y="71.817902" />
|
||||
<path
|
||||
style="fill:none;stroke:#00d455;stroke-width:1;stroke-dasharray:1, 1;stroke-dashoffset:0"
|
||||
d="m 69.17932,192.92241 0,-26.32924 H 34.403946"
|
||||
id="path35"
|
||||
sodipodi:nodetypes="ccc" />
|
||||
<path
|
||||
style="fill:none;stroke:#00d455;stroke-width:1;stroke-dasharray:1, 1;stroke-dashoffset:0"
|
||||
d="m 69.167488,192.92241 0,-26.32924 H 184.79581"
|
||||
id="path36"
|
||||
sodipodi:nodetypes="ccc" />
|
||||
<path
|
||||
style="fill:none;stroke:#00d455;stroke-width:1;stroke-dasharray:1, 1;stroke-dashoffset:0"
|
||||
d="m 33.58103,118.30671 147.61609,0 v 30.03021"
|
||||
id="path37"
|
||||
sodipodi:nodetypes="ccc" />
|
||||
<path
|
||||
style="fill:none;stroke:#00d455;stroke-width:1;stroke-dasharray:1, 1;stroke-dashoffset:0"
|
||||
d="m 169.94852,126.77338 15.61123,0"
|
||||
id="path38"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#00d455;stroke-width:1;stroke-dasharray:1, 1;stroke-dashoffset:0"
|
||||
d="m 172.24035,148.99838 13.3194,0"
|
||||
id="path39"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<g
|
||||
id="g40"
|
||||
transform="translate(0,1.8520834)">
|
||||
<circle
|
||||
style="fill:#ff8080;stroke:#ff2a2a;stroke-width:0.7;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
id="path40"
|
||||
cx="7.2723336"
|
||||
cy="194.07741"
|
||||
r="10.186459" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:4.23333px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0690111"
|
||||
x="7.1728497"
|
||||
y="195.6649"
|
||||
id="text40"><tspan
|
||||
sodipodi:role="line"
|
||||
x="7.1728492"
|
||||
y="195.6649"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.0690111"
|
||||
id="tspan40">Firmware</tspan></text>
|
||||
</g>
|
||||
<path
|
||||
style="fill:none;stroke:#ffd42a;stroke-width:1;stroke-dasharray:8, 1;stroke-dashoffset:0"
|
||||
d="m 34.063928,177.71401 78.801482,0.26458"
|
||||
id="path41"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#ffd42a;stroke-width:1;stroke-dasharray:8, 1;stroke-dashoffset:0"
|
||||
d="M 8.1347613,184.72547 27.537285,177.97859"
|
||||
id="path42"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:6.35px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0690111"
|
||||
x="4.5742564"
|
||||
y="84.897125"
|
||||
id="text42"><tspan
|
||||
sodipodi:role="line"
|
||||
x="4.5742559"
|
||||
y="84.897125"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.0690111"
|
||||
id="tspan42">Memory</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:6.35px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0690111"
|
||||
x="4.5742564"
|
||||
y="165.33046"
|
||||
id="text43"><tspan
|
||||
sodipodi:role="line"
|
||||
x="4.5742559"
|
||||
y="165.33046"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.0690111"
|
||||
id="tspan43">Memory</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:6.35px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0690111"
|
||||
x="212.40446"
|
||||
y="165.33046"
|
||||
id="text44"><tspan
|
||||
sodipodi:role="line"
|
||||
x="212.40446"
|
||||
y="165.33046"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.0690111"
|
||||
id="tspan44">Memory</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:6.35px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0690111"
|
||||
x="212.40446"
|
||||
y="84.897125"
|
||||
id="text45"><tspan
|
||||
sodipodi:role="line"
|
||||
x="212.40446"
|
||||
y="84.897125"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.0690111"
|
||||
id="tspan45">Memory</tspan></text>
|
||||
<path
|
||||
style="fill:none;stroke:#00d455;stroke-width:0.882664;stroke-dasharray:0.882664, 0.882664;stroke-dashoffset:0"
|
||||
d="m 174.12438,77.957755 h 10.9062"
|
||||
id="path45"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#00d455;stroke-width:0.960226;stroke-dasharray:0.960226, 0.960226;stroke-dashoffset:0"
|
||||
d="M 34.639355,77.957755 H 47.546469"
|
||||
id="path46"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<rect
|
||||
style="fill:#ffffff;stroke:#008033;stroke-width:1;stroke-dasharray:none"
|
||||
id="rect2"
|
||||
width="5.0221987"
|
||||
height="111.47456"
|
||||
x="28.691442"
|
||||
y="72.435623" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:4.93889px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#008033;fill-opacity:1;stroke:none;stroke-width:0.0690111"
|
||||
x="-127.03961"
|
||||
y="32.94923"
|
||||
id="text34"
|
||||
transform="rotate(-90)"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-127.03961"
|
||||
y="32.94923"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.93889px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#008033;stroke-width:0.0690111"
|
||||
id="tspan34">UMC</tspan></text>
|
||||
<path
|
||||
style="fill:none;stroke:#ffd42a;stroke-width:1;stroke-dasharray:8, 1;stroke-dashoffset:0"
|
||||
d="m 179.15481,177.45676 h 5.90877"
|
||||
id="path1"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<rect
|
||||
style="fill:#ffffff;stroke:#008033;stroke-width:1;stroke-dasharray:none"
|
||||
id="rect3"
|
||||
width="5.0221987"
|
||||
height="111.47456"
|
||||
x="185.4259"
|
||||
y="72.435623" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:4.93889px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#008033;fill-opacity:1;stroke:none;stroke-width:0.0690111"
|
||||
x="-127.03961"
|
||||
y="189.71486"
|
||||
id="text35"
|
||||
transform="rotate(-90)"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-127.03961"
|
||||
y="189.71486"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.93889px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#008033;stroke-width:0.0690111"
|
||||
id="tspan35">UMC</tspan></text>
|
||||
<path
|
||||
style="fill:none;stroke:#ffd42a;stroke-width:1;stroke-dasharray:8, 1;stroke-dashoffset:0"
|
||||
d="m 154.31705,177.44941 24.03273,1e-5 0,-85.765777 h -4.36563"
|
||||
id="path4"
|
||||
sodipodi:nodetypes="cccc" />
|
||||
<g
|
||||
id="g5"
|
||||
transform="translate(0,5.8208336)">
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:6.35px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0690111"
|
||||
x="110.18288"
|
||||
y="73.872185"
|
||||
id="text14-7"><tspan
|
||||
sodipodi:role="line"
|
||||
x="110.18288"
|
||||
y="73.872185"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.0690111"
|
||||
id="tspan14-7">Graphics & Compute (GC)</tspan></text>
|
||||
<g
|
||||
id="g4"
|
||||
transform="translate(10.583333)">
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:5.64444px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0690111"
|
||||
x="58.022533"
|
||||
y="83.518799"
|
||||
id="text14-7-5"><tspan
|
||||
sodipodi:role="line"
|
||||
x="58.022533"
|
||||
y="83.518799"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:5.64444px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.0690111"
|
||||
id="tspan14-7-6">Shader</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
x="58.022533"
|
||||
y="90.574348"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:5.64444px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.0690111"
|
||||
id="tspan20">Engine(SE)</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
x="58.022533"
|
||||
y="97.629898"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:5.64444px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.0690111"
|
||||
id="tspan21">#1</tspan></text>
|
||||
<rect
|
||||
style="fill:none;stroke:#aa0000;stroke-width:1.01356;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
id="rect20"
|
||||
width="31.954243"
|
||||
height="22.038303"
|
||||
x="42.18652"
|
||||
y="77.410309" />
|
||||
</g>
|
||||
<g
|
||||
id="g3"
|
||||
transform="translate(14.287499,-0.66146851)">
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:5.64444px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0690111"
|
||||
x="97.020706"
|
||||
y="91.105995"
|
||||
id="text24"><tspan
|
||||
sodipodi:role="line"
|
||||
x="97.020706"
|
||||
y="91.105995"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:5.64444px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.0690111"
|
||||
id="tspan24">SE #2</tspan></text>
|
||||
<rect
|
||||
style="fill:none;stroke:#aa0000;stroke-width:1.01356;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
id="rect24"
|
||||
width="31.954243"
|
||||
height="22.038303"
|
||||
x="81.080269"
|
||||
y="78.071777" />
|
||||
</g>
|
||||
<g
|
||||
id="g2"
|
||||
transform="translate(-3.96875)">
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:5.64444px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0690111"
|
||||
x="158.03574"
|
||||
y="90.444527"
|
||||
id="text30"><tspan
|
||||
sodipodi:role="line"
|
||||
x="158.03574"
|
||||
y="90.444527"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:5.64444px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.0690111"
|
||||
id="tspan30">SE #N</tspan></text>
|
||||
<rect
|
||||
style="fill:none;stroke:#aa0000;stroke-width:1.01356;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
id="rect30"
|
||||
width="31.954243"
|
||||
height="22.038303"
|
||||
x="141.93443"
|
||||
y="77.410309" />
|
||||
</g>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:6.35px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0690111"
|
||||
x="132.011"
|
||||
y="88.873962"
|
||||
id="text4"><tspan
|
||||
sodipodi:role="line"
|
||||
x="132.011"
|
||||
y="88.873962"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.0690111"
|
||||
id="tspan4">...</tspan></text>
|
||||
<rect
|
||||
style="fill:none;stroke:#ff8080;stroke-width:1;stroke-dasharray:none"
|
||||
id="rect4"
|
||||
width="126.7475"
|
||||
height="35.863121"
|
||||
x="46.912045"
|
||||
y="68.129692" />
|
||||
</g>
|
||||
<g
|
||||
id="g11"
|
||||
transform="translate(-5.0270833,-8.8635417)">
|
||||
<rect
|
||||
style="fill:#ffffff;stroke:#5f5fd3;stroke-width:1;stroke-dasharray:none"
|
||||
id="rect19"
|
||||
width="28.674419"
|
||||
height="11.302325"
|
||||
x="146.1279"
|
||||
y="132.70711" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:6.35px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0690111"
|
||||
x="160.75085"
|
||||
y="140.62521"
|
||||
id="text19"><tspan
|
||||
sodipodi:role="line"
|
||||
x="160.75085"
|
||||
y="140.62521"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.0690111"
|
||||
id="tspan19">VCN</tspan></text>
|
||||
</g>
|
||||
<g
|
||||
id="g6">
|
||||
<rect
|
||||
style="fill:#ffffff;stroke:#0000ff;stroke-width:1;stroke-dasharray:none"
|
||||
id="rect13"
|
||||
width="28.674419"
|
||||
height="11.302325"
|
||||
x="43.988369"
|
||||
y="192.98618" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:6.35px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0690111"
|
||||
x="58.325581"
|
||||
y="200.90428"
|
||||
id="text14"><tspan
|
||||
sodipodi:role="line"
|
||||
x="58.325581"
|
||||
y="200.90428"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.0690111"
|
||||
id="tspan14">DCN</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 30 KiB |
|
|
@ -30,6 +30,15 @@ we have a dedicated glossary for Display Core at
|
|||
CP
|
||||
Command Processor
|
||||
|
||||
CPC
|
||||
Command Processor Compute
|
||||
|
||||
CPF
|
||||
Command Processor Fetch
|
||||
|
||||
CPG
|
||||
Command Processor Graphics
|
||||
|
||||
CPLIB
|
||||
Content Protection Library
|
||||
|
||||
|
|
@ -78,6 +87,9 @@ we have a dedicated glossary for Display Core at
|
|||
GMC
|
||||
Graphic Memory Controller
|
||||
|
||||
GPR
|
||||
General Purpose Register
|
||||
|
||||
GPUVM
|
||||
GPU Virtual Memory. This is the GPU's MMU. The GPU supports multiple
|
||||
virtual address spaces that can be in flight at any given time. These
|
||||
|
|
@ -92,9 +104,15 @@ we have a dedicated glossary for Display Core at
|
|||
table for use by the kernel driver or into per process GPUVM page tables
|
||||
for application usage.
|
||||
|
||||
GWS
|
||||
Global Wave Sync
|
||||
|
||||
IH
|
||||
Interrupt Handler
|
||||
|
||||
IV
|
||||
Interrupt Vector
|
||||
|
||||
HQD
|
||||
Hardware Queue Descriptor
|
||||
|
||||
|
|
@ -143,15 +161,24 @@ we have a dedicated glossary for Display Core at
|
|||
PA
|
||||
Primitive Assembler / Physical Address
|
||||
|
||||
PDE
|
||||
Page Directory Entry
|
||||
|
||||
PFP
|
||||
Pre-Fetch Parser (Graphics)
|
||||
|
||||
PPLib
|
||||
PowerPlay Library - PowerPlay is the power management component.
|
||||
|
||||
PRT
|
||||
Partially Resident Texture (also known as sparse residency)
|
||||
|
||||
PSP
|
||||
Platform Security Processor
|
||||
|
||||
PTE
|
||||
Page Table Entry
|
||||
|
||||
RB
|
||||
Render Backends. Some people called it ROPs.
|
||||
|
||||
|
|
@ -206,12 +233,33 @@ we have a dedicated glossary for Display Core at
|
|||
TC
|
||||
Texture Cache
|
||||
|
||||
TCP (AMDGPU)
|
||||
Texture Cache per Pipe. Even though the name "Texture" is part of this
|
||||
acronym, the TCP represents the path to memory shaders; i.e., it is not
|
||||
related to texture. The name is a leftover from older designs where shader
|
||||
stages had different cache designs; it refers to the L1 cache in older
|
||||
architectures.
|
||||
|
||||
TMR
|
||||
Trusted Memory Region
|
||||
|
||||
TMZ
|
||||
Trusted Memory Zone
|
||||
|
||||
TOC
|
||||
Table of Contents
|
||||
|
||||
UMC
|
||||
Unified Memory Controller
|
||||
|
||||
UMSCH
|
||||
User Mode Scheduler
|
||||
|
||||
UTC (AMDGPU)
|
||||
Unified Translation Cache. UTC is equivalent to TLB. You might see a
|
||||
variation of this acronym with L at the end, i.e., UTCL followed by a
|
||||
number; L means the cache level (e.g., UTCL1 and UTCL2).
|
||||
|
||||
UVD
|
||||
Unified Video Decoder
|
||||
|
||||
|
|
|
|||
|
|
@ -16,3 +16,6 @@ Ryzen AI 300 series, Strix Point, 3.5.0, 11.5.0, 4.0.5, 6.1.0, 14.0.0, 14.0.0
|
|||
Ryzen AI 330 series, Krackan Point, 3.6.0, 11.5.3, 4.0.5, 6.1.3, 14.0.5, 14.0.5
|
||||
Ryzen AI 350 series, Krackan Point, 3.5.0, 11.5.2, 4.0.5, 6.1.2, 14.0.4, 14.0.4
|
||||
Ryzen AI Max 300 series, Strix Halo, 3.5.1, 11.5.1, 4.0.6, 6.1.1, 14.0.1, 14.0.1
|
||||
Ryzen AI 9 475 / 470 / 465, Gorgon Point, 3.5.0, 11.5.0, 4.0.5, 6.1.0, 14.0.0, 14.0.0
|
||||
Ryzen AI 7 450, Gorgon Point, 3.5.0, 11.5.2, 4.0.5, 6.1.2, 14.0.4, 14.0.4
|
||||
Ryzen AI 5 440 / 435, Gorgon Point, 3.6.0, 11.5.3, 4.0.5, 6.1.3, 14.0.5, 14.0.5
|
||||
|
|
|
|||
|
|
|
@ -221,9 +221,6 @@ consider asking on the amd-gfx mailing list and update this page.
|
|||
TMDS
|
||||
Transition-Minimized Differential Signaling
|
||||
|
||||
TMZ
|
||||
Trusted Memory Zone
|
||||
|
||||
TTU
|
||||
Time to Underflow
|
||||
|
||||
|
|
|
|||
|
|
@ -77,6 +77,37 @@ VCN (Video Core Next)
|
|||
decode. It's exposed to userspace for user mode drivers (VA-API,
|
||||
OpenMAX, etc.)
|
||||
|
||||
It is important to note that these blocks can interact with each other. The
|
||||
picture below illustrates some of the components and their interconnection:
|
||||
|
||||
.. kernel-figure:: amd_overview_block.svg
|
||||
|
||||
In the diagram, memory-related blocks are shown in green. Notice that specific
|
||||
IPs have a green square that represents a small hardware block named 'hub',
|
||||
which is responsible for interfacing with memory. All memory hubs are connected
|
||||
in the UMCs, which in turn are connected to memory blocks. As a note,
|
||||
pre-vega devices have a dedicated block for the Graphic Memory Controller
|
||||
(GMC), which was replaced by UMC and hubs in new architectures. In the driver
|
||||
code, you can identify this component by looking for the suffix hub, for
|
||||
example: gfxhub, dchub, mmhub, vmhub, etc. Keep in mind that the component's
|
||||
interaction with the memory block may vary across architectures. For example,
|
||||
on Navi and newer, GC and SDMA are both attached to GCHUB; on pre-Navi, SDMA
|
||||
goes through MMHUB; VCN, JPEG, and VPE go through MMHUB; DCN goes through
|
||||
DCHUB.
|
||||
|
||||
There is some protection for certain memory elements, and the PSP plays an
|
||||
essential role in this area. When a specific firmware is loaded into memory,
|
||||
the PSP takes steps to ensure it has a valid signature. It also stores firmware
|
||||
images in a protected memory area named Trusted Memory Area (TMR), so the OS or
|
||||
driver can't corrupt them at runtime. Another use of PSP is to support Trusted
|
||||
Applications (TA), which are basically small applications that run on the
|
||||
trusted processor and handles a trusted operation (e.g., HDCP). PSP is also
|
||||
used for encrypted memory for content protection via Trusted Memory Zone (TMZ).
|
||||
|
||||
Another critical IP is the SMU. It handles reset distribution, as well as
|
||||
clock, thermal, and power management for all IPs on the SoC. SMU also helps to
|
||||
balance performance and power consumption.
|
||||
|
||||
.. _pipes-and-queues-description:
|
||||
|
||||
GFX, Compute, and SDMA Overall Behavior
|
||||
|
|
|
|||
|
|
@ -128,3 +128,29 @@ smartshift_bias
|
|||
|
||||
.. kernel-doc:: drivers/gpu/drm/amd/pm/amdgpu_pm.c
|
||||
:doc: smartshift_bias
|
||||
|
||||
UMA Carveout
|
||||
============
|
||||
|
||||
Some versions of Atom ROM expose available options for the VRAM carveout sizes,
|
||||
and allow changes to the carveout size via the ATCS function code 0xA on supported
|
||||
BIOS implementations.
|
||||
|
||||
For those platforms, users can use the following files under uma/ to set the
|
||||
carveout size, in a way similar to what Windows users can do in the "Tuning"
|
||||
tab in AMD Adrenalin.
|
||||
|
||||
Note that for BIOS implementations that don't support this, these files will not
|
||||
be created at all.
|
||||
|
||||
uma/carveout_options
|
||||
--------------------
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
|
||||
:doc: uma/carveout_options
|
||||
|
||||
uma/carveout
|
||||
--------------------
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
|
||||
:doc: uma/carveout
|
||||
|
|
|
|||
654
Documentation/gpu/amdgpu/enforce_isolation.svg
Normal file
654
Documentation/gpu/amdgpu/enforce_isolation.svg
Normal file
|
|
@ -0,0 +1,654 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="67.794067mm"
|
||||
height="88.643349mm"
|
||||
viewBox="0 0 67.794066 88.643348"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
|
||||
sodipodi:docname="enforce_isolation.svg"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:zoom="3.5754724"
|
||||
inkscape:cx="200.95247"
|
||||
inkscape:cy="182.77305"
|
||||
inkscape:window-width="3840"
|
||||
inkscape:window-height="2083"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer1" />
|
||||
<defs
|
||||
id="defs1">
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="ArrowWideHeavy"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto-start-reverse"
|
||||
inkscape:stockid="Wide, heavy arrow"
|
||||
markerWidth="1"
|
||||
markerHeight="1"
|
||||
viewBox="0 0 1 1"
|
||||
inkscape:isstock="true"
|
||||
inkscape:collect="always"
|
||||
preserveAspectRatio="xMidYMid">
|
||||
<path
|
||||
style="fill:context-stroke;fill-rule:evenodd;stroke:none"
|
||||
d="m 1,0 -3,3 h -2 l 3,-3 -3,-3 h 2 z"
|
||||
id="path3" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Dot"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Dot"
|
||||
markerWidth="1"
|
||||
markerHeight="1"
|
||||
viewBox="0 0 1 1"
|
||||
inkscape:isstock="true"
|
||||
inkscape:collect="always"
|
||||
preserveAspectRatio="xMidYMid">
|
||||
<path
|
||||
transform="scale(0.5)"
|
||||
style="fill:context-stroke;fill-rule:evenodd;stroke:none"
|
||||
d="M 5,0 C 5,2.76 2.76,5 0,5 -2.76,5 -5,2.76 -5,0 c 0,-2.76 2.3,-5 5,-5 2.76,0 5,2.24 5,5 z"
|
||||
sodipodi:nodetypes="sssss"
|
||||
id="path98" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="marker99"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Dot"
|
||||
markerWidth="1"
|
||||
markerHeight="1"
|
||||
viewBox="0 0 1 1"
|
||||
inkscape:isstock="true"
|
||||
inkscape:collect="always"
|
||||
preserveAspectRatio="xMidYMid">
|
||||
<path
|
||||
transform="scale(0.5)"
|
||||
style="fill:context-stroke;fill-rule:evenodd;stroke:none"
|
||||
d="M 5,0 C 5,2.76 2.76,5 0,5 -2.76,5 -5,2.76 -5,0 c 0,-2.76 2.3,-5 5,-5 2.76,0 5,2.24 5,5 z"
|
||||
sodipodi:nodetypes="sssss"
|
||||
id="path99" />
|
||||
</marker>
|
||||
</defs>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(71.49059,-1.1271925)">
|
||||
<g
|
||||
id="g15"
|
||||
transform="matrix(0.42247861,0,0,0.42247861,-70.575576,-25.242317)">
|
||||
<path
|
||||
id="path33"
|
||||
style="fill:none;stroke:#000000;stroke-width:0.721067;stroke-dasharray:none"
|
||||
d="M 30.278993,176.45537 A 22.905334,22.905334 0 0 0 7.3737955,199.36057 22.905334,22.905334 0 0 0 30.278993,222.26603 22.905334,22.905334 0 0 0 53.18445,199.36057 22.905334,22.905334 0 0 0 30.278993,176.45537 Z m 0,7.13274 a 15.772359,15.772359 0 0 1 15.77246,15.77246 15.772359,15.772359 0 0 1 -15.77246,15.77246 15.772359,15.772359 0 0 1 -15.772206,-15.77246 15.772359,15.772359 0 0 1 15.772206,-15.77246 z" />
|
||||
<g
|
||||
id="g14">
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 46.31405,200.72093 h 6.430134"
|
||||
id="path34"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="M 7.6848605,200.72093 H 14.114993"
|
||||
id="path35"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 30.103415,176.7326 v 6.43014"
|
||||
id="path36"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="M 30.103415,215.50586 V 221.936"
|
||||
id="path37"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 36.501694,214.1052 3.21507,5.56866"
|
||||
id="path38"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 36.501694,184.66805 3.21507,-5.56866"
|
||||
id="path39"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 23.652811,184.66805 -3.21507,-5.56866"
|
||||
id="path40"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 23.652811,214.05288 -3.21507,5.56866"
|
||||
id="path41"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 43.31839,208.65101 4.546794,4.5468"
|
||||
id="path42"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 43.31839,189.96525 4.546794,-4.5468"
|
||||
id="path43"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="M 17.202394,189.96525 12.6556,185.41845"
|
||||
id="path44-1"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 16.940766,208.65101 -4.546794,4.5468"
|
||||
id="path45-8"
|
||||
sodipodi:nodetypes="cc" />
|
||||
</g>
|
||||
</g>
|
||||
<rect
|
||||
style="fill:#afe9c6;stroke:#16502d;stroke-width:0.257104;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
id="rect80"
|
||||
width="25.076588"
|
||||
height="10.493422"
|
||||
x="-71.362038"
|
||||
y="79.148567"
|
||||
ry="1.4529352" />
|
||||
<rect
|
||||
style="fill:#80e5ff;stroke:#00aad4;stroke-width:0.257104;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
id="rect81"
|
||||
width="32.714355"
|
||||
height="10.436013"
|
||||
x="-40.481403"
|
||||
y="79.177269"
|
||||
ry="1.4449863" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:6.53042px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-59.013123"
|
||||
y="86.726654"
|
||||
id="text14-7"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-59.013123"
|
||||
y="86.726654"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.53042px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.102999"
|
||||
id="tspan14-7">GFX</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:6.53042px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-24.387218"
|
||||
y="85.975647"
|
||||
id="text95"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-24.387218"
|
||||
y="85.975647"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.53042px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.102999"
|
||||
id="tspan95">Compute</tspan></text>
|
||||
<path
|
||||
style="fill:#de8787;stroke:#000000;stroke-width:0.385656;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none;marker-start:url(#Dot);marker-end:url(#marker99)"
|
||||
d="M -58.079264,78.410023 V 69.962845"
|
||||
id="path127"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.90242px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-61.752651"
|
||||
y="3.1995225"
|
||||
id="text112"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-61.752651"
|
||||
y="3.1995225"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.90242px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.102999"
|
||||
id="tspan112">Processes</tspan></text>
|
||||
<rect
|
||||
style="fill:none;stroke:#000000;stroke-width:0.247306;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:1.48383, 1.48383;stroke-dashoffset:0"
|
||||
id="rect113"
|
||||
width="64.703476"
|
||||
height="19.562067"
|
||||
x="-68.52655"
|
||||
y="4.468956"
|
||||
ry="1.6976216" />
|
||||
<g
|
||||
id="g84"
|
||||
transform="matrix(0.25710378,0,0,0.25710378,0.68647434,8.7899633)">
|
||||
<g
|
||||
id="g83">
|
||||
<circle
|
||||
style="fill:#ffffff;stroke:#ff00ff;stroke-width:1.62704;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
id="circle137"
|
||||
cx="-225.65012"
|
||||
cy="20.747513"
|
||||
r="30.822298" />
|
||||
</g>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:16.9333px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff00ff;fill-opacity:1;stroke:none;stroke-width:0.400612"
|
||||
x="-225.65012"
|
||||
y="26.8181"
|
||||
id="text113"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-225.65012"
|
||||
y="26.8181"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:16.9333px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff00ff;stroke-width:0.400612"
|
||||
id="tspan113">A</tspan></text>
|
||||
</g>
|
||||
<g
|
||||
id="g85"
|
||||
transform="matrix(0.25710378,0,0,0.25710378,20.618429,8.7899633)">
|
||||
<circle
|
||||
style="fill:#ffffff;stroke:#ff9955;stroke-width:1.62704;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
id="circle112"
|
||||
cx="-207.94376"
|
||||
cy="20.747513"
|
||||
r="30.822298" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:16.9333px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff9955;fill-opacity:1;stroke:none;stroke-width:0.400612"
|
||||
x="-208.25702"
|
||||
y="26.792702"
|
||||
id="text114"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-208.25702"
|
||||
y="26.792702"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:16.9333px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff9955;stroke-width:0.400612"
|
||||
id="tspan114">B</tspan></text>
|
||||
</g>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.17681px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff00ff;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-56.126556"
|
||||
y="51.72607"
|
||||
id="text6"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-56.126556"
|
||||
y="51.72607"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.17681px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff00ff;stroke-width:0.102999"
|
||||
id="tspan6">A</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.26752px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-57.861526"
|
||||
y="58.416431"
|
||||
id="text136"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-57.861526"
|
||||
y="58.416431"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.26752px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.102999"
|
||||
id="tspan136">Ring</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
x="-57.861526"
|
||||
y="61.250832"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.26752px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.102999"
|
||||
id="tspan137">Buffer</tspan></text>
|
||||
<g
|
||||
id="g80"
|
||||
transform="matrix(0.42247861,0,0,0.42247861,-37.21188,-25.242317)">
|
||||
<path
|
||||
id="path67"
|
||||
style="fill:none;stroke:#000000;stroke-width:0.721067;stroke-dasharray:none"
|
||||
d="M 30.278993,176.45537 A 22.905334,22.905334 0 0 0 7.3737955,199.36057 22.905334,22.905334 0 0 0 30.278993,222.26603 22.905334,22.905334 0 0 0 53.18445,199.36057 22.905334,22.905334 0 0 0 30.278993,176.45537 Z m 0,7.13274 a 15.772359,15.772359 0 0 1 15.77246,15.77246 15.772359,15.772359 0 0 1 -15.77246,15.77246 15.772359,15.772359 0 0 1 -15.772206,-15.77246 15.772359,15.772359 0 0 1 15.772206,-15.77246 z" />
|
||||
<g
|
||||
id="g79">
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 46.31405,200.72093 h 6.430134"
|
||||
id="path68"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="M 7.6848605,200.72093 H 14.114993"
|
||||
id="path69"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 30.103415,176.7326 v 6.43014"
|
||||
id="path70"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="M 30.103415,215.50586 V 221.936"
|
||||
id="path71"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 36.501694,214.1052 3.21507,5.56866"
|
||||
id="path72"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 36.501694,184.66805 3.21507,-5.56866"
|
||||
id="path73"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 23.652811,184.66805 -3.21507,-5.56866"
|
||||
id="path74"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 23.652811,214.05288 -3.21507,5.56866"
|
||||
id="path75"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 43.31839,208.65101 4.546794,4.5468"
|
||||
id="path76"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 43.31839,189.96525 4.546794,-4.5468"
|
||||
id="path77"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="M 17.202394,189.96525 12.6556,185.41845"
|
||||
id="path78"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 16.940766,208.65101 -4.546794,4.5468"
|
||||
id="path79"
|
||||
sodipodi:nodetypes="cc" />
|
||||
</g>
|
||||
</g>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.26752px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-24.497828"
|
||||
y="58.416431"
|
||||
id="text81"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-24.497828"
|
||||
y="58.416431"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.26752px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.102999"
|
||||
id="tspan80">Ring</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
x="-24.497828"
|
||||
y="61.250832"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.26752px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.102999"
|
||||
id="tspan81">Buffer</tspan></text>
|
||||
<path
|
||||
style="fill:#de8787;stroke:#000000;stroke-width:0.385656;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none;marker-start:url(#Dot);marker-end:url(#marker99)"
|
||||
d="M -24.338879,78.410023 V 69.962845"
|
||||
id="path81"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.17681px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff00ff;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-52.574932"
|
||||
y="53.340443"
|
||||
id="text82"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-52.574932"
|
||||
y="53.340443"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.17681px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff00ff;stroke-width:0.102999"
|
||||
id="tspan82">A</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.17681px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff00ff;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-50.045757"
|
||||
y="57.376377"
|
||||
id="text83"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-50.045757"
|
||||
y="57.376377"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.17681px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff00ff;stroke-width:0.102999"
|
||||
id="tspan83">A</tspan></text>
|
||||
<g
|
||||
id="g1"
|
||||
transform="translate(0,-16.057901)">
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.17681px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff00ff;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-12.593401"
|
||||
y="57.349865"
|
||||
id="text83-59"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-12.593401"
|
||||
y="57.349865"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.17681px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff00ff;stroke-width:0.102999"
|
||||
id="tspan83-7">A</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.17681px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff00ff;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-9.8666544"
|
||||
y="57.349865"
|
||||
id="text83-59-3"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-9.8666544"
|
||||
y="57.349865"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.17681px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff00ff;stroke-width:0.102999"
|
||||
id="tspan83-7-6">A</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.17681px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-24.724035"
|
||||
y="57.3466"
|
||||
id="text83-5-9"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-24.724035"
|
||||
y="57.3466"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.17681px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff0000;stroke-width:0.102999"
|
||||
id="tspan83-4-2">C</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.17681px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-22.315107"
|
||||
y="57.3466"
|
||||
id="text83-5-9-9"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-22.315107"
|
||||
y="57.3466"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.17681px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff0000;stroke-width:0.102999"
|
||||
id="tspan83-4-2-5">C</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.17681px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff9955;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-19.937738"
|
||||
y="57.3466"
|
||||
id="text83-5-9-9-7"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-19.937738"
|
||||
y="57.3466"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.17681px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff9955;stroke-width:0.102999"
|
||||
id="tspan83-4-2-5-2">B</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.17681px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff9955;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-17.56146"
|
||||
y="57.3466"
|
||||
id="text83-5-9-9-7-0"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-17.56146"
|
||||
y="57.3466"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.17681px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff9955;stroke-width:0.102999"
|
||||
id="tspan83-4-2-5-2-6">B</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.17681px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff9955;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-15.185183"
|
||||
y="57.3466"
|
||||
id="text83-5-9-9-7-0-4"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-15.185183"
|
||||
y="57.3466"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.17681px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff9955;stroke-width:0.102999"
|
||||
id="tspan83-4-2-5-2-6-9">B</tspan></text>
|
||||
</g>
|
||||
<g
|
||||
id="g2"
|
||||
transform="translate(0,-16.057901)">
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.17681px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff00ff;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-46.032711"
|
||||
y="57.349865"
|
||||
id="text83-7"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-46.032711"
|
||||
y="57.349865"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.17681px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff00ff;stroke-width:0.102999"
|
||||
id="tspan83-8">A</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.17681px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff00ff;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-42.773308"
|
||||
y="57.349865"
|
||||
id="text83-7-4"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-42.773308"
|
||||
y="57.349865"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.17681px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff00ff;stroke-width:0.102999"
|
||||
id="tspan83-8-3">A</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.17681px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-55.041409"
|
||||
y="57.3466"
|
||||
id="text83-5"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-55.041409"
|
||||
y="57.3466"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.17681px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff0000;stroke-width:0.102999"
|
||||
id="tspan83-4">C</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.17681px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-57.982994"
|
||||
y="57.3466"
|
||||
id="text83-5-3"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-57.982994"
|
||||
y="57.3466"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.17681px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff0000;stroke-width:0.102999"
|
||||
id="tspan83-4-5">C</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.17681px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-52.099823"
|
||||
y="57.3466"
|
||||
id="text83-5-6"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-52.099823"
|
||||
y="57.3466"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.17681px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff0000;stroke-width:0.102999"
|
||||
id="tspan83-4-9">C</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.17681px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-49.158237"
|
||||
y="57.3466"
|
||||
id="text83-5-6-5"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-49.158237"
|
||||
y="57.3466"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.17681px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff0000;stroke-width:0.102999"
|
||||
id="tspan83-4-9-2">C</tspan></text>
|
||||
</g>
|
||||
<g
|
||||
id="g86"
|
||||
transform="matrix(0.25710378,0,0,0.25710378,17.422136,8.7899633)">
|
||||
<circle
|
||||
style="fill:#ffffff;stroke:#ff0000;stroke-width:1.62704;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
id="circle84"
|
||||
cx="-121.9205"
|
||||
cy="20.747513"
|
||||
r="30.822298" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:16.9333px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff9955;fill-opacity:1;stroke:none;stroke-width:0.400612"
|
||||
x="-122.11524"
|
||||
y="26.792702"
|
||||
id="text84"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-122.11524"
|
||||
y="26.792702"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:16.9333px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff0000;stroke-width:0.400612"
|
||||
id="tspan84">C</tspan></text>
|
||||
</g>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:2.17681px;font-family:'Linux Libertine O';-inkscape-font-specification:'Linux Libertine O';text-align:start;letter-spacing:1.26323px;writing-mode:lr-tb;direction:ltr;text-anchor:start;fill:none;stroke:#000000;stroke-width:0.257104;stroke-linecap:square;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
x="-140.03215"
|
||||
y="26.074423"
|
||||
id="text86"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan86"
|
||||
style="stroke-width:0.257104"
|
||||
x="-140.03215"
|
||||
y="26.074423" /></text>
|
||||
<rect
|
||||
style="fill:none;stroke:#000000;stroke-width:0.463569;stroke-linecap:square;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
id="rect89"
|
||||
width="62.753353"
|
||||
height="10.962811"
|
||||
x="-68.911674"
|
||||
y="32.218185" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.26751px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-37.552006"
|
||||
y="35.595592"
|
||||
id="text89"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-37.552006"
|
||||
y="35.595592"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.26751px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.102999"
|
||||
id="tspan89">Enforce Isolation</tspan></text>
|
||||
<path
|
||||
style="fill:#de8787;stroke:#000000;stroke-width:0.385656;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none;marker-start:url(#Dot);marker-end:url(#marker99)"
|
||||
d="M -57.807162,48.273529 V 44.392491"
|
||||
id="path90"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#de8787;stroke:#000000;stroke-width:0.385656;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none;marker-start:url(#Dot);marker-end:url(#marker99)"
|
||||
d="M -24.512426,48.273529 V 44.392491"
|
||||
id="path91"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#ff00ff;stroke-width:0.257104;stroke-linecap:square;stroke-dasharray:none;marker-end:url(#ArrowWideHeavy)"
|
||||
d="m -57.329023,22.418572 v 9.208373"
|
||||
id="path1" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#ff9955;stroke-width:0.257104;stroke-linecap:square;stroke-dasharray:none;marker-end:url(#ArrowWideHeavy)"
|
||||
d="m -32.844695,22.418572 v 9.208373"
|
||||
id="path2" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#ff0000;stroke-width:0.257104;stroke-linecap:square;stroke-dasharray:none;marker-end:url(#ArrowWideHeavy)"
|
||||
d="m -13.924085,22.418572 v 9.208373"
|
||||
id="path4" />
|
||||
<path
|
||||
style="fill:none;stroke:#ff00ff;stroke-width:0.257104;stroke-linecap:square;stroke-dasharray:none;marker-end:url(#ArrowWideHeavy)"
|
||||
d="m -57.329023,22.418572 v 5.174952 h 20.852017 v 4.033421"
|
||||
id="path5"
|
||||
sodipodi:nodetypes="cccc" />
|
||||
<path
|
||||
style="fill:none;stroke:#ff0000;stroke-width:0.257104;stroke-linecap:square;stroke-dasharray:none;marker-end:url(#ArrowWideHeavy)"
|
||||
d="m -13.924085,22.418572 v 3.652908 h -34.777483 v 5.555465"
|
||||
id="path6"
|
||||
sodipodi:nodetypes="cccc" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 34 KiB |
|
|
@ -7,19 +7,21 @@
|
|||
The relationship between the CPU and GPU can be described as the
|
||||
producer-consumer problem, where the CPU fills out a buffer with operations
|
||||
(producer) to be executed by the GPU (consumer). The requested operations in
|
||||
the buffer are called Command Packets, which can be summarized as a compressed
|
||||
way of transmitting command information to the graphics controller.
|
||||
the buffer are called **Command Packets**, which can be summarized as a
|
||||
compressed way of transmitting command information to the graphics controller.
|
||||
|
||||
The component that acts as the front end between the CPU and the GPU is called
|
||||
the Command Processor (CP). This component is responsible for providing greater
|
||||
flexibility to the GC since CP makes it possible to program various aspects of
|
||||
the GPU pipeline. CP also coordinates the communication between the CPU and GPU
|
||||
via a mechanism named **Ring Buffers**, where the CPU appends information to
|
||||
the buffer while the GPU removes operations. It is relevant to highlight that a
|
||||
CPU can add a pointer to the Ring Buffer that points to another region of
|
||||
memory outside the Ring Buffer, and CP can handle it; this mechanism is called
|
||||
**Indirect Buffer (IB)**. CP receives and parses the Command Streams (CS), and
|
||||
writes the operations to the correct hardware blocks.
|
||||
**Command Processor (CP)**. This component is responsible for providing greater
|
||||
flexibility to the **Graphics and Compute (GC)** since CP makes it possible to
|
||||
program various aspects of the GPU pipeline. CP also coordinates the
|
||||
communication between the CPU and GPU via a mechanism named **Ring Buffers**,
|
||||
where the CPU appends information to the buffer while the GPU removes
|
||||
operations. CP is also responsible for handling **Indirect Buffers (IB)**.
|
||||
|
||||
For reference, internally the CP consists of several sub-blocks (CPC - CP
|
||||
compute, CPG - CP graphics, and CPF - CP fetcher). Some of these acronyms
|
||||
appear in register names, but this is more of an implementation detail and not
|
||||
something that directly impacts driver programming or debugging.
|
||||
|
||||
Graphics (GFX) and Compute Microcontrollers
|
||||
-------------------------------------------
|
||||
|
|
|
|||
413
Documentation/gpu/amdgpu/gfx_pipeline_seq.svg
Normal file
413
Documentation/gpu/amdgpu/gfx_pipeline_seq.svg
Normal file
|
|
@ -0,0 +1,413 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="141.76276mm"
|
||||
height="51.906979mm"
|
||||
viewBox="0 0 141.76275 51.906979"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
|
||||
sodipodi:docname="gfx_pipeline_seq.svg"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:zoom="1.2641204"
|
||||
inkscape:cx="470.28748"
|
||||
inkscape:cy="63.680643"
|
||||
inkscape:window-width="3072"
|
||||
inkscape:window-height="1651"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer1" />
|
||||
<defs
|
||||
id="defs1">
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="ArrowWideHeavy"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto-start-reverse"
|
||||
inkscape:stockid="Wide, heavy arrow"
|
||||
markerWidth="1"
|
||||
markerHeight="1"
|
||||
viewBox="0 0 1 1"
|
||||
inkscape:isstock="true"
|
||||
inkscape:collect="always"
|
||||
preserveAspectRatio="xMidYMid">
|
||||
<path
|
||||
style="fill:context-stroke;fill-rule:evenodd;stroke:none"
|
||||
d="m 1,0 -3,3 h -2 l 3,-3 -3,-3 h 2 z"
|
||||
id="path3" />
|
||||
</marker>
|
||||
</defs>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(23.062206,-30.75877)">
|
||||
<rect
|
||||
style="fill:#ffffff;stroke:none;stroke-width:0.694678;stroke-linecap:square;stroke-dasharray:4.16805, 4.16805"
|
||||
id="rect1"
|
||||
width="141.76276"
|
||||
height="51.906979"
|
||||
x="-23.062206"
|
||||
y="30.75877" />
|
||||
<g
|
||||
id="g28"
|
||||
transform="matrix(1.0835493,0,0,1.0835493,-30.079831,-159.17628)">
|
||||
<path
|
||||
id="path18"
|
||||
style="fill:none;stroke:#000000;stroke-width:0.721067;stroke-dasharray:none"
|
||||
d="M 30.278993,176.45537 A 22.905334,22.905334 0 0 0 7.3737955,199.36057 22.905334,22.905334 0 0 0 30.278993,222.26603 22.905334,22.905334 0 0 0 53.18445,199.36057 22.905334,22.905334 0 0 0 30.278993,176.45537 Z m 0,7.13274 a 15.772359,15.772359 0 0 1 15.77246,15.77246 15.772359,15.772359 0 0 1 -15.77246,15.77246 15.772359,15.772359 0 0 1 -15.772206,-15.77246 15.772359,15.772359 0 0 1 15.772206,-15.77246 z" />
|
||||
<g
|
||||
id="g27">
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 46.31405,200.72093 h 6.430134"
|
||||
id="path19"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="M 7.6848605,200.72093 H 14.114993"
|
||||
id="path20"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 30.103415,176.7326 v 6.43014"
|
||||
id="path21"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="M 30.103415,215.50586 V 221.936"
|
||||
id="path22"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 36.501694,214.1052 3.21507,5.56866"
|
||||
id="path23"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 36.501694,184.66805 3.21507,-5.56866"
|
||||
id="path24"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 23.652811,184.66805 -3.21507,-5.56866"
|
||||
id="path25"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 23.652811,214.05288 -3.21507,5.56866"
|
||||
id="path26"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 43.31839,208.65101 4.546794,4.5468"
|
||||
id="path27"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 43.31839,189.96525 4.546794,-4.5468"
|
||||
id="path28"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="M 17.202394,189.96525 12.6556,185.41845"
|
||||
id="path29"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 16.940766,208.65101 -4.546794,4.5468"
|
||||
id="path30"
|
||||
sodipodi:nodetypes="cc" />
|
||||
</g>
|
||||
</g>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:3.92107px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff9955;fill-opacity:1;stroke:none;stroke-width:0.434083"
|
||||
x="23.133495"
|
||||
y="52.750404"
|
||||
id="text24"><tspan
|
||||
sodipodi:role="line"
|
||||
x="23.133495"
|
||||
y="52.750404"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.92107px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff9955;stroke-width:0.434083"
|
||||
id="tspan24">IB<tspan
|
||||
style="font-size:3.92107px;baseline-shift:sub;fill:#ff9955;stroke-width:0.434083"
|
||||
id="tspan27">b</tspan></tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:6.88054px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.434083"
|
||||
x="2.4917324"
|
||||
y="55.12072"
|
||||
id="text139"><tspan
|
||||
sodipodi:role="line"
|
||||
x="2.4917324"
|
||||
y="55.12072"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.88054px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.434083"
|
||||
id="tspan138">Ring</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
x="2.4917324"
|
||||
y="63.721394"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.88054px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.434083"
|
||||
id="tspan139">Buffer</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:3.92107px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff9955;fill-opacity:1;stroke:none;stroke-width:0.434083"
|
||||
x="22.115709"
|
||||
y="65.117416"
|
||||
id="text18"><tspan
|
||||
sodipodi:role="line"
|
||||
x="22.115709"
|
||||
y="65.117416"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:3.92107px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#87decd;stroke-width:0.434083"
|
||||
id="tspan18">IB<tspan
|
||||
style="font-size:3.92107px;baseline-shift:sub;fill:#87decd;stroke-width:0.434083"
|
||||
id="tspan17">c</tspan></tspan></text>
|
||||
<g
|
||||
id="g62"
|
||||
transform="matrix(0.69467788,0,0,0.69467788,-104.6214,-57.027324)">
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:6.35px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#37abc8;fill-opacity:1;stroke:none;stroke-width:0.400612"
|
||||
x="221.50526"
|
||||
y="173.96935"
|
||||
id="text48"><tspan
|
||||
sodipodi:role="line"
|
||||
x="221.50526"
|
||||
y="173.96935"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#37abc8;stroke-width:0.400612"
|
||||
id="tspan48">SX</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:6.35px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#37abc8;fill-opacity:1;stroke:none;stroke-width:0.400612"
|
||||
x="238.1783"
|
||||
y="173.96935"
|
||||
id="text49"><tspan
|
||||
sodipodi:role="line"
|
||||
x="238.1783"
|
||||
y="173.96935"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#37abc8;stroke-width:0.400612"
|
||||
id="tspan49">GE</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:6.35px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#37abc8;fill-opacity:1;stroke:none;stroke-width:0.400612"
|
||||
x="255.66414"
|
||||
y="173.96935"
|
||||
id="text50"><tspan
|
||||
sodipodi:role="line"
|
||||
x="255.66414"
|
||||
y="173.96935"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#37abc8;stroke-width:0.400612"
|
||||
id="tspan50">SPI</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:6.35px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.400612"
|
||||
x="273.01663"
|
||||
y="173.96935"
|
||||
id="text51"><tspan
|
||||
sodipodi:role="line"
|
||||
x="273.01663"
|
||||
y="173.96935"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.400612"
|
||||
id="tspan51">SC</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:6.35px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.400612"
|
||||
x="289.11816"
|
||||
y="173.97888"
|
||||
id="text52"><tspan
|
||||
sodipodi:role="line"
|
||||
x="289.11816"
|
||||
y="173.97888"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.400612"
|
||||
id="tspan52">PA</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:6.35px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff2a2a;fill-opacity:1;stroke:none;stroke-width:0.400612"
|
||||
x="311.40778"
|
||||
y="174.08365"
|
||||
id="text53"><tspan
|
||||
sodipodi:role="line"
|
||||
x="311.40778"
|
||||
y="174.08365"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff2a2a;stroke-width:0.400612"
|
||||
id="tspan53">Cache</tspan></text>
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.529167;stroke-linecap:square;stroke-dasharray:none;stroke-dashoffset:0;marker-end:url(#ArrowWideHeavy)"
|
||||
d="m 226.31089,171.70241 h 6.95598"
|
||||
id="path53"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.529167;stroke-linecap:square;stroke-dasharray:none;stroke-dashoffset:0;marker-end:url(#ArrowWideHeavy)"
|
||||
d="m 242.81883,171.70241 h 6.95598"
|
||||
id="path54"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.529167;stroke-linecap:square;stroke-dasharray:none;stroke-dashoffset:0;marker-end:url(#ArrowWideHeavy)"
|
||||
d="m 261.37781,171.70241 h 6.95598"
|
||||
id="path55"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.529167;stroke-linecap:square;stroke-dasharray:none;stroke-dashoffset:0;marker-end:url(#ArrowWideHeavy)"
|
||||
d="m 277.50475,171.70241 h 6.95598"
|
||||
id="path56"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.529167;stroke-linecap:square;stroke-dasharray:none;stroke-dashoffset:0;marker-end:url(#ArrowWideHeavy)"
|
||||
d="m 294.08254,171.70241 h 6.95598"
|
||||
id="path57"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.529167;stroke-linecap:square;stroke-dasharray:none;stroke-dashoffset:0;marker-end:url(#ArrowWideHeavy)"
|
||||
d="m 189.90312,171.70241 h 26.34385"
|
||||
id="path60"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.529167;stroke-linecap:square;stroke-dasharray:none;stroke-dashoffset:0;marker-end:url(#ArrowWideHeavy)"
|
||||
d="m 311.60514,176.14239 v 9.61994 H 184.98772"
|
||||
id="path61"
|
||||
sodipodi:nodetypes="ccc" />
|
||||
</g>
|
||||
<path
|
||||
style="fill:#37c871;stroke:#00d455;stroke-width:0.367601;stroke-linecap:square;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
d="m 40.698106,46.362333 4.844663,13.377322"
|
||||
id="path62"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#37c871;stroke:#00d455;stroke-width:0.367601;stroke-linecap:square;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
d="m 52.62426,46.362333 4.844663,13.377322"
|
||||
id="path63"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#37c871;stroke:#00d455;stroke-width:0.367601;stroke-linecap:square;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
d="m 64.55042,46.362333 4.844663,13.377322"
|
||||
id="path64"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#37c871;stroke:#00d455;stroke-width:0.367601;stroke-linecap:square;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
d="m 75.962512,46.362333 4.844663,13.377322"
|
||||
id="path65"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#37c871;stroke:#00d455;stroke-width:0.367601;stroke-linecap:square;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
d="m 87.580235,46.362333 4.844663,13.377322"
|
||||
id="path66"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:4.4112px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#37abc8;fill-opacity:1;stroke:none;stroke-width:0.278297"
|
||||
x="37.018822"
|
||||
y="45.730473"
|
||||
id="text2"><tspan
|
||||
sodipodi:role="line"
|
||||
x="37.018822"
|
||||
y="45.730473"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.4112px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#37abc8;stroke-width:0.278297"
|
||||
id="tspan2">SX</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:4.4112px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#37abc8;fill-opacity:1;stroke:none;stroke-width:0.278297"
|
||||
x="48.601212"
|
||||
y="45.730473"
|
||||
id="text3"><tspan
|
||||
sodipodi:role="line"
|
||||
x="48.601212"
|
||||
y="45.730473"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.4112px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#37abc8;stroke-width:0.278297"
|
||||
id="tspan3">GE</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:4.4112px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#37abc8;fill-opacity:1;stroke:none;stroke-width:0.278297"
|
||||
x="60.748234"
|
||||
y="45.730473"
|
||||
id="text4"><tspan
|
||||
sodipodi:role="line"
|
||||
x="60.748234"
|
||||
y="45.730473"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.4112px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#37abc8;stroke-width:0.278297"
|
||||
id="tspan4">SPI</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:4.4112px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.278297"
|
||||
x="72.802635"
|
||||
y="45.730473"
|
||||
id="text11"><tspan
|
||||
sodipodi:role="line"
|
||||
x="72.802635"
|
||||
y="45.730473"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.4112px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.278297"
|
||||
id="tspan11">SC</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:4.4112px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.278297"
|
||||
x="83.988014"
|
||||
y="45.737099"
|
||||
id="text13"><tspan
|
||||
sodipodi:role="line"
|
||||
x="83.988014"
|
||||
y="45.737099"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.4112px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.278297"
|
||||
id="tspan13">PA</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:4.4112px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff2a2a;fill-opacity:1;stroke:none;stroke-width:0.278297"
|
||||
x="99.472122"
|
||||
y="45.809875"
|
||||
id="text14"><tspan
|
||||
sodipodi:role="line"
|
||||
x="99.472122"
|
||||
y="45.809875"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.4112px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff2a2a;stroke-width:0.278297"
|
||||
id="tspan14">Cache</tspan></text>
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.367601;stroke-linecap:square;stroke-dasharray:none;stroke-dashoffset:0;marker-end:url(#ArrowWideHeavy)"
|
||||
d="m 40.357179,44.155689 h 4.832165"
|
||||
id="path44"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.367601;stroke-linecap:square;stroke-dasharray:none;stroke-dashoffset:0;marker-end:url(#ArrowWideHeavy)"
|
||||
d="m 51.82488,44.155689 h 4.832165"
|
||||
id="path45"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.367601;stroke-linecap:square;stroke-dasharray:none;stroke-dashoffset:0;marker-end:url(#ArrowWideHeavy)"
|
||||
d="m 64.717393,44.155689 h 4.832165"
|
||||
id="path46"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.367601;stroke-linecap:square;stroke-dasharray:none;stroke-dashoffset:0;marker-end:url(#ArrowWideHeavy)"
|
||||
d="m 75.920422,44.155689 h 4.832165"
|
||||
id="path47"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.367601;stroke-linecap:square;stroke-dasharray:none;stroke-dashoffset:0;marker-end:url(#ArrowWideHeavy)"
|
||||
d="m 87.436645,44.155689 h 4.832166"
|
||||
id="path48"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.367601;stroke-linecap:square;stroke-dasharray:none;stroke-dashoffset:0;marker-end:url(#ArrowWideHeavy)"
|
||||
d="m 24.215741,44.155689 h 7.813702"
|
||||
id="path58"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:0.367601;stroke-linecap:square;stroke-dasharray:none;stroke-dashoffset:0;marker-end:url(#ArrowWideHeavy)"
|
||||
d="m 100.63732,46.931607 v 6.68276 H 29.848557"
|
||||
id="path59"
|
||||
sodipodi:nodetypes="ccc" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 21 KiB |
|
|
@ -8,6 +8,7 @@ Next (GCN), Radeon DNA (RDNA), and Compute DNA (CDNA) architectures.
|
|||
.. toctree::
|
||||
|
||||
driver-core
|
||||
ring-buffer
|
||||
amd-hardware-list-info
|
||||
module-parameters
|
||||
gc/index
|
||||
|
|
|
|||
707
Documentation/gpu/amdgpu/no_enforce_isolation.svg
Normal file
707
Documentation/gpu/amdgpu/no_enforce_isolation.svg
Normal file
|
|
@ -0,0 +1,707 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="68.949203mm"
|
||||
height="86.909332mm"
|
||||
viewBox="0 0 68.949202 86.909332"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
|
||||
sodipodi:docname="enforce_isolation.svg"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:zoom="1.7877362"
|
||||
inkscape:cx="291.15034"
|
||||
inkscape:cy="332.54347"
|
||||
inkscape:window-width="3072"
|
||||
inkscape:window-height="1651"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="g61" />
|
||||
<defs
|
||||
id="defs1">
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="ArrowWideHeavy"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto-start-reverse"
|
||||
inkscape:stockid="Wide, heavy arrow"
|
||||
markerWidth="1"
|
||||
markerHeight="1"
|
||||
viewBox="0 0 1 1"
|
||||
inkscape:isstock="true"
|
||||
inkscape:collect="always"
|
||||
preserveAspectRatio="xMidYMid">
|
||||
<path
|
||||
style="fill:context-stroke;fill-rule:evenodd;stroke:none"
|
||||
d="m 1,0 -3,3 h -2 l 3,-3 -3,-3 h 2 z"
|
||||
id="path3" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Dot"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Dot"
|
||||
markerWidth="1"
|
||||
markerHeight="1"
|
||||
viewBox="0 0 1 1"
|
||||
inkscape:isstock="true"
|
||||
inkscape:collect="always"
|
||||
preserveAspectRatio="xMidYMid">
|
||||
<path
|
||||
transform="scale(0.5)"
|
||||
style="fill:context-stroke;fill-rule:evenodd;stroke:none"
|
||||
d="M 5,0 C 5,2.76 2.76,5 0,5 -2.76,5 -5,2.76 -5,0 c 0,-2.76 2.3,-5 5,-5 2.76,0 5,2.24 5,5 z"
|
||||
sodipodi:nodetypes="sssss"
|
||||
id="path98" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="marker99"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Dot"
|
||||
markerWidth="1"
|
||||
markerHeight="1"
|
||||
viewBox="0 0 1 1"
|
||||
inkscape:isstock="true"
|
||||
inkscape:collect="always"
|
||||
preserveAspectRatio="xMidYMid">
|
||||
<path
|
||||
transform="scale(0.5)"
|
||||
style="fill:context-stroke;fill-rule:evenodd;stroke:none"
|
||||
d="M 5,0 C 5,2.76 2.76,5 0,5 -2.76,5 -5,2.76 -5,0 c 0,-2.76 2.3,-5 5,-5 2.76,0 5,2.24 5,5 z"
|
||||
sodipodi:nodetypes="sssss"
|
||||
id="path99" />
|
||||
</marker>
|
||||
</defs>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(72.009598,0.94510132)">
|
||||
<g
|
||||
id="g61">
|
||||
<rect
|
||||
style="fill:#ffffff;stroke:none;stroke-width:0.25654;stroke-linecap:square;stroke-dasharray:none"
|
||||
id="rect6"
|
||||
width="68.949203"
|
||||
height="86.909332"
|
||||
x="-72.009598"
|
||||
y="-0.94510132" />
|
||||
<g
|
||||
id="g15"
|
||||
transform="matrix(0.42247861,0,0,0.42247861,-70.575576,-29.756289)">
|
||||
<path
|
||||
id="path33"
|
||||
style="fill:none;stroke:#000000;stroke-width:0.721067;stroke-dasharray:none"
|
||||
d="M 30.278993,176.45537 A 22.905334,22.905334 0 0 0 7.3737955,199.36057 22.905334,22.905334 0 0 0 30.278993,222.26603 22.905334,22.905334 0 0 0 53.18445,199.36057 22.905334,22.905334 0 0 0 30.278993,176.45537 Z m 0,7.13274 a 15.772359,15.772359 0 0 1 15.77246,15.77246 15.772359,15.772359 0 0 1 -15.77246,15.77246 15.772359,15.772359 0 0 1 -15.772206,-15.77246 15.772359,15.772359 0 0 1 15.772206,-15.77246 z" />
|
||||
<g
|
||||
id="g14">
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 46.31405,200.72093 h 6.430134"
|
||||
id="path34"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="M 7.6848605,200.72093 H 14.114993"
|
||||
id="path35"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 30.103415,176.7326 v 6.43014"
|
||||
id="path36"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="M 30.103415,215.50586 V 221.936"
|
||||
id="path37"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 36.501694,214.1052 3.21507,5.56866"
|
||||
id="path38"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 36.501694,184.66805 3.21507,-5.56866"
|
||||
id="path39"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 23.652811,184.66805 -3.21507,-5.56866"
|
||||
id="path40"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 23.652811,214.05288 -3.21507,5.56866"
|
||||
id="path41"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 43.31839,208.65101 4.546794,4.5468"
|
||||
id="path42"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 43.31839,189.96525 4.546794,-4.5468"
|
||||
id="path43"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="M 17.202394,189.96525 12.6556,185.41845"
|
||||
id="path44-1"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 16.940766,208.65101 -4.546794,4.5468"
|
||||
id="path45-8"
|
||||
sodipodi:nodetypes="cc" />
|
||||
</g>
|
||||
</g>
|
||||
<rect
|
||||
style="fill:#afe9c6;stroke:#16502d;stroke-width:0.257104;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
id="rect80"
|
||||
width="25.076588"
|
||||
height="10.493422"
|
||||
x="-71.362038"
|
||||
y="74.63459"
|
||||
ry="1.4529352" />
|
||||
<rect
|
||||
style="fill:#80e5ff;stroke:#00aad4;stroke-width:0.257104;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
id="rect81"
|
||||
width="32.714355"
|
||||
height="10.436013"
|
||||
x="-40.481403"
|
||||
y="74.663292"
|
||||
ry="1.4449863" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:6.53042px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-59.013123"
|
||||
y="82.212669"
|
||||
id="text14-7"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-59.013123"
|
||||
y="82.212669"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.53042px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.102999"
|
||||
id="tspan14-7">GFX</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:6.53042px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-24.387218"
|
||||
y="81.46167"
|
||||
id="text95"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-24.387218"
|
||||
y="81.46167"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.53042px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.102999"
|
||||
id="tspan95">Compute</tspan></text>
|
||||
<path
|
||||
style="fill:#de8787;stroke:#000000;stroke-width:0.385656;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none;marker-start:url(#Dot);marker-end:url(#marker99)"
|
||||
d="M -58.079264,73.89605 V 65.448872"
|
||||
id="path127"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.90242px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-61.752651"
|
||||
y="3.1995225"
|
||||
id="text112"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-61.752651"
|
||||
y="3.1995225"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.90242px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.102999"
|
||||
id="tspan112">Processes</tspan></text>
|
||||
<rect
|
||||
style="fill:none;stroke:#000000;stroke-width:0.247306;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:1.48383, 1.48383;stroke-dashoffset:0"
|
||||
id="rect113"
|
||||
width="64.703476"
|
||||
height="19.562067"
|
||||
x="-68.52655"
|
||||
y="4.468956"
|
||||
ry="1.6976216" />
|
||||
<g
|
||||
id="g84"
|
||||
transform="matrix(0.25710378,0,0,0.25710378,0.68647434,8.7899633)">
|
||||
<g
|
||||
id="g83">
|
||||
<circle
|
||||
style="fill:#ffffff;stroke:#ff00ff;stroke-width:1.62704;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
id="circle137"
|
||||
cx="-225.65012"
|
||||
cy="20.747513"
|
||||
r="30.822298" />
|
||||
</g>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:16.9333px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff00ff;fill-opacity:1;stroke:none;stroke-width:0.400612"
|
||||
x="-225.65012"
|
||||
y="26.8181"
|
||||
id="text113"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-225.65012"
|
||||
y="26.8181"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:16.9333px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff00ff;stroke-width:0.400612"
|
||||
id="tspan113">A</tspan></text>
|
||||
</g>
|
||||
<g
|
||||
id="g85"
|
||||
transform="matrix(0.25710378,0,0,0.25710378,20.618429,8.7899633)">
|
||||
<circle
|
||||
style="fill:#ffffff;stroke:#ff9955;stroke-width:1.62704;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
id="circle112"
|
||||
cx="-207.94376"
|
||||
cy="20.747513"
|
||||
r="30.822298" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:16.9333px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff9955;fill-opacity:1;stroke:none;stroke-width:0.400612"
|
||||
x="-208.25702"
|
||||
y="26.792702"
|
||||
id="text114"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-208.25702"
|
||||
y="26.792702"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:16.9333px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff9955;stroke-width:0.400612"
|
||||
id="tspan114">B</tspan></text>
|
||||
</g>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.17681px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff00ff;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-56.126556"
|
||||
y="47.212101"
|
||||
id="text6"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-56.126556"
|
||||
y="47.212101"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.17681px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff00ff;stroke-width:0.102999"
|
||||
id="tspan6">A</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.26752px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-57.861526"
|
||||
y="53.902462"
|
||||
id="text136"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-57.861526"
|
||||
y="53.902462"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.26752px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.102999"
|
||||
id="tspan136">Ring</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
x="-57.861526"
|
||||
y="56.736862"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.26752px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.102999"
|
||||
id="tspan137">Buffer</tspan></text>
|
||||
<g
|
||||
id="g80"
|
||||
transform="matrix(0.42247861,0,0,0.42247861,-37.21188,-29.756289)">
|
||||
<path
|
||||
id="path67"
|
||||
style="fill:none;stroke:#000000;stroke-width:0.721067;stroke-dasharray:none"
|
||||
d="M 30.278993,176.45537 A 22.905334,22.905334 0 0 0 7.3737955,199.36057 22.905334,22.905334 0 0 0 30.278993,222.26603 22.905334,22.905334 0 0 0 53.18445,199.36057 22.905334,22.905334 0 0 0 30.278993,176.45537 Z m 0,7.13274 a 15.772359,15.772359 0 0 1 15.77246,15.77246 15.772359,15.772359 0 0 1 -15.77246,15.77246 15.772359,15.772359 0 0 1 -15.772206,-15.77246 15.772359,15.772359 0 0 1 15.772206,-15.77246 z" />
|
||||
<g
|
||||
id="g79">
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 46.31405,200.72093 h 6.430134"
|
||||
id="path68"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="M 7.6848605,200.72093 H 14.114993"
|
||||
id="path69"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 30.103415,176.7326 v 6.43014"
|
||||
id="path70"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="M 30.103415,215.50586 V 221.936"
|
||||
id="path71"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 36.501694,214.1052 3.21507,5.56866"
|
||||
id="path72"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 36.501694,184.66805 3.21507,-5.56866"
|
||||
id="path73"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 23.652811,184.66805 -3.21507,-5.56866"
|
||||
id="path74"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 23.652811,214.05288 -3.21507,5.56866"
|
||||
id="path75"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 43.31839,208.65101 4.546794,4.5468"
|
||||
id="path76"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 43.31839,189.96525 4.546794,-4.5468"
|
||||
id="path77"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="M 17.202394,189.96525 12.6556,185.41845"
|
||||
id="path78"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none"
|
||||
d="m 16.940766,208.65101 -4.546794,4.5468"
|
||||
id="path79"
|
||||
sodipodi:nodetypes="cc" />
|
||||
</g>
|
||||
</g>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.26752px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-24.497828"
|
||||
y="53.902462"
|
||||
id="text81"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-24.497828"
|
||||
y="53.902462"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.26752px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.102999"
|
||||
id="tspan80">Ring</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
x="-24.497828"
|
||||
y="56.736862"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.26752px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.102999"
|
||||
id="tspan81">Buffer</tspan></text>
|
||||
<path
|
||||
style="fill:#de8787;stroke:#000000;stroke-width:0.385656;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none;marker-start:url(#Dot);marker-end:url(#marker99)"
|
||||
d="M -24.338879,73.89605 V 65.448872"
|
||||
id="path81"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.17681px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff00ff;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-52.574932"
|
||||
y="48.826473"
|
||||
id="text82"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-52.574932"
|
||||
y="48.826473"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.17681px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff00ff;stroke-width:0.102999"
|
||||
id="tspan82">A</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.17681px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff00ff;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-50.045757"
|
||||
y="52.862404"
|
||||
id="text83"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-50.045757"
|
||||
y="52.862404"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.17681px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff00ff;stroke-width:0.102999"
|
||||
id="tspan83">A</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.17681px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff00ff;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-31.907158"
|
||||
y="58.226768"
|
||||
id="text83-59"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-31.907158"
|
||||
y="58.226768"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.17681px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff00ff;stroke-width:0.102999"
|
||||
id="tspan83-7">A</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.17681px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff00ff;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-32.436516"
|
||||
y="53.169308"
|
||||
id="text83-59-3"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-32.436516"
|
||||
y="53.169308"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.17681px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff00ff;stroke-width:0.102999"
|
||||
id="tspan83-7-6">A</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.17681px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff00ff;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-65.422112"
|
||||
y="57.972916"
|
||||
id="text83-7"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-65.422112"
|
||||
y="57.972916"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.17681px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff00ff;stroke-width:0.102999"
|
||||
id="tspan83-8">A</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.17681px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff00ff;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-65.713165"
|
||||
y="52.732723"
|
||||
id="text83-7-4"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-65.713165"
|
||||
y="52.732723"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.17681px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff00ff;stroke-width:0.102999"
|
||||
id="tspan83-8-3">A</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.17681px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-52.897129"
|
||||
y="61.668709"
|
||||
id="text83-5"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-52.897129"
|
||||
y="61.668709"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.17681px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff0000;stroke-width:0.102999"
|
||||
id="tspan83-4">C</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.17681px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-19.174068"
|
||||
y="49.045818"
|
||||
id="text83-5-9"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-19.174068"
|
||||
y="49.045818"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.17681px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff0000;stroke-width:0.102999"
|
||||
id="tspan83-4-2">C</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.17681px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-16.531792"
|
||||
y="53.259804"
|
||||
id="text83-5-9-9"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-16.531792"
|
||||
y="53.259804"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.17681px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff0000;stroke-width:0.102999"
|
||||
id="tspan83-4-2-5">C</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.17681px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff9955;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-19.325029"
|
||||
y="61.488995"
|
||||
id="text83-5-9-9-7"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-19.325029"
|
||||
y="61.488995"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.17681px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff9955;stroke-width:0.102999"
|
||||
id="tspan83-4-2-5-2">B</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.17681px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff9955;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-22.869593"
|
||||
y="63.231686"
|
||||
id="text83-5-9-9-7-0"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-22.869593"
|
||||
y="63.231686"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.17681px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff9955;stroke-width:0.102999"
|
||||
id="tspan83-4-2-5-2-6">B</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.17681px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff9955;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-26.235374"
|
||||
y="63.331181"
|
||||
id="text83-5-9-9-7-0-4"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-26.235374"
|
||||
y="63.331181"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.17681px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff9955;stroke-width:0.102999"
|
||||
id="tspan83-4-2-5-2-6-9">B</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.17681px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-56.235538"
|
||||
y="63.072704"
|
||||
id="text83-5-6"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-56.235538"
|
||||
y="63.072704"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.17681px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff0000;stroke-width:0.102999"
|
||||
id="tspan83-4-9">C</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:2.17681px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.102999"
|
||||
x="-59.697765"
|
||||
y="63.066635"
|
||||
id="text83-5-6-5"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-59.697765"
|
||||
y="63.066635"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.17681px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff0000;stroke-width:0.102999"
|
||||
id="tspan83-4-9-2">C</tspan></text>
|
||||
<circle
|
||||
style="fill:#ffcc00;stroke:#00d455;stroke-width:0.213261;stroke-linecap:square;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
id="path83"
|
||||
cx="-50.145481"
|
||||
cy="57.387428"
|
||||
r="1.0712636" />
|
||||
<circle
|
||||
style="fill:#ffcc00;stroke:#00d455;stroke-width:0.213261;stroke-linecap:square;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
id="path83-7"
|
||||
cx="-16.886913"
|
||||
cy="57.596024"
|
||||
r="1.0712636" />
|
||||
<circle
|
||||
style="fill:#ffcc00;stroke:#00d455;stroke-width:0.213261;stroke-linecap:square;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
id="path83-7-7"
|
||||
cx="-29.53648"
|
||||
cy="60.832634"
|
||||
r="1.0712636" />
|
||||
<circle
|
||||
style="fill:#ffcc00;stroke:#00d455;stroke-width:0.213261;stroke-linecap:square;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
id="path83-7-7-9"
|
||||
cx="-29.751556"
|
||||
cy="48.260994"
|
||||
r="1.0712636" />
|
||||
<circle
|
||||
style="fill:#ffcc00;stroke:#00d455;stroke-width:0.213261;stroke-linecap:square;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
id="path83-4"
|
||||
cx="-63.051891"
|
||||
cy="60.73439"
|
||||
r="1.0712636" />
|
||||
<circle
|
||||
style="fill:#ffcc00;stroke:#00d455;stroke-width:0.213261;stroke-linecap:square;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
id="path83-4-2"
|
||||
cx="-63.022129"
|
||||
cy="48.24374"
|
||||
r="1.0712636" />
|
||||
<g
|
||||
id="g86"
|
||||
transform="matrix(0.25710378,0,0,0.25710378,17.422136,8.7899633)">
|
||||
<circle
|
||||
style="fill:#ffffff;stroke:#ff0000;stroke-width:1.62704;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
id="circle84"
|
||||
cx="-121.9205"
|
||||
cy="20.747513"
|
||||
r="30.822298" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:16.9333px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff9955;fill-opacity:1;stroke:none;stroke-width:0.400612"
|
||||
x="-122.11524"
|
||||
y="26.792702"
|
||||
id="text84"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-122.11524"
|
||||
y="26.792702"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:16.9333px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#ff0000;stroke-width:0.400612"
|
||||
id="tspan84">C</tspan></text>
|
||||
</g>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:2.17681px;font-family:'Linux Libertine O';-inkscape-font-specification:'Linux Libertine O';text-align:start;letter-spacing:1.26323px;writing-mode:lr-tb;direction:ltr;text-anchor:start;fill:none;stroke:#000000;stroke-width:0.257104;stroke-linecap:square;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
x="-140.03215"
|
||||
y="26.074423"
|
||||
id="text86"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan86"
|
||||
style="stroke-width:0.257104"
|
||||
x="-140.03215"
|
||||
y="26.074423" /></text>
|
||||
<g
|
||||
id="g90"
|
||||
transform="matrix(0.25710378,0,0,0.25710378,18.175509,7.82134)">
|
||||
<rect
|
||||
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
id="rect86"
|
||||
width="92.604057"
|
||||
height="26.883123"
|
||||
x="-338.30258"
|
||||
y="93.635468" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:8.81944px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.400612"
|
||||
x="-291.13989"
|
||||
y="110.58046"
|
||||
id="text88"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-291.13989"
|
||||
y="110.58046"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:8.81944px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.400612"
|
||||
id="tspan88">Enforce Isolation</tspan></text>
|
||||
</g>
|
||||
<g
|
||||
id="g89"
|
||||
transform="matrix(0.25710378,0,0,0.25710378,18.606009,7.82134)">
|
||||
<rect
|
||||
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
id="rect89"
|
||||
width="119.67937"
|
||||
height="26.749132"
|
||||
x="-219.35185"
|
||||
y="93.702461" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:8.81944px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.400612"
|
||||
x="-159.57832"
|
||||
y="110.40636"
|
||||
id="text89"><tspan
|
||||
sodipodi:role="line"
|
||||
x="-159.57832"
|
||||
y="110.40636"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:8.81944px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle;fill:#1c241c;stroke-width:0.400612"
|
||||
id="tspan89">Enforce Isolation</tspan></text>
|
||||
</g>
|
||||
<path
|
||||
style="fill:#de8787;stroke:#000000;stroke-width:0.385656;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none;marker-start:url(#Dot);marker-end:url(#marker99)"
|
||||
d="M -57.807162,43.759556 V 39.878518"
|
||||
id="path90"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#de8787;stroke:#000000;stroke-width:0.385656;stroke-linecap:square;stroke-linejoin:miter;stroke-dasharray:none;marker-start:url(#Dot);marker-end:url(#marker99)"
|
||||
d="M -24.512426,43.759556 V 39.878518"
|
||||
id="path91"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#ff00ff;stroke-width:0.257104;stroke-linecap:square;stroke-dasharray:none;marker-end:url(#ArrowWideHeavy)"
|
||||
d="m -57.329023,22.418572 v 9.208373"
|
||||
id="path1" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#ff9955;stroke-width:0.257104;stroke-linecap:square;stroke-dasharray:none;marker-end:url(#ArrowWideHeavy)"
|
||||
d="m -32.844695,22.418572 v 9.208373"
|
||||
id="path2" />
|
||||
<path
|
||||
style="fill:#ff00ff;stroke:#ff0000;stroke-width:0.257104;stroke-linecap:square;stroke-dasharray:none;marker-end:url(#ArrowWideHeavy)"
|
||||
d="m -13.924085,22.418572 v 9.208373"
|
||||
id="path4" />
|
||||
<path
|
||||
style="fill:none;stroke:#ff00ff;stroke-width:0.257104;stroke-linecap:square;stroke-dasharray:none;marker-end:url(#ArrowWideHeavy)"
|
||||
d="m -57.329023,22.418572 v 5.174952 h 20.852017 v 4.033421"
|
||||
id="path5"
|
||||
sodipodi:nodetypes="cccc" />
|
||||
<path
|
||||
style="fill:none;stroke:#ff0000;stroke-width:0.257104;stroke-linecap:square;stroke-dasharray:none;marker-end:url(#ArrowWideHeavy)"
|
||||
d="m -13.924085,22.418572 v 3.652908 h -34.777483 v 5.555465"
|
||||
id="path6"
|
||||
sodipodi:nodetypes="cccc" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 36 KiB |
|
|
@ -1,3 +1,4 @@
|
|||
.. _amdgpu-process-isolation:
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
=========================
|
||||
|
|
|
|||
95
Documentation/gpu/amdgpu/ring-buffer.rst
Normal file
95
Documentation/gpu/amdgpu/ring-buffer.rst
Normal file
|
|
@ -0,0 +1,95 @@
|
|||
=============
|
||||
Ring Buffer
|
||||
=============
|
||||
|
||||
To handle communication between user space and kernel space, AMD GPUs use a
|
||||
ring buffer design to feed the engines (GFX, Compute, SDMA, UVD, VCE, VCN, VPE,
|
||||
etc.). See the figure below that illustrates how this communication works:
|
||||
|
||||
.. kernel-figure:: ring_buffers.svg
|
||||
|
||||
Ring buffers in the amdgpu work as a producer-consumer model, where userspace
|
||||
acts as the producer, constantly filling the ring buffer with GPU commands to
|
||||
be executed. Meanwhile, the GPU retrieves the information from the ring, parses
|
||||
it, and distributes the specific set of instructions between the different
|
||||
amdgpu blocks.
|
||||
|
||||
Notice from the diagram that the ring has a Read Pointer (rptr), which
|
||||
indicates where the engine is currently reading packets from the ring, and a
|
||||
Write Pointer (wptr), which indicates how many packets software has added to
|
||||
the ring. When the rptr and wptr are equal, the ring is idle. When software
|
||||
adds packets to the ring, it updates the wptr, this causes the engine to start
|
||||
fetching and processing packets. As the engine processes packets, the rptr gets
|
||||
updates until the rptr catches up to the wptr and they are equal again.
|
||||
|
||||
Usually, ring buffers in the driver have a limited size (search for occurrences
|
||||
of `amdgpu_ring_init()`). One of the reasons for the small ring buffer size is
|
||||
that CP (Command Processor) is capable of following addresses inserted into the
|
||||
ring; this is illustrated in the image by the reference to the IB (Indirect
|
||||
Buffer). The IB gives userspace the possibility to have an area in memory that
|
||||
CP can read and feed the hardware with extra instructions.
|
||||
|
||||
All ASICs pre-GFX11 use what is called a kernel queue, which means
|
||||
the ring is allocated in kernel space and has some restrictions, such as not
|
||||
being able to be :ref:`preempted directly by the scheduler<amdgpu-mes>`. GFX11
|
||||
and newer support kernel queues, but also provide a new mechanism named
|
||||
:ref:`user queues<amdgpu-userq>`, where the queue is moved to the user space
|
||||
and can be mapped and unmapped via the scheduler. In practice, both queues
|
||||
insert user-space-generated GPU commands from different jobs into the requested
|
||||
component ring.
|
||||
|
||||
Enforce Isolation
|
||||
=================
|
||||
|
||||
.. note:: After reading this section, you might want to check the
|
||||
:ref:`Process Isolation<amdgpu-process-isolation>` page for more details.
|
||||
|
||||
Before examining the Enforce Isolation mechanism in the ring buffer context, it
|
||||
is helpful to briefly discuss how instructions from the ring buffer are
|
||||
processed in the graphics pipeline. Let’s expand on this topic by checking the
|
||||
diagram below that illustrates the graphics pipeline:
|
||||
|
||||
.. kernel-figure:: gfx_pipeline_seq.svg
|
||||
|
||||
In terms of executing instructions, the GFX pipeline follows the sequence:
|
||||
Shader Export (SX), Geometry Engine (GE), Shader Process or Input (SPI), Scan
|
||||
Converter (SC), Primitive Assembler (PA), and cache manipulation (which may
|
||||
vary across ASICs). Another common way to describe the pipeline is to use Pixel
|
||||
Shader (PS), raster, and Vertex Shader (VS) to symbolize the two shader stages.
|
||||
Now, with this pipeline in mind, let's assume that Job B causes a hang issue,
|
||||
but Job C's instruction might already be executing, leading developers to
|
||||
incorrectly identify Job C as the problematic one. This problem can be
|
||||
mitigated on multiple levels; the diagram below illustrates how to minimize
|
||||
part of this problem:
|
||||
|
||||
.. kernel-figure:: no_enforce_isolation.svg
|
||||
|
||||
Note from the diagram that there is no guarantee of order or a clear separation
|
||||
between instructions, which is not a problem most of the time, and is also good
|
||||
for performance. Furthermore, notice some circles between jobs in the diagram
|
||||
that represent a **fence wait** used to avoid overlapping work in the ring. At
|
||||
the end of the fence, a cache flush occurs, ensuring that when the next job
|
||||
starts, it begins in a clean state and, if issues arise, the developer can
|
||||
pinpoint the problematic process more precisely.
|
||||
|
||||
To increase the level of isolation between jobs, there is the "Enforce
|
||||
Isolation" method described in the picture below:
|
||||
|
||||
.. kernel-figure:: enforce_isolation.svg
|
||||
|
||||
As shown in the diagram, enforcing isolation introduces ordering between
|
||||
submissions, since the access to GFX/Compute is serialized, think about it as
|
||||
single process at a time mode for gfx/compute. Notice that this approach has a
|
||||
significant performance impact, as it allows only one job to submit commands at
|
||||
a time. However, this option can help pinpoint the job that caused the problem.
|
||||
Although enforcing isolation improves the situation, it does not fully resolve
|
||||
the issue of precisely pinpointing bad jobs, since isolation might mask the
|
||||
problem. In summary, identifying which job caused the issue may not be precise,
|
||||
but enforcing isolation might help with the debugging.
|
||||
|
||||
Ring Operations
|
||||
===============
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
|
||||
:internal:
|
||||
|
||||
1633
Documentation/gpu/amdgpu/ring_buffers.svg
Normal file
1633
Documentation/gpu/amdgpu/ring_buffers.svg
Normal file
File diff suppressed because it is too large
Load diff
|
After Width: | Height: | Size: 86 KiB |
|
|
@ -1,3 +1,5 @@
|
|||
.. _amdgpu-userq:
|
||||
|
||||
==================
|
||||
User Mode Queues
|
||||
==================
|
||||
|
|
|
|||
|
|
@ -155,7 +155,12 @@ drm_gem_object_init() will create an shmfs file of the
|
|||
requested size and store it into the struct :c:type:`struct
|
||||
drm_gem_object <drm_gem_object>` filp field. The memory is
|
||||
used as either main storage for the object when the graphics hardware
|
||||
uses system memory directly or as a backing store otherwise.
|
||||
uses system memory directly or as a backing store otherwise. Drivers
|
||||
can call drm_gem_huge_mnt_create() to create, mount and use a huge
|
||||
shmem mountpoint instead of the default one ('shm_mnt'). For builds
|
||||
with CONFIG_TRANSPARENT_HUGEPAGE enabled, further calls to
|
||||
drm_gem_object_init() will let shmem allocate huge pages when
|
||||
possible.
|
||||
|
||||
Drivers are responsible for the actual physical pages allocation by
|
||||
calling shmem_read_mapping_page_gfp() for each page.
|
||||
|
|
@ -290,15 +295,27 @@ The open and close operations must update the GEM object reference
|
|||
count. Drivers can use the drm_gem_vm_open() and drm_gem_vm_close() helper
|
||||
functions directly as open and close handlers.
|
||||
|
||||
The fault operation handler is responsible for mapping individual pages
|
||||
to userspace when a page fault occurs. Depending on the memory
|
||||
allocation scheme, drivers can allocate pages at fault time, or can
|
||||
decide to allocate memory for the GEM object at the time the object is
|
||||
created.
|
||||
The fault operation handler is responsible for mapping pages to
|
||||
userspace when a page fault occurs. Depending on the memory allocation
|
||||
scheme, drivers can allocate pages at fault time, or can decide to
|
||||
allocate memory for the GEM object at the time the object is created.
|
||||
|
||||
Drivers that want to map the GEM object upfront instead of handling page
|
||||
faults can implement their own mmap file operation handler.
|
||||
|
||||
In order to reduce page table overhead, if the internal shmem mountpoint
|
||||
"shm_mnt" is configured to use transparent huge pages (for builds with
|
||||
CONFIG_TRANSPARENT_HUGEPAGE enabled) and if the shmem backing store
|
||||
managed to allocate a huge page for a faulty address, the fault handler
|
||||
will first attempt to insert that huge page into the VMA before falling
|
||||
back to individual page insertion. mmap() user address alignment for GEM
|
||||
objects is handled by providing a custom get_unmapped_area file
|
||||
operation which forwards to the shmem backing store. For most drivers,
|
||||
which don't create a huge mountpoint by default or through a module
|
||||
parameter, transparent huge pages can be enabled by either setting the
|
||||
"transparent_hugepage_shmem" kernel parameter or the
|
||||
"/sys/kernel/mm/transparent_hugepage/shmem_enabled" sysfs knob.
|
||||
|
||||
For platforms without MMU the GEM core provides a helper method
|
||||
drm_gem_dma_get_unmapped_area(). The mmap() routines will call this to get a
|
||||
proposed address for the mapping.
|
||||
|
|
|
|||
|
|
@ -41,8 +41,15 @@ trait [1] from the num crate.
|
|||
Having this generalization also helps with implementing a generic macro that
|
||||
automatically generates the corresponding mappings between a value and a number.
|
||||
|
||||
FromPrimitive support has been worked on in the past, but hasn't been followed
|
||||
since then [1].
|
||||
|
||||
There also have been considerations of ToPrimitive [2].
|
||||
|
||||
| Complexity: Beginner
|
||||
| Link: https://docs.rs/num/latest/num/trait.FromPrimitive.html
|
||||
| Link: https://lore.kernel.org/all/cover.1750689857.git.y.j3ms.n@gmail.com/ [1]
|
||||
| Link: https://rust-for-linux.zulipchat.com/#narrow/channel/288089-General/topic/Implement.20.60FromPrimitive.60.20trait.20.2B.20derive.20macro.20for.20nova-core/with/541971854 [2]
|
||||
|
||||
Generic register abstraction [REGA]
|
||||
-----------------------------------
|
||||
|
|
@ -134,21 +141,6 @@ A `num` core kernel module is being designed to provide these operations.
|
|||
| Complexity: Intermediate
|
||||
| Contact: Alexandre Courbot
|
||||
|
||||
IRQ abstractions
|
||||
----------------
|
||||
|
||||
Rust abstractions for IRQ handling.
|
||||
|
||||
There is active ongoing work from Daniel Almeida [1] for the "core" abstractions
|
||||
to request IRQs.
|
||||
|
||||
Besides optional review and testing work, the required ``pci::Device`` code
|
||||
around those core abstractions needs to be worked out.
|
||||
|
||||
| Complexity: Intermediate
|
||||
| Link: https://lore.kernel.org/lkml/20250122163932.46697-1-daniel.almeida@collabora.com/ [1]
|
||||
| Contact: Daniel Almeida
|
||||
|
||||
Page abstraction for foreign pages
|
||||
----------------------------------
|
||||
|
||||
|
|
@ -161,40 +153,16 @@ There is active onging work from Abdiel Janulgue [1] and Lina [2].
|
|||
| Link: https://lore.kernel.org/linux-mm/20241119112408.779243-1-abdiel.janulgue@gmail.com/ [1]
|
||||
| Link: https://lore.kernel.org/rust-for-linux/20250202-rust-page-v1-0-e3170d7fe55e@asahilina.net/ [2]
|
||||
|
||||
Scatterlist / sg_table abstractions
|
||||
-----------------------------------
|
||||
|
||||
Rust abstractions for scatterlist / sg_table.
|
||||
|
||||
There is preceding work from Abdiel Janulgue, which hasn't made it to the
|
||||
mailing list yet.
|
||||
|
||||
| Complexity: Intermediate
|
||||
| Contact: Abdiel Janulgue
|
||||
|
||||
PCI MISC APIs
|
||||
-------------
|
||||
|
||||
Extend the existing PCI device / driver abstractions by SR-IOV, config space,
|
||||
capability, MSI API abstractions.
|
||||
Extend the existing PCI device / driver abstractions by SR-IOV, capability, MSI
|
||||
API abstractions.
|
||||
|
||||
SR-IOV [1] is work in progress.
|
||||
|
||||
| Complexity: Beginner
|
||||
|
||||
XArray bindings [XARR]
|
||||
----------------------
|
||||
|
||||
We need bindings for `xa_alloc`/`xa_alloc_cyclic` in order to generate the
|
||||
auxiliary device IDs.
|
||||
|
||||
| Complexity: Intermediate
|
||||
|
||||
Debugfs abstractions
|
||||
--------------------
|
||||
|
||||
Rust abstraction for debugfs APIs.
|
||||
|
||||
| Reference: Export GSP log buffers
|
||||
| Complexity: Intermediate
|
||||
| Link: https://lore.kernel.org/all/20251119-rust-pci-sriov-v1-0-883a94599a97@redhat.com/ [1]
|
||||
|
||||
GPU (general)
|
||||
=============
|
||||
|
|
@ -233,7 +201,10 @@ Some possible options:
|
|||
- maple_tree
|
||||
- native Rust collections
|
||||
|
||||
There is work in progress for using drm_buddy [1].
|
||||
|
||||
| Complexity: Advanced
|
||||
| Link: https://lore.kernel.org/all/20251219203805.1246586-4-joelagnelf@nvidia.com/ [1]
|
||||
|
||||
Instance Memory
|
||||
---------------
|
||||
|
|
|
|||
|
|
@ -506,6 +506,22 @@ Contact: Maxime Ripard <mripard@kernel.org>,
|
|||
|
||||
Level: Intermediate
|
||||
|
||||
Convert users of of_drm_find_bridge() to of_drm_find_and_get_bridge()
|
||||
---------------------------------------------------------------------
|
||||
|
||||
Taking a struct drm_bridge pointer requires getting a reference and putting
|
||||
it after disposing of the pointer. Most functions returning a struct
|
||||
drm_bridge pointer already call drm_bridge_get() to increment the refcount
|
||||
and their users have been updated to call drm_bridge_put() when
|
||||
appropriate. of_drm_find_bridge() does not get a reference and it has been
|
||||
deprecated in favor of of_drm_find_and_get_bridge() which does, but some
|
||||
users still need to be converted.
|
||||
|
||||
Contact: Maxime Ripard <mripard@kernel.org>,
|
||||
Luca Ceresoli <luca.ceresoli@bootlin.com>
|
||||
|
||||
Level: Intermediate
|
||||
|
||||
Core refactorings
|
||||
=================
|
||||
|
||||
|
|
@ -878,6 +894,51 @@ Contact: Christian König
|
|||
|
||||
Level: Starter
|
||||
|
||||
DRM GPU Scheduler
|
||||
=================
|
||||
|
||||
Provide a universal successor for drm_sched_resubmit_jobs()
|
||||
-----------------------------------------------------------
|
||||
|
||||
drm_sched_resubmit_jobs() is deprecated. Main reason being that it leads to
|
||||
reinitializing dma_fences. See that function's docu for details. The better
|
||||
approach for valid resubmissions by amdgpu and Xe is (apparently) to figure out
|
||||
which job (and, through association: which entity) caused the hang. Then, the
|
||||
job's buffer data, together with all other jobs' buffer data currently in the
|
||||
same hardware ring, must be invalidated. This can for example be done by
|
||||
overwriting it. amdgpu currently determines which jobs are in the ring and need
|
||||
to be overwritten by keeping copies of the job. Xe obtains that information by
|
||||
directly accessing drm_sched's pending_list.
|
||||
|
||||
Tasks:
|
||||
|
||||
1. implement scheduler functionality through which the driver can obtain the
|
||||
information which *broken* jobs are currently in the hardware ring.
|
||||
2. Such infrastructure would then typically be used in
|
||||
drm_sched_backend_ops.timedout_job(). Document that.
|
||||
3. Port a driver as first user.
|
||||
4. Document the new alternative in the docu of deprecated
|
||||
drm_sched_resubmit_jobs().
|
||||
|
||||
Contact: Christian König <christian.koenig@amd.com>
|
||||
Philipp Stanner <phasta@kernel.org>
|
||||
|
||||
Level: Advanced
|
||||
|
||||
Add locking for runqueues
|
||||
-------------------------
|
||||
|
||||
There is an old FIXME by Sima in include/drm/gpu_scheduler.h. It details that
|
||||
struct drm_sched_rq is read at many places without any locks, not even with a
|
||||
READ_ONCE. At XDC 2025 no one could really tell why that is the case, whether
|
||||
locks are needed and whether they could be added. (But for real, that should
|
||||
probably be locked!). Check whether it's possible to add locks everywhere, and
|
||||
do so if yes.
|
||||
|
||||
Contact: Philipp Stanner <phasta@kernel.org>
|
||||
|
||||
Level: Intermediate
|
||||
|
||||
Outside DRM
|
||||
===========
|
||||
|
||||
|
|
|
|||
|
|
@ -7,6 +7,20 @@ Execution Queue
|
|||
.. kernel-doc:: drivers/gpu/drm/xe/xe_exec_queue.c
|
||||
:doc: Execution Queue
|
||||
|
||||
Multi Queue Group
|
||||
=================
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/xe/xe_exec_queue.c
|
||||
:doc: Multi Queue Group
|
||||
|
||||
.. _multi-queue-group-guc-interface:
|
||||
|
||||
Multi Queue Group GuC interface
|
||||
===============================
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/xe/xe_guc_submit.c
|
||||
:doc: Multi Queue Group GuC interface
|
||||
|
||||
Internal API
|
||||
============
|
||||
|
||||
|
|
|
|||
|
|
@ -896,34 +896,6 @@ in the virtual console layer. On resuming kernel execution, the kernel
|
|||
debugger calls kgdboc_post_exp_handler() which in turn calls
|
||||
con_debug_leave().
|
||||
|
||||
Any video driver that wants to be compatible with the kernel debugger
|
||||
and the atomic kms callbacks must implement the ``mode_set_base_atomic``,
|
||||
``fb_debug_enter`` and ``fb_debug_leave operations``. For the
|
||||
``fb_debug_enter`` and ``fb_debug_leave`` the option exists to use the
|
||||
generic drm fb helper functions or implement something custom for the
|
||||
hardware. The following example shows the initialization of the
|
||||
.mode_set_base_atomic operation in
|
||||
drivers/gpu/drm/i915/intel_display.c::
|
||||
|
||||
|
||||
static const struct drm_crtc_helper_funcs intel_helper_funcs = {
|
||||
[...]
|
||||
.mode_set_base_atomic = intel_pipe_set_base_atomic,
|
||||
[...]
|
||||
};
|
||||
|
||||
|
||||
Here is an example of how the i915 driver initializes the
|
||||
fb_debug_enter and fb_debug_leave functions to use the generic drm
|
||||
helpers in ``drivers/gpu/drm/i915/intel_fb.c``::
|
||||
|
||||
|
||||
static struct fb_ops intelfb_ops = {
|
||||
[...]
|
||||
.fb_debug_enter = drm_fb_helper_debug_enter,
|
||||
.fb_debug_leave = drm_fb_helper_debug_leave,
|
||||
[...]
|
||||
};
|
||||
|
||||
|
||||
Credits
|
||||
|
|
|
|||
33
MAINTAINERS
33
MAINTAINERS
|
|
@ -8042,6 +8042,7 @@ S: Maintained
|
|||
B: https://gitlab.freedesktop.org/drm/msm/-/issues
|
||||
T: git https://gitlab.freedesktop.org/drm/msm.git
|
||||
F: Documentation/devicetree/bindings/display/msm/gpu.yaml
|
||||
F: Documentation/devicetree/bindings/display/msm/qcom,adreno-rgmu.yaml
|
||||
F: Documentation/devicetree/bindings/opp/opp-v2-qcom-adreno.yaml
|
||||
F: drivers/gpu/drm/msm/adreno/
|
||||
F: drivers/gpu/drm/msm/msm_gpu.*
|
||||
|
|
@ -8261,6 +8262,9 @@ S: Maintained
|
|||
F: Documentation/devicetree/bindings/display/sitronix,st7567.yaml
|
||||
F: Documentation/devicetree/bindings/display/sitronix,st7571.yaml
|
||||
F: drivers/gpu/drm/sitronix/st7571-i2c.c
|
||||
F: drivers/gpu/drm/sitronix/st7571-spi.c
|
||||
F: drivers/gpu/drm/sitronix/st7571.c
|
||||
F: drivers/gpu/drm/sitronix/st7571.h
|
||||
|
||||
DRM DRIVER FOR SITRONIX ST7701 PANELS
|
||||
M: Jagan Teki <jagan@amarulasolutions.com>
|
||||
|
|
@ -8283,6 +8287,13 @@ T: git https://gitlab.freedesktop.org/drm/misc/kernel.git
|
|||
F: Documentation/devicetree/bindings/display/sitronix,st7735r.yaml
|
||||
F: drivers/gpu/drm/sitronix/st7735r.c
|
||||
|
||||
DRM DRIVER FOR SITRONIX ST7920 LCD DISPLAYS
|
||||
M: Iker Pedrosa <ikerpedrosam@gmail.com>
|
||||
S: Maintained
|
||||
T: git https://gitlab.freedesktop.org/drm/misc/kernel.git
|
||||
F: Documentation/devicetree/bindings/display/sitronix,st7920.yaml
|
||||
F: drivers/gpu/drm/sitronix/st7920.c
|
||||
|
||||
DRM DRIVER FOR SOLOMON SSD130X OLED DISPLAYS
|
||||
M: Javier Martinez Canillas <javierm@redhat.com>
|
||||
S: Maintained
|
||||
|
|
@ -8800,6 +8811,7 @@ T: git https://gitlab.freedesktop.org/drm/misc/kernel.git
|
|||
F: drivers/gpu/drm/drm_draw.c
|
||||
F: drivers/gpu/drm/drm_draw_internal.h
|
||||
F: drivers/gpu/drm/drm_panic*.c
|
||||
F: drivers/gpu/drm/tests/drm_panic_test.c
|
||||
F: include/drm/drm_panic*
|
||||
|
||||
DRM PANIC QR CODE
|
||||
|
|
@ -8830,6 +8842,17 @@ T: git https://gitlab.freedesktop.org/drm/misc/kernel.git
|
|||
F: drivers/gpu/drm/ttm/
|
||||
F: include/drm/ttm/
|
||||
|
||||
DRM BUDDY ALLOCATOR
|
||||
M: Matthew Auld <matthew.auld@intel.com>
|
||||
M: Arun Pravin <arunpravin.paneerselvam@amd.com>
|
||||
R: Christian Koenig <christian.koenig@amd.com>
|
||||
L: dri-devel@lists.freedesktop.org
|
||||
S: Maintained
|
||||
T: git https://gitlab.freedesktop.org/drm/misc/kernel.git
|
||||
F: drivers/gpu/drm/drm_buddy.c
|
||||
F: drivers/gpu/drm/tests/drm_buddy_test.c
|
||||
F: include/drm/drm_buddy.h
|
||||
|
||||
DRM AUTOMATED TESTING
|
||||
M: Helen Koike <helen.fornazier@gmail.com>
|
||||
M: Vignesh Raman <vignesh.raman@collabora.com>
|
||||
|
|
@ -12514,6 +12537,14 @@ M: Samuel Holland <samuel@sholland.org>
|
|||
S: Maintained
|
||||
F: drivers/power/supply/ip5xxx_power.c
|
||||
|
||||
INNOSILICON HDMI BRIDGE DRIVER
|
||||
M: Andy Yan <andy.yan@rock-chips.com>
|
||||
L: dri-devel@lists.freedesktop.org
|
||||
S: Maintained
|
||||
T: git https://gitlab.freedesktop.org/drm/misc/kernel.git
|
||||
F: drivers/gpu/drm/bridge/inno-hdmi.c
|
||||
F: include/drm/bridge/inno_hdmi.h
|
||||
|
||||
INOTIFY
|
||||
M: Jan Kara <jack@suse.cz>
|
||||
R: Amir Goldstein <amir73il@gmail.com>
|
||||
|
|
@ -12697,7 +12728,7 @@ F: include/drm/intel/
|
|||
F: include/uapi/drm/i915_drm.h
|
||||
|
||||
INTEL DRM XE DRIVER (Lunar Lake and newer)
|
||||
M: Lucas De Marchi <lucas.demarchi@intel.com>
|
||||
M: Matthew Brost <matthew.brost@intel.com>
|
||||
M: Thomas Hellström <thomas.hellstrom@linux.intel.com>
|
||||
M: Rodrigo Vivi <rodrigo.vivi@intel.com>
|
||||
L: intel-xe@lists.freedesktop.org
|
||||
|
|
|
|||
|
|
@ -18,7 +18,6 @@ amdxdna-y := \
|
|||
amdxdna_sysfs.o \
|
||||
amdxdna_ubuf.o \
|
||||
npu1_regs.o \
|
||||
npu2_regs.o \
|
||||
npu4_regs.o \
|
||||
npu5_regs.o \
|
||||
npu6_regs.o
|
||||
|
|
|
|||
|
|
@ -47,17 +47,6 @@ static void aie2_job_put(struct amdxdna_sched_job *job)
|
|||
kref_put(&job->refcnt, aie2_job_release);
|
||||
}
|
||||
|
||||
static void aie2_hwctx_status_shift_stop(struct amdxdna_hwctx *hwctx)
|
||||
{
|
||||
hwctx->old_status = hwctx->status;
|
||||
hwctx->status = HWCTX_STAT_STOP;
|
||||
}
|
||||
|
||||
static void aie2_hwctx_status_restore(struct amdxdna_hwctx *hwctx)
|
||||
{
|
||||
hwctx->status = hwctx->old_status;
|
||||
}
|
||||
|
||||
/* The bad_job is used in aie2_sched_job_timedout, otherwise, set it to NULL */
|
||||
static void aie2_hwctx_stop(struct amdxdna_dev *xdna, struct amdxdna_hwctx *hwctx,
|
||||
struct drm_sched_job *bad_job)
|
||||
|
|
@ -84,11 +73,6 @@ static int aie2_hwctx_restart(struct amdxdna_dev *xdna, struct amdxdna_hwctx *hw
|
|||
goto out;
|
||||
}
|
||||
|
||||
if (hwctx->status != HWCTX_STAT_READY) {
|
||||
XDNA_DBG(xdna, "hwctx is not ready, status %d", hwctx->status);
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = aie2_config_cu(hwctx, NULL);
|
||||
if (ret) {
|
||||
XDNA_ERR(xdna, "Config cu failed, ret %d", ret);
|
||||
|
|
@ -140,7 +124,6 @@ static int aie2_hwctx_suspend_cb(struct amdxdna_hwctx *hwctx, void *arg)
|
|||
|
||||
aie2_hwctx_wait_for_idle(hwctx);
|
||||
aie2_hwctx_stop(xdna, hwctx, NULL);
|
||||
aie2_hwctx_status_shift_stop(hwctx);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -162,7 +145,6 @@ static int aie2_hwctx_resume_cb(struct amdxdna_hwctx *hwctx, void *arg)
|
|||
{
|
||||
struct amdxdna_dev *xdna = hwctx->client->xdna;
|
||||
|
||||
aie2_hwctx_status_restore(hwctx);
|
||||
return aie2_hwctx_restart(xdna, hwctx);
|
||||
}
|
||||
|
||||
|
|
@ -292,7 +274,7 @@ aie2_sched_cmdlist_resp_handler(void *handle, void __iomem *data, size_t size)
|
|||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
amdxdna_cmd_set_state(cmd_abo, fail_cmd_status);
|
||||
amdxdna_cmd_set_state(cmd_abo, ERT_CMD_STATE_ERROR);
|
||||
|
||||
if (amdxdna_cmd_get_op(cmd_abo) == ERT_CMD_CHAIN) {
|
||||
struct amdxdna_cmd_chain *cc = amdxdna_cmd_get_payload(cmd_abo, NULL);
|
||||
|
|
@ -315,12 +297,19 @@ aie2_sched_job_run(struct drm_sched_job *sched_job)
|
|||
struct dma_fence *fence;
|
||||
int ret;
|
||||
|
||||
if (!hwctx->priv->mbox_chann)
|
||||
return NULL;
|
||||
|
||||
if (!mmget_not_zero(job->mm))
|
||||
return ERR_PTR(-ESRCH);
|
||||
|
||||
kref_get(&job->refcnt);
|
||||
fence = dma_fence_get(job->fence);
|
||||
|
||||
ret = amdxdna_pm_resume_get(hwctx->client->xdna);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
if (job->drv_cmd) {
|
||||
switch (job->drv_cmd->opcode) {
|
||||
case SYNC_DEBUG_BO:
|
||||
|
|
@ -347,6 +336,7 @@ aie2_sched_job_run(struct drm_sched_job *sched_job)
|
|||
|
||||
out:
|
||||
if (ret) {
|
||||
amdxdna_pm_suspend_put(hwctx->client->xdna);
|
||||
dma_fence_put(job->fence);
|
||||
aie2_job_put(job);
|
||||
mmput(job->mm);
|
||||
|
|
@ -468,6 +458,12 @@ static int aie2_alloc_resource(struct amdxdna_hwctx *hwctx)
|
|||
struct alloc_requests *xrs_req;
|
||||
int ret;
|
||||
|
||||
if (AIE2_FEATURE_ON(xdna->dev_handle, AIE2_TEMPORAL_ONLY)) {
|
||||
hwctx->num_unused_col = xdna->dev_handle->total_col - hwctx->num_col;
|
||||
hwctx->num_col = xdna->dev_handle->total_col;
|
||||
return aie2_create_context(xdna->dev_handle, hwctx);
|
||||
}
|
||||
|
||||
xrs_req = kzalloc(sizeof(*xrs_req), GFP_KERNEL);
|
||||
if (!xrs_req)
|
||||
return -ENOMEM;
|
||||
|
|
@ -499,9 +495,15 @@ static void aie2_release_resource(struct amdxdna_hwctx *hwctx)
|
|||
struct amdxdna_dev *xdna = hwctx->client->xdna;
|
||||
int ret;
|
||||
|
||||
ret = xrs_release_resource(xdna->xrs_hdl, (uintptr_t)hwctx);
|
||||
if (ret)
|
||||
XDNA_ERR(xdna, "Release AIE resource failed, ret %d", ret);
|
||||
if (AIE2_FEATURE_ON(xdna->dev_handle, AIE2_TEMPORAL_ONLY)) {
|
||||
ret = aie2_destroy_context(xdna->dev_handle, hwctx);
|
||||
if (ret)
|
||||
XDNA_ERR(xdna, "Destroy temporal only context failed, ret %d", ret);
|
||||
} else {
|
||||
ret = xrs_release_resource(xdna->xrs_hdl, (uintptr_t)hwctx);
|
||||
if (ret)
|
||||
XDNA_ERR(xdna, "Release AIE resource failed, ret %d", ret);
|
||||
}
|
||||
}
|
||||
|
||||
static int aie2_ctx_syncobj_create(struct amdxdna_hwctx *hwctx)
|
||||
|
|
@ -651,7 +653,6 @@ int aie2_hwctx_init(struct amdxdna_hwctx *hwctx)
|
|||
}
|
||||
amdxdna_pm_suspend_put(xdna);
|
||||
|
||||
hwctx->status = HWCTX_STAT_INIT;
|
||||
init_waitqueue_head(&priv->job_free_wq);
|
||||
|
||||
XDNA_DBG(xdna, "hwctx %s init completed", hwctx->name);
|
||||
|
|
@ -693,7 +694,9 @@ void aie2_hwctx_fini(struct amdxdna_hwctx *hwctx)
|
|||
aie2_hwctx_wait_for_idle(hwctx);
|
||||
|
||||
/* Request fw to destroy hwctx and cancel the rest pending requests */
|
||||
drm_sched_stop(&hwctx->priv->sched, NULL);
|
||||
aie2_release_resource(hwctx);
|
||||
drm_sched_start(&hwctx->priv->sched, 0);
|
||||
|
||||
mutex_unlock(&xdna->dev_lock);
|
||||
drm_sched_entity_destroy(&hwctx->priv->entity);
|
||||
|
|
@ -737,7 +740,7 @@ static int aie2_hwctx_cu_config(struct amdxdna_hwctx *hwctx, void *buf, u32 size
|
|||
if (XDNA_MBZ_DBG(xdna, config->pad, sizeof(config->pad)))
|
||||
return -EINVAL;
|
||||
|
||||
if (hwctx->status != HWCTX_STAT_INIT) {
|
||||
if (hwctx->cus) {
|
||||
XDNA_ERR(xdna, "Not support re-config CU");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
@ -768,7 +771,6 @@ static int aie2_hwctx_cu_config(struct amdxdna_hwctx *hwctx, void *buf, u32 size
|
|||
}
|
||||
|
||||
wmb(); /* To avoid locking in command submit when check status */
|
||||
hwctx->status = HWCTX_STAT_READY;
|
||||
|
||||
return 0;
|
||||
|
||||
|
|
@ -991,15 +993,11 @@ int aie2_cmd_submit(struct amdxdna_hwctx *hwctx, struct amdxdna_sched_job *job,
|
|||
goto free_chain;
|
||||
}
|
||||
|
||||
ret = amdxdna_pm_resume_get(xdna);
|
||||
if (ret)
|
||||
goto cleanup_job;
|
||||
|
||||
retry:
|
||||
ret = drm_gem_lock_reservations(job->bos, job->bo_cnt, &acquire_ctx);
|
||||
if (ret) {
|
||||
XDNA_WARN(xdna, "Failed to lock BOs, ret %d", ret);
|
||||
goto suspend_put;
|
||||
goto cleanup_job;
|
||||
}
|
||||
|
||||
for (i = 0; i < job->bo_cnt; i++) {
|
||||
|
|
@ -1007,7 +1005,7 @@ retry:
|
|||
if (ret) {
|
||||
XDNA_WARN(xdna, "Failed to reserve fences %d", ret);
|
||||
drm_gem_unlock_reservations(job->bos, job->bo_cnt, &acquire_ctx);
|
||||
goto suspend_put;
|
||||
goto cleanup_job;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1022,12 +1020,12 @@ retry:
|
|||
msecs_to_jiffies(HMM_RANGE_DEFAULT_TIMEOUT);
|
||||
} else if (time_after(jiffies, timeout)) {
|
||||
ret = -ETIME;
|
||||
goto suspend_put;
|
||||
goto cleanup_job;
|
||||
}
|
||||
|
||||
ret = aie2_populate_range(abo);
|
||||
if (ret)
|
||||
goto suspend_put;
|
||||
goto cleanup_job;
|
||||
goto retry;
|
||||
}
|
||||
}
|
||||
|
|
@ -1053,8 +1051,6 @@ retry:
|
|||
|
||||
return 0;
|
||||
|
||||
suspend_put:
|
||||
amdxdna_pm_suspend_put(xdna);
|
||||
cleanup_job:
|
||||
drm_sched_job_cleanup(&job->base);
|
||||
free_chain:
|
||||
|
|
|
|||
|
|
@ -338,8 +338,7 @@ void aie2_error_async_events_free(struct amdxdna_dev_hdl *ndev)
|
|||
destroy_workqueue(events->wq);
|
||||
mutex_lock(&xdna->dev_lock);
|
||||
|
||||
dma_free_noncoherent(xdna->ddev.dev, events->size, events->buf,
|
||||
events->addr, DMA_FROM_DEVICE);
|
||||
aie2_free_msg_buffer(ndev, events->size, events->buf, events->addr);
|
||||
kfree(events);
|
||||
}
|
||||
|
||||
|
|
@ -355,8 +354,8 @@ int aie2_error_async_events_alloc(struct amdxdna_dev_hdl *ndev)
|
|||
if (!events)
|
||||
return -ENOMEM;
|
||||
|
||||
events->buf = dma_alloc_noncoherent(xdna->ddev.dev, total_size, &events->addr,
|
||||
DMA_FROM_DEVICE, GFP_KERNEL);
|
||||
events->buf = aie2_alloc_msg_buffer(ndev, &total_size, &events->addr);
|
||||
|
||||
if (!events->buf) {
|
||||
ret = -ENOMEM;
|
||||
goto free_events;
|
||||
|
|
@ -396,8 +395,7 @@ int aie2_error_async_events_alloc(struct amdxdna_dev_hdl *ndev)
|
|||
free_wq:
|
||||
destroy_workqueue(events->wq);
|
||||
free_buf:
|
||||
dma_free_noncoherent(xdna->ddev.dev, events->size, events->buf,
|
||||
events->addr, DMA_FROM_DEVICE);
|
||||
aie2_free_msg_buffer(ndev, events->size, events->buf, events->addr);
|
||||
free_events:
|
||||
kfree(events);
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -39,7 +39,6 @@ static int aie2_send_mgmt_msg_wait(struct amdxdna_dev_hdl *ndev,
|
|||
if (!ndev->mgmt_chann)
|
||||
return -ENODEV;
|
||||
|
||||
drm_WARN_ON(&xdna->ddev, xdna->rpm_on && !mutex_is_locked(&xdna->dev_lock));
|
||||
ret = xdna_send_msg_wait(xdna, ndev->mgmt_chann, msg);
|
||||
if (ret == -ETIME) {
|
||||
xdna_mailbox_stop_channel(ndev->mgmt_chann);
|
||||
|
|
@ -56,11 +55,34 @@ static int aie2_send_mgmt_msg_wait(struct amdxdna_dev_hdl *ndev,
|
|||
return ret;
|
||||
}
|
||||
|
||||
void *aie2_alloc_msg_buffer(struct amdxdna_dev_hdl *ndev, u32 *size,
|
||||
dma_addr_t *dma_addr)
|
||||
{
|
||||
struct amdxdna_dev *xdna = ndev->xdna;
|
||||
int order;
|
||||
|
||||
*size = max(*size, SZ_8K);
|
||||
order = get_order(*size);
|
||||
if (order > MAX_PAGE_ORDER)
|
||||
return NULL;
|
||||
*size = PAGE_SIZE << order;
|
||||
|
||||
return dma_alloc_noncoherent(xdna->ddev.dev, *size, dma_addr,
|
||||
DMA_FROM_DEVICE, GFP_KERNEL);
|
||||
}
|
||||
|
||||
int aie2_suspend_fw(struct amdxdna_dev_hdl *ndev)
|
||||
{
|
||||
DECLARE_AIE2_MSG(suspend, MSG_OP_SUSPEND);
|
||||
int ret;
|
||||
|
||||
return aie2_send_mgmt_msg_wait(ndev, &msg);
|
||||
ret = aie2_send_mgmt_msg_wait(ndev, &msg);
|
||||
if (ret) {
|
||||
XDNA_ERR(ndev->xdna, "Failed to suspend fw, ret %d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return aie2_psp_waitmode_poll(ndev->psp_hdl);
|
||||
}
|
||||
|
||||
int aie2_resume_fw(struct amdxdna_dev_hdl *ndev)
|
||||
|
|
@ -186,6 +208,40 @@ int aie2_query_firmware_version(struct amdxdna_dev_hdl *ndev,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int aie2_destroy_context_req(struct amdxdna_dev_hdl *ndev, u32 id)
|
||||
{
|
||||
DECLARE_AIE2_MSG(destroy_ctx, MSG_OP_DESTROY_CONTEXT);
|
||||
struct amdxdna_dev *xdna = ndev->xdna;
|
||||
int ret;
|
||||
|
||||
req.context_id = id;
|
||||
ret = aie2_send_mgmt_msg_wait(ndev, &msg);
|
||||
if (ret)
|
||||
XDNA_WARN(xdna, "Destroy context failed, ret %d", ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static u32 aie2_get_context_priority(struct amdxdna_dev_hdl *ndev,
|
||||
struct amdxdna_hwctx *hwctx)
|
||||
{
|
||||
if (!AIE2_FEATURE_ON(ndev, AIE2_PREEMPT))
|
||||
return PRIORITY_HIGH;
|
||||
|
||||
switch (hwctx->qos.priority) {
|
||||
case AMDXDNA_QOS_REALTIME_PRIORITY:
|
||||
return PRIORITY_REALTIME;
|
||||
case AMDXDNA_QOS_HIGH_PRIORITY:
|
||||
return PRIORITY_HIGH;
|
||||
case AMDXDNA_QOS_NORMAL_PRIORITY:
|
||||
return PRIORITY_NORMAL;
|
||||
case AMDXDNA_QOS_LOW_PRIORITY:
|
||||
return PRIORITY_LOW;
|
||||
default:
|
||||
return PRIORITY_HIGH;
|
||||
}
|
||||
}
|
||||
|
||||
int aie2_create_context(struct amdxdna_dev_hdl *ndev, struct amdxdna_hwctx *hwctx)
|
||||
{
|
||||
DECLARE_AIE2_MSG(create_ctx, MSG_OP_CREATE_CONTEXT);
|
||||
|
|
@ -199,22 +255,24 @@ int aie2_create_context(struct amdxdna_dev_hdl *ndev, struct amdxdna_hwctx *hwct
|
|||
req.aie_type = 1;
|
||||
req.start_col = hwctx->start_col;
|
||||
req.num_col = hwctx->num_col;
|
||||
req.num_unused_col = hwctx->num_unused_col;
|
||||
req.num_cq_pairs_requested = 1;
|
||||
req.pasid = hwctx->client->pasid;
|
||||
req.context_priority = 2;
|
||||
req.context_priority = aie2_get_context_priority(ndev, hwctx);
|
||||
|
||||
ret = aie2_send_mgmt_msg_wait(ndev, &msg);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
hwctx->fw_ctx_id = resp.context_id;
|
||||
WARN_ONCE(hwctx->fw_ctx_id == -1, "Unexpected context id");
|
||||
if (WARN_ON_ONCE(hwctx->fw_ctx_id == -1))
|
||||
return -EINVAL;
|
||||
|
||||
if (ndev->force_preempt_enabled) {
|
||||
ret = aie2_runtime_cfg(ndev, AIE2_RT_CFG_FORCE_PREEMPT, &hwctx->fw_ctx_id);
|
||||
if (ret) {
|
||||
XDNA_ERR(xdna, "failed to enable force preempt %d", ret);
|
||||
return ret;
|
||||
goto del_ctx_req;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -231,51 +289,39 @@ int aie2_create_context(struct amdxdna_dev_hdl *ndev, struct amdxdna_hwctx *hwct
|
|||
|
||||
ret = pci_irq_vector(to_pci_dev(xdna->ddev.dev), resp.msix_id);
|
||||
if (ret == -EINVAL) {
|
||||
XDNA_ERR(xdna, "not able to create channel");
|
||||
goto out_destroy_context;
|
||||
XDNA_ERR(xdna, "Alloc IRQ failed %d", ret);
|
||||
goto del_ctx_req;
|
||||
}
|
||||
|
||||
intr_reg = i2x.mb_head_ptr_reg + 4;
|
||||
hwctx->priv->mbox_chann = xdna_mailbox_create_channel(ndev->mbox, &x2i, &i2x,
|
||||
intr_reg, ret);
|
||||
if (!hwctx->priv->mbox_chann) {
|
||||
XDNA_ERR(xdna, "not able to create channel");
|
||||
XDNA_ERR(xdna, "Not able to create channel");
|
||||
ret = -EINVAL;
|
||||
goto out_destroy_context;
|
||||
goto del_ctx_req;
|
||||
}
|
||||
ndev->hwctx_num++;
|
||||
|
||||
XDNA_DBG(xdna, "%s mailbox channel irq: %d, msix_id: %d",
|
||||
hwctx->name, ret, resp.msix_id);
|
||||
XDNA_DBG(xdna, "%s created fw ctx %d pasid %d", hwctx->name,
|
||||
hwctx->fw_ctx_id, hwctx->client->pasid);
|
||||
XDNA_DBG(xdna, "Mailbox channel irq: %d, msix_id: %d", ret, resp.msix_id);
|
||||
XDNA_DBG(xdna, "Created fw ctx %d pasid %d", hwctx->fw_ctx_id, hwctx->client->pasid);
|
||||
|
||||
return 0;
|
||||
|
||||
out_destroy_context:
|
||||
aie2_destroy_context(ndev, hwctx);
|
||||
del_ctx_req:
|
||||
aie2_destroy_context_req(ndev, hwctx->fw_ctx_id);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int aie2_destroy_context(struct amdxdna_dev_hdl *ndev, struct amdxdna_hwctx *hwctx)
|
||||
{
|
||||
DECLARE_AIE2_MSG(destroy_ctx, MSG_OP_DESTROY_CONTEXT);
|
||||
struct amdxdna_dev *xdna = ndev->xdna;
|
||||
int ret;
|
||||
|
||||
if (hwctx->fw_ctx_id == -1)
|
||||
return 0;
|
||||
|
||||
xdna_mailbox_stop_channel(hwctx->priv->mbox_chann);
|
||||
|
||||
req.context_id = hwctx->fw_ctx_id;
|
||||
ret = aie2_send_mgmt_msg_wait(ndev, &msg);
|
||||
if (ret)
|
||||
XDNA_WARN(xdna, "%s destroy context failed, ret %d", hwctx->name, ret);
|
||||
|
||||
ret = aie2_destroy_context_req(ndev, hwctx->fw_ctx_id);
|
||||
xdna_mailbox_destroy_channel(hwctx->priv->mbox_chann);
|
||||
XDNA_DBG(xdna, "%s destroyed fw ctx %d", hwctx->name,
|
||||
hwctx->fw_ctx_id);
|
||||
XDNA_DBG(xdna, "Destroyed fw ctx %d", hwctx->fw_ctx_id);
|
||||
hwctx->priv->mbox_chann = NULL;
|
||||
hwctx->fw_ctx_id = -1;
|
||||
ndev->hwctx_num--;
|
||||
|
|
@ -316,14 +362,13 @@ int aie2_query_status(struct amdxdna_dev_hdl *ndev, char __user *buf,
|
|||
{
|
||||
DECLARE_AIE2_MSG(aie_column_info, MSG_OP_QUERY_COL_STATUS);
|
||||
struct amdxdna_dev *xdna = ndev->xdna;
|
||||
u32 buf_sz = size, aie_bitmap = 0;
|
||||
struct amdxdna_client *client;
|
||||
dma_addr_t dma_addr;
|
||||
u32 aie_bitmap = 0;
|
||||
u8 *buff_addr;
|
||||
int ret;
|
||||
|
||||
buff_addr = dma_alloc_noncoherent(xdna->ddev.dev, size, &dma_addr,
|
||||
DMA_FROM_DEVICE, GFP_KERNEL);
|
||||
buff_addr = aie2_alloc_msg_buffer(ndev, &buf_sz, &dma_addr);
|
||||
if (!buff_addr)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
@ -333,7 +378,7 @@ int aie2_query_status(struct amdxdna_dev_hdl *ndev, char __user *buf,
|
|||
|
||||
*cols_filled = 0;
|
||||
req.dump_buff_addr = dma_addr;
|
||||
req.dump_buff_size = size;
|
||||
req.dump_buff_size = buf_sz;
|
||||
req.num_cols = hweight32(aie_bitmap);
|
||||
req.aie_bitmap = aie_bitmap;
|
||||
|
||||
|
|
@ -361,7 +406,7 @@ int aie2_query_status(struct amdxdna_dev_hdl *ndev, char __user *buf,
|
|||
*cols_filled = aie_bitmap;
|
||||
|
||||
fail:
|
||||
dma_free_noncoherent(xdna->ddev.dev, size, buff_addr, dma_addr, DMA_FROM_DEVICE);
|
||||
aie2_free_msg_buffer(ndev, buf_sz, buff_addr, dma_addr);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -372,19 +417,19 @@ int aie2_query_telemetry(struct amdxdna_dev_hdl *ndev,
|
|||
DECLARE_AIE2_MSG(get_telemetry, MSG_OP_GET_TELEMETRY);
|
||||
struct amdxdna_dev *xdna = ndev->xdna;
|
||||
dma_addr_t dma_addr;
|
||||
u32 buf_sz = size;
|
||||
u8 *addr;
|
||||
int ret;
|
||||
|
||||
if (header->type >= MAX_TELEMETRY_TYPE)
|
||||
return -EINVAL;
|
||||
|
||||
addr = dma_alloc_noncoherent(xdna->ddev.dev, size, &dma_addr,
|
||||
DMA_FROM_DEVICE, GFP_KERNEL);
|
||||
addr = aie2_alloc_msg_buffer(ndev, &buf_sz, &dma_addr);
|
||||
if (!addr)
|
||||
return -ENOMEM;
|
||||
|
||||
req.buf_addr = dma_addr;
|
||||
req.buf_size = size;
|
||||
req.buf_size = buf_sz;
|
||||
req.type = header->type;
|
||||
|
||||
drm_clflush_virt_range(addr, size); /* device can access */
|
||||
|
|
@ -410,7 +455,7 @@ int aie2_query_telemetry(struct amdxdna_dev_hdl *ndev,
|
|||
header->minor = resp.minor;
|
||||
|
||||
free_buf:
|
||||
dma_free_noncoherent(xdna->ddev.dev, size, addr, dma_addr, DMA_FROM_DEVICE);
|
||||
aie2_free_msg_buffer(ndev, buf_sz, addr, dma_addr);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -448,6 +493,9 @@ int aie2_config_cu(struct amdxdna_hwctx *hwctx,
|
|||
if (!chann)
|
||||
return -ENODEV;
|
||||
|
||||
if (!hwctx->cus)
|
||||
return 0;
|
||||
|
||||
if (hwctx->cus->num_cus > MAX_NUM_CUS) {
|
||||
XDNA_DBG(xdna, "Exceed maximum CU %d", MAX_NUM_CUS);
|
||||
return -EINVAL;
|
||||
|
|
@ -646,6 +694,7 @@ aie2_cmdlist_fill_npu_cf(struct amdxdna_gem_obj *cmd_bo, void *slot, size_t *siz
|
|||
u32 cmd_len;
|
||||
void *cmd;
|
||||
|
||||
memset(npu_slot, 0, sizeof(*npu_slot));
|
||||
cmd = amdxdna_cmd_get_payload(cmd_bo, &cmd_len);
|
||||
if (*size < sizeof(*npu_slot) + cmd_len)
|
||||
return -EINVAL;
|
||||
|
|
@ -654,7 +703,6 @@ aie2_cmdlist_fill_npu_cf(struct amdxdna_gem_obj *cmd_bo, void *slot, size_t *siz
|
|||
if (npu_slot->cu_idx == INVALID_CU_IDX)
|
||||
return -EINVAL;
|
||||
|
||||
memset(npu_slot, 0, sizeof(*npu_slot));
|
||||
npu_slot->type = EXEC_NPU_TYPE_NON_ELF;
|
||||
npu_slot->arg_cnt = cmd_len / sizeof(u32);
|
||||
memcpy(npu_slot->args, cmd, cmd_len);
|
||||
|
|
@ -671,6 +719,7 @@ aie2_cmdlist_fill_npu_dpu(struct amdxdna_gem_obj *cmd_bo, void *slot, size_t *si
|
|||
u32 cmd_len;
|
||||
u32 arg_sz;
|
||||
|
||||
memset(npu_slot, 0, sizeof(*npu_slot));
|
||||
sn = amdxdna_cmd_get_payload(cmd_bo, &cmd_len);
|
||||
arg_sz = cmd_len - sizeof(*sn);
|
||||
if (cmd_len < sizeof(*sn) || arg_sz > MAX_NPU_ARGS_SIZE)
|
||||
|
|
@ -683,7 +732,6 @@ aie2_cmdlist_fill_npu_dpu(struct amdxdna_gem_obj *cmd_bo, void *slot, size_t *si
|
|||
if (npu_slot->cu_idx == INVALID_CU_IDX)
|
||||
return -EINVAL;
|
||||
|
||||
memset(npu_slot, 0, sizeof(*npu_slot));
|
||||
npu_slot->type = EXEC_NPU_TYPE_PARTIAL_ELF;
|
||||
npu_slot->inst_buf_addr = sn->buffer;
|
||||
npu_slot->inst_size = sn->buffer_size;
|
||||
|
|
@ -703,6 +751,7 @@ aie2_cmdlist_fill_npu_preempt(struct amdxdna_gem_obj *cmd_bo, void *slot, size_t
|
|||
u32 cmd_len;
|
||||
u32 arg_sz;
|
||||
|
||||
memset(npu_slot, 0, sizeof(*npu_slot));
|
||||
pd = amdxdna_cmd_get_payload(cmd_bo, &cmd_len);
|
||||
arg_sz = cmd_len - sizeof(*pd);
|
||||
if (cmd_len < sizeof(*pd) || arg_sz > MAX_NPU_ARGS_SIZE)
|
||||
|
|
@ -715,7 +764,6 @@ aie2_cmdlist_fill_npu_preempt(struct amdxdna_gem_obj *cmd_bo, void *slot, size_t
|
|||
if (npu_slot->cu_idx == INVALID_CU_IDX)
|
||||
return -EINVAL;
|
||||
|
||||
memset(npu_slot, 0, sizeof(*npu_slot));
|
||||
npu_slot->type = EXEC_NPU_TYPE_PREEMPT;
|
||||
npu_slot->inst_buf_addr = pd->inst_buf;
|
||||
npu_slot->save_buf_addr = pd->save_buf;
|
||||
|
|
@ -739,6 +787,7 @@ aie2_cmdlist_fill_npu_elf(struct amdxdna_gem_obj *cmd_bo, void *slot, size_t *si
|
|||
u32 cmd_len;
|
||||
u32 arg_sz;
|
||||
|
||||
memset(npu_slot, 0, sizeof(*npu_slot));
|
||||
pd = amdxdna_cmd_get_payload(cmd_bo, &cmd_len);
|
||||
arg_sz = cmd_len - sizeof(*pd);
|
||||
if (cmd_len < sizeof(*pd) || arg_sz > MAX_NPU_ARGS_SIZE)
|
||||
|
|
@ -747,7 +796,6 @@ aie2_cmdlist_fill_npu_elf(struct amdxdna_gem_obj *cmd_bo, void *slot, size_t *si
|
|||
if (*size < sizeof(*npu_slot) + arg_sz)
|
||||
return -EINVAL;
|
||||
|
||||
memset(npu_slot, 0, sizeof(*npu_slot));
|
||||
npu_slot->type = EXEC_NPU_TYPE_ELF;
|
||||
npu_slot->inst_buf_addr = pd->inst_buf;
|
||||
npu_slot->save_buf_addr = pd->save_buf;
|
||||
|
|
|
|||
|
|
@ -108,11 +108,17 @@ struct cq_pair {
|
|||
struct cq_info i2x_q;
|
||||
};
|
||||
|
||||
#define PRIORITY_REALTIME 1
|
||||
#define PRIORITY_HIGH 2
|
||||
#define PRIORITY_NORMAL 3
|
||||
#define PRIORITY_LOW 4
|
||||
|
||||
struct create_ctx_req {
|
||||
__u32 aie_type;
|
||||
__u8 start_col;
|
||||
__u8 num_col;
|
||||
__u16 reserved;
|
||||
__u8 num_unused_col;
|
||||
__u8 reserved;
|
||||
__u8 num_cq_pairs_requested;
|
||||
__u8 reserved1;
|
||||
__u16 pasid;
|
||||
|
|
|
|||
|
|
@ -57,41 +57,23 @@ struct mgmt_mbox_chann_info {
|
|||
static int aie2_check_protocol(struct amdxdna_dev_hdl *ndev, u32 fw_major, u32 fw_minor)
|
||||
{
|
||||
const struct aie2_fw_feature_tbl *feature;
|
||||
struct amdxdna_dev *xdna = ndev->xdna;
|
||||
bool found = false;
|
||||
|
||||
/*
|
||||
* The driver supported mailbox behavior is defined by
|
||||
* ndev->priv->protocol_major and protocol_minor.
|
||||
*
|
||||
* When protocol_major and fw_major are different, it means driver
|
||||
* and firmware are incompatible.
|
||||
*/
|
||||
if (ndev->priv->protocol_major != fw_major) {
|
||||
XDNA_ERR(xdna, "Incompatible firmware protocol major %d minor %d",
|
||||
fw_major, fw_minor);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* When protocol_minor is greater then fw_minor, that means driver
|
||||
* relies on operation the installed firmware does not support.
|
||||
*/
|
||||
if (ndev->priv->protocol_minor > fw_minor) {
|
||||
XDNA_ERR(xdna, "Firmware minor version smaller than supported");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
for (feature = ndev->priv->fw_feature_tbl; feature && feature->min_minor;
|
||||
feature++) {
|
||||
for (feature = ndev->priv->fw_feature_tbl; feature->major; feature++) {
|
||||
if (feature->major != fw_major)
|
||||
continue;
|
||||
if (fw_minor < feature->min_minor)
|
||||
continue;
|
||||
if (feature->max_minor > 0 && fw_minor > feature->max_minor)
|
||||
continue;
|
||||
|
||||
set_bit(feature->feature, &ndev->feature_mask);
|
||||
ndev->feature_mask |= feature->features;
|
||||
|
||||
/* firmware version matches one of the driver support entry */
|
||||
found = true;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return found ? 0 : -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static void aie2_dump_chann_info_debug(struct amdxdna_dev_hdl *ndev)
|
||||
|
|
@ -322,7 +304,7 @@ static int aie2_xrs_set_dft_dpm_level(struct drm_device *ddev, u32 dpm_level)
|
|||
if (ndev->pw_mode != POWER_MODE_DEFAULT || ndev->dpm_level == dpm_level)
|
||||
return 0;
|
||||
|
||||
return ndev->priv->hw_ops.set_dpm(ndev, dpm_level);
|
||||
return aie2_pm_set_dpm(ndev, dpm_level);
|
||||
}
|
||||
|
||||
static struct xrs_action_ops aie2_xrs_actions = {
|
||||
|
|
|
|||
|
|
@ -70,6 +70,7 @@ enum psp_reg_idx {
|
|||
PSP_INTR_REG = PSP_NUM_IN_REGS,
|
||||
PSP_STATUS_REG,
|
||||
PSP_RESP_REG,
|
||||
PSP_PWAITMODE_REG,
|
||||
PSP_MAX_REGS /* Keep this at the end */
|
||||
};
|
||||
|
||||
|
|
@ -231,11 +232,13 @@ struct aie2_hw_ops {
|
|||
enum aie2_fw_feature {
|
||||
AIE2_NPU_COMMAND,
|
||||
AIE2_PREEMPT,
|
||||
AIE2_TEMPORAL_ONLY,
|
||||
AIE2_FEATURE_MAX
|
||||
};
|
||||
|
||||
struct aie2_fw_feature_tbl {
|
||||
enum aie2_fw_feature feature;
|
||||
u64 features;
|
||||
u32 major;
|
||||
u32 max_minor;
|
||||
u32 min_minor;
|
||||
};
|
||||
|
|
@ -244,8 +247,6 @@ struct aie2_fw_feature_tbl {
|
|||
|
||||
struct amdxdna_dev_priv {
|
||||
const char *fw_path;
|
||||
u64 protocol_major;
|
||||
u64 protocol_minor;
|
||||
const struct rt_config *rt_config;
|
||||
const struct dpm_clk_freq *dpm_clk_tbl;
|
||||
const struct aie2_fw_feature_tbl *fw_feature_tbl;
|
||||
|
|
@ -285,11 +286,13 @@ int npu4_set_dpm(struct amdxdna_dev_hdl *ndev, u32 dpm_level);
|
|||
/* aie2_pm.c */
|
||||
int aie2_pm_init(struct amdxdna_dev_hdl *ndev);
|
||||
int aie2_pm_set_mode(struct amdxdna_dev_hdl *ndev, enum amdxdna_power_mode_type target);
|
||||
int aie2_pm_set_dpm(struct amdxdna_dev_hdl *ndev, u32 dpm_level);
|
||||
|
||||
/* aie2_psp.c */
|
||||
struct psp_device *aie2m_psp_create(struct drm_device *ddev, struct psp_config *conf);
|
||||
int aie2_psp_start(struct psp_device *psp);
|
||||
void aie2_psp_stop(struct psp_device *psp);
|
||||
int aie2_psp_waitmode_poll(struct psp_device *psp);
|
||||
|
||||
/* aie2_error.c */
|
||||
int aie2_error_async_events_alloc(struct amdxdna_dev_hdl *ndev);
|
||||
|
|
@ -332,6 +335,11 @@ int aie2_sync_bo(struct amdxdna_hwctx *hwctx, struct amdxdna_sched_job *job,
|
|||
int (*notify_cb)(void *, void __iomem *, size_t));
|
||||
int aie2_config_debug_bo(struct amdxdna_hwctx *hwctx, struct amdxdna_sched_job *job,
|
||||
int (*notify_cb)(void *, void __iomem *, size_t));
|
||||
void *aie2_alloc_msg_buffer(struct amdxdna_dev_hdl *ndev, u32 *size,
|
||||
dma_addr_t *dma_addr);
|
||||
#define aie2_free_msg_buffer(ndev, size, buff_addr, dma_addr) \
|
||||
dma_free_noncoherent((ndev)->xdna->ddev.dev, size, buff_addr, \
|
||||
dma_addr, DMA_FROM_DEVICE)
|
||||
|
||||
/* aie2_hwctx.c */
|
||||
int aie2_hwctx_init(struct amdxdna_hwctx *hwctx);
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@
|
|||
|
||||
#include "aie2_pci.h"
|
||||
#include "amdxdna_pci_drv.h"
|
||||
#include "amdxdna_pm.h"
|
||||
|
||||
#define AIE2_CLK_GATING_ENABLE 1
|
||||
#define AIE2_CLK_GATING_DISABLE 0
|
||||
|
|
@ -26,6 +27,22 @@ static int aie2_pm_set_clk_gating(struct amdxdna_dev_hdl *ndev, u32 val)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int aie2_pm_set_dpm(struct amdxdna_dev_hdl *ndev, u32 dpm_level)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = amdxdna_pm_resume_get(ndev->xdna);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = ndev->priv->hw_ops.set_dpm(ndev, dpm_level);
|
||||
if (!ret)
|
||||
ndev->dpm_level = dpm_level;
|
||||
amdxdna_pm_suspend_put(ndev->xdna);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int aie2_pm_init(struct amdxdna_dev_hdl *ndev)
|
||||
{
|
||||
int ret;
|
||||
|
|
@ -50,6 +67,7 @@ int aie2_pm_init(struct amdxdna_dev_hdl *ndev)
|
|||
ret = ndev->priv->hw_ops.set_dpm(ndev, ndev->max_dpm_level);
|
||||
if (ret)
|
||||
return ret;
|
||||
ndev->dpm_level = ndev->max_dpm_level;
|
||||
|
||||
ret = aie2_pm_set_clk_gating(ndev, AIE2_CLK_GATING_ENABLE);
|
||||
if (ret)
|
||||
|
|
@ -94,7 +112,7 @@ int aie2_pm_set_mode(struct amdxdna_dev_hdl *ndev, enum amdxdna_power_mode_type
|
|||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
ret = ndev->priv->hw_ops.set_dpm(ndev, dpm_level);
|
||||
ret = aie2_pm_set_dpm(ndev, dpm_level);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
|
|||
|
|
@ -76,6 +76,21 @@ static int psp_exec(struct psp_device *psp, u32 *reg_vals)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int aie2_psp_waitmode_poll(struct psp_device *psp)
|
||||
{
|
||||
struct amdxdna_dev *xdna = to_xdna_dev(psp->ddev);
|
||||
u32 mode_reg;
|
||||
int ret;
|
||||
|
||||
ret = readx_poll_timeout(readl, PSP_REG(psp, PSP_PWAITMODE_REG), mode_reg,
|
||||
(mode_reg & 0x1) == 1,
|
||||
PSP_POLL_INTERVAL, PSP_POLL_TIMEOUT);
|
||||
if (ret)
|
||||
XDNA_ERR(xdna, "fw waitmode reg error, ret %d", ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void aie2_psp_stop(struct psp_device *psp)
|
||||
{
|
||||
u32 reg_vals[PSP_NUM_IN_REGS] = { PSP_RELEASE_TMR, };
|
||||
|
|
|
|||
|
|
@ -11,7 +11,6 @@
|
|||
|
||||
#include "aie2_pci.h"
|
||||
#include "amdxdna_pci_drv.h"
|
||||
#include "amdxdna_pm.h"
|
||||
|
||||
#define SMU_RESULT_OK 1
|
||||
|
||||
|
|
@ -67,16 +66,12 @@ int npu1_set_dpm(struct amdxdna_dev_hdl *ndev, u32 dpm_level)
|
|||
u32 freq;
|
||||
int ret;
|
||||
|
||||
ret = amdxdna_pm_resume_get(ndev->xdna);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = aie2_smu_exec(ndev, AIE2_SMU_SET_MPNPUCLK_FREQ,
|
||||
ndev->priv->dpm_clk_tbl[dpm_level].npuclk, &freq);
|
||||
if (ret) {
|
||||
XDNA_ERR(ndev->xdna, "Set npu clock to %d failed, ret %d\n",
|
||||
ndev->priv->dpm_clk_tbl[dpm_level].npuclk, ret);
|
||||
goto suspend_put;
|
||||
return ret;
|
||||
}
|
||||
ndev->npuclk_freq = freq;
|
||||
|
||||
|
|
@ -85,12 +80,10 @@ int npu1_set_dpm(struct amdxdna_dev_hdl *ndev, u32 dpm_level)
|
|||
if (ret) {
|
||||
XDNA_ERR(ndev->xdna, "Set h clock to %d failed, ret %d\n",
|
||||
ndev->priv->dpm_clk_tbl[dpm_level].hclk, ret);
|
||||
goto suspend_put;
|
||||
return ret;
|
||||
}
|
||||
|
||||
amdxdna_pm_suspend_put(ndev->xdna);
|
||||
ndev->hclk_freq = freq;
|
||||
ndev->dpm_level = dpm_level;
|
||||
ndev->max_tops = 2 * ndev->total_col;
|
||||
ndev->curr_tops = ndev->max_tops * freq / 1028;
|
||||
|
||||
|
|
@ -98,38 +91,28 @@ int npu1_set_dpm(struct amdxdna_dev_hdl *ndev, u32 dpm_level)
|
|||
ndev->npuclk_freq, ndev->hclk_freq);
|
||||
|
||||
return 0;
|
||||
|
||||
suspend_put:
|
||||
amdxdna_pm_suspend_put(ndev->xdna);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int npu4_set_dpm(struct amdxdna_dev_hdl *ndev, u32 dpm_level)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = amdxdna_pm_resume_get(ndev->xdna);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = aie2_smu_exec(ndev, AIE2_SMU_SET_HARD_DPMLEVEL, dpm_level, NULL);
|
||||
if (ret) {
|
||||
XDNA_ERR(ndev->xdna, "Set hard dpm level %d failed, ret %d ",
|
||||
dpm_level, ret);
|
||||
goto suspend_put;
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = aie2_smu_exec(ndev, AIE2_SMU_SET_SOFT_DPMLEVEL, dpm_level, NULL);
|
||||
if (ret) {
|
||||
XDNA_ERR(ndev->xdna, "Set soft dpm level %d failed, ret %d",
|
||||
dpm_level, ret);
|
||||
goto suspend_put;
|
||||
return ret;
|
||||
}
|
||||
|
||||
amdxdna_pm_suspend_put(ndev->xdna);
|
||||
ndev->npuclk_freq = ndev->priv->dpm_clk_tbl[dpm_level].npuclk;
|
||||
ndev->hclk_freq = ndev->priv->dpm_clk_tbl[dpm_level].hclk;
|
||||
ndev->dpm_level = dpm_level;
|
||||
ndev->max_tops = NPU4_DPM_TOPS(ndev, ndev->max_dpm_level);
|
||||
ndev->curr_tops = NPU4_DPM_TOPS(ndev, dpm_level);
|
||||
|
||||
|
|
@ -137,10 +120,6 @@ int npu4_set_dpm(struct amdxdna_dev_hdl *ndev, u32 dpm_level)
|
|||
ndev->npuclk_freq, ndev->hclk_freq);
|
||||
|
||||
return 0;
|
||||
|
||||
suspend_put:
|
||||
amdxdna_pm_suspend_put(ndev->xdna);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int aie2_smu_init(struct amdxdna_dev_hdl *ndev)
|
||||
|
|
|
|||
|
|
@ -98,11 +98,7 @@ struct amdxdna_hwctx {
|
|||
u32 *col_list;
|
||||
u32 start_col;
|
||||
u32 num_col;
|
||||
#define HWCTX_STAT_INIT 0
|
||||
#define HWCTX_STAT_READY 1
|
||||
#define HWCTX_STAT_STOP 2
|
||||
u32 status;
|
||||
u32 old_status;
|
||||
u32 num_unused_col;
|
||||
|
||||
struct amdxdna_qos_info qos;
|
||||
struct amdxdna_hwctx_param_config_cu *cus;
|
||||
|
|
|
|||
|
|
@ -112,22 +112,6 @@ static u32 mailbox_reg_read(struct mailbox_channel *mb_chann, u32 mbox_reg)
|
|||
return readl(ringbuf_addr);
|
||||
}
|
||||
|
||||
static int mailbox_reg_read_non_zero(struct mailbox_channel *mb_chann, u32 mbox_reg, u32 *val)
|
||||
{
|
||||
struct xdna_mailbox_res *mb_res = &mb_chann->mb->res;
|
||||
void __iomem *ringbuf_addr = mb_res->mbox_base + mbox_reg;
|
||||
int ret, value;
|
||||
|
||||
/* Poll till value is not zero */
|
||||
ret = readx_poll_timeout(readl, ringbuf_addr, value,
|
||||
value, 1 /* us */, 100);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
*val = value;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void
|
||||
mailbox_set_headptr(struct mailbox_channel *mb_chann, u32 headptr_val)
|
||||
{
|
||||
|
|
@ -207,26 +191,34 @@ mailbox_send_msg(struct mailbox_channel *mb_chann, struct mailbox_msg *mb_msg)
|
|||
u32 head, tail;
|
||||
u32 start_addr;
|
||||
u32 tmp_tail;
|
||||
int ret;
|
||||
|
||||
head = mailbox_get_headptr(mb_chann, CHAN_RES_X2I);
|
||||
tail = mb_chann->x2i_tail;
|
||||
ringbuf_size = mailbox_get_ringbuf_size(mb_chann, CHAN_RES_X2I);
|
||||
ringbuf_size = mailbox_get_ringbuf_size(mb_chann, CHAN_RES_X2I) - sizeof(u32);
|
||||
start_addr = mb_chann->res[CHAN_RES_X2I].rb_start_addr;
|
||||
tmp_tail = tail + mb_msg->pkg_size;
|
||||
|
||||
if (tail < head && tmp_tail >= head)
|
||||
goto no_space;
|
||||
|
||||
if (tail >= head && (tmp_tail > ringbuf_size - sizeof(u32) &&
|
||||
mb_msg->pkg_size >= head))
|
||||
goto no_space;
|
||||
|
||||
if (tail >= head && tmp_tail > ringbuf_size - sizeof(u32)) {
|
||||
check_again:
|
||||
if (tail >= head && tmp_tail > ringbuf_size) {
|
||||
write_addr = mb_chann->mb->res.ringbuf_base + start_addr + tail;
|
||||
writel(TOMBSTONE, write_addr);
|
||||
|
||||
/* tombstone is set. Write from the start of the ringbuf */
|
||||
tail = 0;
|
||||
tmp_tail = tail + mb_msg->pkg_size;
|
||||
}
|
||||
|
||||
if (tail < head && tmp_tail >= head) {
|
||||
ret = read_poll_timeout(mailbox_get_headptr, head,
|
||||
tmp_tail < head || tail >= head,
|
||||
1, 100, false, mb_chann, CHAN_RES_X2I);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (tail >= head)
|
||||
goto check_again;
|
||||
}
|
||||
|
||||
write_addr = mb_chann->mb->res.ringbuf_base + start_addr + tail;
|
||||
|
|
@ -238,9 +230,6 @@ mailbox_send_msg(struct mailbox_channel *mb_chann, struct mailbox_msg *mb_msg)
|
|||
mb_msg->pkg.header.id);
|
||||
|
||||
return 0;
|
||||
|
||||
no_space:
|
||||
return -ENOSPC;
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
@ -286,8 +275,7 @@ static int mailbox_get_msg(struct mailbox_channel *mb_chann)
|
|||
u32 start_addr;
|
||||
int ret;
|
||||
|
||||
if (mailbox_reg_read_non_zero(mb_chann, mb_chann->res[CHAN_RES_I2X].mb_tail_ptr_reg, &tail))
|
||||
return -EINVAL;
|
||||
tail = mailbox_get_tailptr(mb_chann, CHAN_RES_I2X);
|
||||
head = mb_chann->i2x_head;
|
||||
ringbuf_size = mailbox_get_ringbuf_size(mb_chann, CHAN_RES_I2X);
|
||||
start_addr = mb_chann->res[CHAN_RES_I2X].rb_start_addr;
|
||||
|
|
|
|||
|
|
@ -51,7 +51,6 @@ MODULE_DEVICE_TABLE(pci, pci_ids);
|
|||
|
||||
static const struct amdxdna_device_id amdxdna_ids[] = {
|
||||
{ 0x1502, 0x0, &dev_npu1_info },
|
||||
{ 0x17f0, 0x0, &dev_npu2_info },
|
||||
{ 0x17f0, 0x10, &dev_npu4_info },
|
||||
{ 0x17f0, 0x11, &dev_npu5_info },
|
||||
{ 0x17f0, 0x20, &dev_npu6_info },
|
||||
|
|
@ -83,6 +82,8 @@ static int amdxdna_drm_open(struct drm_device *ddev, struct drm_file *filp)
|
|||
ret = -ENODEV;
|
||||
goto unbind_sva;
|
||||
}
|
||||
client->mm = current->mm;
|
||||
mmgrab(client->mm);
|
||||
init_srcu_struct(&client->hwctx_srcu);
|
||||
xa_init_flags(&client->hwctx_xa, XA_FLAGS_ALLOC);
|
||||
mutex_init(&client->mm_lock);
|
||||
|
|
@ -105,43 +106,39 @@ failed:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void amdxdna_drm_close(struct drm_device *ddev, struct drm_file *filp)
|
||||
static void amdxdna_client_cleanup(struct amdxdna_client *client)
|
||||
{
|
||||
struct amdxdna_client *client = filp->driver_priv;
|
||||
struct amdxdna_dev *xdna = to_xdna_dev(ddev);
|
||||
|
||||
XDNA_DBG(xdna, "closing pid %d", client->pid);
|
||||
|
||||
list_del(&client->node);
|
||||
amdxdna_hwctx_remove_all(client);
|
||||
xa_destroy(&client->hwctx_xa);
|
||||
cleanup_srcu_struct(&client->hwctx_srcu);
|
||||
mutex_destroy(&client->mm_lock);
|
||||
|
||||
if (client->dev_heap)
|
||||
drm_gem_object_put(to_gobj(client->dev_heap));
|
||||
|
||||
iommu_sva_unbind_device(client->sva);
|
||||
mmdrop(client->mm);
|
||||
|
||||
XDNA_DBG(xdna, "pid %d closed", client->pid);
|
||||
kfree(client);
|
||||
}
|
||||
|
||||
static int amdxdna_flush(struct file *f, fl_owner_t id)
|
||||
static void amdxdna_drm_close(struct drm_device *ddev, struct drm_file *filp)
|
||||
{
|
||||
struct drm_file *filp = f->private_data;
|
||||
struct amdxdna_client *client = filp->driver_priv;
|
||||
struct amdxdna_dev *xdna = client->xdna;
|
||||
struct amdxdna_dev *xdna = to_xdna_dev(ddev);
|
||||
int idx;
|
||||
|
||||
XDNA_DBG(xdna, "PID %d flushing...", client->pid);
|
||||
XDNA_DBG(xdna, "closing pid %d", client->pid);
|
||||
|
||||
if (!drm_dev_enter(&xdna->ddev, &idx))
|
||||
return 0;
|
||||
return;
|
||||
|
||||
mutex_lock(&xdna->dev_lock);
|
||||
list_del_init(&client->node);
|
||||
amdxdna_hwctx_remove_all(client);
|
||||
amdxdna_client_cleanup(client);
|
||||
mutex_unlock(&xdna->dev_lock);
|
||||
|
||||
drm_dev_exit(idx);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int amdxdna_drm_get_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
|
||||
|
|
@ -217,7 +214,6 @@ static const struct file_operations amdxdna_fops = {
|
|||
.owner = THIS_MODULE,
|
||||
.open = accel_open,
|
||||
.release = drm_release,
|
||||
.flush = amdxdna_flush,
|
||||
.unlocked_ioctl = drm_ioctl,
|
||||
.compat_ioctl = drm_compat_ioctl,
|
||||
.poll = drm_poll,
|
||||
|
|
@ -282,7 +278,7 @@ static int amdxdna_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
fs_reclaim_release(GFP_KERNEL);
|
||||
}
|
||||
|
||||
xdna->notifier_wq = alloc_ordered_workqueue("notifier_wq", 0);
|
||||
xdna->notifier_wq = alloc_ordered_workqueue("notifier_wq", WQ_MEM_RECLAIM);
|
||||
if (!xdna->notifier_wq)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
@ -333,8 +329,7 @@ static void amdxdna_remove(struct pci_dev *pdev)
|
|||
client = list_first_entry_or_null(&xdna->client_list,
|
||||
struct amdxdna_client, node);
|
||||
while (client) {
|
||||
list_del_init(&client->node);
|
||||
amdxdna_hwctx_remove_all(client);
|
||||
amdxdna_client_cleanup(client);
|
||||
|
||||
client = list_first_entry_or_null(&xdna->client_list,
|
||||
struct amdxdna_client, node);
|
||||
|
|
|
|||
|
|
@ -101,7 +101,6 @@ struct amdxdna_dev {
|
|||
struct amdxdna_fw_ver fw_ver;
|
||||
struct rw_semaphore notifier_lock; /* for mmu notifier*/
|
||||
struct workqueue_struct *notifier_wq;
|
||||
bool rpm_on;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -131,6 +130,7 @@ struct amdxdna_client {
|
|||
|
||||
struct iommu_sva *sva;
|
||||
int pasid;
|
||||
struct mm_struct *mm;
|
||||
};
|
||||
|
||||
#define amdxdna_for_each_hwctx(client, hwctx_id, entry) \
|
||||
|
|
@ -138,7 +138,6 @@ struct amdxdna_client {
|
|||
|
||||
/* Add device info below */
|
||||
extern const struct amdxdna_dev_info dev_npu1_info;
|
||||
extern const struct amdxdna_dev_info dev_npu2_info;
|
||||
extern const struct amdxdna_dev_info dev_npu4_info;
|
||||
extern const struct amdxdna_dev_info dev_npu5_info;
|
||||
extern const struct amdxdna_dev_info dev_npu6_info;
|
||||
|
|
|
|||
|
|
@ -15,14 +15,9 @@ int amdxdna_pm_suspend(struct device *dev)
|
|||
{
|
||||
struct amdxdna_dev *xdna = to_xdna_dev(dev_get_drvdata(dev));
|
||||
int ret = -EOPNOTSUPP;
|
||||
bool rpm;
|
||||
|
||||
if (xdna->dev_info->ops->suspend) {
|
||||
rpm = xdna->rpm_on;
|
||||
xdna->rpm_on = false;
|
||||
if (xdna->dev_info->ops->suspend)
|
||||
ret = xdna->dev_info->ops->suspend(xdna);
|
||||
xdna->rpm_on = rpm;
|
||||
}
|
||||
|
||||
XDNA_DBG(xdna, "Suspend done ret %d", ret);
|
||||
return ret;
|
||||
|
|
@ -32,14 +27,9 @@ int amdxdna_pm_resume(struct device *dev)
|
|||
{
|
||||
struct amdxdna_dev *xdna = to_xdna_dev(dev_get_drvdata(dev));
|
||||
int ret = -EOPNOTSUPP;
|
||||
bool rpm;
|
||||
|
||||
if (xdna->dev_info->ops->resume) {
|
||||
rpm = xdna->rpm_on;
|
||||
xdna->rpm_on = false;
|
||||
if (xdna->dev_info->ops->resume)
|
||||
ret = xdna->dev_info->ops->resume(xdna);
|
||||
xdna->rpm_on = rpm;
|
||||
}
|
||||
|
||||
XDNA_DBG(xdna, "Resume done ret %d", ret);
|
||||
return ret;
|
||||
|
|
@ -50,9 +40,6 @@ int amdxdna_pm_resume_get(struct amdxdna_dev *xdna)
|
|||
struct device *dev = xdna->ddev.dev;
|
||||
int ret;
|
||||
|
||||
if (!xdna->rpm_on)
|
||||
return 0;
|
||||
|
||||
ret = pm_runtime_resume_and_get(dev);
|
||||
if (ret) {
|
||||
XDNA_ERR(xdna, "Resume failed: %d", ret);
|
||||
|
|
@ -66,9 +53,6 @@ void amdxdna_pm_suspend_put(struct amdxdna_dev *xdna)
|
|||
{
|
||||
struct device *dev = xdna->ddev.dev;
|
||||
|
||||
if (!xdna->rpm_on)
|
||||
return;
|
||||
|
||||
pm_runtime_put_autosuspend(dev);
|
||||
}
|
||||
|
||||
|
|
@ -81,14 +65,12 @@ void amdxdna_pm_init(struct amdxdna_dev *xdna)
|
|||
pm_runtime_use_autosuspend(dev);
|
||||
pm_runtime_allow(dev);
|
||||
pm_runtime_put_autosuspend(dev);
|
||||
xdna->rpm_on = true;
|
||||
}
|
||||
|
||||
void amdxdna_pm_fini(struct amdxdna_dev *xdna)
|
||||
{
|
||||
struct device *dev = xdna->ddev.dev;
|
||||
|
||||
xdna->rpm_on = false;
|
||||
pm_runtime_get_noresume(dev);
|
||||
pm_runtime_forbid(dev);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -34,15 +34,21 @@ static struct sg_table *amdxdna_ubuf_map(struct dma_buf_attachment *attach,
|
|||
ret = sg_alloc_table_from_pages(sg, ubuf->pages, ubuf->nr_pages, 0,
|
||||
ubuf->nr_pages << PAGE_SHIFT, GFP_KERNEL);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
goto err_free_sg;
|
||||
|
||||
if (ubuf->flags & AMDXDNA_UBUF_FLAG_MAP_DMA) {
|
||||
ret = dma_map_sgtable(attach->dev, sg, direction, 0);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
goto err_free_table;
|
||||
}
|
||||
|
||||
return sg;
|
||||
|
||||
err_free_table:
|
||||
sg_free_table(sg);
|
||||
err_free_sg:
|
||||
kfree(sg);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
static void amdxdna_ubuf_unmap(struct dma_buf_attachment *attach,
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@
|
|||
#include <drm/amdxdna_accel.h>
|
||||
#include <drm/drm_device.h>
|
||||
#include <drm/gpu_scheduler.h>
|
||||
#include <linux/bits.h>
|
||||
#include <linux/sizes.h>
|
||||
|
||||
#include "aie2_pci.h"
|
||||
|
|
@ -13,6 +14,7 @@
|
|||
#include "amdxdna_pci_drv.h"
|
||||
|
||||
/* Address definition from NPU1 docs */
|
||||
#define MPNPU_PWAITMODE 0x3010034
|
||||
#define MPNPU_PUB_SEC_INTR 0x3010090
|
||||
#define MPNPU_PUB_PWRMGMT_INTR 0x3010094
|
||||
#define MPNPU_PUB_SCRATCH2 0x30100A0
|
||||
|
|
@ -64,14 +66,13 @@ const struct dpm_clk_freq npu1_dpm_clk_table[] = {
|
|||
};
|
||||
|
||||
static const struct aie2_fw_feature_tbl npu1_fw_feature_table[] = {
|
||||
{ .feature = AIE2_NPU_COMMAND, .min_minor = 8 },
|
||||
{ .major = 5, .min_minor = 7 },
|
||||
{ .features = BIT_U64(AIE2_NPU_COMMAND), .min_minor = 8 },
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
static const struct amdxdna_dev_priv npu1_dev_priv = {
|
||||
.fw_path = "amdnpu/1502_00/npu.sbin",
|
||||
.protocol_major = 0x5,
|
||||
.protocol_minor = 0x7,
|
||||
.rt_config = npu1_default_rt_cfg,
|
||||
.dpm_clk_tbl = npu1_dpm_clk_table,
|
||||
.fw_feature_tbl = npu1_fw_feature_table,
|
||||
|
|
@ -92,6 +93,7 @@ static const struct amdxdna_dev_priv npu1_dev_priv = {
|
|||
DEFINE_BAR_OFFSET(PSP_INTR_REG, NPU1_PSP, MPNPU_PUB_SEC_INTR),
|
||||
DEFINE_BAR_OFFSET(PSP_STATUS_REG, NPU1_PSP, MPNPU_PUB_SCRATCH2),
|
||||
DEFINE_BAR_OFFSET(PSP_RESP_REG, NPU1_PSP, MPNPU_PUB_SCRATCH3),
|
||||
DEFINE_BAR_OFFSET(PSP_PWAITMODE_REG, NPU1_PSP, MPNPU_PWAITMODE),
|
||||
},
|
||||
.smu_regs_off = {
|
||||
DEFINE_BAR_OFFSET(SMU_CMD_REG, NPU1_SMU, MPNPU_PUB_SCRATCH5),
|
||||
|
|
|
|||
|
|
@ -1,115 +0,0 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (C) 2023-2024, Advanced Micro Devices, Inc.
|
||||
*/
|
||||
|
||||
#include <drm/amdxdna_accel.h>
|
||||
#include <drm/drm_device.h>
|
||||
#include <drm/gpu_scheduler.h>
|
||||
#include <linux/sizes.h>
|
||||
|
||||
#include "aie2_pci.h"
|
||||
#include "amdxdna_mailbox.h"
|
||||
#include "amdxdna_pci_drv.h"
|
||||
|
||||
/* NPU Public Registers on MpNPUAxiXbar (refer to Diag npu_registers.h) */
|
||||
#define MPNPU_PUB_SEC_INTR 0x3010060
|
||||
#define MPNPU_PUB_PWRMGMT_INTR 0x3010064
|
||||
#define MPNPU_PUB_SCRATCH0 0x301006C
|
||||
#define MPNPU_PUB_SCRATCH1 0x3010070
|
||||
#define MPNPU_PUB_SCRATCH2 0x3010074
|
||||
#define MPNPU_PUB_SCRATCH3 0x3010078
|
||||
#define MPNPU_PUB_SCRATCH4 0x301007C
|
||||
#define MPNPU_PUB_SCRATCH5 0x3010080
|
||||
#define MPNPU_PUB_SCRATCH6 0x3010084
|
||||
#define MPNPU_PUB_SCRATCH7 0x3010088
|
||||
#define MPNPU_PUB_SCRATCH8 0x301008C
|
||||
#define MPNPU_PUB_SCRATCH9 0x3010090
|
||||
#define MPNPU_PUB_SCRATCH10 0x3010094
|
||||
#define MPNPU_PUB_SCRATCH11 0x3010098
|
||||
#define MPNPU_PUB_SCRATCH12 0x301009C
|
||||
#define MPNPU_PUB_SCRATCH13 0x30100A0
|
||||
#define MPNPU_PUB_SCRATCH14 0x30100A4
|
||||
#define MPNPU_PUB_SCRATCH15 0x30100A8
|
||||
#define MP0_C2PMSG_73 0x3810A24
|
||||
#define MP0_C2PMSG_123 0x3810AEC
|
||||
|
||||
#define MP1_C2PMSG_0 0x3B10900
|
||||
#define MP1_C2PMSG_60 0x3B109F0
|
||||
#define MP1_C2PMSG_61 0x3B109F4
|
||||
|
||||
#define MPNPU_SRAM_X2I_MAILBOX_0 0x3600000
|
||||
#define MPNPU_SRAM_X2I_MAILBOX_15 0x361E000
|
||||
#define MPNPU_SRAM_X2I_MAILBOX_31 0x363E000
|
||||
#define MPNPU_SRAM_I2X_MAILBOX_31 0x363F000
|
||||
|
||||
#define MMNPU_APERTURE0_BASE 0x3000000
|
||||
#define MMNPU_APERTURE1_BASE 0x3600000
|
||||
#define MMNPU_APERTURE3_BASE 0x3810000
|
||||
#define MMNPU_APERTURE4_BASE 0x3B10000
|
||||
|
||||
/* PCIe BAR Index for NPU2 */
|
||||
#define NPU2_REG_BAR_INDEX 0
|
||||
#define NPU2_MBOX_BAR_INDEX 0
|
||||
#define NPU2_PSP_BAR_INDEX 4
|
||||
#define NPU2_SMU_BAR_INDEX 5
|
||||
#define NPU2_SRAM_BAR_INDEX 2
|
||||
/* Associated BARs and Apertures */
|
||||
#define NPU2_REG_BAR_BASE MMNPU_APERTURE0_BASE
|
||||
#define NPU2_MBOX_BAR_BASE MMNPU_APERTURE0_BASE
|
||||
#define NPU2_PSP_BAR_BASE MMNPU_APERTURE3_BASE
|
||||
#define NPU2_SMU_BAR_BASE MMNPU_APERTURE4_BASE
|
||||
#define NPU2_SRAM_BAR_BASE MMNPU_APERTURE1_BASE
|
||||
|
||||
static const struct amdxdna_dev_priv npu2_dev_priv = {
|
||||
.fw_path = "amdnpu/17f0_00/npu.sbin",
|
||||
.protocol_major = 0x6,
|
||||
.protocol_minor = 0x6,
|
||||
.rt_config = npu4_default_rt_cfg,
|
||||
.dpm_clk_tbl = npu4_dpm_clk_table,
|
||||
.fw_feature_tbl = npu4_fw_feature_table,
|
||||
.col_align = COL_ALIGN_NATURE,
|
||||
.mbox_dev_addr = NPU2_MBOX_BAR_BASE,
|
||||
.mbox_size = 0, /* Use BAR size */
|
||||
.sram_dev_addr = NPU2_SRAM_BAR_BASE,
|
||||
.hwctx_limit = 16,
|
||||
.sram_offs = {
|
||||
DEFINE_BAR_OFFSET(MBOX_CHANN_OFF, NPU2_SRAM, MPNPU_SRAM_X2I_MAILBOX_0),
|
||||
DEFINE_BAR_OFFSET(FW_ALIVE_OFF, NPU2_SRAM, MPNPU_SRAM_X2I_MAILBOX_15),
|
||||
},
|
||||
.psp_regs_off = {
|
||||
DEFINE_BAR_OFFSET(PSP_CMD_REG, NPU2_PSP, MP0_C2PMSG_123),
|
||||
DEFINE_BAR_OFFSET(PSP_ARG0_REG, NPU2_REG, MPNPU_PUB_SCRATCH3),
|
||||
DEFINE_BAR_OFFSET(PSP_ARG1_REG, NPU2_REG, MPNPU_PUB_SCRATCH4),
|
||||
DEFINE_BAR_OFFSET(PSP_ARG2_REG, NPU2_REG, MPNPU_PUB_SCRATCH9),
|
||||
DEFINE_BAR_OFFSET(PSP_INTR_REG, NPU2_PSP, MP0_C2PMSG_73),
|
||||
DEFINE_BAR_OFFSET(PSP_STATUS_REG, NPU2_PSP, MP0_C2PMSG_123),
|
||||
DEFINE_BAR_OFFSET(PSP_RESP_REG, NPU2_REG, MPNPU_PUB_SCRATCH3),
|
||||
},
|
||||
.smu_regs_off = {
|
||||
DEFINE_BAR_OFFSET(SMU_CMD_REG, NPU2_SMU, MP1_C2PMSG_0),
|
||||
DEFINE_BAR_OFFSET(SMU_ARG_REG, NPU2_SMU, MP1_C2PMSG_60),
|
||||
DEFINE_BAR_OFFSET(SMU_INTR_REG, NPU2_SMU, MMNPU_APERTURE4_BASE),
|
||||
DEFINE_BAR_OFFSET(SMU_RESP_REG, NPU2_SMU, MP1_C2PMSG_61),
|
||||
DEFINE_BAR_OFFSET(SMU_OUT_REG, NPU2_SMU, MP1_C2PMSG_60),
|
||||
},
|
||||
.hw_ops = {
|
||||
.set_dpm = npu4_set_dpm,
|
||||
},
|
||||
};
|
||||
|
||||
const struct amdxdna_dev_info dev_npu2_info = {
|
||||
.reg_bar = NPU2_REG_BAR_INDEX,
|
||||
.mbox_bar = NPU2_MBOX_BAR_INDEX,
|
||||
.sram_bar = NPU2_SRAM_BAR_INDEX,
|
||||
.psp_bar = NPU2_PSP_BAR_INDEX,
|
||||
.smu_bar = NPU2_SMU_BAR_INDEX,
|
||||
.first_col = 0,
|
||||
.dev_mem_buf_shift = 15, /* 32 KiB aligned */
|
||||
.dev_mem_base = AIE2_DEVM_BASE,
|
||||
.dev_mem_size = AIE2_DEVM_SIZE,
|
||||
.vbnv = "RyzenAI-npu2",
|
||||
.device_type = AMDXDNA_DEV_TYPE_KMQ,
|
||||
.dev_priv = &npu2_dev_priv,
|
||||
.ops = &aie2_ops, /* NPU2 can share NPU1's callback */
|
||||
};
|
||||
|
|
@ -6,6 +6,7 @@
|
|||
#include <drm/amdxdna_accel.h>
|
||||
#include <drm/drm_device.h>
|
||||
#include <drm/gpu_scheduler.h>
|
||||
#include <linux/bits.h>
|
||||
#include <linux/sizes.h>
|
||||
|
||||
#include "aie2_pci.h"
|
||||
|
|
@ -13,6 +14,7 @@
|
|||
#include "amdxdna_pci_drv.h"
|
||||
|
||||
/* NPU Public Registers on MpNPUAxiXbar (refer to Diag npu_registers.h) */
|
||||
#define MPNPU_PWAITMODE 0x301003C
|
||||
#define MPNPU_PUB_SEC_INTR 0x3010060
|
||||
#define MPNPU_PUB_PWRMGMT_INTR 0x3010064
|
||||
#define MPNPU_PUB_SCRATCH0 0x301006C
|
||||
|
|
@ -87,15 +89,16 @@ const struct dpm_clk_freq npu4_dpm_clk_table[] = {
|
|||
};
|
||||
|
||||
const struct aie2_fw_feature_tbl npu4_fw_feature_table[] = {
|
||||
{ .feature = AIE2_NPU_COMMAND, .min_minor = 15 },
|
||||
{ .feature = AIE2_PREEMPT, .min_minor = 12 },
|
||||
{ .major = 6, .min_minor = 12 },
|
||||
{ .features = BIT_U64(AIE2_NPU_COMMAND), .major = 6, .min_minor = 15 },
|
||||
{ .features = BIT_U64(AIE2_PREEMPT), .major = 6, .min_minor = 12 },
|
||||
{ .features = BIT_U64(AIE2_TEMPORAL_ONLY), .major = 6, .min_minor = 12 },
|
||||
{ .features = GENMASK_ULL(AIE2_TEMPORAL_ONLY, AIE2_NPU_COMMAND), .major = 7 },
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
static const struct amdxdna_dev_priv npu4_dev_priv = {
|
||||
.fw_path = "amdnpu/17f0_10/npu.sbin",
|
||||
.protocol_major = 0x6,
|
||||
.protocol_minor = 12,
|
||||
.rt_config = npu4_default_rt_cfg,
|
||||
.dpm_clk_tbl = npu4_dpm_clk_table,
|
||||
.fw_feature_tbl = npu4_fw_feature_table,
|
||||
|
|
@ -116,6 +119,7 @@ static const struct amdxdna_dev_priv npu4_dev_priv = {
|
|||
DEFINE_BAR_OFFSET(PSP_INTR_REG, NPU4_PSP, MP0_C2PMSG_73),
|
||||
DEFINE_BAR_OFFSET(PSP_STATUS_REG, NPU4_PSP, MP0_C2PMSG_123),
|
||||
DEFINE_BAR_OFFSET(PSP_RESP_REG, NPU4_REG, MPNPU_PUB_SCRATCH3),
|
||||
DEFINE_BAR_OFFSET(PSP_PWAITMODE_REG, NPU4_REG, MPNPU_PWAITMODE),
|
||||
},
|
||||
.smu_regs_off = {
|
||||
DEFINE_BAR_OFFSET(SMU_CMD_REG, NPU4_SMU, MP1_C2PMSG_0),
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
#include "amdxdna_pci_drv.h"
|
||||
|
||||
/* NPU Public Registers on MpNPUAxiXbar (refer to Diag npu_registers.h) */
|
||||
#define MPNPU_PWAITMODE 0x301003C
|
||||
#define MPNPU_PUB_SEC_INTR 0x3010060
|
||||
#define MPNPU_PUB_PWRMGMT_INTR 0x3010064
|
||||
#define MPNPU_PUB_SCRATCH0 0x301006C
|
||||
|
|
@ -63,8 +64,6 @@
|
|||
|
||||
static const struct amdxdna_dev_priv npu5_dev_priv = {
|
||||
.fw_path = "amdnpu/17f0_11/npu.sbin",
|
||||
.protocol_major = 0x6,
|
||||
.protocol_minor = 12,
|
||||
.rt_config = npu4_default_rt_cfg,
|
||||
.dpm_clk_tbl = npu4_dpm_clk_table,
|
||||
.fw_feature_tbl = npu4_fw_feature_table,
|
||||
|
|
@ -85,6 +84,7 @@ static const struct amdxdna_dev_priv npu5_dev_priv = {
|
|||
DEFINE_BAR_OFFSET(PSP_INTR_REG, NPU5_PSP, MP0_C2PMSG_73),
|
||||
DEFINE_BAR_OFFSET(PSP_STATUS_REG, NPU5_PSP, MP0_C2PMSG_123),
|
||||
DEFINE_BAR_OFFSET(PSP_RESP_REG, NPU5_REG, MPNPU_PUB_SCRATCH3),
|
||||
DEFINE_BAR_OFFSET(PSP_PWAITMODE_REG, NPU5_REG, MPNPU_PWAITMODE),
|
||||
},
|
||||
.smu_regs_off = {
|
||||
DEFINE_BAR_OFFSET(SMU_CMD_REG, NPU5_SMU, MP1_C2PMSG_0),
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
#include "amdxdna_pci_drv.h"
|
||||
|
||||
/* NPU Public Registers on MpNPUAxiXbar (refer to Diag npu_registers.h) */
|
||||
#define MPNPU_PWAITMODE 0x301003C
|
||||
#define MPNPU_PUB_SEC_INTR 0x3010060
|
||||
#define MPNPU_PUB_PWRMGMT_INTR 0x3010064
|
||||
#define MPNPU_PUB_SCRATCH0 0x301006C
|
||||
|
|
@ -63,8 +64,6 @@
|
|||
|
||||
static const struct amdxdna_dev_priv npu6_dev_priv = {
|
||||
.fw_path = "amdnpu/17f0_10/npu.sbin",
|
||||
.protocol_major = 0x6,
|
||||
.protocol_minor = 12,
|
||||
.rt_config = npu4_default_rt_cfg,
|
||||
.dpm_clk_tbl = npu4_dpm_clk_table,
|
||||
.fw_feature_tbl = npu4_fw_feature_table,
|
||||
|
|
@ -85,6 +84,7 @@ static const struct amdxdna_dev_priv npu6_dev_priv = {
|
|||
DEFINE_BAR_OFFSET(PSP_INTR_REG, NPU6_PSP, MP0_C2PMSG_73),
|
||||
DEFINE_BAR_OFFSET(PSP_STATUS_REG, NPU6_PSP, MP0_C2PMSG_123),
|
||||
DEFINE_BAR_OFFSET(PSP_RESP_REG, NPU6_REG, MPNPU_PUB_SCRATCH3),
|
||||
DEFINE_BAR_OFFSET(PSP_PWAITMODE_REG, NPU6_REG, MPNPU_PWAITMODE),
|
||||
},
|
||||
.smu_regs_off = {
|
||||
DEFINE_BAR_OFFSET(SMU_CMD_REG, NPU6_SMU, MP1_C2PMSG_0),
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@
|
|||
#include "ivpu_hw.h"
|
||||
#include "ivpu_jsm_msg.h"
|
||||
#include "ivpu_pm.h"
|
||||
#include "vpu_boot_api.h"
|
||||
|
||||
static inline struct ivpu_device *seq_to_ivpu(struct seq_file *s)
|
||||
{
|
||||
|
|
@ -96,7 +97,8 @@ static int last_bootmode_show(struct seq_file *s, void *v)
|
|||
{
|
||||
struct ivpu_device *vdev = seq_to_ivpu(s);
|
||||
|
||||
seq_printf(s, "%s\n", (vdev->pm->is_warmboot) ? "warmboot" : "coldboot");
|
||||
seq_printf(s, "%s\n", (vdev->fw->last_boot_mode == VPU_BOOT_TYPE_WARMBOOT) ?
|
||||
"warm boot" : "cold boot");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -384,6 +384,7 @@ int ivpu_boot(struct ivpu_device *vdev)
|
|||
drm_WARN_ON(&vdev->drm, !xa_empty(&vdev->submitted_jobs_xa));
|
||||
|
||||
ivpu_fw_boot_params_setup(vdev, ivpu_bo_vaddr(vdev->fw->mem_bp));
|
||||
vdev->fw->last_boot_mode = vdev->fw->next_boot_mode;
|
||||
|
||||
ret = ivpu_hw_boot_fw(vdev);
|
||||
if (ret) {
|
||||
|
|
@ -396,13 +397,12 @@ int ivpu_boot(struct ivpu_device *vdev)
|
|||
ivpu_err(vdev, "Failed to boot the firmware: %d\n", ret);
|
||||
goto err_diagnose_failure;
|
||||
}
|
||||
|
||||
ivpu_hw_irq_clear(vdev);
|
||||
enable_irq(vdev->irq);
|
||||
ivpu_hw_irq_enable(vdev);
|
||||
ivpu_ipc_enable(vdev);
|
||||
|
||||
if (ivpu_fw_is_cold_boot(vdev)) {
|
||||
if (!ivpu_fw_is_warm_boot(vdev)) {
|
||||
ret = ivpu_pm_dct_init(vdev);
|
||||
if (ret)
|
||||
goto err_disable_ipc;
|
||||
|
|
|
|||
|
|
@ -300,9 +300,7 @@ static int ivpu_fw_parse(struct ivpu_device *vdev)
|
|||
fw->image_load_offset = image_load_addr - runtime_addr;
|
||||
fw->image_size = image_size;
|
||||
fw->shave_nn_size = PAGE_ALIGN(fw_hdr->shave_nn_fw_size);
|
||||
|
||||
fw->cold_boot_entry_point = fw_hdr->entry_point;
|
||||
fw->entry_point = fw->cold_boot_entry_point;
|
||||
|
||||
fw->trace_level = min_t(u32, ivpu_fw_log_level, IVPU_FW_LOG_FATAL);
|
||||
fw->trace_destination_mask = VPU_TRACE_DESTINATION_VERBOSE_TRACING;
|
||||
|
|
@ -338,7 +336,7 @@ static int ivpu_fw_parse(struct ivpu_device *vdev)
|
|||
fw->image_load_offset, fw->image_size);
|
||||
ivpu_dbg(vdev, FW_BOOT, "Read-only section: address 0x%llx, size %u\n",
|
||||
fw->read_only_addr, fw->read_only_size);
|
||||
ivpu_dbg(vdev, FW_BOOT, "FW entry point: 0x%llx\n", fw->entry_point);
|
||||
ivpu_dbg(vdev, FW_BOOT, "FW cold boot entry point: 0x%llx\n", fw->cold_boot_entry_point);
|
||||
ivpu_dbg(vdev, FW_BOOT, "SHAVE NN size: %u\n", fw->shave_nn_size);
|
||||
|
||||
return 0;
|
||||
|
|
@ -616,6 +614,7 @@ static void ivpu_fw_boot_params_print(struct ivpu_device *vdev, struct vpu_boot_
|
|||
boot_params->power_profile);
|
||||
ivpu_dbg(vdev, FW_BOOT, "boot_params.vpu_uses_ecc_mca_signal = 0x%x\n",
|
||||
boot_params->vpu_uses_ecc_mca_signal);
|
||||
ivpu_dbg(vdev, FW_BOOT, "boot_params.boot_type = 0x%x\n", boot_params->boot_type);
|
||||
}
|
||||
|
||||
void ivpu_fw_boot_params_setup(struct ivpu_device *vdev, struct vpu_boot_params *boot_params)
|
||||
|
|
@ -623,7 +622,7 @@ void ivpu_fw_boot_params_setup(struct ivpu_device *vdev, struct vpu_boot_params
|
|||
struct ivpu_bo *ipc_mem_rx = vdev->ipc->mem_rx;
|
||||
|
||||
/* In case of warm boot only update variable params */
|
||||
if (!ivpu_fw_is_cold_boot(vdev)) {
|
||||
if (ivpu_fw_is_warm_boot(vdev)) {
|
||||
boot_params->d0i3_residency_time_us =
|
||||
ktime_us_delta(ktime_get_boottime(), vdev->hw->d0i3_entry_host_ts);
|
||||
boot_params->d0i3_entry_vpu_ts = vdev->hw->d0i3_entry_vpu_ts;
|
||||
|
|
@ -635,16 +634,16 @@ void ivpu_fw_boot_params_setup(struct ivpu_device *vdev, struct vpu_boot_params
|
|||
boot_params->d0i3_entry_vpu_ts);
|
||||
ivpu_dbg(vdev, FW_BOOT, "boot_params.system_time_us = %llu\n",
|
||||
boot_params->system_time_us);
|
||||
ivpu_dbg(vdev, FW_BOOT, "boot_params.boot_type = 0x%x\n", boot_params->boot_type);
|
||||
|
||||
boot_params->save_restore_ret_address = 0;
|
||||
vdev->pm->is_warmboot = true;
|
||||
boot_params->boot_type = VPU_BOOT_TYPE_WARMBOOT;
|
||||
wmb(); /* Flush WC buffers after writing save_restore_ret_address */
|
||||
return;
|
||||
}
|
||||
|
||||
memset(boot_params, 0, sizeof(*boot_params));
|
||||
vdev->pm->is_warmboot = false;
|
||||
|
||||
boot_params->boot_type = VPU_BOOT_TYPE_COLDBOOT;
|
||||
boot_params->magic = VPU_BOOT_PARAMS_MAGIC;
|
||||
boot_params->vpu_id = to_pci_dev(vdev->drm.dev)->bus->number;
|
||||
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@
|
|||
#ifndef __IVPU_FW_H__
|
||||
#define __IVPU_FW_H__
|
||||
|
||||
#include "vpu_boot_api.h"
|
||||
#include "vpu_jsm_api.h"
|
||||
|
||||
#define FW_VERSION_HEADER_SIZE SZ_4K
|
||||
|
|
@ -34,8 +35,10 @@ struct ivpu_fw_info {
|
|||
u64 image_load_offset;
|
||||
u32 image_size;
|
||||
u32 shave_nn_size;
|
||||
u64 entry_point; /* Cold or warm boot entry point for next boot */
|
||||
u64 warm_boot_entry_point;
|
||||
u64 cold_boot_entry_point;
|
||||
u8 last_boot_mode;
|
||||
u8 next_boot_mode;
|
||||
u32 trace_level;
|
||||
u32 trace_destination_mask;
|
||||
u64 trace_hw_component_mask;
|
||||
|
|
@ -54,9 +57,9 @@ void ivpu_fw_fini(struct ivpu_device *vdev);
|
|||
void ivpu_fw_load(struct ivpu_device *vdev);
|
||||
void ivpu_fw_boot_params_setup(struct ivpu_device *vdev, struct vpu_boot_params *boot_params);
|
||||
|
||||
static inline bool ivpu_fw_is_cold_boot(struct ivpu_device *vdev)
|
||||
static inline bool ivpu_fw_is_warm_boot(struct ivpu_device *vdev)
|
||||
{
|
||||
return vdev->fw->entry_point == vdev->fw->cold_boot_entry_point;
|
||||
return vdev->fw->next_boot_mode == VPU_BOOT_TYPE_WARMBOOT;
|
||||
}
|
||||
|
||||
static inline u32 ivpu_fw_preempt_buf_size(struct ivpu_device *vdev)
|
||||
|
|
|
|||
|
|
@ -95,7 +95,7 @@ int __must_check ivpu_bo_bind(struct ivpu_bo *bo)
|
|||
|
||||
if (!bo->mmu_mapped) {
|
||||
drm_WARN_ON(&vdev->drm, !bo->ctx);
|
||||
ret = ivpu_mmu_context_map_sgt(vdev, bo->ctx, bo->vpu_addr, sgt,
|
||||
ret = ivpu_mmu_context_map_sgt(vdev, bo->ctx, bo->vpu_addr, sgt, ivpu_bo_size(bo),
|
||||
ivpu_bo_is_snooped(bo), ivpu_bo_is_read_only(bo));
|
||||
if (ret) {
|
||||
ivpu_err(vdev, "Failed to map BO in MMU: %d\n", ret);
|
||||
|
|
|
|||
|
|
@ -121,6 +121,12 @@
|
|||
#define VPU_50XX_HOST_SS_AON_PWR_ISLAND_STATUS_DLY 0x0003006cu
|
||||
#define VPU_50XX_HOST_SS_AON_PWR_ISLAND_STATUS_DLY_STATUS_DLY_MASK GENMASK(7, 0)
|
||||
|
||||
#define VPU_40XX_HOST_SS_AON_RETENTION0 0x0003000cu
|
||||
#define VPU_40XX_HOST_SS_AON_RETENTION1 0x00030010u
|
||||
#define VPU_40XX_HOST_SS_AON_RETENTION2 0x00030014u
|
||||
#define VPU_40XX_HOST_SS_AON_RETENTION3 0x00030018u
|
||||
#define VPU_40XX_HOST_SS_AON_RETENTION4 0x0003001cu
|
||||
|
||||
#define VPU_40XX_HOST_SS_AON_IDLE_GEN 0x00030200u
|
||||
#define VPU_40XX_HOST_SS_AON_IDLE_GEN_EN_MASK BIT_MASK(0)
|
||||
#define VPU_40XX_HOST_SS_AON_IDLE_GEN_HW_PG_EN_MASK BIT_MASK(1)
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@
|
|||
|
||||
#include "ivpu_drv.h"
|
||||
#include "ivpu_fw.h"
|
||||
#include "ivpu_gem.h"
|
||||
#include "ivpu_hw.h"
|
||||
#include "ivpu_hw_37xx_reg.h"
|
||||
#include "ivpu_hw_40xx_reg.h"
|
||||
|
|
@ -816,6 +817,14 @@ void ivpu_hw_ip_tbu_mmu_enable(struct ivpu_device *vdev)
|
|||
return ivpu_hw_ip_tbu_mmu_enable_40xx(vdev);
|
||||
}
|
||||
|
||||
static inline u64 get_entry_point_addr(struct ivpu_device *vdev)
|
||||
{
|
||||
if (ivpu_fw_is_warm_boot(vdev))
|
||||
return vdev->fw->warm_boot_entry_point;
|
||||
else
|
||||
return vdev->fw->cold_boot_entry_point;
|
||||
}
|
||||
|
||||
static int soc_cpu_boot_37xx(struct ivpu_device *vdev)
|
||||
{
|
||||
u32 val;
|
||||
|
|
@ -832,15 +841,12 @@ static int soc_cpu_boot_37xx(struct ivpu_device *vdev)
|
|||
val = REG_CLR_FLD(VPU_37XX_CPU_SS_MSSCPU_CPR_LEON_RT_VEC, IRQI_RESUME0, val);
|
||||
REGV_WR32(VPU_37XX_CPU_SS_MSSCPU_CPR_LEON_RT_VEC, val);
|
||||
|
||||
val = vdev->fw->entry_point >> 9;
|
||||
val = get_entry_point_addr(vdev) >> 9;
|
||||
REGV_WR32(VPU_37XX_HOST_SS_LOADING_ADDRESS_LO, val);
|
||||
|
||||
val = REG_SET_FLD(VPU_37XX_HOST_SS_LOADING_ADDRESS_LO, DONE, val);
|
||||
REGV_WR32(VPU_37XX_HOST_SS_LOADING_ADDRESS_LO, val);
|
||||
|
||||
ivpu_dbg(vdev, PM, "Booting firmware, mode: %s\n",
|
||||
vdev->fw->entry_point == vdev->fw->cold_boot_entry_point ? "cold boot" : "resume");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -894,46 +900,68 @@ static int soc_cpu_drive_40xx(struct ivpu_device *vdev, bool enable)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int soc_cpu_enable(struct ivpu_device *vdev)
|
||||
static void soc_cpu_set_entry_point_40xx(struct ivpu_device *vdev, u64 entry_point)
|
||||
{
|
||||
if (ivpu_hw_ip_gen(vdev) >= IVPU_HW_IP_60XX)
|
||||
return 0;
|
||||
|
||||
return soc_cpu_drive_40xx(vdev, true);
|
||||
}
|
||||
|
||||
static int soc_cpu_boot_40xx(struct ivpu_device *vdev)
|
||||
{
|
||||
int ret;
|
||||
u32 val;
|
||||
u64 val64;
|
||||
u32 val;
|
||||
|
||||
ret = soc_cpu_enable(vdev);
|
||||
if (ret) {
|
||||
ivpu_err(vdev, "Failed to enable SOC CPU: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
val64 = vdev->fw->entry_point;
|
||||
val64 = entry_point;
|
||||
val64 <<= ffs(VPU_40XX_HOST_SS_VERIFICATION_ADDRESS_LO_IMAGE_LOCATION_MASK) - 1;
|
||||
REGV_WR64(VPU_40XX_HOST_SS_VERIFICATION_ADDRESS_LO, val64);
|
||||
|
||||
val = REGV_RD32(VPU_40XX_HOST_SS_VERIFICATION_ADDRESS_LO);
|
||||
val = REG_SET_FLD(VPU_40XX_HOST_SS_VERIFICATION_ADDRESS_LO, DONE, val);
|
||||
REGV_WR32(VPU_40XX_HOST_SS_VERIFICATION_ADDRESS_LO, val);
|
||||
}
|
||||
|
||||
ivpu_dbg(vdev, PM, "Booting firmware, mode: %s\n",
|
||||
ivpu_fw_is_cold_boot(vdev) ? "cold boot" : "resume");
|
||||
static int soc_cpu_boot_40xx(struct ivpu_device *vdev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = soc_cpu_drive_40xx(vdev, true);
|
||||
if (ret) {
|
||||
ivpu_err(vdev, "Failed to enable SOC CPU: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
soc_cpu_set_entry_point_40xx(vdev, get_entry_point_addr(vdev));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int soc_cpu_boot_60xx(struct ivpu_device *vdev)
|
||||
{
|
||||
REGV_WR64(VPU_40XX_HOST_SS_AON_RETENTION1, vdev->fw->mem_bp->vpu_addr);
|
||||
soc_cpu_set_entry_point_40xx(vdev, vdev->fw->cold_boot_entry_point);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ivpu_hw_ip_soc_cpu_boot(struct ivpu_device *vdev)
|
||||
{
|
||||
if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX)
|
||||
return soc_cpu_boot_37xx(vdev);
|
||||
else
|
||||
return soc_cpu_boot_40xx(vdev);
|
||||
int ret;
|
||||
|
||||
switch (ivpu_hw_ip_gen(vdev)) {
|
||||
case IVPU_HW_IP_37XX:
|
||||
ret = soc_cpu_boot_37xx(vdev);
|
||||
break;
|
||||
|
||||
case IVPU_HW_IP_40XX:
|
||||
case IVPU_HW_IP_50XX:
|
||||
ret = soc_cpu_boot_40xx(vdev);
|
||||
break;
|
||||
|
||||
default:
|
||||
ret = soc_cpu_boot_60xx(vdev);
|
||||
}
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ivpu_dbg(vdev, PM, "Booting firmware, mode: %s\n",
|
||||
ivpu_fw_is_warm_boot(vdev) ? "warm boot" : "cold boot");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void wdt_disable_37xx(struct ivpu_device *vdev)
|
||||
|
|
|
|||
|
|
@ -29,7 +29,6 @@ u32 ivpu_hw_ip_ipc_rx_addr_get(struct ivpu_device *vdev);
|
|||
void ivpu_hw_ip_ipc_tx_set(struct ivpu_device *vdev, u32 vpu_addr);
|
||||
void ivpu_hw_ip_irq_enable(struct ivpu_device *vdev);
|
||||
void ivpu_hw_ip_irq_disable(struct ivpu_device *vdev);
|
||||
void ivpu_hw_ip_diagnose_failure(struct ivpu_device *vdev);
|
||||
void ivpu_hw_ip_fabric_req_override_enable_50xx(struct ivpu_device *vdev);
|
||||
void ivpu_hw_ip_fabric_req_override_disable_50xx(struct ivpu_device *vdev);
|
||||
|
||||
|
|
|
|||
|
|
@ -429,11 +429,12 @@ static void ivpu_mmu_context_unmap_pages(struct ivpu_mmu_context *ctx, u64 vpu_a
|
|||
}
|
||||
|
||||
int
|
||||
ivpu_mmu_context_map_sgt(struct ivpu_device *vdev, struct ivpu_mmu_context *ctx,
|
||||
u64 vpu_addr, struct sg_table *sgt, bool llc_coherent, bool read_only)
|
||||
ivpu_mmu_context_map_sgt(struct ivpu_device *vdev, struct ivpu_mmu_context *ctx, u64 vpu_addr,
|
||||
struct sg_table *sgt, size_t bo_size, bool llc_coherent, bool read_only)
|
||||
{
|
||||
size_t start_vpu_addr = vpu_addr;
|
||||
struct scatterlist *sg;
|
||||
size_t sgt_size = 0;
|
||||
int ret;
|
||||
u64 prot;
|
||||
u64 i;
|
||||
|
|
@ -462,12 +463,25 @@ ivpu_mmu_context_map_sgt(struct ivpu_device *vdev, struct ivpu_mmu_context *ctx,
|
|||
ivpu_dbg(vdev, MMU_MAP, "Map ctx: %u dma_addr: 0x%llx vpu_addr: 0x%llx size: %lu\n",
|
||||
ctx->id, dma_addr, vpu_addr, size);
|
||||
|
||||
if (sgt_size + size > bo_size) {
|
||||
ivpu_err(vdev, "Scatter-gather table size exceeds buffer object size\n");
|
||||
ret = -EINVAL;
|
||||
goto err_unmap_pages;
|
||||
}
|
||||
|
||||
ret = ivpu_mmu_context_map_pages(vdev, ctx, vpu_addr, dma_addr, size, prot);
|
||||
if (ret) {
|
||||
ivpu_err(vdev, "Failed to map context pages\n");
|
||||
goto err_unmap_pages;
|
||||
}
|
||||
vpu_addr += size;
|
||||
sgt_size += size;
|
||||
}
|
||||
|
||||
if (sgt_size < bo_size) {
|
||||
ivpu_err(vdev, "Scatter-gather table size too small to cover buffer object size\n");
|
||||
ret = -EINVAL;
|
||||
goto err_unmap_pages;
|
||||
}
|
||||
|
||||
if (!ctx->is_cd_valid) {
|
||||
|
|
@ -493,7 +507,7 @@ ivpu_mmu_context_map_sgt(struct ivpu_device *vdev, struct ivpu_mmu_context *ctx,
|
|||
return 0;
|
||||
|
||||
err_unmap_pages:
|
||||
ivpu_mmu_context_unmap_pages(ctx, start_vpu_addr, vpu_addr - start_vpu_addr);
|
||||
ivpu_mmu_context_unmap_pages(ctx, start_vpu_addr, sgt_size);
|
||||
mutex_unlock(&ctx->lock);
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -41,8 +41,9 @@ int ivpu_mmu_context_insert_node(struct ivpu_mmu_context *ctx, const struct ivpu
|
|||
u64 size, struct drm_mm_node *node);
|
||||
void ivpu_mmu_context_remove_node(struct ivpu_mmu_context *ctx, struct drm_mm_node *node);
|
||||
|
||||
int ivpu_mmu_context_map_sgt(struct ivpu_device *vdev, struct ivpu_mmu_context *ctx,
|
||||
u64 vpu_addr, struct sg_table *sgt, bool llc_coherent, bool read_only);
|
||||
int
|
||||
ivpu_mmu_context_map_sgt(struct ivpu_device *vdev, struct ivpu_mmu_context *ctx, u64 vpu_addr,
|
||||
struct sg_table *sgt, size_t bo_size, bool llc_coherent, bool read_only);
|
||||
void ivpu_mmu_context_unmap_sgt(struct ivpu_device *vdev, struct ivpu_mmu_context *ctx,
|
||||
u64 vpu_addr, struct sg_table *sgt);
|
||||
int ivpu_mmu_context_set_pages_ro(struct ivpu_device *vdev, struct ivpu_mmu_context *ctx,
|
||||
|
|
|
|||
|
|
@ -47,8 +47,10 @@ static void ivpu_pm_prepare_cold_boot(struct ivpu_device *vdev)
|
|||
ivpu_ipc_reset(vdev);
|
||||
ivpu_fw_log_reset(vdev);
|
||||
ivpu_fw_load(vdev);
|
||||
fw->entry_point = fw->cold_boot_entry_point;
|
||||
fw->last_heartbeat = 0;
|
||||
|
||||
ivpu_dbg(vdev, FW_BOOT, "Cold boot entry point 0x%llx", vdev->fw->cold_boot_entry_point);
|
||||
fw->next_boot_mode = VPU_BOOT_TYPE_COLDBOOT;
|
||||
}
|
||||
|
||||
static void ivpu_pm_prepare_warm_boot(struct ivpu_device *vdev)
|
||||
|
|
@ -56,13 +58,14 @@ static void ivpu_pm_prepare_warm_boot(struct ivpu_device *vdev)
|
|||
struct ivpu_fw_info *fw = vdev->fw;
|
||||
struct vpu_boot_params *bp = ivpu_bo_vaddr(fw->mem_bp);
|
||||
|
||||
if (!bp->save_restore_ret_address) {
|
||||
fw->warm_boot_entry_point = bp->save_restore_ret_address;
|
||||
if (!fw->warm_boot_entry_point) {
|
||||
ivpu_pm_prepare_cold_boot(vdev);
|
||||
return;
|
||||
}
|
||||
|
||||
ivpu_dbg(vdev, FW_BOOT, "Save/restore entry point %llx", bp->save_restore_ret_address);
|
||||
fw->entry_point = bp->save_restore_ret_address;
|
||||
ivpu_dbg(vdev, FW_BOOT, "Warm boot entry point 0x%llx", fw->warm_boot_entry_point);
|
||||
fw->next_boot_mode = VPU_BOOT_TYPE_WARMBOOT;
|
||||
}
|
||||
|
||||
static int ivpu_suspend(struct ivpu_device *vdev)
|
||||
|
|
@ -110,7 +113,7 @@ err_power_down:
|
|||
ivpu_hw_power_down(vdev);
|
||||
pci_set_power_state(to_pci_dev(vdev->drm.dev), PCI_D3hot);
|
||||
|
||||
if (!ivpu_fw_is_cold_boot(vdev)) {
|
||||
if (ivpu_fw_is_warm_boot(vdev)) {
|
||||
ivpu_pm_prepare_cold_boot(vdev);
|
||||
goto retry;
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -18,7 +18,6 @@ struct ivpu_pm_info {
|
|||
struct rw_semaphore reset_lock;
|
||||
atomic_t reset_counter;
|
||||
atomic_t reset_pending;
|
||||
bool is_warmboot;
|
||||
u8 dct_active_percent;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -59,8 +59,11 @@ int rocket_core_init(struct rocket_core *core)
|
|||
core->iommu_group = iommu_group_get(dev);
|
||||
|
||||
err = rocket_job_init(core);
|
||||
if (err)
|
||||
if (err) {
|
||||
iommu_group_put(core->iommu_group);
|
||||
core->iommu_group = NULL;
|
||||
return err;
|
||||
}
|
||||
|
||||
pm_runtime_use_autosuspend(dev);
|
||||
|
||||
|
|
@ -76,7 +79,7 @@ int rocket_core_init(struct rocket_core *core)
|
|||
|
||||
err = pm_runtime_resume_and_get(dev);
|
||||
if (err) {
|
||||
rocket_job_fini(core);
|
||||
rocket_core_fini(core);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
|
||||
#include "rocket_device.h"
|
||||
#include "rocket_drv.h"
|
||||
#include "rocket_gem.h"
|
||||
#include "rocket_job.h"
|
||||
|
|
@ -158,6 +159,8 @@ static const struct drm_driver rocket_drm_driver = {
|
|||
|
||||
static int rocket_probe(struct platform_device *pdev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (rdev == NULL) {
|
||||
/* First core probing, initialize DRM device. */
|
||||
rdev = rocket_device_init(drm_dev, &rocket_drm_driver);
|
||||
|
|
@ -177,20 +180,31 @@ static int rocket_probe(struct platform_device *pdev)
|
|||
|
||||
rdev->num_cores++;
|
||||
|
||||
return rocket_core_init(&rdev->cores[core]);
|
||||
ret = rocket_core_init(&rdev->cores[core]);
|
||||
if (ret) {
|
||||
rdev->num_cores--;
|
||||
|
||||
if (rdev->num_cores == 0) {
|
||||
rocket_device_fini(rdev);
|
||||
rdev = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int find_core_for_dev(struct device *dev);
|
||||
|
||||
static void rocket_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
int core = find_core_for_dev(dev);
|
||||
|
||||
for (unsigned int core = 0; core < rdev->num_cores; core++) {
|
||||
if (rdev->cores[core].dev == dev) {
|
||||
rocket_core_fini(&rdev->cores[core]);
|
||||
rdev->num_cores--;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (core < 0)
|
||||
return;
|
||||
|
||||
rocket_core_fini(&rdev->cores[core]);
|
||||
rdev->num_cores--;
|
||||
|
||||
if (rdev->num_cores == 0) {
|
||||
/* Last core removed, deinitialize DRM device. */
|
||||
|
|
|
|||
|
|
@ -401,11 +401,9 @@ static int tegra_se_host1x_probe(struct host1x_device *dev)
|
|||
return host1x_device_init(dev);
|
||||
}
|
||||
|
||||
static int tegra_se_host1x_remove(struct host1x_device *dev)
|
||||
static void tegra_se_host1x_remove(struct host1x_device *dev)
|
||||
{
|
||||
host1x_device_exit(dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct host1x_driver tegra_se_host1x_driver = {
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ config DMABUF_MOVE_NOTIFY
|
|||
config DMABUF_DEBUG
|
||||
bool "DMA-BUF debug checks"
|
||||
depends on DMA_SHARED_BUFFER
|
||||
default y if DMA_API_DEBUG
|
||||
default y if DEBUG
|
||||
help
|
||||
This option enables additional checks for DMA-BUF importers and
|
||||
exporters. Specifically it validates that importers do not peek at the
|
||||
|
|
@ -75,21 +75,6 @@ menuconfig DMABUF_HEAPS
|
|||
allows userspace to allocate dma-bufs that can be shared
|
||||
between drivers.
|
||||
|
||||
menuconfig DMABUF_SYSFS_STATS
|
||||
bool "DMA-BUF sysfs statistics (DEPRECATED)"
|
||||
depends on DMA_SHARED_BUFFER
|
||||
help
|
||||
Choose this option to enable DMA-BUF sysfs statistics
|
||||
in location /sys/kernel/dmabuf/buffers.
|
||||
|
||||
/sys/kernel/dmabuf/buffers/<inode_number> will contain
|
||||
statistics for the DMA-BUF with the unique inode number
|
||||
<inode_number>.
|
||||
|
||||
This option is deprecated and should sooner or later be removed.
|
||||
Android is the only user of this and it turned out that this resulted
|
||||
in quite some performance problems.
|
||||
|
||||
source "drivers/dma-buf/heaps/Kconfig"
|
||||
|
||||
endmenu
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@ obj-$(CONFIG_DMABUF_HEAPS) += heaps/
|
|||
obj-$(CONFIG_SYNC_FILE) += sync_file.o
|
||||
obj-$(CONFIG_SW_SYNC) += sw_sync.o sync_debug.o
|
||||
obj-$(CONFIG_UDMABUF) += udmabuf.o
|
||||
obj-$(CONFIG_DMABUF_SYSFS_STATS) += dma-buf-sysfs-stats.o
|
||||
|
||||
dmabuf_selftests-y := \
|
||||
selftest.o \
|
||||
|
|
|
|||
|
|
@ -1,202 +0,0 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* DMA-BUF sysfs statistics.
|
||||
*
|
||||
* Copyright (C) 2021 Google LLC.
|
||||
*/
|
||||
|
||||
#include <linux/dma-buf.h>
|
||||
#include <linux/dma-resv.h>
|
||||
#include <linux/kobject.h>
|
||||
#include <linux/printk.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/sysfs.h>
|
||||
|
||||
#include "dma-buf-sysfs-stats.h"
|
||||
|
||||
#define to_dma_buf_entry_from_kobj(x) container_of(x, struct dma_buf_sysfs_entry, kobj)
|
||||
|
||||
/**
|
||||
* DOC: overview
|
||||
*
|
||||
* ``/sys/kernel/debug/dma_buf/bufinfo`` provides an overview of every DMA-BUF
|
||||
* in the system. However, since debugfs is not safe to be mounted in
|
||||
* production, procfs and sysfs can be used to gather DMA-BUF statistics on
|
||||
* production systems.
|
||||
*
|
||||
* The ``/proc/<pid>/fdinfo/<fd>`` files in procfs can be used to gather
|
||||
* information about DMA-BUF fds. Detailed documentation about the interface
|
||||
* is present in Documentation/filesystems/proc.rst.
|
||||
*
|
||||
* Unfortunately, the existing procfs interfaces can only provide information
|
||||
* about the DMA-BUFs for which processes hold fds or have the buffers mmapped
|
||||
* into their address space. This necessitated the creation of the DMA-BUF sysfs
|
||||
* statistics interface to provide per-buffer information on production systems.
|
||||
*
|
||||
* The interface at ``/sys/kernel/dmabuf/buffers`` exposes information about
|
||||
* every DMA-BUF when ``CONFIG_DMABUF_SYSFS_STATS`` is enabled.
|
||||
*
|
||||
* The following stats are exposed by the interface:
|
||||
*
|
||||
* * ``/sys/kernel/dmabuf/buffers/<inode_number>/exporter_name``
|
||||
* * ``/sys/kernel/dmabuf/buffers/<inode_number>/size``
|
||||
*
|
||||
* The information in the interface can also be used to derive per-exporter
|
||||
* statistics. The data from the interface can be gathered on error conditions
|
||||
* or other important events to provide a snapshot of DMA-BUF usage.
|
||||
* It can also be collected periodically by telemetry to monitor various metrics.
|
||||
*
|
||||
* Detailed documentation about the interface is present in
|
||||
* Documentation/ABI/testing/sysfs-kernel-dmabuf-buffers.
|
||||
*/
|
||||
|
||||
struct dma_buf_stats_attribute {
|
||||
struct attribute attr;
|
||||
ssize_t (*show)(struct dma_buf *dmabuf,
|
||||
struct dma_buf_stats_attribute *attr, char *buf);
|
||||
};
|
||||
#define to_dma_buf_stats_attr(x) container_of(x, struct dma_buf_stats_attribute, attr)
|
||||
|
||||
static ssize_t dma_buf_stats_attribute_show(struct kobject *kobj,
|
||||
struct attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct dma_buf_stats_attribute *attribute;
|
||||
struct dma_buf_sysfs_entry *sysfs_entry;
|
||||
struct dma_buf *dmabuf;
|
||||
|
||||
attribute = to_dma_buf_stats_attr(attr);
|
||||
sysfs_entry = to_dma_buf_entry_from_kobj(kobj);
|
||||
dmabuf = sysfs_entry->dmabuf;
|
||||
|
||||
if (!dmabuf || !attribute->show)
|
||||
return -EIO;
|
||||
|
||||
return attribute->show(dmabuf, attribute, buf);
|
||||
}
|
||||
|
||||
static const struct sysfs_ops dma_buf_stats_sysfs_ops = {
|
||||
.show = dma_buf_stats_attribute_show,
|
||||
};
|
||||
|
||||
static ssize_t exporter_name_show(struct dma_buf *dmabuf,
|
||||
struct dma_buf_stats_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
return sysfs_emit(buf, "%s\n", dmabuf->exp_name);
|
||||
}
|
||||
|
||||
static ssize_t size_show(struct dma_buf *dmabuf,
|
||||
struct dma_buf_stats_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
return sysfs_emit(buf, "%zu\n", dmabuf->size);
|
||||
}
|
||||
|
||||
static struct dma_buf_stats_attribute exporter_name_attribute =
|
||||
__ATTR_RO(exporter_name);
|
||||
static struct dma_buf_stats_attribute size_attribute = __ATTR_RO(size);
|
||||
|
||||
static struct attribute *dma_buf_stats_default_attrs[] = {
|
||||
&exporter_name_attribute.attr,
|
||||
&size_attribute.attr,
|
||||
NULL,
|
||||
};
|
||||
ATTRIBUTE_GROUPS(dma_buf_stats_default);
|
||||
|
||||
static void dma_buf_sysfs_release(struct kobject *kobj)
|
||||
{
|
||||
struct dma_buf_sysfs_entry *sysfs_entry;
|
||||
|
||||
sysfs_entry = to_dma_buf_entry_from_kobj(kobj);
|
||||
kfree(sysfs_entry);
|
||||
}
|
||||
|
||||
static const struct kobj_type dma_buf_ktype = {
|
||||
.sysfs_ops = &dma_buf_stats_sysfs_ops,
|
||||
.release = dma_buf_sysfs_release,
|
||||
.default_groups = dma_buf_stats_default_groups,
|
||||
};
|
||||
|
||||
void dma_buf_stats_teardown(struct dma_buf *dmabuf)
|
||||
{
|
||||
struct dma_buf_sysfs_entry *sysfs_entry;
|
||||
|
||||
sysfs_entry = dmabuf->sysfs_entry;
|
||||
if (!sysfs_entry)
|
||||
return;
|
||||
|
||||
kobject_del(&sysfs_entry->kobj);
|
||||
kobject_put(&sysfs_entry->kobj);
|
||||
}
|
||||
|
||||
|
||||
/* Statistics files do not need to send uevents. */
|
||||
static int dmabuf_sysfs_uevent_filter(const struct kobject *kobj)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct kset_uevent_ops dmabuf_sysfs_no_uevent_ops = {
|
||||
.filter = dmabuf_sysfs_uevent_filter,
|
||||
};
|
||||
|
||||
static struct kset *dma_buf_stats_kset;
|
||||
static struct kset *dma_buf_per_buffer_stats_kset;
|
||||
int dma_buf_init_sysfs_statistics(void)
|
||||
{
|
||||
dma_buf_stats_kset = kset_create_and_add("dmabuf",
|
||||
&dmabuf_sysfs_no_uevent_ops,
|
||||
kernel_kobj);
|
||||
if (!dma_buf_stats_kset)
|
||||
return -ENOMEM;
|
||||
|
||||
dma_buf_per_buffer_stats_kset = kset_create_and_add("buffers",
|
||||
&dmabuf_sysfs_no_uevent_ops,
|
||||
&dma_buf_stats_kset->kobj);
|
||||
if (!dma_buf_per_buffer_stats_kset) {
|
||||
kset_unregister(dma_buf_stats_kset);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void dma_buf_uninit_sysfs_statistics(void)
|
||||
{
|
||||
kset_unregister(dma_buf_per_buffer_stats_kset);
|
||||
kset_unregister(dma_buf_stats_kset);
|
||||
}
|
||||
|
||||
int dma_buf_stats_setup(struct dma_buf *dmabuf, struct file *file)
|
||||
{
|
||||
struct dma_buf_sysfs_entry *sysfs_entry;
|
||||
int ret;
|
||||
|
||||
if (!dmabuf->exp_name) {
|
||||
pr_err("exporter name must not be empty if stats needed\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
sysfs_entry = kzalloc(sizeof(struct dma_buf_sysfs_entry), GFP_KERNEL);
|
||||
if (!sysfs_entry)
|
||||
return -ENOMEM;
|
||||
|
||||
sysfs_entry->kobj.kset = dma_buf_per_buffer_stats_kset;
|
||||
sysfs_entry->dmabuf = dmabuf;
|
||||
|
||||
dmabuf->sysfs_entry = sysfs_entry;
|
||||
|
||||
/* create the directory for buffer stats */
|
||||
ret = kobject_init_and_add(&sysfs_entry->kobj, &dma_buf_ktype, NULL,
|
||||
"%lu", file_inode(file)->i_ino);
|
||||
if (ret)
|
||||
goto err_sysfs_dmabuf;
|
||||
|
||||
return 0;
|
||||
|
||||
err_sysfs_dmabuf:
|
||||
kobject_put(&sysfs_entry->kobj);
|
||||
dmabuf->sysfs_entry = NULL;
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* DMA-BUF sysfs statistics.
|
||||
*
|
||||
* Copyright (C) 2021 Google LLC.
|
||||
*/
|
||||
|
||||
#ifndef _DMA_BUF_SYSFS_STATS_H
|
||||
#define _DMA_BUF_SYSFS_STATS_H
|
||||
|
||||
#ifdef CONFIG_DMABUF_SYSFS_STATS
|
||||
|
||||
int dma_buf_init_sysfs_statistics(void);
|
||||
void dma_buf_uninit_sysfs_statistics(void);
|
||||
|
||||
int dma_buf_stats_setup(struct dma_buf *dmabuf, struct file *file);
|
||||
|
||||
void dma_buf_stats_teardown(struct dma_buf *dmabuf);
|
||||
#else
|
||||
|
||||
static inline int dma_buf_init_sysfs_statistics(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void dma_buf_uninit_sysfs_statistics(void) {}
|
||||
|
||||
static inline int dma_buf_stats_setup(struct dma_buf *dmabuf, struct file *file)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void dma_buf_stats_teardown(struct dma_buf *dmabuf) {}
|
||||
#endif
|
||||
#endif // _DMA_BUF_SYSFS_STATS_H
|
||||
|
|
@ -33,7 +33,31 @@
|
|||
#include <uapi/linux/dma-buf.h>
|
||||
#include <uapi/linux/magic.h>
|
||||
|
||||
#include "dma-buf-sysfs-stats.h"
|
||||
#define CREATE_TRACE_POINTS
|
||||
#include <trace/events/dma_buf.h>
|
||||
|
||||
/*
|
||||
* dmabuf->name must be accessed with holding dmabuf->name_lock.
|
||||
* we need to take the lock around the tracepoint call itself where
|
||||
* it is called in the code.
|
||||
*
|
||||
* Note: FUNC##_enabled() is a static branch that will only
|
||||
* be set when the trace event is enabled.
|
||||
*/
|
||||
#define DMA_BUF_TRACE(FUNC, ...) \
|
||||
do { \
|
||||
/* Always expose lock if lockdep is enabled */ \
|
||||
if (IS_ENABLED(CONFIG_LOCKDEP) || FUNC##_enabled()) { \
|
||||
guard(spinlock)(&dmabuf->name_lock); \
|
||||
FUNC(__VA_ARGS__); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
/* Wrapper to hide the sg_table page link from the importer */
|
||||
struct dma_buf_sg_table_wrapper {
|
||||
struct sg_table *original;
|
||||
struct sg_table wrapper;
|
||||
};
|
||||
|
||||
static inline int is_dma_buf_file(struct file *);
|
||||
|
||||
|
|
@ -156,7 +180,6 @@ static void dma_buf_release(struct dentry *dentry)
|
|||
*/
|
||||
BUG_ON(dmabuf->cb_in.active || dmabuf->cb_out.active);
|
||||
|
||||
dma_buf_stats_teardown(dmabuf);
|
||||
dmabuf->ops->release(dmabuf);
|
||||
|
||||
if (dmabuf->resv == (struct dma_resv *)&dmabuf[1])
|
||||
|
|
@ -220,6 +243,8 @@ static int dma_buf_mmap_internal(struct file *file, struct vm_area_struct *vma)
|
|||
dmabuf->size >> PAGE_SHIFT)
|
||||
return -EINVAL;
|
||||
|
||||
DMA_BUF_TRACE(trace_dma_buf_mmap_internal, dmabuf);
|
||||
|
||||
return dmabuf->ops->mmap(dmabuf, vma);
|
||||
}
|
||||
|
||||
|
|
@ -735,22 +760,16 @@ struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info)
|
|||
dmabuf->resv = resv;
|
||||
}
|
||||
|
||||
ret = dma_buf_stats_setup(dmabuf, file);
|
||||
if (ret)
|
||||
goto err_dmabuf;
|
||||
|
||||
file->private_data = dmabuf;
|
||||
file->f_path.dentry->d_fsdata = dmabuf;
|
||||
dmabuf->file = file;
|
||||
|
||||
__dma_buf_list_add(dmabuf);
|
||||
|
||||
DMA_BUF_TRACE(trace_dma_buf_export, dmabuf);
|
||||
|
||||
return dmabuf;
|
||||
|
||||
err_dmabuf:
|
||||
if (!resv)
|
||||
dma_resv_fini(dmabuf->resv);
|
||||
kfree(dmabuf);
|
||||
err_file:
|
||||
fput(file);
|
||||
err_module:
|
||||
|
|
@ -768,10 +787,15 @@ EXPORT_SYMBOL_NS_GPL(dma_buf_export, "DMA_BUF");
|
|||
*/
|
||||
int dma_buf_fd(struct dma_buf *dmabuf, int flags)
|
||||
{
|
||||
int fd;
|
||||
|
||||
if (!dmabuf || !dmabuf->file)
|
||||
return -EINVAL;
|
||||
|
||||
return FD_ADD(flags, dmabuf->file);
|
||||
fd = FD_ADD(flags, dmabuf->file);
|
||||
DMA_BUF_TRACE(trace_dma_buf_fd, dmabuf, fd);
|
||||
|
||||
return fd;
|
||||
}
|
||||
EXPORT_SYMBOL_NS_GPL(dma_buf_fd, "DMA_BUF");
|
||||
|
||||
|
|
@ -786,6 +810,7 @@ EXPORT_SYMBOL_NS_GPL(dma_buf_fd, "DMA_BUF");
|
|||
struct dma_buf *dma_buf_get(int fd)
|
||||
{
|
||||
struct file *file;
|
||||
struct dma_buf *dmabuf;
|
||||
|
||||
file = fget(fd);
|
||||
|
||||
|
|
@ -797,7 +822,11 @@ struct dma_buf *dma_buf_get(int fd)
|
|||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
return file->private_data;
|
||||
dmabuf = file->private_data;
|
||||
|
||||
DMA_BUF_TRACE(trace_dma_buf_get, dmabuf, fd);
|
||||
|
||||
return dmabuf;
|
||||
}
|
||||
EXPORT_SYMBOL_NS_GPL(dma_buf_get, "DMA_BUF");
|
||||
|
||||
|
|
@ -817,24 +846,64 @@ void dma_buf_put(struct dma_buf *dmabuf)
|
|||
return;
|
||||
|
||||
fput(dmabuf->file);
|
||||
|
||||
DMA_BUF_TRACE(trace_dma_buf_put, dmabuf);
|
||||
}
|
||||
EXPORT_SYMBOL_NS_GPL(dma_buf_put, "DMA_BUF");
|
||||
|
||||
static void mangle_sg_table(struct sg_table *sg_table)
|
||||
static int dma_buf_wrap_sg_table(struct sg_table **sg_table)
|
||||
{
|
||||
#ifdef CONFIG_DMABUF_DEBUG
|
||||
int i;
|
||||
struct scatterlist *sg;
|
||||
struct scatterlist *to_sg, *from_sg;
|
||||
struct sg_table *from = *sg_table;
|
||||
struct dma_buf_sg_table_wrapper *to;
|
||||
int i, ret;
|
||||
|
||||
/* To catch abuse of the underlying struct page by importers mix
|
||||
* up the bits, but take care to preserve the low SG_ bits to
|
||||
* not corrupt the sgt. The mixing is undone on unmap
|
||||
* before passing the sgt back to the exporter.
|
||||
if (!IS_ENABLED(CONFIG_DMABUF_DEBUG))
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* To catch abuse of the underlying struct page by importers copy the
|
||||
* sg_table without copying the page_link and give only the copy back to
|
||||
* the importer.
|
||||
*/
|
||||
for_each_sgtable_sg(sg_table, sg, i)
|
||||
sg->page_link ^= ~0xffUL;
|
||||
#endif
|
||||
to = kzalloc(sizeof(*to), GFP_KERNEL);
|
||||
if (!to)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = sg_alloc_table(&to->wrapper, from->nents, GFP_KERNEL);
|
||||
if (ret)
|
||||
goto free_to;
|
||||
|
||||
to_sg = to->wrapper.sgl;
|
||||
for_each_sgtable_dma_sg(from, from_sg, i) {
|
||||
to_sg->offset = 0;
|
||||
to_sg->length = 0;
|
||||
sg_assign_page(to_sg, NULL);
|
||||
sg_dma_address(to_sg) = sg_dma_address(from_sg);
|
||||
sg_dma_len(to_sg) = sg_dma_len(from_sg);
|
||||
to_sg = sg_next(to_sg);
|
||||
}
|
||||
|
||||
to->original = from;
|
||||
*sg_table = &to->wrapper;
|
||||
return 0;
|
||||
|
||||
free_to:
|
||||
kfree(to);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void dma_buf_unwrap_sg_table(struct sg_table **sg_table)
|
||||
{
|
||||
struct dma_buf_sg_table_wrapper *copy;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_DMABUF_DEBUG))
|
||||
return;
|
||||
|
||||
copy = container_of(*sg_table, typeof(*copy), wrapper);
|
||||
*sg_table = copy->original;
|
||||
sg_free_table(©->wrapper);
|
||||
kfree(copy);
|
||||
}
|
||||
|
||||
static inline bool
|
||||
|
|
@ -971,6 +1040,9 @@ dma_buf_dynamic_attach(struct dma_buf *dmabuf, struct device *dev,
|
|||
list_add(&attach->node, &dmabuf->attachments);
|
||||
dma_resv_unlock(dmabuf->resv);
|
||||
|
||||
DMA_BUF_TRACE(trace_dma_buf_dynamic_attach, dmabuf, attach,
|
||||
dma_buf_attachment_is_dynamic(attach), dev);
|
||||
|
||||
return attach;
|
||||
|
||||
err_attach:
|
||||
|
|
@ -1015,6 +1087,9 @@ void dma_buf_detach(struct dma_buf *dmabuf, struct dma_buf_attachment *attach)
|
|||
if (dmabuf->ops->detach)
|
||||
dmabuf->ops->detach(dmabuf, attach);
|
||||
|
||||
DMA_BUF_TRACE(trace_dma_buf_detach, dmabuf, attach,
|
||||
dma_buf_attachment_is_dynamic(attach), attach->dev);
|
||||
|
||||
kfree(attach);
|
||||
}
|
||||
EXPORT_SYMBOL_NS_GPL(dma_buf_detach, "DMA_BUF");
|
||||
|
|
@ -1131,10 +1206,11 @@ struct sg_table *dma_buf_map_attachment(struct dma_buf_attachment *attach,
|
|||
if (ret < 0)
|
||||
goto error_unmap;
|
||||
}
|
||||
mangle_sg_table(sg_table);
|
||||
ret = dma_buf_wrap_sg_table(&sg_table);
|
||||
if (ret)
|
||||
goto error_unmap;
|
||||
|
||||
#ifdef CONFIG_DMA_API_DEBUG
|
||||
{
|
||||
if (IS_ENABLED(CONFIG_DMA_API_DEBUG)) {
|
||||
struct scatterlist *sg;
|
||||
u64 addr;
|
||||
int len;
|
||||
|
|
@ -1146,10 +1222,10 @@ struct sg_table *dma_buf_map_attachment(struct dma_buf_attachment *attach,
|
|||
if (!PAGE_ALIGNED(addr) || !PAGE_ALIGNED(len)) {
|
||||
pr_debug("%s: addr %llx or len %x is not page aligned!\n",
|
||||
__func__, addr, len);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_DMA_API_DEBUG */
|
||||
return sg_table;
|
||||
|
||||
error_unmap:
|
||||
|
|
@ -1213,7 +1289,7 @@ void dma_buf_unmap_attachment(struct dma_buf_attachment *attach,
|
|||
|
||||
dma_resv_assert_held(attach->dmabuf->resv);
|
||||
|
||||
mangle_sg_table(sg_table);
|
||||
dma_buf_unwrap_sg_table(&sg_table);
|
||||
attach->dmabuf->ops->unmap_dma_buf(attach, sg_table, direction);
|
||||
|
||||
if (dma_buf_pin_on_map(attach))
|
||||
|
|
@ -1480,6 +1556,8 @@ int dma_buf_mmap(struct dma_buf *dmabuf, struct vm_area_struct *vma,
|
|||
vma_set_file(vma, dmabuf->file);
|
||||
vma->vm_pgoff = pgoff;
|
||||
|
||||
DMA_BUF_TRACE(trace_dma_buf_mmap, dmabuf);
|
||||
|
||||
return dmabuf->ops->mmap(dmabuf, vma);
|
||||
}
|
||||
EXPORT_SYMBOL_NS_GPL(dma_buf_mmap, "DMA_BUF");
|
||||
|
|
@ -1710,12 +1788,6 @@ static inline void dma_buf_uninit_debugfs(void)
|
|||
|
||||
static int __init dma_buf_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = dma_buf_init_sysfs_statistics();
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
dma_buf_mnt = kern_mount(&dma_buf_fs_type);
|
||||
if (IS_ERR(dma_buf_mnt))
|
||||
return PTR_ERR(dma_buf_mnt);
|
||||
|
|
@ -1729,6 +1801,5 @@ static void __exit dma_buf_deinit(void)
|
|||
{
|
||||
dma_buf_uninit_debugfs();
|
||||
kern_unmount(dma_buf_mnt);
|
||||
dma_buf_uninit_sysfs_statistics();
|
||||
}
|
||||
__exitcall(dma_buf_deinit);
|
||||
|
|
|
|||
|
|
@ -358,11 +358,8 @@ void __dma_fence_might_wait(void)
|
|||
*
|
||||
* Unlike dma_fence_signal_timestamp(), this function must be called with
|
||||
* &dma_fence.lock held.
|
||||
*
|
||||
* Returns 0 on success and a negative error value when @fence has been
|
||||
* signalled already.
|
||||
*/
|
||||
int dma_fence_signal_timestamp_locked(struct dma_fence *fence,
|
||||
void dma_fence_signal_timestamp_locked(struct dma_fence *fence,
|
||||
ktime_t timestamp)
|
||||
{
|
||||
struct dma_fence_cb *cur, *tmp;
|
||||
|
|
@ -372,7 +369,7 @@ int dma_fence_signal_timestamp_locked(struct dma_fence *fence,
|
|||
|
||||
if (unlikely(test_and_set_bit(DMA_FENCE_FLAG_SIGNALED_BIT,
|
||||
&fence->flags)))
|
||||
return -EINVAL;
|
||||
return;
|
||||
|
||||
/* Stash the cb_list before replacing it with the timestamp */
|
||||
list_replace(&fence->cb_list, &cb_list);
|
||||
|
|
@ -385,8 +382,6 @@ int dma_fence_signal_timestamp_locked(struct dma_fence *fence,
|
|||
INIT_LIST_HEAD(&cur->node);
|
||||
cur->func(fence, cur);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(dma_fence_signal_timestamp_locked);
|
||||
|
||||
|
|
@ -401,23 +396,17 @@ EXPORT_SYMBOL(dma_fence_signal_timestamp_locked);
|
|||
* can only go from the unsignaled to the signaled state and not back, it will
|
||||
* only be effective the first time. Set the timestamp provided as the fence
|
||||
* signal timestamp.
|
||||
*
|
||||
* Returns 0 on success and a negative error value when @fence has been
|
||||
* signalled already.
|
||||
*/
|
||||
int dma_fence_signal_timestamp(struct dma_fence *fence, ktime_t timestamp)
|
||||
void dma_fence_signal_timestamp(struct dma_fence *fence, ktime_t timestamp)
|
||||
{
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
|
||||
if (WARN_ON(!fence))
|
||||
return -EINVAL;
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(fence->lock, flags);
|
||||
ret = dma_fence_signal_timestamp_locked(fence, timestamp);
|
||||
dma_fence_signal_timestamp_locked(fence, timestamp);
|
||||
spin_unlock_irqrestore(fence->lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(dma_fence_signal_timestamp);
|
||||
|
||||
|
|
@ -433,16 +422,57 @@ EXPORT_SYMBOL(dma_fence_signal_timestamp);
|
|||
*
|
||||
* Unlike dma_fence_signal(), this function must be called with &dma_fence.lock
|
||||
* held.
|
||||
*
|
||||
* Returns 0 on success and a negative error value when @fence has been
|
||||
* signalled already.
|
||||
*/
|
||||
int dma_fence_signal_locked(struct dma_fence *fence)
|
||||
void dma_fence_signal_locked(struct dma_fence *fence)
|
||||
{
|
||||
return dma_fence_signal_timestamp_locked(fence, ktime_get());
|
||||
dma_fence_signal_timestamp_locked(fence, ktime_get());
|
||||
}
|
||||
EXPORT_SYMBOL(dma_fence_signal_locked);
|
||||
|
||||
/**
|
||||
* dma_fence_check_and_signal_locked - signal the fence if it's not yet signaled
|
||||
* @fence: the fence to check and signal
|
||||
*
|
||||
* Checks whether a fence was signaled and signals it if it was not yet signaled.
|
||||
*
|
||||
* Unlike dma_fence_check_and_signal(), this function must be called with
|
||||
* &struct dma_fence.lock being held.
|
||||
*
|
||||
* Return: true if fence has been signaled already, false otherwise.
|
||||
*/
|
||||
bool dma_fence_check_and_signal_locked(struct dma_fence *fence)
|
||||
{
|
||||
bool ret;
|
||||
|
||||
ret = dma_fence_test_signaled_flag(fence);
|
||||
dma_fence_signal_locked(fence);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(dma_fence_check_and_signal_locked);
|
||||
|
||||
/**
|
||||
* dma_fence_check_and_signal - signal the fence if it's not yet signaled
|
||||
* @fence: the fence to check and signal
|
||||
*
|
||||
* Checks whether a fence was signaled and signals it if it was not yet signaled.
|
||||
* All this is done in a race-free manner.
|
||||
*
|
||||
* Return: true if fence has been signaled already, false otherwise.
|
||||
*/
|
||||
bool dma_fence_check_and_signal(struct dma_fence *fence)
|
||||
{
|
||||
unsigned long flags;
|
||||
bool ret;
|
||||
|
||||
spin_lock_irqsave(fence->lock, flags);
|
||||
ret = dma_fence_check_and_signal_locked(fence);
|
||||
spin_unlock_irqrestore(fence->lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(dma_fence_check_and_signal);
|
||||
|
||||
/**
|
||||
* dma_fence_signal - signal completion of a fence
|
||||
* @fence: the fence to signal
|
||||
|
|
@ -452,28 +482,22 @@ EXPORT_SYMBOL(dma_fence_signal_locked);
|
|||
* dma_fence_add_callback(). Can be called multiple times, but since a fence
|
||||
* can only go from the unsignaled to the signaled state and not back, it will
|
||||
* only be effective the first time.
|
||||
*
|
||||
* Returns 0 on success and a negative error value when @fence has been
|
||||
* signalled already.
|
||||
*/
|
||||
int dma_fence_signal(struct dma_fence *fence)
|
||||
void dma_fence_signal(struct dma_fence *fence)
|
||||
{
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
bool tmp;
|
||||
|
||||
if (WARN_ON(!fence))
|
||||
return -EINVAL;
|
||||
return;
|
||||
|
||||
tmp = dma_fence_begin_signalling();
|
||||
|
||||
spin_lock_irqsave(fence->lock, flags);
|
||||
ret = dma_fence_signal_timestamp_locked(fence, ktime_get());
|
||||
dma_fence_signal_timestamp_locked(fence, ktime_get());
|
||||
spin_unlock_irqrestore(fence->lock, flags);
|
||||
|
||||
dma_fence_end_signalling(tmp);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(dma_fence_signal);
|
||||
|
||||
|
|
@ -543,7 +567,7 @@ void dma_fence_release(struct kref *kref)
|
|||
trace_dma_fence_destroy(fence);
|
||||
|
||||
if (!list_empty(&fence->cb_list) &&
|
||||
!test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags)) {
|
||||
!dma_fence_test_signaled_flag(fence)) {
|
||||
const char __rcu *timeline;
|
||||
const char __rcu *driver;
|
||||
unsigned long flags;
|
||||
|
|
@ -600,7 +624,7 @@ static bool __dma_fence_enable_signaling(struct dma_fence *fence)
|
|||
was_set = test_and_set_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT,
|
||||
&fence->flags);
|
||||
|
||||
if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
|
||||
if (dma_fence_test_signaled_flag(fence))
|
||||
return false;
|
||||
|
||||
if (!was_set && fence->ops->enable_signaling) {
|
||||
|
|
@ -664,7 +688,7 @@ int dma_fence_add_callback(struct dma_fence *fence, struct dma_fence_cb *cb,
|
|||
if (WARN_ON(!fence || !func))
|
||||
return -EINVAL;
|
||||
|
||||
if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags)) {
|
||||
if (dma_fence_test_signaled_flag(fence)) {
|
||||
INIT_LIST_HEAD(&cb->node);
|
||||
return -ENOENT;
|
||||
}
|
||||
|
|
@ -781,7 +805,7 @@ dma_fence_default_wait(struct dma_fence *fence, bool intr, signed long timeout)
|
|||
|
||||
spin_lock_irqsave(fence->lock, flags);
|
||||
|
||||
if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
|
||||
if (dma_fence_test_signaled_flag(fence))
|
||||
goto out;
|
||||
|
||||
if (intr && signal_pending(current)) {
|
||||
|
|
@ -798,7 +822,7 @@ dma_fence_default_wait(struct dma_fence *fence, bool intr, signed long timeout)
|
|||
cb.task = current;
|
||||
list_add(&cb.base.node, &fence->cb_list);
|
||||
|
||||
while (!test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags) && ret > 0) {
|
||||
while (!dma_fence_test_signaled_flag(fence) && ret > 0) {
|
||||
if (intr)
|
||||
__set_current_state(TASK_INTERRUPTIBLE);
|
||||
else
|
||||
|
|
@ -830,7 +854,7 @@ dma_fence_test_signaled_any(struct dma_fence **fences, uint32_t count,
|
|||
|
||||
for (i = 0; i < count; ++i) {
|
||||
struct dma_fence *fence = fences[i];
|
||||
if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags)) {
|
||||
if (dma_fence_test_signaled_flag(fence)) {
|
||||
if (idx)
|
||||
*idx = i;
|
||||
return true;
|
||||
|
|
@ -1108,7 +1132,7 @@ const char __rcu *dma_fence_driver_name(struct dma_fence *fence)
|
|||
RCU_LOCKDEP_WARN(!rcu_read_lock_held(),
|
||||
"RCU protection is required for safe access to returned string");
|
||||
|
||||
if (!test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
|
||||
if (!dma_fence_test_signaled_flag(fence))
|
||||
return fence->ops->get_driver_name(fence);
|
||||
else
|
||||
return "detached-driver";
|
||||
|
|
@ -1140,7 +1164,7 @@ const char __rcu *dma_fence_timeline_name(struct dma_fence *fence)
|
|||
RCU_LOCKDEP_WARN(!rcu_read_lock_held(),
|
||||
"RCU protection is required for safe access to returned string");
|
||||
|
||||
if (!test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags))
|
||||
if (!dma_fence_test_signaled_flag(fence))
|
||||
return fence->ops->get_timeline_name(fence);
|
||||
else
|
||||
return "signaled-timeline";
|
||||
|
|
|
|||
|
|
@ -49,6 +49,11 @@ static dev_t dma_heap_devt;
|
|||
static struct class *dma_heap_class;
|
||||
static DEFINE_XARRAY_ALLOC(dma_heap_minors);
|
||||
|
||||
bool __read_mostly mem_accounting;
|
||||
module_param(mem_accounting, bool, 0444);
|
||||
MODULE_PARM_DESC(mem_accounting,
|
||||
"Enable cgroup-based memory accounting for dma-buf heap allocations (default=false).");
|
||||
|
||||
static int dma_heap_buffer_alloc(struct dma_heap *heap, size_t len,
|
||||
u32 fd_flags,
|
||||
u64 heap_flags)
|
||||
|
|
|
|||
|
|
@ -331,7 +331,7 @@ static struct dma_buf *cma_heap_allocate(struct dma_heap *heap,
|
|||
while (nr_clear_pages > 0) {
|
||||
void *vaddr = kmap_local_page(page);
|
||||
|
||||
memset(vaddr, 0, PAGE_SIZE);
|
||||
clear_page(vaddr);
|
||||
kunmap_local(vaddr);
|
||||
/*
|
||||
* Avoid wasting time zeroing memory if the process
|
||||
|
|
|
|||
|
|
@ -320,14 +320,17 @@ static struct page *alloc_largest_available(unsigned long size,
|
|||
{
|
||||
struct page *page;
|
||||
int i;
|
||||
gfp_t flags;
|
||||
|
||||
for (i = 0; i < NUM_ORDERS; i++) {
|
||||
if (size < (PAGE_SIZE << orders[i]))
|
||||
continue;
|
||||
if (max_order < orders[i])
|
||||
continue;
|
||||
|
||||
page = alloc_pages(order_flags[i], orders[i]);
|
||||
flags = order_flags[i];
|
||||
if (mem_accounting)
|
||||
flags |= __GFP_ACCOUNT;
|
||||
page = alloc_pages(flags, orders[i]);
|
||||
if (!page)
|
||||
continue;
|
||||
return page;
|
||||
|
|
|
|||
|
|
@ -33,50 +33,9 @@ static void mock_fence_release(struct dma_fence *f)
|
|||
kmem_cache_free(slab_fences, to_mock_fence(f));
|
||||
}
|
||||
|
||||
struct wait_cb {
|
||||
struct dma_fence_cb cb;
|
||||
struct task_struct *task;
|
||||
};
|
||||
|
||||
static void mock_wakeup(struct dma_fence *f, struct dma_fence_cb *cb)
|
||||
{
|
||||
wake_up_process(container_of(cb, struct wait_cb, cb)->task);
|
||||
}
|
||||
|
||||
static long mock_wait(struct dma_fence *f, bool intr, long timeout)
|
||||
{
|
||||
const int state = intr ? TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE;
|
||||
struct wait_cb cb = { .task = current };
|
||||
|
||||
if (dma_fence_add_callback(f, &cb.cb, mock_wakeup))
|
||||
return timeout;
|
||||
|
||||
while (timeout) {
|
||||
set_current_state(state);
|
||||
|
||||
if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &f->flags))
|
||||
break;
|
||||
|
||||
if (signal_pending_state(state, current))
|
||||
break;
|
||||
|
||||
timeout = schedule_timeout(timeout);
|
||||
}
|
||||
__set_current_state(TASK_RUNNING);
|
||||
|
||||
if (!dma_fence_remove_callback(f, &cb.cb))
|
||||
return timeout;
|
||||
|
||||
if (signal_pending_state(state, current))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
return -ETIME;
|
||||
}
|
||||
|
||||
static const struct dma_fence_ops mock_ops = {
|
||||
.get_driver_name = mock_name,
|
||||
.get_timeline_name = mock_name,
|
||||
.wait = mock_wait,
|
||||
.release = mock_fence_release,
|
||||
};
|
||||
|
||||
|
|
@ -126,7 +85,7 @@ static int test_signaling(void *arg)
|
|||
goto err_free;
|
||||
}
|
||||
|
||||
if (dma_fence_signal(f)) {
|
||||
if (dma_fence_check_and_signal(f)) {
|
||||
pr_err("Fence reported being already signaled\n");
|
||||
goto err_free;
|
||||
}
|
||||
|
|
@ -136,7 +95,7 @@ static int test_signaling(void *arg)
|
|||
goto err_free;
|
||||
}
|
||||
|
||||
if (!dma_fence_signal(f)) {
|
||||
if (!dma_fence_test_signaled_flag(f)) {
|
||||
pr_err("Fence reported not being already signaled\n");
|
||||
goto err_free;
|
||||
}
|
||||
|
|
@ -349,14 +308,14 @@ static int test_wait(void *arg)
|
|||
|
||||
dma_fence_enable_sw_signaling(f);
|
||||
|
||||
if (dma_fence_wait_timeout(f, false, 0) != -ETIME) {
|
||||
if (dma_fence_wait_timeout(f, false, 0) != 0) {
|
||||
pr_err("Wait reported complete before being signaled\n");
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
dma_fence_signal(f);
|
||||
|
||||
if (dma_fence_wait_timeout(f, false, 0) != 0) {
|
||||
if (dma_fence_wait_timeout(f, false, 0) != 1) {
|
||||
pr_err("Wait reported incomplete after being signaled\n");
|
||||
goto err_free;
|
||||
}
|
||||
|
|
@ -393,16 +352,16 @@ static int test_wait_timeout(void *arg)
|
|||
|
||||
dma_fence_enable_sw_signaling(wt.f);
|
||||
|
||||
if (dma_fence_wait_timeout(wt.f, false, 1) != -ETIME) {
|
||||
if (dma_fence_wait_timeout(wt.f, false, 1) != 0) {
|
||||
pr_err("Wait reported complete before being signaled\n");
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
mod_timer(&wt.timer, jiffies + 1);
|
||||
|
||||
if (dma_fence_wait_timeout(wt.f, false, 2) == -ETIME) {
|
||||
if (dma_fence_wait_timeout(wt.f, false, HZ) == 0) {
|
||||
if (timer_pending(&wt.timer)) {
|
||||
pr_notice("Timer did not fire within the jiffy!\n");
|
||||
pr_notice("Timer did not fire within one HZ!\n");
|
||||
err = 0; /* not our fault! */
|
||||
} else {
|
||||
pr_err("Wait reported incomplete after timeout\n");
|
||||
|
|
|
|||
|
|
@ -265,153 +265,6 @@ config DRM_SCHED
|
|||
tristate
|
||||
depends on DRM
|
||||
|
||||
source "drivers/gpu/drm/sysfb/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/arm/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/radeon/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/amd/amdgpu/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/nouveau/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/nova/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/i915/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/xe/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/kmb/Kconfig"
|
||||
|
||||
config DRM_VGEM
|
||||
tristate "Virtual GEM provider"
|
||||
depends on DRM && MMU
|
||||
select DRM_GEM_SHMEM_HELPER
|
||||
help
|
||||
Choose this option to get a virtual graphics memory manager,
|
||||
as used by Mesa's software renderer for enhanced performance.
|
||||
If M is selected the module will be called vgem.
|
||||
|
||||
source "drivers/gpu/drm/vkms/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/exynos/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/rockchip/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/vmwgfx/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/gma500/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/udl/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/ast/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/mgag200/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/armada/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/atmel-hlcdc/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/renesas/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/sun4i/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/omapdrm/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/tilcdc/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/qxl/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/virtio/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/msm/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/fsl-dcu/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/tegra/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/stm/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/panel/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/bridge/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/sti/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/imx/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/ingenic/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/v3d/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/vc4/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/loongson/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/etnaviv/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/hisilicon/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/logicvc/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/mediatek/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/mxsfb/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/meson/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/tiny/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/pl111/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/tve200/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/xen/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/vboxvideo/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/lima/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/panfrost/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/panthor/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/aspeed/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/mcde/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/tidss/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/adp/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/xlnx/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/gud/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/sitronix/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/solomon/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/sprd/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/imagination/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/tyr/Kconfig"
|
||||
|
||||
config DRM_HYPERV
|
||||
tristate "DRM Support for Hyper-V synthetic video device"
|
||||
depends on DRM && PCI && HYPERV_VMBUS
|
||||
select DRM_CLIENT_SELECTION
|
||||
select DRM_KMS_HELPER
|
||||
select DRM_GEM_SHMEM_HELPER
|
||||
help
|
||||
This is a KMS driver for Hyper-V synthetic video device. Choose this
|
||||
option if you would like to enable drm driver for Hyper-V virtual
|
||||
machine. Unselect Hyper-V framebuffer driver (CONFIG_FB_HYPERV) so
|
||||
that DRM driver is used by default.
|
||||
|
||||
If M is selected the module will be called hyperv_drm.
|
||||
|
||||
# Separate option as not all DRM drivers use it
|
||||
config DRM_PANEL_BACKLIGHT_QUIRKS
|
||||
tristate
|
||||
|
|
@ -424,6 +277,72 @@ config DRM_PRIVACY_SCREEN
|
|||
bool
|
||||
default n
|
||||
|
||||
# DRM driver Kconfig files, sorted
|
||||
source "drivers/gpu/drm/adp/Kconfig"
|
||||
source "drivers/gpu/drm/amd/amdgpu/Kconfig"
|
||||
source "drivers/gpu/drm/arm/Kconfig"
|
||||
source "drivers/gpu/drm/armada/Kconfig"
|
||||
source "drivers/gpu/drm/aspeed/Kconfig"
|
||||
source "drivers/gpu/drm/ast/Kconfig"
|
||||
source "drivers/gpu/drm/atmel-hlcdc/Kconfig"
|
||||
source "drivers/gpu/drm/bridge/Kconfig"
|
||||
source "drivers/gpu/drm/etnaviv/Kconfig"
|
||||
source "drivers/gpu/drm/exynos/Kconfig"
|
||||
source "drivers/gpu/drm/fsl-dcu/Kconfig"
|
||||
source "drivers/gpu/drm/gma500/Kconfig"
|
||||
source "drivers/gpu/drm/gud/Kconfig"
|
||||
source "drivers/gpu/drm/hisilicon/Kconfig"
|
||||
source "drivers/gpu/drm/hyperv/Kconfig"
|
||||
source "drivers/gpu/drm/i915/Kconfig"
|
||||
source "drivers/gpu/drm/imagination/Kconfig"
|
||||
source "drivers/gpu/drm/imx/Kconfig"
|
||||
source "drivers/gpu/drm/ingenic/Kconfig"
|
||||
source "drivers/gpu/drm/kmb/Kconfig"
|
||||
source "drivers/gpu/drm/lima/Kconfig"
|
||||
source "drivers/gpu/drm/logicvc/Kconfig"
|
||||
source "drivers/gpu/drm/loongson/Kconfig"
|
||||
source "drivers/gpu/drm/mcde/Kconfig"
|
||||
source "drivers/gpu/drm/mediatek/Kconfig"
|
||||
source "drivers/gpu/drm/meson/Kconfig"
|
||||
source "drivers/gpu/drm/mgag200/Kconfig"
|
||||
source "drivers/gpu/drm/msm/Kconfig"
|
||||
source "drivers/gpu/drm/mxsfb/Kconfig"
|
||||
source "drivers/gpu/drm/nouveau/Kconfig"
|
||||
source "drivers/gpu/drm/nova/Kconfig"
|
||||
source "drivers/gpu/drm/omapdrm/Kconfig"
|
||||
source "drivers/gpu/drm/panel/Kconfig"
|
||||
source "drivers/gpu/drm/panfrost/Kconfig"
|
||||
source "drivers/gpu/drm/panthor/Kconfig"
|
||||
source "drivers/gpu/drm/pl111/Kconfig"
|
||||
source "drivers/gpu/drm/qxl/Kconfig"
|
||||
source "drivers/gpu/drm/radeon/Kconfig"
|
||||
source "drivers/gpu/drm/renesas/Kconfig"
|
||||
source "drivers/gpu/drm/rockchip/Kconfig"
|
||||
source "drivers/gpu/drm/sitronix/Kconfig"
|
||||
source "drivers/gpu/drm/solomon/Kconfig"
|
||||
source "drivers/gpu/drm/sprd/Kconfig"
|
||||
source "drivers/gpu/drm/sti/Kconfig"
|
||||
source "drivers/gpu/drm/stm/Kconfig"
|
||||
source "drivers/gpu/drm/sun4i/Kconfig"
|
||||
source "drivers/gpu/drm/sysfb/Kconfig"
|
||||
source "drivers/gpu/drm/tegra/Kconfig"
|
||||
source "drivers/gpu/drm/tidss/Kconfig"
|
||||
source "drivers/gpu/drm/tilcdc/Kconfig"
|
||||
source "drivers/gpu/drm/tiny/Kconfig"
|
||||
source "drivers/gpu/drm/tve200/Kconfig"
|
||||
source "drivers/gpu/drm/tyr/Kconfig"
|
||||
source "drivers/gpu/drm/udl/Kconfig"
|
||||
source "drivers/gpu/drm/v3d/Kconfig"
|
||||
source "drivers/gpu/drm/vboxvideo/Kconfig"
|
||||
source "drivers/gpu/drm/vc4/Kconfig"
|
||||
source "drivers/gpu/drm/vgem/Kconfig"
|
||||
source "drivers/gpu/drm/virtio/Kconfig"
|
||||
source "drivers/gpu/drm/vkms/Kconfig"
|
||||
source "drivers/gpu/drm/vmwgfx/Kconfig"
|
||||
source "drivers/gpu/drm/xe/Kconfig"
|
||||
source "drivers/gpu/drm/xen/Kconfig"
|
||||
source "drivers/gpu/drm/xlnx/Kconfig"
|
||||
|
||||
endif
|
||||
|
||||
# Separate option because drm_panel_orientation_quirks.c is shared with fbdev
|
||||
|
|
|
|||
|
|
@ -110,7 +110,8 @@ obj-$(CONFIG_DRM_GPUVM) += drm_gpuvm.o
|
|||
drm_gpusvm_helper-y := \
|
||||
drm_gpusvm.o
|
||||
drm_gpusvm_helper-$(CONFIG_ZONE_DEVICE) += \
|
||||
drm_pagemap.o
|
||||
drm_pagemap.o\
|
||||
drm_pagemap_util.o
|
||||
|
||||
obj-$(CONFIG_DRM_GPUSVM) += drm_gpusvm_helper.o
|
||||
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@ amdgpu-y += \
|
|||
nbio_v7_2.o hdp_v4_0.o hdp_v5_0.o aldebaran_reg_init.o aldebaran.o soc21.o soc24.o \
|
||||
sienna_cichlid.o smu_v13_0_10.o nbio_v4_3.o hdp_v6_0.o nbio_v7_7.o hdp_v5_2.o lsdma_v6_0.o \
|
||||
nbio_v7_9.o aqua_vanjaram.o nbio_v7_11.o lsdma_v7_0.o hdp_v7_0.o nbif_v6_3_1.o \
|
||||
cyan_skillfish_reg_init.o
|
||||
cyan_skillfish_reg_init.o soc_v1_0.o
|
||||
|
||||
# add DF block
|
||||
amdgpu-y += \
|
||||
|
|
@ -104,7 +104,8 @@ amdgpu-y += \
|
|||
gfxhub_v2_0.o mmhub_v2_0.o gmc_v10_0.o gfxhub_v2_1.o mmhub_v2_3.o \
|
||||
mmhub_v1_7.o gfxhub_v3_0.o mmhub_v3_0.o mmhub_v3_0_2.o gmc_v11_0.o \
|
||||
mmhub_v3_0_1.o gfxhub_v3_0_3.o gfxhub_v1_2.o mmhub_v1_8.o mmhub_v3_3.o \
|
||||
gfxhub_v11_5_0.o mmhub_v4_1_0.o gfxhub_v12_0.o gmc_v12_0.o
|
||||
gfxhub_v11_5_0.o mmhub_v4_1_0.o gfxhub_v12_0.o gmc_v12_0.o \
|
||||
mmhub_v4_2_0.o gfxhub_v12_1.o gmc_v12_1.o
|
||||
|
||||
# add UMC block
|
||||
amdgpu-y += \
|
||||
|
|
@ -134,7 +135,9 @@ amdgpu-y += \
|
|||
psp_v12_0.o \
|
||||
psp_v13_0.o \
|
||||
psp_v13_0_4.o \
|
||||
psp_v14_0.o
|
||||
psp_v14_0.o \
|
||||
psp_v15_0.o \
|
||||
psp_v15_0_8.o
|
||||
|
||||
# add DCE block
|
||||
amdgpu-y += \
|
||||
|
|
@ -156,7 +159,9 @@ amdgpu-y += \
|
|||
gfx_v11_0_3.o \
|
||||
imu_v11_0_3.o \
|
||||
gfx_v12_0.o \
|
||||
imu_v12_0.o
|
||||
gfx_v12_1.o \
|
||||
imu_v12_0.o \
|
||||
imu_v12_1.o
|
||||
|
||||
# add async DMA block
|
||||
amdgpu-y += \
|
||||
|
|
@ -169,13 +174,15 @@ amdgpu-y += \
|
|||
sdma_v5_0.o \
|
||||
sdma_v5_2.o \
|
||||
sdma_v6_0.o \
|
||||
sdma_v7_0.o
|
||||
sdma_v7_0.o \
|
||||
sdma_v7_1.o
|
||||
|
||||
# add MES block
|
||||
amdgpu-y += \
|
||||
amdgpu_mes.o \
|
||||
mes_v11_0.o \
|
||||
mes_v12_0.o \
|
||||
mes_v12_1.o
|
||||
|
||||
# add GFX userqueue support
|
||||
amdgpu-y += mes_userqueue.o
|
||||
|
|
@ -215,7 +222,8 @@ amdgpu-y += \
|
|||
jpeg_v4_0_3.o \
|
||||
jpeg_v4_0_5.o \
|
||||
jpeg_v5_0_0.o \
|
||||
jpeg_v5_0_1.o
|
||||
jpeg_v5_0_1.o \
|
||||
jpeg_v5_3_0.o
|
||||
|
||||
# add VPE block
|
||||
amdgpu-y += \
|
||||
|
|
@ -244,7 +252,9 @@ amdgpu-y += \
|
|||
smuio_v13_0.o \
|
||||
smuio_v13_0_3.o \
|
||||
smuio_v13_0_6.o \
|
||||
smuio_v14_0_2.o
|
||||
smuio_v14_0_2.o \
|
||||
smuio_v15_0_0.o \
|
||||
smuio_v15_0_8.o
|
||||
|
||||
# add reset block
|
||||
amdgpu-y += \
|
||||
|
|
@ -275,7 +285,8 @@ amdgpu-y += \
|
|||
amdgpu_amdkfd_gfx_v10.o \
|
||||
amdgpu_amdkfd_gfx_v10_3.o \
|
||||
amdgpu_amdkfd_gfx_v11.o \
|
||||
amdgpu_amdkfd_gfx_v12.o
|
||||
amdgpu_amdkfd_gfx_v12.o \
|
||||
amdgpu_amdkfd_gfx_v12_1.o
|
||||
|
||||
ifneq ($(CONFIG_DRM_AMDGPU_CIK),)
|
||||
amdgpu-y += amdgpu_amdkfd_gfx_v7.o
|
||||
|
|
|
|||
|
|
@ -34,12 +34,6 @@
|
|||
|
||||
#define pr_fmt(fmt) "amdgpu: " fmt
|
||||
|
||||
#ifdef dev_fmt
|
||||
#undef dev_fmt
|
||||
#endif
|
||||
|
||||
#define dev_fmt(fmt) "amdgpu: " fmt
|
||||
|
||||
#include "amdgpu_ctx.h"
|
||||
|
||||
#include <linux/atomic.h>
|
||||
|
|
@ -116,6 +110,7 @@
|
|||
#include "amdgpu_reg_state.h"
|
||||
#include "amdgpu_userq.h"
|
||||
#include "amdgpu_eviction_fence.h"
|
||||
#include "amdgpu_ip.h"
|
||||
#if defined(CONFIG_DRM_AMD_ISP)
|
||||
#include "amdgpu_isp.h"
|
||||
#endif
|
||||
|
|
@ -364,59 +359,6 @@ enum amdgpu_kiq_irq {
|
|||
#define MAX_KIQ_REG_BAILOUT_INTERVAL 5 /* in msecs, 5ms */
|
||||
#define MAX_KIQ_REG_TRY 1000
|
||||
|
||||
int amdgpu_device_ip_set_clockgating_state(void *dev,
|
||||
enum amd_ip_block_type block_type,
|
||||
enum amd_clockgating_state state);
|
||||
int amdgpu_device_ip_set_powergating_state(void *dev,
|
||||
enum amd_ip_block_type block_type,
|
||||
enum amd_powergating_state state);
|
||||
void amdgpu_device_ip_get_clockgating_state(struct amdgpu_device *adev,
|
||||
u64 *flags);
|
||||
int amdgpu_device_ip_wait_for_idle(struct amdgpu_device *adev,
|
||||
enum amd_ip_block_type block_type);
|
||||
bool amdgpu_device_ip_is_hw(struct amdgpu_device *adev,
|
||||
enum amd_ip_block_type block_type);
|
||||
bool amdgpu_device_ip_is_valid(struct amdgpu_device *adev,
|
||||
enum amd_ip_block_type block_type);
|
||||
int amdgpu_ip_block_suspend(struct amdgpu_ip_block *ip_block);
|
||||
|
||||
int amdgpu_ip_block_resume(struct amdgpu_ip_block *ip_block);
|
||||
|
||||
#define AMDGPU_MAX_IP_NUM AMD_IP_BLOCK_TYPE_NUM
|
||||
|
||||
struct amdgpu_ip_block_status {
|
||||
bool valid;
|
||||
bool sw;
|
||||
bool hw;
|
||||
bool late_initialized;
|
||||
bool hang;
|
||||
};
|
||||
|
||||
struct amdgpu_ip_block_version {
|
||||
const enum amd_ip_block_type type;
|
||||
const u32 major;
|
||||
const u32 minor;
|
||||
const u32 rev;
|
||||
const struct amd_ip_funcs *funcs;
|
||||
};
|
||||
|
||||
struct amdgpu_ip_block {
|
||||
struct amdgpu_ip_block_status status;
|
||||
const struct amdgpu_ip_block_version *version;
|
||||
struct amdgpu_device *adev;
|
||||
};
|
||||
|
||||
int amdgpu_device_ip_block_version_cmp(struct amdgpu_device *adev,
|
||||
enum amd_ip_block_type type,
|
||||
u32 major, u32 minor);
|
||||
|
||||
struct amdgpu_ip_block *
|
||||
amdgpu_device_ip_get_ip_block(struct amdgpu_device *adev,
|
||||
enum amd_ip_block_type type);
|
||||
|
||||
int amdgpu_device_ip_block_add(struct amdgpu_device *adev,
|
||||
const struct amdgpu_ip_block_version *ip_block_version);
|
||||
|
||||
/*
|
||||
* BIOS.
|
||||
*/
|
||||
|
|
@ -759,71 +701,6 @@ struct amdgpu_mmio_remap {
|
|||
struct amdgpu_bo *bo;
|
||||
};
|
||||
|
||||
/* Define the HW IP blocks will be used in driver , add more if necessary */
|
||||
enum amd_hw_ip_block_type {
|
||||
GC_HWIP = 1,
|
||||
HDP_HWIP,
|
||||
SDMA0_HWIP,
|
||||
SDMA1_HWIP,
|
||||
SDMA2_HWIP,
|
||||
SDMA3_HWIP,
|
||||
SDMA4_HWIP,
|
||||
SDMA5_HWIP,
|
||||
SDMA6_HWIP,
|
||||
SDMA7_HWIP,
|
||||
LSDMA_HWIP,
|
||||
MMHUB_HWIP,
|
||||
ATHUB_HWIP,
|
||||
NBIO_HWIP,
|
||||
MP0_HWIP,
|
||||
MP1_HWIP,
|
||||
UVD_HWIP,
|
||||
VCN_HWIP = UVD_HWIP,
|
||||
JPEG_HWIP = VCN_HWIP,
|
||||
VCN1_HWIP,
|
||||
VCE_HWIP,
|
||||
VPE_HWIP,
|
||||
DF_HWIP,
|
||||
DCE_HWIP,
|
||||
OSSSYS_HWIP,
|
||||
SMUIO_HWIP,
|
||||
PWR_HWIP,
|
||||
NBIF_HWIP,
|
||||
THM_HWIP,
|
||||
CLK_HWIP,
|
||||
UMC_HWIP,
|
||||
RSMU_HWIP,
|
||||
XGMI_HWIP,
|
||||
DCI_HWIP,
|
||||
PCIE_HWIP,
|
||||
ISP_HWIP,
|
||||
MAX_HWIP
|
||||
};
|
||||
|
||||
#define HWIP_MAX_INSTANCE 44
|
||||
|
||||
#define HW_ID_MAX 300
|
||||
#define IP_VERSION_FULL(mj, mn, rv, var, srev) \
|
||||
(((mj) << 24) | ((mn) << 16) | ((rv) << 8) | ((var) << 4) | (srev))
|
||||
#define IP_VERSION(mj, mn, rv) IP_VERSION_FULL(mj, mn, rv, 0, 0)
|
||||
#define IP_VERSION_MAJ(ver) ((ver) >> 24)
|
||||
#define IP_VERSION_MIN(ver) (((ver) >> 16) & 0xFF)
|
||||
#define IP_VERSION_REV(ver) (((ver) >> 8) & 0xFF)
|
||||
#define IP_VERSION_VARIANT(ver) (((ver) >> 4) & 0xF)
|
||||
#define IP_VERSION_SUBREV(ver) ((ver) & 0xF)
|
||||
#define IP_VERSION_MAJ_MIN_REV(ver) ((ver) >> 8)
|
||||
|
||||
struct amdgpu_ip_map_info {
|
||||
/* Map of logical to actual dev instances/mask */
|
||||
uint32_t dev_inst[MAX_HWIP][HWIP_MAX_INSTANCE];
|
||||
int8_t (*logical_to_dev_inst)(struct amdgpu_device *adev,
|
||||
enum amd_hw_ip_block_type block,
|
||||
int8_t inst);
|
||||
uint32_t (*logical_to_dev_mask)(struct amdgpu_device *adev,
|
||||
enum amd_hw_ip_block_type block,
|
||||
uint32_t mask);
|
||||
};
|
||||
|
||||
enum amdgpu_uid_type {
|
||||
AMDGPU_UID_TYPE_XCD,
|
||||
AMDGPU_UID_TYPE_AID,
|
||||
|
|
@ -838,6 +715,38 @@ struct amdgpu_uid {
|
|||
struct amdgpu_device *adev;
|
||||
};
|
||||
|
||||
#define MAX_UMA_OPTION_NAME 28
|
||||
#define MAX_UMA_OPTION_ENTRIES 19
|
||||
|
||||
#define AMDGPU_UMA_FLAG_AUTO BIT(1)
|
||||
#define AMDGPU_UMA_FLAG_CUSTOM BIT(0)
|
||||
|
||||
/**
|
||||
* struct amdgpu_uma_carveout_option - single UMA carveout option
|
||||
* @name: Name of the carveout option
|
||||
* @memory_carved_mb: Amount of memory carved in MB
|
||||
* @flags: ATCS flags supported by this option
|
||||
*/
|
||||
struct amdgpu_uma_carveout_option {
|
||||
char name[MAX_UMA_OPTION_NAME];
|
||||
uint32_t memory_carved_mb;
|
||||
uint8_t flags;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct amdgpu_uma_carveout_info - table of available UMA carveout options
|
||||
* @num_entries: Number of available options
|
||||
* @uma_option_index: The index of the option currently applied
|
||||
* @update_lock: Lock to serialize changes to the option
|
||||
* @entries: The array of carveout options
|
||||
*/
|
||||
struct amdgpu_uma_carveout_info {
|
||||
uint8_t num_entries;
|
||||
uint8_t uma_option_index;
|
||||
struct mutex update_lock;
|
||||
struct amdgpu_uma_carveout_option entries[MAX_UMA_OPTION_ENTRIES];
|
||||
};
|
||||
|
||||
struct amd_powerplay {
|
||||
void *pp_handle;
|
||||
const struct amd_pm_funcs *pp_funcs;
|
||||
|
|
@ -893,6 +802,7 @@ struct amdgpu_mqd_prop {
|
|||
uint64_t eop_gpu_addr;
|
||||
uint32_t hqd_pipe_priority;
|
||||
uint32_t hqd_queue_priority;
|
||||
uint32_t mqd_stride_size;
|
||||
bool allow_tunneling;
|
||||
bool hqd_active;
|
||||
uint64_t shadow_addr;
|
||||
|
|
@ -1321,12 +1231,22 @@ struct amdgpu_device {
|
|||
struct work_struct userq_reset_work;
|
||||
struct amdgpu_uid *uid_info;
|
||||
|
||||
struct amdgpu_uma_carveout_info uma_info;
|
||||
|
||||
/* KFD
|
||||
* Must be last --ends in a flexible-array member.
|
||||
*/
|
||||
struct amdgpu_kfd_dev kfd;
|
||||
};
|
||||
|
||||
/*
|
||||
* MES FW uses address(mqd_addr + sizeof(struct mqd) + 3*sizeof(uint32_t))
|
||||
* as fence address and writes a 32 bit fence value to this address.
|
||||
* Driver needs to allocate at least 4 DWs extra memory in addition to
|
||||
* sizeof(struct mqd). Add 8 DWs and align to AMDGPU_GPU_PAGE_SIZE for safety.
|
||||
*/
|
||||
#define AMDGPU_MQD_SIZE_ALIGN(mqd_size) AMDGPU_GPU_PAGE_ALIGN(((mqd_size) + 32))
|
||||
|
||||
static inline uint32_t amdgpu_ip_version(const struct amdgpu_device *adev,
|
||||
uint8_t ip, uint8_t inst)
|
||||
{
|
||||
|
|
@ -1547,8 +1467,13 @@ int emu_soc_asic_init(struct amdgpu_device *adev);
|
|||
#define amdgpu_asic_get_pcie_usage(adev, cnt0, cnt1) ((adev)->asic_funcs->get_pcie_usage((adev), (cnt0), (cnt1)))
|
||||
#define amdgpu_asic_need_reset_on_init(adev) (adev)->asic_funcs->need_reset_on_init((adev))
|
||||
#define amdgpu_asic_get_pcie_replay_count(adev) ((adev)->asic_funcs->get_pcie_replay_count((adev)))
|
||||
#define amdgpu_asic_supports_baco(adev) (adev)->asic_funcs->supports_baco((adev))
|
||||
#define amdgpu_asic_pre_asic_init(adev) (adev)->asic_funcs->pre_asic_init((adev))
|
||||
#define amdgpu_asic_supports_baco(adev) \
|
||||
((adev)->asic_funcs->supports_baco ? (adev)->asic_funcs->supports_baco((adev)) : 0)
|
||||
#define amdgpu_asic_pre_asic_init(adev) \
|
||||
{ \
|
||||
if ((adev)->asic_funcs && (adev)->asic_funcs->pre_asic_init) \
|
||||
(adev)->asic_funcs->pre_asic_init((adev)); \
|
||||
}
|
||||
#define amdgpu_asic_update_umd_stable_pstate(adev, enter) \
|
||||
((adev)->asic_funcs->update_umd_stable_pstate ? (adev)->asic_funcs->update_umd_stable_pstate((adev), (enter)) : 0)
|
||||
#define amdgpu_asic_query_video_codecs(adev, e, c) (adev)->asic_funcs->query_video_codecs((adev), (e), (c))
|
||||
|
|
@ -1688,12 +1613,14 @@ int amdgpu_acpi_init(struct amdgpu_device *adev);
|
|||
void amdgpu_acpi_fini(struct amdgpu_device *adev);
|
||||
bool amdgpu_acpi_is_pcie_performance_request_supported(struct amdgpu_device *adev);
|
||||
bool amdgpu_acpi_is_power_shift_control_supported(void);
|
||||
bool amdgpu_acpi_is_set_uma_allocation_size_supported(void);
|
||||
int amdgpu_acpi_pcie_performance_request(struct amdgpu_device *adev,
|
||||
u8 perf_req, bool advertise);
|
||||
int amdgpu_acpi_power_shift_control(struct amdgpu_device *adev,
|
||||
u8 dev_state, bool drv_state);
|
||||
int amdgpu_acpi_smart_shift_update(struct amdgpu_device *adev,
|
||||
enum amdgpu_ss ss_state);
|
||||
int amdgpu_acpi_set_uma_allocation_size(struct amdgpu_device *adev, u8 index, u8 type);
|
||||
int amdgpu_acpi_pcie_notify_device_ready(struct amdgpu_device *adev);
|
||||
int amdgpu_acpi_get_tmr_info(struct amdgpu_device *adev, u64 *tmr_offset,
|
||||
u64 *tmr_size);
|
||||
|
|
@ -1722,6 +1649,7 @@ static inline bool amdgpu_acpi_should_gpu_reset(struct amdgpu_device *adev) { re
|
|||
static inline void amdgpu_acpi_detect(void) { }
|
||||
static inline void amdgpu_acpi_release(void) { }
|
||||
static inline bool amdgpu_acpi_is_power_shift_control_supported(void) { return false; }
|
||||
static inline bool amdgpu_acpi_is_set_uma_allocation_size_supported(void) { return false; }
|
||||
static inline int amdgpu_acpi_power_shift_control(struct amdgpu_device *adev,
|
||||
u8 dev_state, bool drv_state) { return 0; }
|
||||
static inline int amdgpu_acpi_smart_shift_update(struct amdgpu_device *adev,
|
||||
|
|
@ -1729,6 +1657,10 @@ static inline int amdgpu_acpi_smart_shift_update(struct amdgpu_device *adev,
|
|||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int amdgpu_acpi_set_uma_allocation_size(struct amdgpu_device *adev, u8 index, u8 type)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
static inline void amdgpu_acpi_get_backlight_caps(struct amdgpu_dm_backlight_caps *caps) { }
|
||||
#endif
|
||||
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue