diff mbox

[U-Boot,v2,4/9] x86: Tidy up the PIRQ routing code a little

Message ID 1439044022-14481-5-git-send-email-sjg@chromium.org
State Superseded
Delegated to: Simon Glass
Headers show

Commit Message

Simon Glass Aug. 8, 2015, 2:26 p.m. UTC
This code could use a little tightening up. There is some repetition and
an odd use of fdtdec_get_int_array().

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2:
- Fix handling of duplicate entries

 arch/x86/cpu/irq.c | 41 +++++++++++++----------------------------
 1 file changed, 13 insertions(+), 28 deletions(-)

Comments

Bin Meng Aug. 10, 2015, 6:19 a.m. UTC | #1
On Sat, Aug 8, 2015 at 10:26 PM, Simon Glass <sjg@chromium.org> wrote:
> This code could use a little tightening up. There is some repetition and
> an odd use of fdtdec_get_int_array().
>
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
>
> Changes in v2:
> - Fix handling of duplicate entries
>
>  arch/x86/cpu/irq.c | 41 +++++++++++++----------------------------
>  1 file changed, 13 insertions(+), 28 deletions(-)
>
> diff --git a/arch/x86/cpu/irq.c b/arch/x86/cpu/irq.c
> index 97dd000..6be2f81 100644
> --- a/arch/x86/cpu/irq.c
> +++ b/arch/x86/cpu/irq.c
> @@ -125,10 +125,10 @@ static int create_pirq_routing_table(void)
>                         return -EINVAL;
>         }
>
> -       ret = fdtdec_get_int_array(blob, node, "intel,pirq-link",
> -                                  &irq_router.link_base, 1);
> -       if (ret)
> +       ret = fdtdec_get_int(blob, node, "intel,pirq-link", -1);
> +       if (ret == -1)
>                 return ret;
> +       irq_router.link_base = ret;
>
>         irq_router.irq_mask = fdtdec_get_int(blob, node,
>                                              "intel,pirq-mask", PIRQ_BITMAP);
> @@ -156,18 +156,13 @@ static int create_pirq_routing_table(void)
>         }
>
>         cell = fdt_getprop(blob, node, "intel,pirq-routing", &len);
> -       if (!cell)
> -               return -EINVAL;
> -
> -       if ((len % sizeof(struct pirq_routing)) == 0)
> -               count = len / sizeof(struct pirq_routing);
> -       else
> +       if (!cell || len % sizeof(struct pirq_routing))
>                 return -EINVAL;
> +       count = len / sizeof(struct pirq_routing);
>
> -       rt = malloc(sizeof(struct irq_routing_table));
> +       rt = calloc(1, sizeof(struct irq_routing_table));
>         if (!rt)
>                 return -ENOMEM;
> -       memset((char *)rt, 0, sizeof(struct irq_routing_table));
>
>         /* Populate the PIRQ table fields */
>         rt->signature = PIRQ_SIGNATURE;
> @@ -181,7 +176,8 @@ static int create_pirq_routing_table(void)
>         slot_base = rt->slots;
>
>         /* Now fill in the irq_info entries in the PIRQ table */
> -       for (i = 0; i < count; i++) {
> +       for (i = 0; i < count;
> +            i++, cell += sizeof(struct pirq_routing) / sizeof(u32)) {
>                 struct pirq_routing pr;
>
>                 pr.bdf = fdt_addr_to_cpu(cell[0]);
> @@ -212,25 +208,14 @@ static int create_pirq_routing_table(void)
>                                 if (slot->irq[pr.pin - 1].link !=
>                                         LINK_N2V(pr.pirq, irq_router.link_base))
>                                         debug("WARNING: Inconsistent PIRQ routing information\n");
> -
> -                               cell += sizeof(struct pirq_routing) /
> -                                       sizeof(u32);
> -                               continue;
> -                       } else {
> -                               debug("writing INT%c\n", 'A' + pr.pin - 1);
> -                               fill_irq_info(slot, PCI_BUS(pr.bdf),
> -                                             PCI_DEV(pr.bdf), pr.pin, pr.pirq);
> -                               cell += sizeof(struct pirq_routing) /
> -                                       sizeof(u32);
>                                 continue;
>                         }
> +               } else {
> +                       slot = slot_base + irq_entries++;
>                 }
> -
> -               slot = slot_base + irq_entries;
> -               fill_irq_info(slot, PCI_BUS(pr.bdf), PCI_DEV(pr.bdf),
> -                             pr.pin, pr.pirq);
> -               irq_entries++;
> -               cell += sizeof(struct pirq_routing) / sizeof(u32);
> +               debug("writing INT%c\n", 'A' + pr.pin - 1);
> +               fill_irq_info(slot, PCI_BUS(pr.bdf), PCI_DEV(pr.bdf), pr.pin,
> +                             pr.pirq);
>         }
>
>         rt->size = irq_entries * sizeof(struct irq_info) + 32;
> --

Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Tested-by: Bin Meng <bmeng.cn@gmail.com>
diff mbox

Patch

diff --git a/arch/x86/cpu/irq.c b/arch/x86/cpu/irq.c
index 97dd000..6be2f81 100644
--- a/arch/x86/cpu/irq.c
+++ b/arch/x86/cpu/irq.c
@@ -125,10 +125,10 @@  static int create_pirq_routing_table(void)
 			return -EINVAL;
 	}
 
-	ret = fdtdec_get_int_array(blob, node, "intel,pirq-link",
-				   &irq_router.link_base, 1);
-	if (ret)
+	ret = fdtdec_get_int(blob, node, "intel,pirq-link", -1);
+	if (ret == -1)
 		return ret;
+	irq_router.link_base = ret;
 
 	irq_router.irq_mask = fdtdec_get_int(blob, node,
 					     "intel,pirq-mask", PIRQ_BITMAP);
@@ -156,18 +156,13 @@  static int create_pirq_routing_table(void)
 	}
 
 	cell = fdt_getprop(blob, node, "intel,pirq-routing", &len);
-	if (!cell)
-		return -EINVAL;
-
-	if ((len % sizeof(struct pirq_routing)) == 0)
-		count = len / sizeof(struct pirq_routing);
-	else
+	if (!cell || len % sizeof(struct pirq_routing))
 		return -EINVAL;
+	count = len / sizeof(struct pirq_routing);
 
-	rt = malloc(sizeof(struct irq_routing_table));
+	rt = calloc(1, sizeof(struct irq_routing_table));
 	if (!rt)
 		return -ENOMEM;
-	memset((char *)rt, 0, sizeof(struct irq_routing_table));
 
 	/* Populate the PIRQ table fields */
 	rt->signature = PIRQ_SIGNATURE;
@@ -181,7 +176,8 @@  static int create_pirq_routing_table(void)
 	slot_base = rt->slots;
 
 	/* Now fill in the irq_info entries in the PIRQ table */
-	for (i = 0; i < count; i++) {
+	for (i = 0; i < count;
+	     i++, cell += sizeof(struct pirq_routing) / sizeof(u32)) {
 		struct pirq_routing pr;
 
 		pr.bdf = fdt_addr_to_cpu(cell[0]);
@@ -212,25 +208,14 @@  static int create_pirq_routing_table(void)
 				if (slot->irq[pr.pin - 1].link !=
 					LINK_N2V(pr.pirq, irq_router.link_base))
 					debug("WARNING: Inconsistent PIRQ routing information\n");
-
-				cell += sizeof(struct pirq_routing) /
-					sizeof(u32);
-				continue;
-			} else {
-				debug("writing INT%c\n", 'A' + pr.pin - 1);
-				fill_irq_info(slot, PCI_BUS(pr.bdf),
-					      PCI_DEV(pr.bdf), pr.pin, pr.pirq);
-				cell += sizeof(struct pirq_routing) /
-					sizeof(u32);
 				continue;
 			}
+		} else {
+			slot = slot_base + irq_entries++;
 		}
-
-		slot = slot_base + irq_entries;
-		fill_irq_info(slot, PCI_BUS(pr.bdf), PCI_DEV(pr.bdf),
-			      pr.pin, pr.pirq);
-		irq_entries++;
-		cell += sizeof(struct pirq_routing) / sizeof(u32);
+		debug("writing INT%c\n", 'A' + pr.pin - 1);
+		fill_irq_info(slot, PCI_BUS(pr.bdf), PCI_DEV(pr.bdf), pr.pin,
+			      pr.pirq);
 	}
 
 	rt->size = irq_entries * sizeof(struct irq_info) + 32;