[OpenBIOS] r366 - openbios-devel/drivers

svn at openbios.org svn at openbios.org
Wed Jan 7 16:51:41 CET 2009


Author: blueswirl
Date: 2009-01-07 16:51:40 +0100 (Wed, 07 Jan 2009)
New Revision: 366

Modified:
   openbios-devel/drivers/pci.c
   openbios-devel/drivers/pci_database.h
Log:
Correctly create "reg" property for PCI devices (Laurent Vivier)

Modified: openbios-devel/drivers/pci.c
===================================================================
--- openbios-devel/drivers/pci.c	2009-01-07 15:50:03 UTC (rev 365)
+++ openbios-devel/drivers/pci.c	2009-01-07 15:51:40 UTC (rev 366)
@@ -176,22 +176,12 @@
 
 int eth_config_cb (const pci_config_t *config)
 {
-	phandle_t ph;
-	cell props[12];
-	int i;
+	phandle_t ph = get_cur_dev();;
 
-	ph = find_dev(config->path);
-
 	set_property(ph, "network-type", "ethernet", 9);
 	set_property(ph, "removable", "network", 8);
 	set_property(ph, "category", "net", 4);
 
-	for (i = 0; i < 7; i++)
-	{
-		props[i*2] = config->assigned[i] & ~0x0000000F;
-		props[i*2 + 1] = config->sizes[i];
-	}
-        set_property(ph, "reg", (char *)props, i * 2 * sizeof(cell));
         return 0;
 }
 
@@ -295,6 +285,44 @@
 			     ncells * sizeof(cell));
 }
 
+static void pci_set_reg(const pci_config_t *config)
+{
+	phandle_t dev = get_cur_dev();
+	cell props[38];
+	int ncells;
+	int i;
+	uint32_t mask;
+	int space_code, flags;
+
+	ncells = 0;
+	pci_encode_phys_addr(props + ncells, 0, CONFIGURATION_SPACE,
+			     config->dev, 0, 0);
+	ncells += 3;
+
+	props[ncells++] = 0x00000000;
+	props[ncells++] = 0x00000000;
+
+	for (i = 0; i < 6; i++) {
+		if (!config->assigned[i] || !config->sizes[i])
+			continue;
+
+		pci_decode_pci_addr(config->regions[i],
+				    &flags, &space_code, &mask);
+
+		pci_encode_phys_addr(props + ncells,
+				     flags, space_code, config->dev,
+				     PCI_BASE_ADDR_0 + (i * sizeof(uint32_t)),
+				     config->regions[i] & ~mask);
+		ncells += 3;
+
+		/* set size */
+
+		props[ncells++] = 0x00000000;
+		props[ncells++] = config->sizes[i];
+	}
+	set_property(dev, "reg", (char *)props, ncells * sizeof(cell));
+}
+
 int macio_config_cb (const pci_config_t *config)
 {
 #ifdef CONFIG_DRIVER_MACIO
@@ -378,6 +406,7 @@
 		set_property(dev, "compatible",
 			     pci_dev->compat, pci_compat_len(pci_dev));
 
+	pci_set_reg(config);
 	pci_set_assigned_addresses(config);
 	pci_set_interrupt_map(config);
 
@@ -396,20 +425,6 @@
 		pci_dev->config_cb(config);
 }
 
-static void ob_pci_add_reg(pci_addr addr)
-{
-	PUSH(0);
-	PUSH(0);
-	PUSH(addr&(~arch->cfg_base));
-	fword("pci-addr-encode");
-	PUSH(0);
-	PUSH(0);
-	fword("pci-len-encode");
-	fword("encode+");
-	push_str("reg");
-	fword("property");
-}
-
 #ifdef CONFIG_XBOX
 static char pci_xbox_blacklisted (int bus, int devnum, int fn)
 {
@@ -486,6 +501,8 @@
 		else
 			config_addr = PCI_BASE_ADDR_0 + reg * 4;
 
+		config->regions[reg] = pci_config_read32(addr, config_addr);
+
 		/* get region size */
 
 		pci_config_write32(addr, config_addr, 0xffffffff);
@@ -594,7 +611,6 @@
 
                         ob_pci_configure(addr, &config, mem_base, io_base);
 			ob_pci_add_properties(addr, pci_dev, &config);
-			ob_pci_add_reg(addr);
 
 			if (ccode == 0x0600 || ccode == 0x0604) {
 				/* host or bridge */

Modified: openbios-devel/drivers/pci_database.h
===================================================================
--- openbios-devel/drivers/pci_database.h	2009-01-07 15:50:03 UTC (rev 365)
+++ openbios-devel/drivers/pci_database.h	2009-01-07 15:51:40 UTC (rev 366)
@@ -3,6 +3,7 @@
 struct pci_config_t {
 	char path[256];
 	uint32_t dev;		/* bus, dev, fn */
+	uint32_t regions[7];
 	uint32_t assigned[7];
 	uint32_t sizes[7];
 	int irq_pin;




More information about the OpenBIOS mailing list