1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 21da177e4SLinus Torvalds /* 31da177e4SLinus Torvalds * File: mca_drv.h 41da177e4SLinus Torvalds * Purpose: Define helpers for Generic MCA handling 51da177e4SLinus Torvalds * 61da177e4SLinus Torvalds * Copyright (C) 2004 FUJITSU LIMITED 7fe77efb8SHidetoshi Seto * Copyright (C) 2004 Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com> 81da177e4SLinus Torvalds */ 91da177e4SLinus Torvalds /* 101da177e4SLinus Torvalds * Processor error section: 111da177e4SLinus Torvalds * 121da177e4SLinus Torvalds * +-sal_log_processor_info_t *info-------------+ 131da177e4SLinus Torvalds * | sal_log_section_hdr_t header; | 141da177e4SLinus Torvalds * | ... | 151da177e4SLinus Torvalds * | sal_log_mod_error_info_t info[0]; | 161da177e4SLinus Torvalds * +-+----------------+-------------------------+ 171da177e4SLinus Torvalds * | CACHE_CHECK | ^ num_cache_check v 181da177e4SLinus Torvalds * +----------------+ 191da177e4SLinus Torvalds * | TLB_CHECK | ^ num_tlb_check v 201da177e4SLinus Torvalds * +----------------+ 211da177e4SLinus Torvalds * | BUS_CHECK | ^ num_bus_check v 221da177e4SLinus Torvalds * +----------------+ 231da177e4SLinus Torvalds * | REG_FILE_CHECK | ^ num_reg_file_check v 241da177e4SLinus Torvalds * +----------------+ 251da177e4SLinus Torvalds * | MS_CHECK | ^ num_ms_check v 261da177e4SLinus Torvalds * +-struct cpuid_info *id----------------------+ 271da177e4SLinus Torvalds * | regs[5]; | 281da177e4SLinus Torvalds * | reserved; | 291da177e4SLinus Torvalds * +-sal_processor_static_info_t *regs----------+ 301da177e4SLinus Torvalds * | valid; | 311da177e4SLinus Torvalds * | ... | 321da177e4SLinus Torvalds * | fr[128]; | 331da177e4SLinus Torvalds * +--------------------------------------------+ 341da177e4SLinus Torvalds */ 351da177e4SLinus Torvalds 361da177e4SLinus Torvalds /* peidx: index of processor error section */ 371da177e4SLinus Torvalds typedef struct peidx_table { 381da177e4SLinus Torvalds sal_log_processor_info_t *info; 391da177e4SLinus Torvalds struct sal_cpuid_info *id; 401da177e4SLinus Torvalds sal_processor_static_info_t *regs; 411da177e4SLinus Torvalds } peidx_table_t; 421da177e4SLinus Torvalds 431da177e4SLinus Torvalds #define peidx_head(p) (((p)->info)) 441da177e4SLinus Torvalds #define peidx_mid(p) (((p)->id)) 451da177e4SLinus Torvalds #define peidx_bottom(p) (((p)->regs)) 461da177e4SLinus Torvalds 471da177e4SLinus Torvalds #define peidx_psp(p) (&(peidx_head(p)->proc_state_parameter)) 481da177e4SLinus Torvalds #define peidx_field_valid(p) (&(peidx_head(p)->valid)) 491da177e4SLinus Torvalds #define peidx_minstate_area(p) (&(peidx_bottom(p)->min_state_area)) 501da177e4SLinus Torvalds 511da177e4SLinus Torvalds #define peidx_cache_check_num(p) (peidx_head(p)->valid.num_cache_check) 521da177e4SLinus Torvalds #define peidx_tlb_check_num(p) (peidx_head(p)->valid.num_tlb_check) 531da177e4SLinus Torvalds #define peidx_bus_check_num(p) (peidx_head(p)->valid.num_bus_check) 541da177e4SLinus Torvalds #define peidx_reg_file_check_num(p) (peidx_head(p)->valid.num_reg_file_check) 551da177e4SLinus Torvalds #define peidx_ms_check_num(p) (peidx_head(p)->valid.num_ms_check) 561da177e4SLinus Torvalds 571da177e4SLinus Torvalds #define peidx_cache_check_idx(p, n) (n) 581da177e4SLinus Torvalds #define peidx_tlb_check_idx(p, n) (peidx_cache_check_idx(p, peidx_cache_check_num(p)) + n) 591da177e4SLinus Torvalds #define peidx_bus_check_idx(p, n) (peidx_tlb_check_idx(p, peidx_tlb_check_num(p)) + n) 601da177e4SLinus Torvalds #define peidx_reg_file_check_idx(p, n) (peidx_bus_check_idx(p, peidx_bus_check_num(p)) + n) 611da177e4SLinus Torvalds #define peidx_ms_check_idx(p, n) (peidx_reg_file_check_idx(p, peidx_reg_file_check_num(p)) + n) 621da177e4SLinus Torvalds 631da177e4SLinus Torvalds #define peidx_mod_error_info(p, name, n) \ 641da177e4SLinus Torvalds ({ int __idx = peidx_##name##_idx(p, n); \ 651da177e4SLinus Torvalds sal_log_mod_error_info_t *__ret = NULL; \ 661da177e4SLinus Torvalds if (peidx_##name##_num(p) > n) /*BUG*/ \ 671da177e4SLinus Torvalds __ret = &(peidx_head(p)->info[__idx]); \ 681da177e4SLinus Torvalds __ret; }) 691da177e4SLinus Torvalds 701da177e4SLinus Torvalds #define peidx_cache_check(p, n) peidx_mod_error_info(p, cache_check, n) 711da177e4SLinus Torvalds #define peidx_tlb_check(p, n) peidx_mod_error_info(p, tlb_check, n) 721da177e4SLinus Torvalds #define peidx_bus_check(p, n) peidx_mod_error_info(p, bus_check, n) 731da177e4SLinus Torvalds #define peidx_reg_file_check(p, n) peidx_mod_error_info(p, reg_file_check, n) 741da177e4SLinus Torvalds #define peidx_ms_check(p, n) peidx_mod_error_info(p, ms_check, n) 751da177e4SLinus Torvalds 761da177e4SLinus Torvalds #define peidx_check_info(proc, name, n) \ 771da177e4SLinus Torvalds ({ \ 781da177e4SLinus Torvalds sal_log_mod_error_info_t *__info = peidx_mod_error_info(proc, name, n);\ 791da177e4SLinus Torvalds u64 __temp = __info && __info->valid.check_info \ 801da177e4SLinus Torvalds ? __info->check_info : 0; \ 811da177e4SLinus Torvalds __temp; }) 821da177e4SLinus Torvalds 831da177e4SLinus Torvalds /* slidx: index of SAL log error record */ 841da177e4SLinus Torvalds 851da177e4SLinus Torvalds typedef struct slidx_list { 861da177e4SLinus Torvalds struct list_head list; 871da177e4SLinus Torvalds sal_log_section_hdr_t *hdr; 881da177e4SLinus Torvalds } slidx_list_t; 891da177e4SLinus Torvalds 901da177e4SLinus Torvalds typedef struct slidx_table { 911da177e4SLinus Torvalds sal_log_record_header_t *header; 921da177e4SLinus Torvalds int n_sections; /* # of section headers */ 931da177e4SLinus Torvalds struct list_head proc_err; 941da177e4SLinus Torvalds struct list_head mem_dev_err; 951da177e4SLinus Torvalds struct list_head sel_dev_err; 961da177e4SLinus Torvalds struct list_head pci_bus_err; 971da177e4SLinus Torvalds struct list_head smbios_dev_err; 981da177e4SLinus Torvalds struct list_head pci_comp_err; 991da177e4SLinus Torvalds struct list_head plat_specific_err; 1001da177e4SLinus Torvalds struct list_head host_ctlr_err; 1011da177e4SLinus Torvalds struct list_head plat_bus_err; 1021da177e4SLinus Torvalds struct list_head unsupported; /* list of unsupported sections */ 1031da177e4SLinus Torvalds } slidx_table_t; 1041da177e4SLinus Torvalds 1051da177e4SLinus Torvalds #define slidx_foreach_entry(pos, head) \ 1061da177e4SLinus Torvalds list_for_each_entry(pos, head, list) 1071da177e4SLinus Torvalds #define slidx_first_entry(head) \ 1081da177e4SLinus Torvalds (((head)->next != (head)) ? list_entry((head)->next, typeof(slidx_list_t), list) : NULL) 1091da177e4SLinus Torvalds #define slidx_count(slidx, sec) \ 1101da177e4SLinus Torvalds ({ int __count = 0; \ 1111da177e4SLinus Torvalds slidx_list_t *__pos; \ 1121da177e4SLinus Torvalds slidx_foreach_entry(__pos, &((slidx)->sec)) { __count++; }\ 1131da177e4SLinus Torvalds __count; }) 1141da177e4SLinus Torvalds 115d2a28ad9SRuss Anderson struct mca_table_entry { 116d2a28ad9SRuss Anderson int start_addr; /* location-relative starting address of MCA recoverable range */ 117d2a28ad9SRuss Anderson int end_addr; /* location-relative ending address of MCA recoverable range */ 118d2a28ad9SRuss Anderson }; 119d2a28ad9SRuss Anderson 120d2a28ad9SRuss Anderson extern const struct mca_table_entry *search_mca_tables (unsigned long addr); 121d2a28ad9SRuss Anderson extern int mca_recover_range(unsigned long); 12243ed3bafSHidetoshi Seto extern void ia64_mlogbuf_dump(void); 12343ed3bafSHidetoshi Seto 124