Lines Matching refs:rec
170 #define for_each_fru(i, rec) \ argument
171 for (i = 0; rec = fru_records[i], i < max_nr_fru; i++)
173 static inline u32 get_fmp_len(struct fru_rec *rec) in get_fmp_len() argument
175 return rec->sec_desc.section_length - sizeof(struct cper_section_descriptor); in get_fmp_len()
180 struct fru_rec *rec; in get_fru_record() local
183 for_each_fru(i, rec) { in get_fru_record()
184 if (rec->fmp.fru_id == fru_id) in get_fru_record()
185 return rec; in get_fru_record()
215 static int update_record_on_storage(struct fru_rec *rec) in update_record_on_storage() argument
221 len = get_fmp_len(rec); in update_record_on_storage()
224 checksum = do_fmp_checksum(&rec->fmp, len); in update_record_on_storage()
227 rec->fmp.checksum = -checksum; in update_record_on_storage()
231 ret = erst_write(&rec->hdr); in update_record_on_storage()
233 pr_warn("Storage update failed for FRU 0x%016llx\n", rec->fmp.fru_id); in update_record_on_storage()
242 static bool rec_has_valid_entries(struct fru_rec *rec) in rec_has_valid_entries() argument
244 if (!(rec->fmp.validation_bits & FMP_VALID_LIST_ENTRIES)) in rec_has_valid_entries()
247 if (!(rec->fmp.validation_bits & FMP_VALID_LIST)) in rec_has_valid_entries()
283 static bool rec_has_fpd(struct fru_rec *rec, struct cper_fru_poison_desc *fpd) in rec_has_fpd() argument
287 for (i = 0; i < rec->fmp.nr_entries; i++) { in rec_has_fpd()
288 struct cper_fru_poison_desc *fpd_i = &rec->entries[i]; in rec_has_fpd()
299 static void save_spa(struct fru_rec *rec, unsigned int entry, in save_spa() argument
315 if (fru_records[fru_idx] == rec) in save_spa()
347 static void update_fru_record(struct fru_rec *rec, struct mce *m) in update_fru_record() argument
349 struct cper_sec_fru_mem_poison *fmp = &rec->fmp; in update_fru_record()
364 if (!rec_has_valid_entries(rec)) in update_fru_record()
368 if (rec_has_fpd(rec, &fpd)) in update_fru_record()
371 if (rec->fmp.nr_entries >= max_nr_entries) { in update_fru_record()
372 pr_warn("Exceeded number of entries for FRU 0x%016llx\n", rec->fmp.fru_id); in update_fru_record()
379 save_spa(rec, entry, m->addr, m->ipid, m->extcpu); in update_fru_record()
380 fpd_dest = &rec->entries[entry]; in update_fru_record()
389 update_record_on_storage(rec); in update_fru_record()
411 struct fru_rec *rec; in fru_handle_mem_poison() local
422 rec = get_fru_record(m->ppin); in fru_handle_mem_poison()
423 if (!rec) in fru_handle_mem_poison()
426 update_fru_record(rec, m); in fru_handle_mem_poison()
436 static void retire_mem_fmp(struct fru_rec *rec) in retire_mem_fmp() argument
438 struct cper_sec_fru_mem_poison *fmp = &rec->fmp; in retire_mem_fmp()
442 struct cper_fru_poison_desc *fpd = &rec->entries[i]; in retire_mem_fmp()
464 save_spa(rec, i, fpd->addr, fpd->hw_id, err_cpu); in retire_mem_fmp()
470 struct fru_rec *rec; in retire_mem_records() local
473 for_each_fru(i, rec) { in retire_mem_records()
474 if (!rec_has_valid_entries(rec)) in retire_mem_records()
477 retire_mem_fmp(rec); in retire_mem_records()
482 static void set_rec_fields(struct fru_rec *rec) in set_rec_fields() argument
484 struct cper_section_descriptor *sec_desc = &rec->sec_desc; in set_rec_fields()
485 struct cper_record_header *hdr = &rec->hdr; in set_rec_fields()
531 struct fru_rec *rec; in save_new_records() local
535 for_each_fru(i, rec) { in save_new_records()
537 if (rec->hdr.record_length == max_rec_len) in save_new_records()
540 if (!rec->hdr.record_length) in save_new_records()
543 set_rec_fields(rec); in save_new_records()
545 ret = update_record_on_storage(rec); in save_new_records()
553 for_each_fru(i, rec) { in save_new_records()
557 erst_clear(rec->hdr.record_id); in save_new_records()
564 static bool fmp_is_usable(struct fru_rec *rec) in fmp_is_usable() argument
566 struct cper_sec_fru_mem_poison *fmp = &rec->fmp; in fmp_is_usable()
611 static bool fmp_is_valid(struct fru_rec *rec) in fmp_is_valid() argument
613 struct cper_sec_fru_mem_poison *fmp = &rec->fmp; in fmp_is_valid()
616 len = get_fmp_len(rec); in fmp_is_valid()
630 if (!fmp_is_usable(rec)) in fmp_is_valid()
721 static void set_fmp_fields(struct fru_rec *rec, unsigned int cpu) in set_fmp_fields() argument
723 struct cper_sec_fru_mem_poison *fmp = &rec->fmp; in set_fmp_fields()
741 struct fru_rec *rec; in init_fmps() local
745 for_each_fru(i, rec) { in init_fmps()
763 set_fmp_fields(rec, fru_cpu); in init_fmps()
808 struct fru_rec *rec; in free_records() local
811 for_each_fru(i, rec) in free_records()
812 kfree(rec); in free_records()
884 struct fru_rec *rec; in fmpm_show() local
902 rec = fru_records[fru_idx]; in fmpm_show()
903 if (!rec) in fmpm_show()
907 seq_printf(f, "0x%016llx%-*s", rec->fmp.fru_id, U64_PAD, ""); in fmpm_show()
912 if (entry >= rec->fmp.nr_entries) { in fmpm_show()
920 fpd = &rec->entries[entry]; in fmpm_show()