[kvm-unit-tests PATCH 2/2] devicetree: use node #address/size-cells

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Don't assume all pbus (cpu physical bus) translations will use the same
number of address and size cells as are defined in the root node. Also,
drop the caching of the address/size cells in the bus structure, as that
was a bad idea, and unused anyway.

(I was tempted to completely remove dt_pbus_translate_node, which still
 uses the root node's address/size cells, but I kept it, as it offers a
 nice shortcut for when we are sure we can use the root node's cells.)

Signed-off-by: Andrew Jones <drjones@xxxxxxxxxx>
---
 lib/devicetree.c | 25 +++++++++++++++++--------
 lib/devicetree.h | 10 +++-------
 2 files changed, 20 insertions(+), 15 deletions(-)

diff --git a/lib/devicetree.c b/lib/devicetree.c
index d3751e2b7e7f9..3d31f694b0d77 100644
--- a/lib/devicetree.c
+++ b/lib/devicetree.c
@@ -87,13 +87,14 @@ int dt_get_reg(int fdtnode, int regidx, struct dt_reg *reg)
 	return 0;
 }
 
-int dt_pbus_translate_node(int fdtnode, int regidx,
-			   struct dt_pbus_reg *pbus_reg)
+static int __dt_pbus_translate_node(int fdtnode, int regidx,
+				    struct dt_pbus_reg *pbus_reg,
+				    u32 nr_address_cells, u32 nr_size_cells)
 {
 	struct dt_reg raw_reg;
 	int ret;
 
-	dt_reg_init(&raw_reg, root_nr_address_cells, root_nr_size_cells);
+	dt_reg_init(&raw_reg, nr_address_cells, nr_size_cells);
 
 	ret = dt_get_reg(fdtnode, regidx, &raw_reg);
 	if (ret < 0)
@@ -107,10 +108,22 @@ int dt_pbus_translate_node(int fdtnode, int regidx,
 	return 0;
 }
 
+int dt_pbus_translate_node(int fdtnode, int regidx,
+			   struct dt_pbus_reg *pbus_reg)
+{
+	return __dt_pbus_translate_node(fdtnode, regidx, pbus_reg,
+			root_nr_address_cells, root_nr_size_cells);
+}
+
 int dt_pbus_translate(const struct dt_device *dev, int regidx,
 		      void *reg)
 {
-	return dt_pbus_translate_node(dev->fdtnode, regidx, reg);
+	u32 nac, nsc;
+	int ret = dt_get_nr_cells(dev->fdtnode, &nac, &nsc);
+
+	if (ret < 0)
+		return ret;
+	return __dt_pbus_translate_node(dev->fdtnode, regidx, reg, nac, nsc);
 }
 
 int dt_bus_match_any(const struct dt_device *dev __unused, int fdtnode)
@@ -278,7 +291,6 @@ int dt_get_default_console_node(void)
 
 int dt_init(const void *fdt_ptr)
 {
-	struct dt_bus *defbus = (struct dt_bus *)&dt_default_bus;
 	int root, ret;
 
 	ret = fdt_check_header(fdt_ptr);
@@ -295,8 +307,5 @@ int dt_init(const void *fdt_ptr)
 	if (ret < 0)
 		return ret;
 
-	defbus->nr_address_cells = root_nr_address_cells;
-	defbus->nr_size_cells = root_nr_size_cells;
-
 	return 0;
 }
diff --git a/lib/devicetree.h b/lib/devicetree.h
index 09f2509409615..dc2f11b6e9b36 100644
--- a/lib/devicetree.h
+++ b/lib/devicetree.h
@@ -66,9 +66,6 @@ struct dt_bus {
 	 *  - a negative FDT_ERR_* value on failure
 	 */
 	int (*translate)(const struct dt_device *dev, int regidx, void *reg);
-
-	/* the bus #address-cells and #size-cells properties */
-	u32 nr_address_cells, nr_size_cells;
 };
 
 /* dt_bus_match_any matches any fdt node, i.e. it always returns true */
@@ -92,7 +89,7 @@ static inline dt_pbus_addr_t dt_pbus_read_cells(u32 nr_cells, u32 *cells)
 
 /*
  * dt_pbus_translate translates device node regs for the
- * processor bus using the root node's #address-cells and
+ * processor bus using the node's #address-cells and
  * #size-cells and dt_pbus_read_cells()
  * returns
  *  - zero on success
@@ -103,7 +100,8 @@ extern int dt_pbus_translate(const struct dt_device *dev, int regidx,
 
 /*
  * dt_pbus_translate_node is the same as dt_pbus_translate but
- * operates on an fdt node instead of a dt_device
+ * operates on an fdt node, instead of a dt_device, and uses the
+ * root node's #address-cells and #size-cells.
  */
 extern int dt_pbus_translate_node(int fdtnode, int regidx,
 				  struct dt_pbus_reg *reg);
@@ -125,8 +123,6 @@ static inline int dt_pbus_get_base(const struct dt_device *dev,
  * dt_bus_init_defaults initializes @bus with
  *  match		<- dt_bus_match_any
  *  translate		<- dt_pbus_translate
- *  nr_address_cells	<- #address-cells of the root node
- *  nr_size_cells	<- #size-cells of the root node
  */
 extern void dt_bus_init_defaults(struct dt_bus *bus);
 
-- 
2.4.11

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux