+void rockchip_free_loader_memory(struct drm_device *drm)
+{
+ struct rockchip_drm_private *private = drm->dev_private;
+ struct rockchip_logo *logo;
+ void *start, *end;
+
+ if (!private || !private->logo || --private->logo->count)
+ return;
+
+ logo = private->logo;
+ start = phys_to_virt(logo->start);
+ end = phys_to_virt(logo->size);
+
+ if (private->domain) {
+ iommu_unmap(private->domain, logo->dma_addr,
+ logo->iommu_map_size);
+ drm_mm_remove_node(&logo->mm);
+ } else {
+ dma_unmap_sg(drm->dev, logo->sgt->sgl,
+ logo->sgt->nents, DMA_TO_DEVICE);
+ }
+ sg_free_table(logo->sgt);
+ memblock_free(logo->start, logo->size);
+ free_reserved_area(start, end, -1, "drm_logo");
+ kfree(logo);
+ private->logo = NULL;
+}
+