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

drm/radeon: Move AGP helpers into radeon driver

Radeon calls DRMs core AGP helpers. These helpers are only required
by legacy drivers. Reimplement the code in radeon to uncouple radeon
from the legacy code.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Acked-by: Christian König <christian.koenig@amd.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210507185709.22797-2-tzimmermann@suse.de

+104 -8
+8
drivers/gpu/drm/radeon/radeon.h
··· 1110 1110 /* 1111 1111 * AGP 1112 1112 */ 1113 + #if IS_ENABLED(CONFIG_AGP) 1114 + struct drm_agp_head *radeon_agp_head_init(struct drm_device *dev); 1115 + #else 1116 + static inline struct drm_agp_head *radeon_agp_head_init(struct drm_device *dev) 1117 + { 1118 + return NULL; 1119 + } 1120 + #endif 1113 1121 int radeon_agp_init(struct radeon_device *rdev); 1114 1122 void radeon_agp_resume(struct radeon_device *rdev); 1115 1123 void radeon_agp_suspend(struct radeon_device *rdev);
+95 -7
drivers/gpu/drm/radeon/radeon_agp.c
··· 127 127 PCI_VENDOR_ID_SONY, 0x8175, 1}, 128 128 { 0, 0, 0, 0, 0, 0, 0 }, 129 129 }; 130 + 131 + struct drm_agp_head *radeon_agp_head_init(struct drm_device *dev) 132 + { 133 + struct pci_dev *pdev = to_pci_dev(dev->dev); 134 + struct drm_agp_head *head = NULL; 135 + 136 + head = kzalloc(sizeof(*head), GFP_KERNEL); 137 + if (!head) 138 + return NULL; 139 + head->bridge = agp_find_bridge(pdev); 140 + if (!head->bridge) { 141 + head->bridge = agp_backend_acquire(pdev); 142 + if (!head->bridge) { 143 + kfree(head); 144 + return NULL; 145 + } 146 + agp_copy_info(head->bridge, &head->agp_info); 147 + agp_backend_release(head->bridge); 148 + } else { 149 + agp_copy_info(head->bridge, &head->agp_info); 150 + } 151 + if (head->agp_info.chipset == NOT_SUPPORTED) { 152 + kfree(head); 153 + return NULL; 154 + } 155 + INIT_LIST_HEAD(&head->memory); 156 + head->cant_use_aperture = head->agp_info.cant_use_aperture; 157 + head->page_mask = head->agp_info.page_mask; 158 + head->base = head->agp_info.aper_base; 159 + 160 + return head; 161 + } 162 + 163 + static int radeon_agp_head_acquire(struct drm_device *dev) 164 + { 165 + struct pci_dev *pdev = to_pci_dev(dev->dev); 166 + 167 + if (!dev->agp) 168 + return -ENODEV; 169 + if (dev->agp->acquired) 170 + return -EBUSY; 171 + dev->agp->bridge = agp_backend_acquire(pdev); 172 + if (!dev->agp->bridge) 173 + return -ENODEV; 174 + dev->agp->acquired = 1; 175 + return 0; 176 + } 177 + 178 + static int radeon_agp_head_release(struct drm_device *dev) 179 + { 180 + if (!dev->agp || !dev->agp->acquired) 181 + return -EINVAL; 182 + agp_backend_release(dev->agp->bridge); 183 + dev->agp->acquired = 0; 184 + return 0; 185 + } 186 + 187 + static int radeon_agp_head_enable(struct drm_device *dev, struct drm_agp_mode mode) 188 + { 189 + if (!dev->agp || !dev->agp->acquired) 190 + return -EINVAL; 191 + 192 + dev->agp->mode = mode.mode; 193 + agp_enable(dev->agp->bridge, mode.mode); 194 + dev->agp->enabled = 1; 195 + return 0; 196 + } 197 + 198 + static int radeon_agp_head_info(struct drm_device *dev, struct drm_agp_info *info) 199 + { 200 + struct agp_kern_info *kern; 201 + 202 + if (!dev->agp || !dev->agp->acquired) 203 + return -EINVAL; 204 + 205 + kern = &dev->agp->agp_info; 206 + info->agp_version_major = kern->version.major; 207 + info->agp_version_minor = kern->version.minor; 208 + info->mode = kern->mode; 209 + info->aperture_base = kern->aper_base; 210 + info->aperture_size = kern->aper_size * 1024 * 1024; 211 + info->memory_allowed = kern->max_memory << PAGE_SHIFT; 212 + info->memory_used = kern->current_memory << PAGE_SHIFT; 213 + info->id_vendor = kern->device->vendor; 214 + info->id_device = kern->device->device; 215 + 216 + return 0; 217 + } 130 218 #endif 131 219 132 220 int radeon_agp_init(struct radeon_device *rdev) ··· 229 141 int ret; 230 142 231 143 /* Acquire AGP. */ 232 - ret = drm_agp_acquire(rdev->ddev); 144 + ret = radeon_agp_head_acquire(rdev->ddev); 233 145 if (ret) { 234 146 DRM_ERROR("Unable to acquire AGP: %d\n", ret); 235 147 return ret; 236 148 } 237 149 238 - ret = drm_agp_info(rdev->ddev, &info); 150 + ret = radeon_agp_head_info(rdev->ddev, &info); 239 151 if (ret) { 240 - drm_agp_release(rdev->ddev); 152 + radeon_agp_head_release(rdev->ddev); 241 153 DRM_ERROR("Unable to get AGP info: %d\n", ret); 242 154 return ret; 243 155 } 244 156 245 157 if (rdev->ddev->agp->agp_info.aper_size < 32) { 246 - drm_agp_release(rdev->ddev); 158 + radeon_agp_head_release(rdev->ddev); 247 159 dev_warn(rdev->dev, "AGP aperture too small (%zuM) " 248 160 "need at least 32M, disabling AGP\n", 249 161 rdev->ddev->agp->agp_info.aper_size); ··· 327 239 } 328 240 329 241 mode.mode &= ~RADEON_AGP_FW_MODE; /* disable fw */ 330 - ret = drm_agp_enable(rdev->ddev, mode); 242 + ret = radeon_agp_head_enable(rdev->ddev, mode); 331 243 if (ret) { 332 244 DRM_ERROR("Unable to enable AGP (mode = 0x%lx)\n", mode.mode); 333 - drm_agp_release(rdev->ddev); 245 + radeon_agp_head_release(rdev->ddev); 334 246 return ret; 335 247 } 336 248 ··· 367 279 { 368 280 #if IS_ENABLED(CONFIG_AGP) 369 281 if (rdev->ddev->agp && rdev->ddev->agp->acquired) { 370 - drm_agp_release(rdev->ddev); 282 + radeon_agp_head_release(rdev->ddev); 371 283 } 372 284 #endif 373 285 }
+1 -1
drivers/gpu/drm/radeon/radeon_drv.c
··· 346 346 pci_set_drvdata(pdev, dev); 347 347 348 348 if (pci_find_capability(pdev, PCI_CAP_ID_AGP)) 349 - dev->agp = drm_agp_init(dev); 349 + dev->agp = radeon_agp_head_init(dev); 350 350 if (dev->agp) { 351 351 dev->agp->agp_mtrr = arch_phys_wc_add( 352 352 dev->agp->agp_info.aper_base,