Skip to content

Commit 7f9c136

Browse files
Venkata Narendra Kumar GuttaAndy Gross
authored andcommitted
soc: qcom: Add broadcast base for Last Level Cache Controller (LLCC)
Currently, broadcast base is set to end of the LLCC banks, which may not be correct always. As the number of banks may vary for each chipset and the broadcast base could be at a different address as well. This info depends on the chipset, so get the broadcast base info from the device tree (DT). Add broadcast base in LLCC driver and use this for broadcast writes. Signed-off-by: Venkata Narendra Kumar Gutta <[email protected]> Reviewed-by: Evan Green <[email protected]> Signed-off-by: Andy Gross <[email protected]>
1 parent 5b394b2 commit 7f9c136

File tree

2 files changed

+35
-24
lines changed

2 files changed

+35
-24
lines changed

drivers/soc/qcom/llcc-slice.c

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -106,22 +106,24 @@ static int llcc_update_act_ctrl(u32 sid,
106106
u32 slice_status;
107107
int ret;
108108

109-
act_ctrl_reg = drv_data->bcast_off + LLCC_TRP_ACT_CTRLn(sid);
110-
status_reg = drv_data->bcast_off + LLCC_TRP_STATUSn(sid);
109+
act_ctrl_reg = LLCC_TRP_ACT_CTRLn(sid);
110+
status_reg = LLCC_TRP_STATUSn(sid);
111111

112112
/* Set the ACTIVE trigger */
113113
act_ctrl_reg_val |= ACT_CTRL_ACT_TRIG;
114-
ret = regmap_write(drv_data->regmap, act_ctrl_reg, act_ctrl_reg_val);
114+
ret = regmap_write(drv_data->bcast_regmap, act_ctrl_reg,
115+
act_ctrl_reg_val);
115116
if (ret)
116117
return ret;
117118

118119
/* Clear the ACTIVE trigger */
119120
act_ctrl_reg_val &= ~ACT_CTRL_ACT_TRIG;
120-
ret = regmap_write(drv_data->regmap, act_ctrl_reg, act_ctrl_reg_val);
121+
ret = regmap_write(drv_data->bcast_regmap, act_ctrl_reg,
122+
act_ctrl_reg_val);
121123
if (ret)
122124
return ret;
123125

124-
ret = regmap_read_poll_timeout(drv_data->regmap, status_reg,
126+
ret = regmap_read_poll_timeout(drv_data->bcast_regmap, status_reg,
125127
slice_status, !(slice_status & status),
126128
0, LLCC_STATUS_READ_DELAY);
127129
return ret;
@@ -226,16 +228,13 @@ static int qcom_llcc_cfg_program(struct platform_device *pdev)
226228
int ret;
227229
const struct llcc_slice_config *llcc_table;
228230
struct llcc_slice_desc desc;
229-
u32 bcast_off = drv_data->bcast_off;
230231

231232
sz = drv_data->cfg_size;
232233
llcc_table = drv_data->cfg;
233234

234235
for (i = 0; i < sz; i++) {
235-
attr1_cfg = bcast_off +
236-
LLCC_TRP_ATTR1_CFGn(llcc_table[i].slice_id);
237-
attr0_cfg = bcast_off +
238-
LLCC_TRP_ATTR0_CFGn(llcc_table[i].slice_id);
236+
attr1_cfg = LLCC_TRP_ATTR1_CFGn(llcc_table[i].slice_id);
237+
attr0_cfg = LLCC_TRP_ATTR0_CFGn(llcc_table[i].slice_id);
239238

240239
attr1_val = llcc_table[i].cache_mode;
241240
attr1_val |= llcc_table[i].probe_target_ways <<
@@ -260,10 +259,12 @@ static int qcom_llcc_cfg_program(struct platform_device *pdev)
260259
attr0_val = llcc_table[i].res_ways & ATTR0_RES_WAYS_MASK;
261260
attr0_val |= llcc_table[i].bonus_ways << ATTR0_BONUS_WAYS_SHIFT;
262261

263-
ret = regmap_write(drv_data->regmap, attr1_cfg, attr1_val);
262+
ret = regmap_write(drv_data->bcast_regmap, attr1_cfg,
263+
attr1_val);
264264
if (ret)
265265
return ret;
266-
ret = regmap_write(drv_data->regmap, attr0_cfg, attr0_val);
266+
ret = regmap_write(drv_data->bcast_regmap, attr0_cfg,
267+
attr0_val);
267268
if (ret)
268269
return ret;
269270
if (llcc_table[i].activate_on_init) {
@@ -279,24 +280,36 @@ int qcom_llcc_probe(struct platform_device *pdev,
279280
{
280281
u32 num_banks;
281282
struct device *dev = &pdev->dev;
282-
struct resource *res;
283-
void __iomem *base;
283+
struct resource *llcc_banks_res, *llcc_bcast_res;
284+
void __iomem *llcc_banks_base, *llcc_bcast_base;
284285
int ret, i;
285286

286287
drv_data = devm_kzalloc(dev, sizeof(*drv_data), GFP_KERNEL);
287288
if (!drv_data)
288289
return -ENOMEM;
289290

290-
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
291-
base = devm_ioremap_resource(&pdev->dev, res);
292-
if (IS_ERR(base))
293-
return PTR_ERR(base);
291+
llcc_banks_res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
292+
"llcc_base");
293+
llcc_banks_base = devm_ioremap_resource(&pdev->dev, llcc_banks_res);
294+
if (IS_ERR(llcc_banks_base))
295+
return PTR_ERR(llcc_banks_base);
294296

295-
drv_data->regmap = devm_regmap_init_mmio(dev, base,
296-
&llcc_regmap_config);
297+
drv_data->regmap = devm_regmap_init_mmio(dev, llcc_banks_base,
298+
&llcc_regmap_config);
297299
if (IS_ERR(drv_data->regmap))
298300
return PTR_ERR(drv_data->regmap);
299301

302+
llcc_bcast_res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
303+
"llcc_broadcast_base");
304+
llcc_bcast_base = devm_ioremap_resource(&pdev->dev, llcc_bcast_res);
305+
if (IS_ERR(llcc_bcast_base))
306+
return PTR_ERR(llcc_bcast_base);
307+
308+
drv_data->bcast_regmap = devm_regmap_init_mmio(dev, llcc_bcast_base,
309+
&llcc_regmap_config);
310+
if (IS_ERR(drv_data->bcast_regmap))
311+
return PTR_ERR(drv_data->bcast_regmap);
312+
300313
ret = regmap_read(drv_data->regmap, LLCC_COMMON_STATUS0,
301314
&num_banks);
302315
if (ret)
@@ -318,8 +331,6 @@ int qcom_llcc_probe(struct platform_device *pdev,
318331
for (i = 0; i < num_banks; i++)
319332
drv_data->offsets[i] = i * BANK_OFFSET_STRIDE;
320333

321-
drv_data->bcast_off = num_banks * BANK_OFFSET_STRIDE;
322-
323334
drv_data->bitmap = devm_kcalloc(dev,
324335
BITS_TO_LONGS(drv_data->max_slices), sizeof(unsigned long),
325336
GFP_KERNEL);

include/linux/soc/qcom/llcc-qcom.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,22 +70,22 @@ struct llcc_slice_config {
7070
/**
7171
* llcc_drv_data - Data associated with the llcc driver
7272
* @regmap: regmap associated with the llcc device
73+
* @bcast_regmap: regmap associated with llcc broadcast offset
7374
* @cfg: pointer to the data structure for slice configuration
7475
* @lock: mutex associated with each slice
7576
* @cfg_size: size of the config data table
7677
* @max_slices: max slices as read from device tree
77-
* @bcast_off: Offset of the broadcast bank
7878
* @num_banks: Number of llcc banks
7979
* @bitmap: Bit map to track the active slice ids
8080
* @offsets: Pointer to the bank offsets array
8181
*/
8282
struct llcc_drv_data {
8383
struct regmap *regmap;
84+
struct regmap *bcast_regmap;
8485
const struct llcc_slice_config *cfg;
8586
struct mutex lock;
8687
u32 cfg_size;
8788
u32 max_slices;
88-
u32 bcast_off;
8989
u32 num_banks;
9090
unsigned long *bitmap;
9191
u32 *offsets;

0 commit comments

Comments
 (0)