diff options
Diffstat (limited to 'drivers/edac/tile_edac.c')
-rw-r--r-- | drivers/edac/tile_edac.c | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/drivers/edac/tile_edac.c b/drivers/edac/tile_edac.c index e99d00976189..7bb4614730db 100644 --- a/drivers/edac/tile_edac.c +++ b/drivers/edac/tile_edac.c | |||
@@ -71,7 +71,10 @@ static void tile_edac_check(struct mem_ctl_info *mci) | |||
71 | if (mem_error.sbe_count != priv->ce_count) { | 71 | if (mem_error.sbe_count != priv->ce_count) { |
72 | dev_dbg(mci->dev, "ECC CE err on node %d\n", priv->node); | 72 | dev_dbg(mci->dev, "ECC CE err on node %d\n", priv->node); |
73 | priv->ce_count = mem_error.sbe_count; | 73 | priv->ce_count = mem_error.sbe_count; |
74 | edac_mc_handle_ce(mci, 0, 0, 0, 0, 0, mci->ctl_name); | 74 | edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, |
75 | 0, 0, 0, | ||
76 | 0, 0, -1, | ||
77 | mci->ctl_name, "", NULL); | ||
75 | } | 78 | } |
76 | } | 79 | } |
77 | 80 | ||
@@ -84,6 +87,7 @@ static int __devinit tile_edac_init_csrows(struct mem_ctl_info *mci) | |||
84 | struct csrow_info *csrow = &mci->csrows[0]; | 87 | struct csrow_info *csrow = &mci->csrows[0]; |
85 | struct tile_edac_priv *priv = mci->pvt_info; | 88 | struct tile_edac_priv *priv = mci->pvt_info; |
86 | struct mshim_mem_info mem_info; | 89 | struct mshim_mem_info mem_info; |
90 | struct dimm_info *dimm = csrow->channels[0].dimm; | ||
87 | 91 | ||
88 | if (hv_dev_pread(priv->hv_devhdl, 0, (HV_VirtAddr)&mem_info, | 92 | if (hv_dev_pread(priv->hv_devhdl, 0, (HV_VirtAddr)&mem_info, |
89 | sizeof(struct mshim_mem_info), MSHIM_MEM_INFO_OFF) != | 93 | sizeof(struct mshim_mem_info), MSHIM_MEM_INFO_OFF) != |
@@ -93,27 +97,25 @@ static int __devinit tile_edac_init_csrows(struct mem_ctl_info *mci) | |||
93 | } | 97 | } |
94 | 98 | ||
95 | if (mem_info.mem_ecc) | 99 | if (mem_info.mem_ecc) |
96 | csrow->edac_mode = EDAC_SECDED; | 100 | dimm->edac_mode = EDAC_SECDED; |
97 | else | 101 | else |
98 | csrow->edac_mode = EDAC_NONE; | 102 | dimm->edac_mode = EDAC_NONE; |
99 | switch (mem_info.mem_type) { | 103 | switch (mem_info.mem_type) { |
100 | case DDR2: | 104 | case DDR2: |
101 | csrow->mtype = MEM_DDR2; | 105 | dimm->mtype = MEM_DDR2; |
102 | break; | 106 | break; |
103 | 107 | ||
104 | case DDR3: | 108 | case DDR3: |
105 | csrow->mtype = MEM_DDR3; | 109 | dimm->mtype = MEM_DDR3; |
106 | break; | 110 | break; |
107 | 111 | ||
108 | default: | 112 | default: |
109 | return -1; | 113 | return -1; |
110 | } | 114 | } |
111 | 115 | ||
112 | csrow->first_page = 0; | 116 | dimm->nr_pages = mem_info.mem_size >> PAGE_SHIFT; |
113 | csrow->nr_pages = mem_info.mem_size >> PAGE_SHIFT; | 117 | dimm->grain = TILE_EDAC_ERROR_GRAIN; |
114 | csrow->last_page = csrow->first_page + csrow->nr_pages - 1; | 118 | dimm->dtype = DEV_UNKNOWN; |
115 | csrow->grain = TILE_EDAC_ERROR_GRAIN; | ||
116 | csrow->dtype = DEV_UNKNOWN; | ||
117 | 119 | ||
118 | return 0; | 120 | return 0; |
119 | } | 121 | } |
@@ -123,6 +125,7 @@ static int __devinit tile_edac_mc_probe(struct platform_device *pdev) | |||
123 | char hv_file[32]; | 125 | char hv_file[32]; |
124 | int hv_devhdl; | 126 | int hv_devhdl; |
125 | struct mem_ctl_info *mci; | 127 | struct mem_ctl_info *mci; |
128 | struct edac_mc_layer layers[2]; | ||
126 | struct tile_edac_priv *priv; | 129 | struct tile_edac_priv *priv; |
127 | int rc; | 130 | int rc; |
128 | 131 | ||
@@ -132,8 +135,14 @@ static int __devinit tile_edac_mc_probe(struct platform_device *pdev) | |||
132 | return -EINVAL; | 135 | return -EINVAL; |
133 | 136 | ||
134 | /* A TILE MC has a single channel and one chip-select row. */ | 137 | /* A TILE MC has a single channel and one chip-select row. */ |
135 | mci = edac_mc_alloc(sizeof(struct tile_edac_priv), | 138 | layers[0].type = EDAC_MC_LAYER_CHIP_SELECT; |
136 | TILE_EDAC_NR_CSROWS, TILE_EDAC_NR_CHANS, pdev->id); | 139 | layers[0].size = TILE_EDAC_NR_CSROWS; |
140 | layers[0].is_virt_csrow = true; | ||
141 | layers[1].type = EDAC_MC_LAYER_CHANNEL; | ||
142 | layers[1].size = TILE_EDAC_NR_CHANS; | ||
143 | layers[1].is_virt_csrow = false; | ||
144 | mci = edac_mc_alloc(pdev->id, ARRAY_SIZE(layers), layers, | ||
145 | sizeof(struct tile_edac_priv)); | ||
137 | if (mci == NULL) | 146 | if (mci == NULL) |
138 | return -ENOMEM; | 147 | return -ENOMEM; |
139 | priv = mci->pvt_info; | 148 | priv = mci->pvt_info; |