static void pnv_lpc_do_eccb(PnvLpcController *lpc, uint64_t cmd) { /* XXX Check for magic bits at the top, addr size etc... */ unsigned int sz = (cmd & ECCB_CTL_SZ_MASK) >> ECCB_CTL_SZ_LSH; uint32_t opb_addr = cmd & ECCB_CTL_ADDR_MASK; uint8_t data[4]; bool success; if (cmd & ECCB_CTL_READ) { success = opb_read(lpc, opb_addr, data, sz); if (success) { lpc->eccb_stat_reg = ECCB_STAT_OP_DONE | (((uint64_t)data[0]) << 24 | ((uint64_t)data[1]) << 16 | ((uint64_t)data[2]) << 8 | ((uint64_t)data[3])) << ECCB_STAT_RD_DATA_LSH; } else { lpc->eccb_stat_reg = ECCB_STAT_OP_DONE | (0xffffffffull << ECCB_STAT_RD_DATA_LSH); } } else { data[0] = lpc->eccb_data_reg >> 24; data[1] = lpc->eccb_data_reg >> 16; data[2] = lpc->eccb_data_reg >> 8; data[3] = lpc->eccb_data_reg; success = opb_write(lpc, opb_addr, data, sz); lpc->eccb_stat_reg = ECCB_STAT_OP_DONE; } /* XXX Which error bit (if any) to signal OPB error ? */ }
static int p8_hmfsi_write(struct fsi *fsi, uint32_t addr, uint32_t data) { return opb_write(&fsi->target, addr, data); }