Blame view

arch/ia64/kernel/mca_drv.h 4.57 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
  /*
   * File:	mca_drv.h
   * Purpose:	Define helpers for Generic MCA handling
   *
   * Copyright (C) 2004 FUJITSU LIMITED
fe77efb8b   Hidetoshi Seto   [IA64] mca style ...
6
   * Copyright (C) 2004 Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7
8
   */
  /*
20305e597   Hidetoshi Seto   [IA64] mca_drv cl...
9
   * Processor error section:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
   *
   *  +-sal_log_processor_info_t *info-------------+
   *  | sal_log_section_hdr_t header;              |
   *  | ...                                        |
   *  | sal_log_mod_error_info_t info[0];          |
   *  +-+----------------+-------------------------+
   *    | CACHE_CHECK    |  ^ num_cache_check v
   *    +----------------+
   *    | TLB_CHECK      |  ^ num_tlb_check v
   *    +----------------+
   *    | BUS_CHECK      |  ^ num_bus_check v
   *    +----------------+
   *    | REG_FILE_CHECK |  ^ num_reg_file_check v
   *    +----------------+
   *    | MS_CHECK       |  ^ num_ms_check v
   *  +-struct cpuid_info *id----------------------+
   *  | regs[5];                                   |
   *  | reserved;                                  |
   *  +-sal_processor_static_info_t *regs----------+
   *  | valid;                                     |
   *  | ...                                        |
   *  | fr[128];                                   |
   *  +--------------------------------------------+
   */
  
  /* peidx: index of processor error section */
  typedef struct peidx_table {
  	sal_log_processor_info_t        *info;
  	struct sal_cpuid_info           *id;
  	sal_processor_static_info_t     *regs;
  } peidx_table_t;
  
  #define peidx_head(p)   (((p)->info))
  #define peidx_mid(p)    (((p)->id))
  #define peidx_bottom(p) (((p)->regs))
  
  #define peidx_psp(p)           (&(peidx_head(p)->proc_state_parameter))
  #define peidx_field_valid(p)   (&(peidx_head(p)->valid))
  #define peidx_minstate_area(p) (&(peidx_bottom(p)->min_state_area))
  
  #define peidx_cache_check_num(p)    (peidx_head(p)->valid.num_cache_check)
  #define peidx_tlb_check_num(p)      (peidx_head(p)->valid.num_tlb_check)
  #define peidx_bus_check_num(p)      (peidx_head(p)->valid.num_bus_check)
  #define peidx_reg_file_check_num(p) (peidx_head(p)->valid.num_reg_file_check)
  #define peidx_ms_check_num(p)       (peidx_head(p)->valid.num_ms_check)
  
  #define peidx_cache_check_idx(p, n)    (n)
  #define peidx_tlb_check_idx(p, n)      (peidx_cache_check_idx(p, peidx_cache_check_num(p)) + n)
  #define peidx_bus_check_idx(p, n)      (peidx_tlb_check_idx(p, peidx_tlb_check_num(p)) + n)
  #define peidx_reg_file_check_idx(p, n) (peidx_bus_check_idx(p, peidx_bus_check_num(p)) + n)
  #define peidx_ms_check_idx(p, n)       (peidx_reg_file_check_idx(p, peidx_reg_file_check_num(p)) + n)
  
  #define peidx_mod_error_info(p, name, n) \
  ({	int __idx = peidx_##name##_idx(p, n); \
  	sal_log_mod_error_info_t *__ret = NULL; \
  	if (peidx_##name##_num(p) > n) /*BUG*/ \
  		__ret = &(peidx_head(p)->info[__idx]); \
  	__ret; })
  
  #define peidx_cache_check(p, n)    peidx_mod_error_info(p, cache_check, n)
  #define peidx_tlb_check(p, n)      peidx_mod_error_info(p, tlb_check, n)
  #define peidx_bus_check(p, n)      peidx_mod_error_info(p, bus_check, n)
  #define peidx_reg_file_check(p, n) peidx_mod_error_info(p, reg_file_check, n)
  #define peidx_ms_check(p, n)       peidx_mod_error_info(p, ms_check, n)
  
  #define peidx_check_info(proc, name, n) \
  ({ \
  	sal_log_mod_error_info_t *__info = peidx_mod_error_info(proc, name, n);\
  	u64 __temp = __info && __info->valid.check_info \
  		? __info->check_info : 0; \
  	__temp; })
  
  /* slidx: index of SAL log error record */
  
  typedef struct slidx_list {
  	struct list_head list;
  	sal_log_section_hdr_t *hdr;
  } slidx_list_t;
  
  typedef struct slidx_table {
  	sal_log_record_header_t *header;
  	int n_sections;			/* # of section headers */
  	struct list_head proc_err;
  	struct list_head mem_dev_err;
  	struct list_head sel_dev_err;
  	struct list_head pci_bus_err;
  	struct list_head smbios_dev_err;
  	struct list_head pci_comp_err;
  	struct list_head plat_specific_err;
  	struct list_head host_ctlr_err;
  	struct list_head plat_bus_err;
  	struct list_head unsupported;	/* list of unsupported sections */
  } slidx_table_t;
  
  #define slidx_foreach_entry(pos, head) \
  	list_for_each_entry(pos, head, list)
  #define slidx_first_entry(head) \
  	(((head)->next != (head)) ? list_entry((head)->next, typeof(slidx_list_t), list) : NULL)
  #define slidx_count(slidx, sec) \
  ({	int __count = 0; \
  	slidx_list_t *__pos; \
  	slidx_foreach_entry(__pos, &((slidx)->sec)) { __count++; }\
  	__count; })
d2a28ad9f   Russ Anderson   [IA64] MCA recove...
113
114
115
116
117
118
119
  struct mca_table_entry {
  	int start_addr;	/* location-relative starting address of MCA recoverable range */
  	int end_addr;	/* location-relative ending address of MCA recoverable range */
  };
  
  extern const struct mca_table_entry *search_mca_tables (unsigned long addr);
  extern int mca_recover_range(unsigned long);
43ed3baf6   Hidetoshi Seto   [IA64] printing s...
120
  extern void ia64_mlogbuf_dump(void);