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_probe(struct pdbg_target *target) { struct fsi *fsi = target_to_fsi(target); uint32_t value; int rc; if ((rc = opb_read(&fsi->target, 0xc09, &value))) return rc; fsi->chip_type = get_chip_type(value); PR_DEBUG("Found chip type %x\n", fsi->chip_type); if (fsi->chip_type == CHIP_UNKNOWN) return -1; return 0; }
static int p8_hmfsi_read(struct fsi *fsi, uint32_t addr, uint32_t *data) { return opb_read(&fsi->target, addr, data); }