Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/mgag200: Use managed interfaces for framebuffer write combining

Replace arch_phys_wc_add() and arch_io_reserve_memtype_wc() with
the rsp managed functions. Allows for removing the cleanup code
for memory management

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210916181601.9146-5-tzimmermann@suse.de

+7 -30
-2
drivers/gpu/drm/mgag200/mgag200_drv.h
··· 224 224 225 225 enum mga_type type; 226 226 227 - int fb_mtrr; 228 - 229 227 union { 230 228 struct { 231 229 long ref_clk;
+7 -28
drivers/gpu/drm/mgag200/mgag200_mm.c
··· 75 75 return offset - 65536; 76 76 } 77 77 78 - static void mgag200_mm_release(struct drm_device *dev, void *ptr) 79 - { 80 - struct mga_device *mdev = to_mga_device(dev); 81 - struct pci_dev *pdev = to_pci_dev(dev->dev); 82 - 83 - mdev->vram_fb_available = 0; 84 - iounmap(mdev->vram); 85 - arch_io_free_memtype_wc(pci_resource_start(pdev, 0), 86 - pci_resource_len(pdev, 0)); 87 - arch_phys_wc_del(mdev->fb_mtrr); 88 - mdev->fb_mtrr = 0; 89 - } 90 - 91 78 int mgag200_mm_init(struct mga_device *mdev) 92 79 { 93 80 struct drm_device *dev = &mdev->base; 94 81 struct pci_dev *pdev = to_pci_dev(dev->dev); 95 82 u8 misc; 96 83 resource_size_t start, len; 97 - int ret; 98 84 99 85 WREG_ECRT(0x04, 0x00); 100 86 ··· 98 112 return -ENXIO; 99 113 } 100 114 101 - arch_io_reserve_memtype_wc(start, len); 115 + /* Don't fail on errors, but performance might be reduced. */ 116 + devm_arch_io_reserve_memtype_wc(dev->dev, start, len); 117 + devm_arch_phys_wc_add(dev->dev, start, len); 102 118 103 - mdev->fb_mtrr = arch_phys_wc_add(start, len); 104 - 105 - mdev->vram = ioremap(start, len); 106 - if (!mdev->vram) { 107 - ret = -ENOMEM; 108 - goto err_arch_phys_wc_del; 109 - } 119 + mdev->vram = devm_ioremap(dev->dev, start, len); 120 + if (!mdev->vram) 121 + return -ENOMEM; 110 122 111 123 mdev->mc.vram_size = mgag200_probe_vram(mdev, mdev->vram, len); 112 124 mdev->mc.vram_base = start; ··· 112 128 113 129 mdev->vram_fb_available = mdev->mc.vram_size; 114 130 115 - return drmm_add_action_or_reset(dev, mgag200_mm_release, NULL); 116 - 117 - err_arch_phys_wc_del: 118 - arch_phys_wc_del(mdev->fb_mtrr); 119 - arch_io_free_memtype_wc(start, len); 120 - return ret; 131 + return 0; 121 132 }