aboutsummaryrefslogtreecommitdiff
path: root/hw/phb4.c
diff options
context:
space:
mode:
authorOliver O'Halloran <oohall@gmail.com>2019-02-01 14:57:44 +1100
committerStewart Smith <stewart@linux.ibm.com>2019-02-18 22:12:37 -0600
commite19f14e3134b4877c0aad34c1b2b6ce9d1c2056f (patch)
tree01cdd8787069452d873300c215fcc41a39ca40f0 /hw/phb4.c
parent2f5d15f167b074f3e68df089a7ef53db9d0d77e5 (diff)
downloadskiboot-e19f14e3134b4877c0aad34c1b2b6ce9d1c2056f.zip
skiboot-e19f14e3134b4877c0aad34c1b2b6ce9d1c2056f.tar.gz
skiboot-e19f14e3134b4877c0aad34c1b2b6ce9d1c2056f.tar.bz2
phb4: Eliminate p->rte_cache
In ancient times we added a caches to struct phb3 for some of the IODA tables which can only be accessed in-directly via XSCOM. A cache for the Requester Translation Table (RTT) was also added even though this is an in-memory table. This was carried over to PHB4 when Ben did the initial copy and paste, but it's still largely pointless. There's no real need to have a second copy of the table. This patch removes the "cache" and changes all the users to reference the RTT directly if we need to. This reduces the size of the struct phb4 by 128KB. Reviewed-by: Andrew Donnellan <andrew.donnellan@au1.ibm.com> Signed-off-by: Oliver O'Halloran <oohall@gmail.com> Signed-off-by: Stewart Smith <stewart@linux.ibm.com>
Diffstat (limited to 'hw/phb4.c')
-rw-r--r--hw/phb4.c37
1 files changed, 15 insertions, 22 deletions
diff --git a/hw/phb4.c b/hw/phb4.c
index 52479ae..b5bc53f 100644
--- a/hw/phb4.c
+++ b/hw/phb4.c
@@ -276,7 +276,7 @@ static int64_t phb4_pcicfg_check(struct phb4 *p, uint32_t bdfn,
return OPAL_HARDWARE;
/* Fetch the PE# from cache */
- *pe = p->rte_cache[bdfn];
+ *pe = p->tbl_rtt[bdfn];
return OPAL_SUCCESS;
}
@@ -923,8 +923,8 @@ static void phb4_init_ioda_cache(struct phb4 *p)
* ever let a live FF RTT even temporarily when resetting
* for EEH etc... (HW278969).
*/
- for (i = 0; i < ARRAY_SIZE(p->rte_cache); i++)
- p->rte_cache[i] = PHB4_RESERVED_PE_NUM(p);
+ for (i = 0; i < RTT_TABLE_ENTRIES; i++)
+ p->tbl_rtt[i] = PHB4_RESERVED_PE_NUM(p);
memset(p->peltv_cache, 0x0, sizeof(p->peltv_cache));
memset(p->tve_cache, 0x0, sizeof(p->tve_cache));
@@ -1136,8 +1136,7 @@ static int64_t phb4_ioda_reset(struct phb *phb, bool purge)
/* Additional OPAL specific inits */
- /* Clear RTT and PELTV and PEST */
- memcpy((void *)p->tbl_rtt, p->rte_cache, RTT_TABLE_SIZE);
+ /* Clear the PELTV */
memcpy((void *)p->tbl_peltv, p->peltv_cache, p->tbl_peltv_size);
/* Clear PEST & PEEV */
@@ -2108,7 +2107,6 @@ static int64_t phb4_set_pe(struct phb *phb,
{
struct phb4 *p = phb_to_phb4(phb);
uint64_t mask, idx;
- uint16_t *rte;
/* Sanity check */
if (action != OPAL_MAP_PE && action != OPAL_UNMAP_PE)
@@ -2136,13 +2134,9 @@ static int64_t phb4_set_pe(struct phb *phb,
pe_number = PHB4_RESERVED_PE_NUM(p);
/* Map or unmap the RTT range */
- rte = (uint16_t *)p->tbl_rtt;
- for (idx = 0; idx < RTT_TABLE_ENTRIES; idx++) {
- if ((idx & mask) == (bdfn & mask)) {
- p->rte_cache[idx] = pe_number;
- rte[idx] = pe_number;
- }
- }
+ for (idx = 0; idx < RTT_TABLE_ENTRIES; idx++)
+ if ((idx & mask) == (bdfn & mask))
+ p->tbl_rtt[idx] = pe_number;
/* Invalidate the RID Translation Cache (RTC) inside the PHB */
out_be64(p->regs + PHB_RTC_INVALIDATE, PHB_RTC_INVALIDATE_ALL);
@@ -3744,13 +3738,13 @@ static int64_t phb4_err_inject_cfg(struct phb4 *phb, uint64_t pe_number,
ctrl = PHB_PAPR_ERR_INJ_CTL_CFG;
for (bdfn = 0; bdfn < RTT_TABLE_ENTRIES; bdfn++) {
- if (phb->rte_cache[bdfn] != pe_number)
+ if (phb->tbl_rtt[bdfn] != pe_number)
continue;
/* The PE can be associated with PCI bus or device */
is_bus_pe = false;
if ((bdfn + 8) < RTT_TABLE_ENTRIES &&
- phb->rte_cache[bdfn + 8] == pe_number)
+ phb->tbl_rtt[bdfn + 8] == pe_number)
is_bus_pe = true;
/* Figure out the PCI config address */
@@ -4779,7 +4773,7 @@ static void phb4_init_ioda3(struct phb4 *p)
SETFIELD(PHB_LSI_SRC_ID, 0ull, (p->num_irqs - 1) >> 3));
/* Init_20 - RTT BAR */
- out_be64(p->regs + PHB_RTT_BAR, p->tbl_rtt | PHB_RTT_BAR_ENABLE);
+ out_be64(p->regs + PHB_RTT_BAR, (u64) p->tbl_rtt | PHB_RTT_BAR_ENABLE);
/* Init_21 - PELT-V BAR */
out_be64(p->regs + PHB_PELTV_BAR, p->tbl_peltv | PHB_PELTV_BAR_ENABLE);
@@ -5269,7 +5263,6 @@ static bool phb4_read_capabilities(struct phb4 *p)
static void phb4_allocate_tables(struct phb4 *p)
{
- uint16_t *rte;
uint32_t i;
/* XXX Our current memalign implementation sucks,
@@ -5278,11 +5271,10 @@ static void phb4_allocate_tables(struct phb4 *p)
* the memory and wastes space by always allocating twice
* as much as requested (size + alignment)
*/
- p->tbl_rtt = (uint64_t)local_alloc(p->chip_id, RTT_TABLE_SIZE, RTT_TABLE_SIZE);
+ p->tbl_rtt = local_alloc(p->chip_id, RTT_TABLE_SIZE, RTT_TABLE_SIZE);
assert(p->tbl_rtt);
- rte = (uint16_t *)(p->tbl_rtt);
- for (i = 0; i < RTT_TABLE_ENTRIES; i++, rte++)
- *rte = PHB4_RESERVED_PE_NUM(p);
+ for (i = 0; i < RTT_TABLE_ENTRIES; i++)
+ p->tbl_rtt[i] = PHB4_RESERVED_PE_NUM(p);
p->tbl_peltv = (uint64_t)local_alloc(p->chip_id, p->tbl_peltv_size, p->tbl_peltv_size);
assert(p->tbl_peltv);
@@ -5391,7 +5383,8 @@ static void phb4_add_properties(struct phb4 *p)
/* Indicators for variable tables */
dt_add_property_cells(np, "ibm,opal-rtt-table",
- hi32(p->tbl_rtt), lo32(p->tbl_rtt), RTT_TABLE_SIZE);
+ hi32((u64) p->tbl_rtt), lo32((u64) p->tbl_rtt), RTT_TABLE_SIZE);
+
dt_add_property_cells(np, "ibm,opal-peltv-table",
hi32(p->tbl_peltv), lo32(p->tbl_peltv), p->tbl_peltv_size);
dt_add_property_cells(np, "ibm,opal-pest-table",