xserver/hw/kdrive/ati ati.c,1.18,1.19 ati_reg.h,1.8,1.9

Eric Anholt <xserver-commit-u7BhqnqprCWvj1b/[email protected]>
Newsgroups gmane.comp.freedesktop.xserver.cvs
Message-ID <[email protected]>
Committed by: anholt

Update of /cvs/xserver/xserver/hw/kdrive/ati
In directory gabe:/tmp/cvs-serv5936/hw/kdrive/ati

Modified Files:
	ati.c ati_reg.h 
Log Message:
Add proper PCI/AGP detection, based on Mike Harris's code for Radeon,
but using the MMIO mirror of the bits instead of config space.


Index: ati.c
===================================================================
RCS file: /cvs/xserver/xserver/hw/kdrive/ati/ati.c,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -d -r1.18 -r1.19
--- ati.c	24 Jul 2004 17:02:49 -0000	1.18
+++ ati.c	14 Sep 2004 06:26:53 -0000	1.19
@@ -698,31 +698,23 @@
 ATIIsAGP(ATICardInfo *atic)
 {
 	char *mmio = atic->reg_base;
-	CARD32 agp_command;
-	Bool is_agp = FALSE;
+	CARD32 cap_ptr, cap_id;
 
 	if (mmio == NULL)
 		return FALSE;
 
-	if (atic->is_radeon) {
-		/* XXX: Apparently this doesn't work.  Maybe it needs to be done
-		 * through the PCI config aperture then.
-		 */
-		agp_command = MMIO_IN32(mmio, RADEON_REG_AGP_COMMAND);
-		MMIO_OUT32(mmio, RADEON_REG_AGP_COMMAND, agp_command |
-		    RADEON_AGP_ENABLE);
-		if (MMIO_IN32(mmio, RADEON_REG_AGP_COMMAND) & RADEON_AGP_ENABLE)
-			is_agp = TRUE;
-		MMIO_OUT32(mmio, RADEON_REG_AGP_COMMAND, agp_command);
-	} else {
-		/* Don't know any way to detect R128 AGP automatically, so
-		 * assume AGP for all cards not marked as PCI-only by XFree86.
-		 */
-		if ((atic->pci_id->caps & CAP_FEATURESMASK) != CAP_NOAGP)
-			is_agp = TRUE;
+	if (MMIO_IN32(mmio, ATI_REG_PCI_CFG_STATUS) & ATI_CAP_LIST) {
+		cap_ptr = MMIO_IN32(mmio, ATI_REG_PCI_CFG_CAPABILITIES_PTR) &
+		    ATI_CAP_PTR_MASK;
+		while (cap_ptr != ATI_CAP_ID_NULL) {
+			cap_id = MMIO_IN32(mmio, ATI_PCI_CFG_OFFSET + cap_ptr);
+			if ((cap_id & 0xff) == ATI_CAP_ID_AGP)
+				return TRUE;
+			cap_ptr = (cap_id >> 8) & ATI_CAP_PTR_MASK;
+		}
 	}
 
-	return is_agp;
+	return FALSE;
 }
 
 /* This function is required to work around a hardware bug in some (all?)

Index: ati_reg.h
===================================================================
RCS file: /cvs/xserver/xserver/hw/kdrive/ati/ati_reg.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -d -r1.8 -r1.9
--- ati_reg.h	11 Sep 2004 09:28:19 -0000	1.8
+++ ati_reg.h	14 Sep 2004 06:26:54 -0000	1.9
@@ -283,6 +283,17 @@
 # define R128_BM_PM4_RD_FORCE_TO_PCI		(1 << 22)
 # define R128_BM_GLOBAL_FORCE_TO_PCI		(1 << 23)
 
+/* Offset of the PCI config space mirror */
+#define ATI_PCI_CFG_OFFSET			0x0f00
+
+#define ATI_REG_PCI_CFG_STATUS			0x0f06
+# define ATI_CAP_LIST				0x0010
+
+#define ATI_REG_PCI_CFG_CAPABILITIES_PTR	0x0f34
+# define ATI_CAP_PTR_MASK			0x00fc
+# define ATI_CAP_ID_NULL			0x0000 /* End of capability list */
+# define ATI_CAP_ID_AGP				0x0002 /* AGP capability ID */
+
 #define R128_REG_AGP_COMMAND			0x0f58
 # define R128_AGP_ENABLE			(1 << 8)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.