在2024年7月1日七月 下午12:40,Christian König写道:
[...]
Ah, wait a second.There are some non-PCIe TTM GPU being hit by this pitfall, we have non-coherent
Such a thing as non-coherent PCIe implementation doesn't exist. The PCIe
specification makes it mandatory for memory access to be cache coherent.
Vivante GPU on some devices.
Handling it at TTM core makes more sense on reducing per-driver effort on dealing
platform issues.
There are a bunch of non-compliant PCIe implementations which haveI don't really understand, "doesn't exist" and "bunch of" seems to be contradicting
broken cache coherency, but those explicitly violate the specification
and because of that are not supported.
with each other.
Regards,IMO for DMA mappings, use dma_pgprot at mapping makes more sense :-)
Christian.
Unfortunately I don't think we can safely ttm_cached to ttm_write_comnined, we'veYes this really sounds like an issue.
had enough drama with write combine behaviour on all different platforms.
See drm_arch_can_wc_memory in drm_cache.h.
Maybe the behavior of ttm_write_combined should furtherly be decided
by drm_arch_can_wc_memory() in case of quirks?
Thanks
- Jiaxun
Thanks
+
return ttm_prot_from_caching(caching, tmp);
}
EXPORT_SYMBOL(ttm_io_prot);
diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c
index 7b00ddf0ce49f..3335df45fba5e 100644
--- a/drivers/gpu/drm/ttm/ttm_tt.c
+++ b/drivers/gpu/drm/ttm/ttm_tt.c
@@ -152,6 +152,10 @@ static void ttm_tt_init_fields(struct ttm_tt *ttm,
enum ttm_caching caching,
unsigned long extra_pages)
{
+ /* Downgrade cached mapping for non-snooping devices */
+ if (!bo->bdev->dma_coherent && caching == ttm_cached)
+ caching = ttm_write_combined;
+
ttm->num_pages = (PAGE_ALIGN(bo->base.size) >> PAGE_SHIFT) + extra_pages;
ttm->page_flags = page_flags;
ttm->dma_address = NULL;
diff --git a/include/drm/ttm/ttm_caching.h b/include/drm/ttm/ttm_caching.h
index a18f43e93abab..f92d7911f50e4 100644
--- a/include/drm/ttm/ttm_caching.h
+++ b/include/drm/ttm/ttm_caching.h
@@ -47,7 +47,8 @@ enum ttm_caching {
/**
* @ttm_cached: Fully cached like normal system memory, requires that
- * devices snoop the CPU cache on accesses.
+ * devices snoop the CPU cache on accesses. Downgraded to
+ * ttm_write_combined when the snooping capaiblity is missing.
*/
ttm_cached
};
--
2.45.2