From 5991fd6ee87caf775ebcbf60003892daa76b5fb7 Mon Sep 17 00:00:00 2001 From: Michael Neuling Date: Wed, 12 Jul 2017 12:06:46 +1000 Subject: [PATCH] phb4: Set default lane equalisation Set default lane equalisation if there is nothing in the device-tree. Default value taken from hdat and confirmed by hardware team. Neatens the code up a bit too. Signed-off-by: Michael Neuling Signed-off-by: Stewart Smith --- hw/phb4.c | 45 +++++++++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/hw/phb4.c b/hw/phb4.c index 40c67b7cdb8f..1d10bb88ada5 100644 --- a/hw/phb4.c +++ b/hw/phb4.c @@ -4184,15 +4184,27 @@ static const struct irq_source_ops phb4_lsi_ops = { .attributes = phb4_lsi_attributes, }; +#ifdef HAVE_BIG_ENDIAN +static u64 lane_eq_default[8] = { + 0x7777777777777777, 0x7777777777777777, + 0x7777777777777777, 0x7777777777777777, + 0x7777777777777777, 0x7777777777777777, + 0x7777777777777777, 0x7777777777777777 +}; +#else +#error lane_eq_default needs to be big endian (device tree property) +#endif + static void phb4_create(struct dt_node *np) { const struct dt_property *prop; struct phb4 *p = zalloc(sizeof(struct phb4)); struct pci_slot *slot; - size_t lane_eq_len; + size_t lane_eq_len, lane_eq_len_req; struct dt_node *iplp; char *path; uint32_t irq_base, irq_flags; + int i; assert(p); @@ -4295,29 +4307,26 @@ static void phb4_create(struct dt_node *np) /* Check for lane equalization values from HB or HDAT */ p->lane_eq = dt_prop_get_def_size(np, "ibm,lane-eq", NULL, &lane_eq_len); + if (p->rev == PHB4_REV_NIMBUS_DD10) + lane_eq_len_req = 8 * 8; + else + lane_eq_len_req = 6 * 8; if (p->lane_eq) { - uint32_t want_len; - - if (p->rev == PHB4_REV_NIMBUS_DD10) - want_len = 8 * 8; - else - want_len = 6 * 8; - if (lane_eq_len != want_len) { - PHBERR(p, "Device-tree has ibm,lane-eq with wrong len %ld" - " (want %d)\n", lane_eq_len, want_len); + if (lane_eq_len < lane_eq_len_req) { + PHBERR(p, "Device-tree has ibm,lane-eq too short: %ld" + " (want %ld)\n", lane_eq_len, lane_eq_len_req); p->lane_eq = NULL; } + } else { + PHBDBG(p, "Using default lane equalization settings\n"); + p->lane_eq = lane_eq_default; } if (p->lane_eq) { PHBDBG(p, "Override lane equalization settings:\n"); - PHBDBG(p, " 0x%016llx 0x%016llx\n", - be64_to_cpu(p->lane_eq[0]), be64_to_cpu(p->lane_eq[1])); - PHBDBG(p, " 0x%016llx 0x%016llx\n", - be64_to_cpu(p->lane_eq[2]), be64_to_cpu(p->lane_eq[3])); - PHBDBG(p, " 0x%016llx 0x%016llx\n", - be64_to_cpu(p->lane_eq[4]), be64_to_cpu(p->lane_eq[5])); - PHBDBG(p, " 0x%016llx 0x%016llx\n", - be64_to_cpu(p->lane_eq[6]), be64_to_cpu(p->lane_eq[7])); + for (i = 0 ; i < lane_eq_len_req/(8 * 2) ; i++) + PHBDBG(p, " 0x%016llx 0x%016llx\n", + be64_to_cpu(p->lane_eq[2 * i]), + be64_to_cpu(p->lane_eq[2 * i + 1])); } /* Allocate a block of interrupts. We need to know if it needs