34 #include <linux/export.h>
37 # define ATI_PCIGART_PAGE_SIZE 4096
39 static int drm_ati_alloc_pcigart_table(struct drm_device *dev,
40 struct drm_ati_pcigart_info *gart_info)
44 if (gart_info->table_handle ==
NULL)
50 static void drm_ati_free_pcigart_table(
struct drm_device *
dev,
51 struct drm_ati_pcigart_info *gart_info)
54 gart_info->table_handle =
NULL;
59 struct drm_sg_mem *
entry = dev->sg;
66 DRM_ERROR(
"no scatter/gather memory!\n");
70 if (gart_info->bus_addr) {
72 max_pages = (gart_info->table_size /
sizeof(
u32));
73 pages = (entry->pages <= max_pages)
74 ? entry->pages : max_pages;
77 if (!entry->busaddr[i])
79 pci_unmap_page(dev->pdev, entry->busaddr[i],
83 if (gart_info->gart_table_location == DRM_ATI_GART_MAIN)
84 gart_info->bus_addr = 0;
87 if (gart_info->gart_table_location == DRM_ATI_GART_MAIN &&
88 gart_info->table_handle) {
89 drm_ati_free_pcigart_table(dev, gart_info);
98 struct drm_local_map *
map = &gart_info->mapping;
99 struct drm_sg_mem *
entry = dev->sg;
102 u32 *pci_gart =
NULL, page_base, gart_idx;
105 int max_ati_pages, max_real_pages;
108 DRM_ERROR(
"no scatter/gather memory!\n");
112 if (gart_info->gart_table_location == DRM_ATI_GART_MAIN) {
113 DRM_DEBUG(
"PCI: no table in VRAM: using normal RAM\n");
115 if (pci_set_dma_mask(dev->pdev, gart_info->table_mask)) {
116 DRM_ERROR(
"fail to set dma mask to 0x%Lx\n",
117 (
unsigned long long)gart_info->table_mask);
122 ret = drm_ati_alloc_pcigart_table(dev, gart_info);
124 DRM_ERROR(
"cannot allocate PCI GART page!\n");
128 pci_gart = gart_info->table_handle->vaddr;
129 address = gart_info->table_handle->vaddr;
130 bus_address = gart_info->table_handle->busaddr;
132 address = gart_info->addr;
133 bus_address = gart_info->bus_addr;
134 DRM_DEBUG(
"PCI: Gart Table: VRAM %08LX mapped at %08lX\n",
135 (
unsigned long long)bus_address,
136 (
unsigned long)address);
140 max_ati_pages = (gart_info->table_size /
sizeof(
u32));
142 pages = (entry->pages <= max_real_pages)
143 ? entry->pages : max_real_pages;
145 if (gart_info->gart_table_location == DRM_ATI_GART_MAIN) {
146 memset(pci_gart, 0, max_ati_pages *
sizeof(
u32));
152 for (i = 0; i <
pages; i++) {
154 entry->busaddr[
i] = pci_map_page(dev->pdev, entry->pagelist[i],
156 if (pci_dma_mapping_error(dev->pdev, entry->busaddr[i])) {
157 DRM_ERROR(
"unable to map PCIGART pages!\n");
163 page_base = (
u32) entry->busaddr[i];
168 switch(gart_info->gart_reg_if) {
169 case DRM_ATI_GART_IGP:
170 val = page_base | 0xc;
172 case DRM_ATI_GART_PCIE:
173 val = (page_base >> 8) | 0
xc;
176 case DRM_ATI_GART_PCI:
180 if (gart_info->gart_table_location ==
191 #if defined(__i386__) || defined(__x86_64__)
199 gart_info->bus_addr = bus_address;