From e3e12f52b214121840b44c91de5b3e5af5d3eb84 Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Mon, 06 Nov 2023 03:04:41 +0000 Subject: [PATCH] rk3568 rt init --- kernel/drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 41 +++++++++++++++++++++++++++++++---------- 1 files changed, 31 insertions(+), 10 deletions(-) diff --git a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_drv.c index 294547b..0ae26f7 100644 --- a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_drv.c +++ b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_drv.c @@ -63,6 +63,7 @@ #else static bool is_support_iommu = true; #endif +static bool iommu_reserve_map; static struct drm_driver rockchip_drm_driver; struct rockchip_drm_mode_set { @@ -1320,6 +1321,7 @@ struct rockchip_drm_private *private = drm_dev->dev_private; struct iommu_domain_geometry *geometry; u64 start, end; + int ret = 0; if (!is_support_iommu) return 0; @@ -1340,7 +1342,23 @@ iommu_set_fault_handler(private->domain, rockchip_drm_fault_handler, drm_dev); - return 0; + if (iommu_reserve_map) { + /* + * At 32 bit platform size_t maximum value is 0xffffffff, SZ_4G(0x100000000) will be + * cliped to 0, so we split into two mapping + */ + ret = iommu_map(private->domain, 0, 0, (size_t)SZ_2G, + IOMMU_WRITE | IOMMU_READ | IOMMU_PRIV); + if (ret) + dev_err(drm_dev->dev, "failed to create 0-2G pre mapping\n"); + + ret = iommu_map(private->domain, SZ_2G, SZ_2G, (size_t)SZ_2G, + IOMMU_WRITE | IOMMU_READ | IOMMU_PRIV); + if (ret) + dev_err(drm_dev->dev, "failed to create 2G-4G pre mapping\n"); + } + + return ret; } static void rockchip_iommu_cleanup(struct drm_device *drm_dev) @@ -1350,6 +1368,10 @@ if (!is_support_iommu) return; + if (iommu_reserve_map) { + iommu_unmap(private->domain, 0, (size_t)SZ_2G); + iommu_unmap(private->domain, SZ_2G, (size_t)SZ_2G); + } drm_mm_takedown(&private->mm); iommu_domain_free(private->domain); } @@ -1765,16 +1787,14 @@ if (ret) goto err_kms_helper_poll_fini; - drm_for_each_crtc(crtc, drm_dev) { - struct drm_fb_helper *helper = private->fbdev_helper; - struct rockchip_crtc_state *s = NULL; + if (private->fbdev_helper && private->fbdev_helper->fb) { + drm_for_each_crtc(crtc, drm_dev) { + struct rockchip_crtc_state *s = NULL; - if (!helper) - break; - - s = to_rockchip_crtc_state(crtc->state); - if (is_support_hotplug(s->output_type)) - drm_framebuffer_get(helper->fb); + s = to_rockchip_crtc_state(crtc->state); + if (is_support_hotplug(s->output_type)) + drm_framebuffer_get(private->fbdev_helper->fb); + } } drm_dev->mode_config.allow_fb_modifiers = true; @@ -2303,6 +2323,7 @@ } found = true; + iommu_reserve_map |= of_property_read_bool(iommu, "rockchip,reserve-map"); of_node_put(iommu); of_node_put(port); -- Gitblit v1.6.2