提交 f26c473c 编写于 作者: D Dave Airlie 提交者: Dave Airlie

drm: update PCIGART support from CVS

In order to work on FreeBSD the gart needed to use a local mapping
This patch moves the mainline to the new code and aligns some comment
changes

From: Eric Anholt <anholt@freebsd.org>
Signed-off-by: NDave Airlie <airlied@linux.ie>
上级 0a406877
...@@ -52,7 +52,7 @@ ...@@ -52,7 +52,7 @@
# define ATI_MAX_PCIGART_PAGES 8192 /**< 32 MB aperture, 4K pages */ # define ATI_MAX_PCIGART_PAGES 8192 /**< 32 MB aperture, 4K pages */
# define ATI_PCIGART_PAGE_SIZE 4096 /**< PCI GART page size */ # define ATI_PCIGART_PAGE_SIZE 4096 /**< PCI GART page size */
static unsigned long drm_ati_alloc_pcigart_table(void) static void *drm_ati_alloc_pcigart_table(void)
{ {
unsigned long address; unsigned long address;
struct page *page; struct page *page;
...@@ -72,27 +72,26 @@ static unsigned long drm_ati_alloc_pcigart_table(void) ...@@ -72,27 +72,26 @@ static unsigned long drm_ati_alloc_pcigart_table(void)
} }
DRM_DEBUG("%s: returning 0x%08lx\n", __FUNCTION__, address); DRM_DEBUG("%s: returning 0x%08lx\n", __FUNCTION__, address);
return address; return (void *)address;
} }
static void drm_ati_free_pcigart_table(unsigned long address) static void drm_ati_free_pcigart_table(void *address)
{ {
struct page *page; struct page *page;
int i; int i;
DRM_DEBUG("%s\n", __FUNCTION__); DRM_DEBUG("%s\n", __FUNCTION__);
page = virt_to_page(address); page = virt_to_page((unsigned long)address);
for (i = 0; i < ATI_PCIGART_TABLE_PAGES; i++, page++) { for (i = 0; i < ATI_PCIGART_TABLE_PAGES; i++, page++) {
__put_page(page); __put_page(page);
ClearPageReserved(page); ClearPageReserved(page);
} }
free_pages(address, ATI_PCIGART_TABLE_ORDER); free_pages((unsigned long)address, ATI_PCIGART_TABLE_ORDER);
} }
int drm_ati_pcigart_cleanup(drm_device_t * dev, int drm_ati_pcigart_cleanup(drm_device_t *dev, drm_ati_pcigart_info *gart_info)
drm_ati_pcigart_info * gart_info)
{ {
drm_sg_mem_t *entry = dev->sg; drm_sg_mem_t *entry = dev->sg;
unsigned long pages; unsigned long pages;
...@@ -136,10 +135,10 @@ int drm_ati_pcigart_cleanup(drm_device_t * dev, ...@@ -136,10 +135,10 @@ int drm_ati_pcigart_cleanup(drm_device_t * dev,
EXPORT_SYMBOL(drm_ati_pcigart_cleanup); EXPORT_SYMBOL(drm_ati_pcigart_cleanup);
int drm_ati_pcigart_init(drm_device_t * dev, drm_ati_pcigart_info * gart_info) int drm_ati_pcigart_init(drm_device_t *dev, drm_ati_pcigart_info *gart_info)
{ {
drm_sg_mem_t *entry = dev->sg; drm_sg_mem_t *entry = dev->sg;
unsigned long address = 0; void *address = NULL;
unsigned long pages; unsigned long pages;
u32 *pci_gart, page_base, bus_address = 0; u32 *pci_gart, page_base, bus_address = 0;
int i, j, ret = 0; int i, j, ret = 0;
...@@ -163,7 +162,7 @@ int drm_ati_pcigart_init(drm_device_t * dev, drm_ati_pcigart_info * gart_info) ...@@ -163,7 +162,7 @@ int drm_ati_pcigart_init(drm_device_t * dev, drm_ati_pcigart_info * gart_info)
goto done; goto done;
} }
bus_address = pci_map_single(dev->pdev, (void *)address, bus_address = pci_map_single(dev->pdev, address,
ATI_PCIGART_TABLE_PAGES * ATI_PCIGART_TABLE_PAGES *
PAGE_SIZE, PCI_DMA_TODEVICE); PAGE_SIZE, PCI_DMA_TODEVICE);
if (bus_address == 0) { if (bus_address == 0) {
...@@ -176,7 +175,7 @@ int drm_ati_pcigart_init(drm_device_t * dev, drm_ati_pcigart_info * gart_info) ...@@ -176,7 +175,7 @@ int drm_ati_pcigart_init(drm_device_t * dev, drm_ati_pcigart_info * gart_info)
address = gart_info->addr; address = gart_info->addr;
bus_address = gart_info->bus_addr; bus_address = gart_info->bus_addr;
DRM_DEBUG("PCI: Gart Table: VRAM %08X mapped at %08lX\n", DRM_DEBUG("PCI: Gart Table: VRAM %08X mapped at %08lX\n",
bus_address, address); bus_address, (unsigned long)address);
} }
pci_gart = (u32 *) address; pci_gart = (u32 *) address;
...@@ -195,7 +194,7 @@ int drm_ati_pcigart_init(drm_device_t * dev, drm_ati_pcigart_info * gart_info) ...@@ -195,7 +194,7 @@ int drm_ati_pcigart_init(drm_device_t * dev, drm_ati_pcigart_info * gart_info)
if (entry->busaddr[i] == 0) { if (entry->busaddr[i] == 0) {
DRM_ERROR("unable to map PCIGART pages!\n"); DRM_ERROR("unable to map PCIGART pages!\n");
drm_ati_pcigart_cleanup(dev, gart_info); drm_ati_pcigart_cleanup(dev, gart_info);
address = 0; address = NULL;
bus_address = 0; bus_address = 0;
goto done; goto done;
} }
......
...@@ -522,8 +522,9 @@ typedef struct drm_vbl_sig { ...@@ -522,8 +522,9 @@ typedef struct drm_vbl_sig {
typedef struct ati_pcigart_info { typedef struct ati_pcigart_info {
int gart_table_location; int gart_table_location;
int is_pcie; int is_pcie;
unsigned long addr; void *addr;
dma_addr_t bus_addr; dma_addr_t bus_addr;
drm_local_map_t mapping;
} drm_ati_pcigart_info; } drm_ati_pcigart_info;
/** /**
......
/* r128_cce.c -- ATI Rage 128 driver -*- linux-c -*- /* r128_cce.c -- ATI Rage 128 driver -*- linux-c -*-
* Created: Wed Apr 5 19:24:19 2000 by kevin@precisioninsight.com * Created: Wed Apr 5 19:24:19 2000 by kevin@precisioninsight.com
* */
/*
* Copyright 2000 Precision Insight, Inc., Cedar Park, Texas. * Copyright 2000 Precision Insight, Inc., Cedar Park, Texas.
* Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
* All Rights Reserved. * All Rights Reserved.
...@@ -559,7 +560,8 @@ static int r128_do_init_cce(drm_device_t * dev, drm_r128_init_t * init) ...@@ -559,7 +560,8 @@ static int r128_do_init_cce(drm_device_t * dev, drm_r128_init_t * init)
if (dev_priv->is_pci) { if (dev_priv->is_pci) {
#endif #endif
dev_priv->gart_info.gart_table_location = DRM_ATI_GART_MAIN; dev_priv->gart_info.gart_table_location = DRM_ATI_GART_MAIN;
dev_priv->gart_info.addr = dev_priv->gart_info.bus_addr = 0; dev_priv->gart_info.addr = NULL;
dev_priv->gart_info.bus_addr = 0;
dev_priv->gart_info.is_pcie = 0; dev_priv->gart_info.is_pcie = 0;
if (!drm_ati_pcigart_init(dev, &dev_priv->gart_info)) { if (!drm_ati_pcigart_init(dev, &dev_priv->gart_info)) {
DRM_ERROR("failed to init PCI GART!\n"); DRM_ERROR("failed to init PCI GART!\n");
...@@ -601,15 +603,16 @@ int r128_do_cleanup_cce(drm_device_t * dev) ...@@ -601,15 +603,16 @@ int r128_do_cleanup_cce(drm_device_t * dev)
drm_core_ioremapfree(dev_priv->cce_ring, dev); drm_core_ioremapfree(dev_priv->cce_ring, dev);
if (dev_priv->ring_rptr != NULL) if (dev_priv->ring_rptr != NULL)
drm_core_ioremapfree(dev_priv->ring_rptr, dev); drm_core_ioremapfree(dev_priv->ring_rptr, dev);
if (dev->agp_buffer_map != NULL) if (dev->agp_buffer_map != NULL) {
drm_core_ioremapfree(dev->agp_buffer_map, dev); drm_core_ioremapfree(dev->agp_buffer_map, dev);
dev->agp_buffer_map = NULL;
}
} else } else
#endif #endif
{ {
if (dev_priv->gart_info.bus_addr) if (dev_priv->gart_info.bus_addr)
if (!drm_ati_pcigart_cleanup(dev, if (!drm_ati_pcigart_cleanup(dev,
&dev_priv-> &dev_priv->gart_info))
gart_info))
DRM_ERROR DRM_ERROR
("failed to cleanup PCI GART!\n"); ("failed to cleanup PCI GART!\n");
} }
......
/* r128_drm.h -- Public header for the r128 driver -*- linux-c -*- /* r128_drm.h -- Public header for the r128 driver -*- linux-c -*-
* Created: Wed Apr 5 19:24:19 2000 by kevin@precisioninsight.com * Created: Wed Apr 5 19:24:19 2000 by kevin@precisioninsight.com
* */
* Copyright 2000 Precision Insight, Inc., Cedar Park, Texas. /* Copyright 2000 Precision Insight, Inc., Cedar Park, Texas.
* Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
* All rights reserved. * All rights reserved.
* *
......
/* r128_drv.h -- Private header for r128 driver -*- linux-c -*- /* r128_drv.h -- Private header for r128 driver -*- linux-c -*-
* Created: Mon Dec 13 09:51:11 1999 by faith@precisioninsight.com * Created: Mon Dec 13 09:51:11 1999 by faith@precisioninsight.com
* */
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. /* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
* Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
* All rights reserved. * All rights reserved.
* *
......
/* r128_irq.c -- IRQ handling for radeon -*- linux-c -*- /* r128_irq.c -- IRQ handling for radeon -*- linux-c -*- */
* /*
* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. * Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved.
* *
* The Weather Channel (TM) funded Tungsten Graphics to develop the * The Weather Channel (TM) funded Tungsten Graphics to develop the
......
/* r128_state.c -- State support for r128 -*- linux-c -*- /* r128_state.c -- State support for r128 -*- linux-c -*-
* Created: Thu Jan 27 02:53:43 2000 by gareth@valinux.com * Created: Thu Jan 27 02:53:43 2000 by gareth@valinux.com
* */
* Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. /* Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
* All Rights Reserved. * All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a * Permission is hereby granted, free of charge, to any person obtaining a
......
/* radeon_cp.c -- CP support for Radeon -*- linux-c -*- /* radeon_cp.c -- CP support for Radeon -*- linux-c -*- */
* /*
* Copyright 2000 Precision Insight, Inc., Cedar Park, Texas. * Copyright 2000 Precision Insight, Inc., Cedar Park, Texas.
* Copyright 2000 VA Linux Systems, Inc., Fremont, California. * Copyright 2000 VA Linux Systems, Inc., Fremont, California.
* All Rights Reserved. * All Rights Reserved.
...@@ -1561,25 +1561,28 @@ static int radeon_do_init_cp(drm_device_t * dev, drm_radeon_init_t * init) ...@@ -1561,25 +1561,28 @@ static int radeon_do_init_cp(drm_device_t * dev, drm_radeon_init_t * init)
if (dev_priv->pcigart_offset) { if (dev_priv->pcigart_offset) {
dev_priv->gart_info.bus_addr = dev_priv->gart_info.bus_addr =
dev_priv->pcigart_offset + dev_priv->fb_location; dev_priv->pcigart_offset + dev_priv->fb_location;
dev_priv->gart_info.mapping.offset =
dev_priv->gart_info.bus_addr;
dev_priv->gart_info.mapping.size =
RADEON_PCIGART_TABLE_SIZE;
drm_core_ioremap(&dev_priv->gart_info.mapping, dev);
dev_priv->gart_info.addr = dev_priv->gart_info.addr =
(unsigned long)drm_ioremap(dev_priv->gart_info. dev_priv->gart_info.mapping.handle;
bus_addr,
RADEON_PCIGART_TABLE_SIZE,
dev);
dev_priv->gart_info.is_pcie = dev_priv->gart_info.is_pcie =
!!(dev_priv->flags & CHIP_IS_PCIE); !!(dev_priv->flags & CHIP_IS_PCIE);
dev_priv->gart_info.gart_table_location = dev_priv->gart_info.gart_table_location =
DRM_ATI_GART_FB; DRM_ATI_GART_FB;
DRM_DEBUG("Setting phys_pci_gart to %08lX %08lX\n", DRM_DEBUG("Setting phys_pci_gart to %p %08lX\n",
dev_priv->gart_info.addr, dev_priv->gart_info.addr,
dev_priv->pcigart_offset); dev_priv->pcigart_offset);
} else { } else {
dev_priv->gart_info.gart_table_location = dev_priv->gart_info.gart_table_location =
DRM_ATI_GART_MAIN; DRM_ATI_GART_MAIN;
dev_priv->gart_info.addr = dev_priv->gart_info.addr = NULL;
dev_priv->gart_info.bus_addr = 0; dev_priv->gart_info.bus_addr = 0;
if (dev_priv->flags & CHIP_IS_PCIE) { if (dev_priv->flags & CHIP_IS_PCIE) {
DRM_ERROR DRM_ERROR
("Cannot use PCI Express without GART in FB memory\n"); ("Cannot use PCI Express without GART in FB memory\n");
...@@ -1641,8 +1644,7 @@ static int radeon_do_cleanup_cp(drm_device_t * dev) ...@@ -1641,8 +1644,7 @@ static int radeon_do_cleanup_cp(drm_device_t * dev)
DRM_ERROR("failed to cleanup PCI GART!\n"); DRM_ERROR("failed to cleanup PCI GART!\n");
if (dev_priv->gart_info.gart_table_location == DRM_ATI_GART_FB) { if (dev_priv->gart_info.gart_table_location == DRM_ATI_GART_FB) {
drm_ioremapfree((void *)dev_priv->gart_info.addr, drm_core_ioremapfree(&dev_priv->gart_info.mapping, dev);
RADEON_PCIGART_TABLE_SIZE, dev);
dev_priv->gart_info.addr = 0; dev_priv->gart_info.addr = 0;
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册