xref: /openbmc/linux/arch/ia64/kernel/mca_drv.h (revision b2441318)
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