mirror of
git://nv-tegra.nvidia.com/linux-nv-oot.git
synced 2025-12-22 09:11:26 +03:00
drivers: gpu: Fix IOMMU support for Linux v6.13
In Linux v6.13, commit f6440fcc9c7b ("iommu: Remove
iommu_domain_alloc()") removed iommu_domain_alloc() and was replaced by
iommu_paging_domain_alloc(). Use conftest to detect if the function
iommu_paging_domain_alloc() is supported by the kernel and update the
Tegra DRM and Host1x drivers accordingly.
Bug 4991705
Change-Id: I86221d96232396fdb6bdccf40c412e029881c513
Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3261695
(cherry picked from commit e374ac996dceee884296c9f1e53fdd0f281b3e0c)
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3499750
Reviewed-by: Brad Griffis <bgriffis@nvidia.com>
Tested-by: Brad Griffis <bgriffis@nvidia.com>
GVS: buildbot_gerritrpt <buildbot_gerritrpt@nvidia.com>
This commit is contained in:
committed by
mobile promotions
parent
0980dbb86e
commit
0a8d8b47c7
@@ -1182,6 +1182,9 @@ static bool host1x_drm_wants_iommu(struct host1x_device *dev)
|
|||||||
|
|
||||||
static int host1x_drm_probe(struct host1x_device *dev)
|
static int host1x_drm_probe(struct host1x_device *dev)
|
||||||
{
|
{
|
||||||
|
#if defined(NV_IOMMU_PAGING_DOMAIN_ALLOC_PRESENT) /* Linux v6.11 */
|
||||||
|
struct device *dma_dev = dev->dev.parent;
|
||||||
|
#endif
|
||||||
struct tegra_drm *tegra;
|
struct tegra_drm *tegra;
|
||||||
struct drm_device *drm;
|
struct drm_device *drm;
|
||||||
int err;
|
int err;
|
||||||
@@ -1196,8 +1199,13 @@ static int host1x_drm_probe(struct host1x_device *dev)
|
|||||||
goto put;
|
goto put;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(NV_IOMMU_PAGING_DOMAIN_ALLOC_PRESENT) /* Linux v6.11 */
|
||||||
|
if (host1x_drm_wants_iommu(dev) && device_iommu_mapped(dma_dev)) {
|
||||||
|
tegra->domain = iommu_paging_domain_alloc(dma_dev);
|
||||||
|
#else
|
||||||
if (host1x_drm_wants_iommu(dev) && iommu_present(&platform_bus_type)) {
|
if (host1x_drm_wants_iommu(dev) && iommu_present(&platform_bus_type)) {
|
||||||
tegra->domain = iommu_domain_alloc(&platform_bus_type);
|
tegra->domain = iommu_domain_alloc(&platform_bus_type);
|
||||||
|
#endif
|
||||||
if (!tegra->domain) {
|
if (!tegra->domain) {
|
||||||
err = -ENOMEM;
|
err = -ENOMEM;
|
||||||
goto free;
|
goto free;
|
||||||
|
|||||||
@@ -620,9 +620,16 @@ static struct iommu_domain *host1x_iommu_attach(struct host1x *host)
|
|||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto put_group;
|
goto put_group;
|
||||||
|
|
||||||
|
#if defined(NV_IOMMU_PAGING_DOMAIN_ALLOC_PRESENT) /* Linux v6.11 */
|
||||||
|
host->domain = iommu_paging_domain_alloc(host->dev);
|
||||||
|
if (IS_ERR(host->domain)) {
|
||||||
|
err = PTR_ERR(host->domain);
|
||||||
|
host->domain = NULL;
|
||||||
|
#else
|
||||||
host->domain = iommu_domain_alloc(&platform_bus_type);
|
host->domain = iommu_domain_alloc(&platform_bus_type);
|
||||||
if (!host->domain) {
|
if (!host->domain) {
|
||||||
err = -ENOMEM;
|
err = -ENOMEM;
|
||||||
|
#endif
|
||||||
goto put_cache;
|
goto put_cache;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -140,6 +140,7 @@ NV_CONFTEST_FUNCTION_COMPILE_TESTS += i2c_driver_struct_remove_return_type_int
|
|||||||
NV_CONFTEST_FUNCTION_COMPILE_TESTS += i2c_mux_add_adapter_has_no_class_argument
|
NV_CONFTEST_FUNCTION_COMPILE_TESTS += i2c_mux_add_adapter_has_no_class_argument
|
||||||
NV_CONFTEST_FUNCTION_COMPILE_TESTS += iio_dev_opaque_has_mlock
|
NV_CONFTEST_FUNCTION_COMPILE_TESTS += iio_dev_opaque_has_mlock
|
||||||
NV_CONFTEST_FUNCTION_COMPILE_TESTS += iommu_map_has_gfp_arg
|
NV_CONFTEST_FUNCTION_COMPILE_TESTS += iommu_map_has_gfp_arg
|
||||||
|
NV_CONFTEST_FUNCTION_COMPILE_TESTS += iommu_paging_domain_alloc
|
||||||
NV_CONFTEST_FUNCTION_COMPILE_TESTS += irq_get_nr_irqs
|
NV_CONFTEST_FUNCTION_COMPILE_TESTS += irq_get_nr_irqs
|
||||||
NV_CONFTEST_FUNCTION_COMPILE_TESTS += kthread_complete_and_exit
|
NV_CONFTEST_FUNCTION_COMPILE_TESTS += kthread_complete_and_exit
|
||||||
NV_CONFTEST_FUNCTION_COMPILE_TESTS += media_entity_remote_pad
|
NV_CONFTEST_FUNCTION_COMPILE_TESTS += media_entity_remote_pad
|
||||||
|
|||||||
@@ -7437,6 +7437,23 @@ compile_test() {
|
|||||||
compile_check_conftest "$CODE" "NV_NETIF_NAPI_ADD_WEIGHT_PRESENT" "" "functions"
|
compile_check_conftest "$CODE" "NV_NETIF_NAPI_ADD_WEIGHT_PRESENT" "" "functions"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
iommu_paging_domain_alloc)
|
||||||
|
#
|
||||||
|
# Determine if iommu_paging_domain_alloc() function is present
|
||||||
|
#
|
||||||
|
# Added by commit a27bf2743cb8 ("iommu: Add iommu_paging_domain_alloc()
|
||||||
|
# interface") in Linux v6.11.
|
||||||
|
#
|
||||||
|
CODE="
|
||||||
|
#include <linux/iommu.h>
|
||||||
|
void conftest_iommu_paging_domain_alloc(void)
|
||||||
|
{
|
||||||
|
iommu_paging_domain_alloc();
|
||||||
|
}
|
||||||
|
"
|
||||||
|
compile_check_conftest "$CODE" "NV_IOMMU_PAGING_DOMAIN_ALLOC_PRESENT" "" "functions"
|
||||||
|
;;
|
||||||
|
|
||||||
iommu_map_has_gfp_arg)
|
iommu_map_has_gfp_arg)
|
||||||
#
|
#
|
||||||
# Determine if iommu_map() has 'gfp' argument.
|
# Determine if iommu_map() has 'gfp' argument.
|
||||||
|
|||||||
Reference in New Issue
Block a user