PCIe memory mapped configuration

Romick yellowrabbit2010 at gmail.com
Tue Jun 19 04:20:44 PDT 2012


--Multipart_Tue_Jun_19_22:20:44_2012-1
Content-Type: text/plain; charset=US-ASCII


No more hang during boot. I'm happy :)

--Multipart_Tue_Jun_19_22:20:44_2012-1
Content-Type: text/plain; charset=US-ASCII

  with best reagrds, Yellow Rabbit
  DragonFly 3.1-DEVELOPMENT x86_64



--Multipart_Tue_Jun_19_22:20:44_2012-1
Content-Type: application/octet-stream; type=patch
Content-Disposition: attachment; filename="pcie.diff"
Content-Transfer-Encoding: 7bit

diff --git a/sys/bus/pci/pci.c b/sys/bus/pci/pci.c
index 7776803..1fb6d95 100644
--- a/sys/bus/pci/pci.c
+++ b/sys/bus/pci/pci.c
@@ -2455,6 +2455,7 @@ pci_add_map(device_t pcib, device_t bus, device_t dev,
     int prefetch)
 {
 	uint32_t map;
+	uint16_t old_cmd;
 	pci_addr_t base;
 	pci_addr_t start, end, count;
 	uint8_t ln2size;
@@ -2466,10 +2467,24 @@ pci_add_map(device_t pcib, device_t bus, device_t dev,
 	struct resource *res;
 
 	map = PCIB_READ_CONFIG(pcib, b, s, f, reg, 4);
+
+   /* Disable access to device memory */
+	old_cmd = 0;
+	if (PCI_BAR_MEM(map)) {
+		old_cmd = PCIB_READ_CONFIG(pcib, b, s, f, PCIR_COMMAND, 2);
+		cmd = old_cmd & ~PCIM_CMD_MEMEN;
+		PCIB_WRITE_CONFIG(pcib, b, s, f, PCIR_COMMAND, cmd, 2);
+	}
+
 	PCIB_WRITE_CONFIG(pcib, b, s, f, reg, 0xffffffff, 4);
 	testval = PCIB_READ_CONFIG(pcib, b, s, f, reg, 4);
 	PCIB_WRITE_CONFIG(pcib, b, s, f, reg, map, 4);
 
+   /* Restore memory access mode */
+	if (PCI_BAR_MEM(map)) {
+		PCIB_WRITE_CONFIG(pcib, b, s, f, PCIR_COMMAND, old_cmd, 2);
+	}
+
 	if (PCI_BAR_MEM(map)) {
 		type = SYS_RES_MEMORY;
 		if (map & PCIM_BAR_MEM_PREFETCH)

--Multipart_Tue_Jun_19_22:20:44_2012-1--





More information about the Test mailing list