File drivers/gpu/alga/amd/si/gpu.c changed (mode: 100644) (index 1347b62..e9dccaf) |
... |
... |
static u32 sh_rbs_dis_get(struct pci_dev *dev) |
177 |
177 |
rbs_dis = 0; |
rbs_dis = 0; |
178 |
178 |
rbs_dis |= rr32(dev, GC_USER_RB_BACKEND_DIS); |
rbs_dis |= rr32(dev, GC_USER_RB_BACKEND_DIS); |
179 |
179 |
|
|
|
180 |
|
/* don't use get(), since we may have major bits on top */ |
180 |
181 |
backend_dis_shift = ffs(CRBD_BACKEND_DIS); |
backend_dis_shift = ffs(CRBD_BACKEND_DIS); |
181 |
182 |
rbs_dis >>= backend_dis_shift; |
rbs_dis >>= backend_dis_shift; |
182 |
183 |
|
|
183 |
184 |
/* get a bit mask for the rbs which are disabled for this sh */ |
/* get a bit mask for the rbs which are disabled for this sh */ |
184 |
|
mask = bitmask_create(dd->cfg.gpu.se_rbs_n / dd->cfg.gpu.ses_n |
|
185 |
|
/ dd->cfg.gpu.se_shs_n); |
|
|
185 |
|
mask = bitmask_create(dd->cfg.gpu.se_rbs_n / dd->cfg.gpu.se_shs_n); |
186 |
186 |
return rbs_dis & mask; |
return rbs_dis & mask; |
187 |
187 |
} |
} |
188 |
188 |
|
|
|
... |
... |
static u32 cus_ena_get(struct pci_dev *dev) |
214 |
214 |
static void spi_setup(struct pci_dev *dev) |
static void spi_setup(struct pci_dev *dev) |
215 |
215 |
{ |
{ |
216 |
216 |
struct dev_drv_data *dd; |
struct dev_drv_data *dd; |
217 |
|
u32 i; |
|
218 |
|
u32 j; |
|
219 |
|
u32 k; |
|
|
217 |
|
u32 se; |
|
218 |
|
u32 sh; |
|
219 |
|
u32 cu; |
220 |
220 |
u32 spi_static_thd_mgmt_2; |
u32 spi_static_thd_mgmt_2; |
221 |
221 |
u32 cus_ena; |
u32 cus_ena; |
222 |
222 |
u32 mask; |
u32 mask; |
223 |
223 |
|
|
224 |
224 |
dd = pci_get_drvdata(dev); |
dd = pci_get_drvdata(dev); |
225 |
225 |
|
|
226 |
|
for (i = 0; i < dd->cfg.gpu.ses_n; ++i) { |
|
227 |
|
for (j = 0; j < dd->cfg.gpu.se_shs_n; ++j) { |
|
228 |
|
se_sh_select(dev, i, j); |
|
|
226 |
|
for (se = 0; se < dd->cfg.gpu.ses_n; ++se) { |
|
227 |
|
for (sh = 0; sh < dd->cfg.gpu.se_shs_n; ++sh) { |
|
228 |
|
se_sh_select(dev, se, sh); |
229 |
229 |
spi_static_thd_mgmt_2 = rr32(dev, |
spi_static_thd_mgmt_2 = rr32(dev, |
230 |
230 |
SPI_STATIC_THD_MGMT_2); |
SPI_STATIC_THD_MGMT_2); |
231 |
231 |
cus_ena = cus_ena_get(dev); |
cus_ena = cus_ena_get(dev); |
232 |
232 |
|
|
233 |
233 |
mask = 1; |
mask = 1; |
234 |
|
for (k = 0; k < CGSAC_SH_CUS_N_MAX; ++k) { |
|
235 |
|
mask <<= k; |
|
|
234 |
|
for (cu = 0; cu < CGSAC_SH_CUS_N_MAX; ++cu) { |
|
235 |
|
mask <<= cu; |
236 |
236 |
if (cus_ena & mask) { |
if (cus_ena & mask) { |
237 |
237 |
spi_static_thd_mgmt_2 &= ~mask; |
spi_static_thd_mgmt_2 &= ~mask; |
238 |
238 |
wr32(dev, spi_static_thd_mgmt_2, |
wr32(dev, spi_static_thd_mgmt_2, |
|
... |
... |
static void spi_setup(struct pci_dev *dev) |
250 |
250 |
static void rbs_setup(struct pci_dev *dev) |
static void rbs_setup(struct pci_dev *dev) |
251 |
251 |
{ |
{ |
252 |
252 |
struct dev_drv_data *dd; |
struct dev_drv_data *dd; |
253 |
|
u32 i; |
|
254 |
|
u32 j; |
|
|
253 |
|
u32 se; |
|
254 |
|
u32 sh; |
255 |
255 |
u32 sh_rbs_dis; |
u32 sh_rbs_dis; |
256 |
256 |
u32 rbs_dis; |
u32 rbs_dis; |
257 |
257 |
u32 mask; |
u32 mask; |
|
... |
... |
static void rbs_setup(struct pci_dev *dev) |
260 |
260 |
|
|
261 |
261 |
dd = pci_get_drvdata(dev); |
dd = pci_get_drvdata(dev); |
262 |
262 |
|
|
263 |
|
/* build the mask of disabled rbs from registers*/ |
|
|
263 |
|
/* build the mask of dis rbs from regs */ |
264 |
264 |
rbs_dis = 0; |
rbs_dis = 0; |
265 |
|
for (i = 0; i < dd->cfg.gpu.ses_n; ++i) { |
|
266 |
|
for (j = 0; j < dd->cfg.gpu.se_shs_n; ++j) { |
|
267 |
|
se_sh_select(dev, i, j); |
|
|
265 |
|
for (se = 0; se < dd->cfg.gpu.ses_n; ++se) { |
|
266 |
|
for (sh = 0; sh < dd->cfg.gpu.se_shs_n; ++sh) { |
|
267 |
|
se_sh_select(dev, se, sh); |
268 |
268 |
sh_rbs_dis = sh_rbs_dis_get(dev); |
sh_rbs_dis = sh_rbs_dis_get(dev); |
269 |
|
rbs_dis |= sh_rbs_dis << ((i * dd->cfg.gpu.se_shs_n + j) |
|
270 |
|
* CRBD_TAHITI_RB_BITMAP_W_PER_SH); |
|
|
269 |
|
rbs_dis |= sh_rbs_dis << ((se * dd->cfg.gpu.se_shs_n |
|
270 |
|
+ sh) * CRBD_TAHITI_RB_BITMAP_W_PER_SH); |
271 |
271 |
} |
} |
272 |
272 |
} |
} |
273 |
273 |
|
|
274 |
274 |
se_sh_select(dev, 0xffffffff, 0xffffffff); |
se_sh_select(dev, 0xffffffff, 0xffffffff); |
275 |
275 |
|
|
276 |
|
/* build the mask of enabled rbs from the mask of disabled rbs */ |
|
|
276 |
|
/* build the mask of ena rbs from the mask of dis rbs */ |
277 |
277 |
rbs_ena = 0; |
rbs_ena = 0; |
278 |
278 |
mask = 1; |
mask = 1; |
279 |
|
for (i = 0; i < dd->cfg.gpu.se_rbs_n; ++i) { |
|
|
279 |
|
for (se = 0; se < dd->cfg.gpu.se_rbs_n * dd->cfg.gpu.ses_n; ++se) { |
280 |
280 |
if(!(rbs_dis & mask)) |
if(!(rbs_dis & mask)) |
281 |
281 |
rbs_ena |= mask; |
rbs_ena |= mask; |
282 |
282 |
mask <<= 1; |
mask <<= 1; |
283 |
283 |
} |
} |
284 |
284 |
|
|
285 |
|
/* configure the raster block for each sh */ |
|
286 |
|
for (i = 0; i < dd->cfg.gpu.ses_n; ++i) { |
|
|
285 |
|
/* configure the raster blk for each sh */ |
|
286 |
|
for (se = 0; se < dd->cfg.gpu.ses_n; ++se) { |
287 |
287 |
pa_sc_raster_cfg = 0; |
pa_sc_raster_cfg = 0; |
288 |
|
for (j = 0; j < dd->cfg.gpu.se_shs_n; ++j) { |
|
|
288 |
|
for (sh = 0; sh < dd->cfg.gpu.se_shs_n; ++sh) { |
289 |
289 |
switch (rbs_ena & 3) { |
switch (rbs_ena & 3) { |
290 |
290 |
case 1: |
case 1: |
291 |
291 |
pa_sc_raster_cfg |= (PSRC_RB_MAP_0 |
pa_sc_raster_cfg |= (PSRC_RB_MAP_0 |
292 |
|
<< (i * dd->cfg.gpu.se_shs_n + j) * 2); |
|
|
292 |
|
<< (se * dd->cfg.gpu.se_shs_n |
|
293 |
|
+ sh) * 2); |
293 |
294 |
break; |
break; |
294 |
295 |
case 2: |
case 2: |
295 |
296 |
pa_sc_raster_cfg |= (PSRC_RB_MAP_3 |
pa_sc_raster_cfg |= (PSRC_RB_MAP_3 |
296 |
|
<< (i * dd->cfg.gpu.se_shs_n + j) * 2); |
|
|
297 |
|
<< (se * dd->cfg.gpu.se_shs_n |
|
298 |
|
+ sh) * 2); |
297 |
299 |
break; |
break; |
298 |
300 |
case 3: |
case 3: |
299 |
301 |
default: |
default: |
300 |
302 |
pa_sc_raster_cfg |= (PSRC_RB_MAP_2 |
pa_sc_raster_cfg |= (PSRC_RB_MAP_2 |
301 |
|
<< (i * dd->cfg.gpu.se_shs_n + j) * 2); |
|
|
303 |
|
<< (se * dd->cfg.gpu.se_shs_n + sh) * 2); |
302 |
304 |
break; |
break; |
303 |
305 |
} |
} |
304 |
|
rbs_ena >>= 2;/* enabled rbs of next sh */ |
|
|
306 |
|
rbs_ena >>= 2;/* ena rbs of next sh */ |
305 |
307 |
} |
} |
306 |
|
se_sh_select(dev, i, 0xffffffff); |
|
307 |
|
dev_info(&dev->dev, "se_sh=%u pa_sc_raster_cfg=0x%08x\n", i, |
|
|
308 |
|
se_sh_select(dev, se, 0xffffffff); |
|
309 |
|
dev_info(&dev->dev, "se=%u pa_sc_raster_cfg=0x%08x\n", se, |
308 |
310 |
pa_sc_raster_cfg); |
pa_sc_raster_cfg); |
309 |
311 |
wr32(dev, pa_sc_raster_cfg, PA_SC_RASTER_CFG); |
wr32(dev, pa_sc_raster_cfg, PA_SC_RASTER_CFG); |
310 |
312 |
} |
} |