Skip to content

Commit be02e1f

Browse files
committed
Merge tag 'qcom-driver-fixes-for-6.4' of https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux into arm/fixes
Qualcomm driver fixes for 6.4 Error paths is corrected across icc-bwmon, rpmh-rsc, ramp_controller and rmtfs. The ice module is renamed qcom_ice, to avoid clashing with existing "ice" driver. SA8155P-specific RPMh power-domains are introduced to avoid the code trying to access resources that exists on SM8150, but not on SA8155P. Lastly, changes to the EDAC driver to fix an issue where the driver performs mmio based on the wrong register map. * tag 'qcom-driver-fixes-for-6.4' of https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux: EDAC/qcom: Get rid of hardcoded register offsets EDAC/qcom: Remove superfluous return variable assignment in qcom_llcc_core_setup() dt-bindings: cache: qcom,llcc: Fix SM8550 description soc: qcom: rpmhpd: Add SA8155P power domains dt-bindings: power: qcom,rpmpd: Add SA8155P soc: qcom: Rename ice to qcom_ice to avoid module name conflict soc: qcom: rmtfs: Fix error code in probe() soc: qcom: ramp_controller: Fix an error handling path in qcom_ramp_controller_probe() soc: qcom: rpmh-rsc: drop redundant unsigned >=0 comparision soc: qcom: icc-bwmon: fix incorrect error code passed to dev_err_probe() Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Arnd Bergmann <[email protected]>
2 parents 1c278f8 + cbd7711 commit be02e1f

File tree

11 files changed

+93
-70
lines changed

11 files changed

+93
-70
lines changed

Documentation/devicetree/bindings/cache/qcom,llcc.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ allOf:
129129
- qcom,sm8250-llcc
130130
- qcom,sm8350-llcc
131131
- qcom,sm8450-llcc
132+
- qcom,sm8550-llcc
132133
then:
133134
properties:
134135
reg:

Documentation/devicetree/bindings/power/qcom,rpmpd.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ properties:
2929
- qcom,qcm2290-rpmpd
3030
- qcom,qcs404-rpmpd
3131
- qcom,qdu1000-rpmhpd
32+
- qcom,sa8155p-rpmhpd
3233
- qcom,sa8540p-rpmhpd
3334
- qcom,sa8775p-rpmhpd
3435
- qcom,sdm660-rpmpd

drivers/edac/qcom_edac.c

Lines changed: 59 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -21,30 +21,9 @@
2121
#define TRP_SYN_REG_CNT 6
2222
#define DRP_SYN_REG_CNT 8
2323

24-
#define LLCC_COMMON_STATUS0 0x0003000c
2524
#define LLCC_LB_CNT_MASK GENMASK(31, 28)
2625
#define LLCC_LB_CNT_SHIFT 28
2726

28-
/* Single & double bit syndrome register offsets */
29-
#define TRP_ECC_SB_ERR_SYN0 0x0002304c
30-
#define TRP_ECC_DB_ERR_SYN0 0x00020370
31-
#define DRP_ECC_SB_ERR_SYN0 0x0004204c
32-
#define DRP_ECC_DB_ERR_SYN0 0x00042070
33-
34-
/* Error register offsets */
35-
#define TRP_ECC_ERROR_STATUS1 0x00020348
36-
#define TRP_ECC_ERROR_STATUS0 0x00020344
37-
#define DRP_ECC_ERROR_STATUS1 0x00042048
38-
#define DRP_ECC_ERROR_STATUS0 0x00042044
39-
40-
/* TRP, DRP interrupt register offsets */
41-
#define DRP_INTERRUPT_STATUS 0x00041000
42-
#define TRP_INTERRUPT_0_STATUS 0x00020480
43-
#define DRP_INTERRUPT_CLEAR 0x00041008
44-
#define DRP_ECC_ERROR_CNTR_CLEAR 0x00040004
45-
#define TRP_INTERRUPT_0_CLEAR 0x00020484
46-
#define TRP_ECC_ERROR_CNTR_CLEAR 0x00020440
47-
4827
/* Mask and shift macros */
4928
#define ECC_DB_ERR_COUNT_MASK GENMASK(4, 0)
5029
#define ECC_DB_ERR_WAYS_MASK GENMASK(31, 16)
@@ -60,15 +39,6 @@
6039
#define DRP_TRP_INT_CLEAR GENMASK(1, 0)
6140
#define DRP_TRP_CNT_CLEAR GENMASK(1, 0)
6241

63-
/* Config registers offsets*/
64-
#define DRP_ECC_ERROR_CFG 0x00040000
65-
66-
/* Tag RAM, Data RAM interrupt register offsets */
67-
#define CMN_INTERRUPT_0_ENABLE 0x0003001c
68-
#define CMN_INTERRUPT_2_ENABLE 0x0003003c
69-
#define TRP_INTERRUPT_0_ENABLE 0x00020488
70-
#define DRP_INTERRUPT_ENABLE 0x0004100c
71-
7242
#define SB_ERROR_THRESHOLD 0x1
7343
#define SB_ERROR_THRESHOLD_SHIFT 24
7444
#define SB_DB_TRP_INTERRUPT_ENABLE 0x3
@@ -88,47 +58,35 @@ enum {
8858
static const struct llcc_edac_reg_data edac_reg_data[] = {
8959
[LLCC_DRAM_CE] = {
9060
.name = "DRAM Single-bit",
91-
.synd_reg = DRP_ECC_SB_ERR_SYN0,
92-
.count_status_reg = DRP_ECC_ERROR_STATUS1,
93-
.ways_status_reg = DRP_ECC_ERROR_STATUS0,
9461
.reg_cnt = DRP_SYN_REG_CNT,
9562
.count_mask = ECC_SB_ERR_COUNT_MASK,
9663
.ways_mask = ECC_SB_ERR_WAYS_MASK,
9764
.count_shift = ECC_SB_ERR_COUNT_SHIFT,
9865
},
9966
[LLCC_DRAM_UE] = {
10067
.name = "DRAM Double-bit",
101-
.synd_reg = DRP_ECC_DB_ERR_SYN0,
102-
.count_status_reg = DRP_ECC_ERROR_STATUS1,
103-
.ways_status_reg = DRP_ECC_ERROR_STATUS0,
10468
.reg_cnt = DRP_SYN_REG_CNT,
10569
.count_mask = ECC_DB_ERR_COUNT_MASK,
10670
.ways_mask = ECC_DB_ERR_WAYS_MASK,
10771
.ways_shift = ECC_DB_ERR_WAYS_SHIFT,
10872
},
10973
[LLCC_TRAM_CE] = {
11074
.name = "TRAM Single-bit",
111-
.synd_reg = TRP_ECC_SB_ERR_SYN0,
112-
.count_status_reg = TRP_ECC_ERROR_STATUS1,
113-
.ways_status_reg = TRP_ECC_ERROR_STATUS0,
11475
.reg_cnt = TRP_SYN_REG_CNT,
11576
.count_mask = ECC_SB_ERR_COUNT_MASK,
11677
.ways_mask = ECC_SB_ERR_WAYS_MASK,
11778
.count_shift = ECC_SB_ERR_COUNT_SHIFT,
11879
},
11980
[LLCC_TRAM_UE] = {
12081
.name = "TRAM Double-bit",
121-
.synd_reg = TRP_ECC_DB_ERR_SYN0,
122-
.count_status_reg = TRP_ECC_ERROR_STATUS1,
123-
.ways_status_reg = TRP_ECC_ERROR_STATUS0,
12482
.reg_cnt = TRP_SYN_REG_CNT,
12583
.count_mask = ECC_DB_ERR_COUNT_MASK,
12684
.ways_mask = ECC_DB_ERR_WAYS_MASK,
12785
.ways_shift = ECC_DB_ERR_WAYS_SHIFT,
12886
},
12987
};
13088

131-
static int qcom_llcc_core_setup(struct regmap *llcc_bcast_regmap)
89+
static int qcom_llcc_core_setup(struct llcc_drv_data *drv, struct regmap *llcc_bcast_regmap)
13290
{
13391
u32 sb_err_threshold;
13492
int ret;
@@ -137,31 +95,31 @@ static int qcom_llcc_core_setup(struct regmap *llcc_bcast_regmap)
13795
* Configure interrupt enable registers such that Tag, Data RAM related
13896
* interrupts are propagated to interrupt controller for servicing
13997
*/
140-
ret = regmap_update_bits(llcc_bcast_regmap, CMN_INTERRUPT_2_ENABLE,
98+
ret = regmap_update_bits(llcc_bcast_regmap, drv->edac_reg_offset->cmn_interrupt_2_enable,
14199
TRP0_INTERRUPT_ENABLE,
142100
TRP0_INTERRUPT_ENABLE);
143101
if (ret)
144102
return ret;
145103

146-
ret = regmap_update_bits(llcc_bcast_regmap, TRP_INTERRUPT_0_ENABLE,
104+
ret = regmap_update_bits(llcc_bcast_regmap, drv->edac_reg_offset->trp_interrupt_0_enable,
147105
SB_DB_TRP_INTERRUPT_ENABLE,
148106
SB_DB_TRP_INTERRUPT_ENABLE);
149107
if (ret)
150108
return ret;
151109

152110
sb_err_threshold = (SB_ERROR_THRESHOLD << SB_ERROR_THRESHOLD_SHIFT);
153-
ret = regmap_write(llcc_bcast_regmap, DRP_ECC_ERROR_CFG,
111+
ret = regmap_write(llcc_bcast_regmap, drv->edac_reg_offset->drp_ecc_error_cfg,
154112
sb_err_threshold);
155113
if (ret)
156114
return ret;
157115

158-
ret = regmap_update_bits(llcc_bcast_regmap, CMN_INTERRUPT_2_ENABLE,
116+
ret = regmap_update_bits(llcc_bcast_regmap, drv->edac_reg_offset->cmn_interrupt_2_enable,
159117
DRP0_INTERRUPT_ENABLE,
160118
DRP0_INTERRUPT_ENABLE);
161119
if (ret)
162120
return ret;
163121

164-
ret = regmap_write(llcc_bcast_regmap, DRP_INTERRUPT_ENABLE,
122+
ret = regmap_write(llcc_bcast_regmap, drv->edac_reg_offset->drp_interrupt_enable,
165123
SB_DB_DRP_INTERRUPT_ENABLE);
166124
return ret;
167125
}
@@ -170,29 +128,33 @@ static int qcom_llcc_core_setup(struct regmap *llcc_bcast_regmap)
170128
static int
171129
qcom_llcc_clear_error_status(int err_type, struct llcc_drv_data *drv)
172130
{
173-
int ret = 0;
131+
int ret;
174132

175133
switch (err_type) {
176134
case LLCC_DRAM_CE:
177135
case LLCC_DRAM_UE:
178-
ret = regmap_write(drv->bcast_regmap, DRP_INTERRUPT_CLEAR,
136+
ret = regmap_write(drv->bcast_regmap,
137+
drv->edac_reg_offset->drp_interrupt_clear,
179138
DRP_TRP_INT_CLEAR);
180139
if (ret)
181140
return ret;
182141

183-
ret = regmap_write(drv->bcast_regmap, DRP_ECC_ERROR_CNTR_CLEAR,
142+
ret = regmap_write(drv->bcast_regmap,
143+
drv->edac_reg_offset->drp_ecc_error_cntr_clear,
184144
DRP_TRP_CNT_CLEAR);
185145
if (ret)
186146
return ret;
187147
break;
188148
case LLCC_TRAM_CE:
189149
case LLCC_TRAM_UE:
190-
ret = regmap_write(drv->bcast_regmap, TRP_INTERRUPT_0_CLEAR,
150+
ret = regmap_write(drv->bcast_regmap,
151+
drv->edac_reg_offset->trp_interrupt_0_clear,
191152
DRP_TRP_INT_CLEAR);
192153
if (ret)
193154
return ret;
194155

195-
ret = regmap_write(drv->bcast_regmap, TRP_ECC_ERROR_CNTR_CLEAR,
156+
ret = regmap_write(drv->bcast_regmap,
157+
drv->edac_reg_offset->trp_ecc_error_cntr_clear,
196158
DRP_TRP_CNT_CLEAR);
197159
if (ret)
198160
return ret;
@@ -205,16 +167,54 @@ qcom_llcc_clear_error_status(int err_type, struct llcc_drv_data *drv)
205167
return ret;
206168
}
207169

170+
struct qcom_llcc_syn_regs {
171+
u32 synd_reg;
172+
u32 count_status_reg;
173+
u32 ways_status_reg;
174+
};
175+
176+
static void get_reg_offsets(struct llcc_drv_data *drv, int err_type,
177+
struct qcom_llcc_syn_regs *syn_regs)
178+
{
179+
const struct llcc_edac_reg_offset *edac_reg_offset = drv->edac_reg_offset;
180+
181+
switch (err_type) {
182+
case LLCC_DRAM_CE:
183+
syn_regs->synd_reg = edac_reg_offset->drp_ecc_sb_err_syn0;
184+
syn_regs->count_status_reg = edac_reg_offset->drp_ecc_error_status1;
185+
syn_regs->ways_status_reg = edac_reg_offset->drp_ecc_error_status0;
186+
break;
187+
case LLCC_DRAM_UE:
188+
syn_regs->synd_reg = edac_reg_offset->drp_ecc_db_err_syn0;
189+
syn_regs->count_status_reg = edac_reg_offset->drp_ecc_error_status1;
190+
syn_regs->ways_status_reg = edac_reg_offset->drp_ecc_error_status0;
191+
break;
192+
case LLCC_TRAM_CE:
193+
syn_regs->synd_reg = edac_reg_offset->trp_ecc_sb_err_syn0;
194+
syn_regs->count_status_reg = edac_reg_offset->trp_ecc_error_status1;
195+
syn_regs->ways_status_reg = edac_reg_offset->trp_ecc_error_status0;
196+
break;
197+
case LLCC_TRAM_UE:
198+
syn_regs->synd_reg = edac_reg_offset->trp_ecc_db_err_syn0;
199+
syn_regs->count_status_reg = edac_reg_offset->trp_ecc_error_status1;
200+
syn_regs->ways_status_reg = edac_reg_offset->trp_ecc_error_status0;
201+
break;
202+
}
203+
}
204+
208205
/* Dump Syndrome registers data for Tag RAM, Data RAM bit errors*/
209206
static int
210207
dump_syn_reg_values(struct llcc_drv_data *drv, u32 bank, int err_type)
211208
{
212209
struct llcc_edac_reg_data reg_data = edac_reg_data[err_type];
210+
struct qcom_llcc_syn_regs regs = { };
213211
int err_cnt, err_ways, ret, i;
214212
u32 synd_reg, synd_val;
215213

214+
get_reg_offsets(drv, err_type, &regs);
215+
216216
for (i = 0; i < reg_data.reg_cnt; i++) {
217-
synd_reg = reg_data.synd_reg + (i * 4);
217+
synd_reg = regs.synd_reg + (i * 4);
218218
ret = regmap_read(drv->regmaps[bank], synd_reg,
219219
&synd_val);
220220
if (ret)
@@ -224,7 +224,7 @@ dump_syn_reg_values(struct llcc_drv_data *drv, u32 bank, int err_type)
224224
reg_data.name, i, synd_val);
225225
}
226226

227-
ret = regmap_read(drv->regmaps[bank], reg_data.count_status_reg,
227+
ret = regmap_read(drv->regmaps[bank], regs.count_status_reg,
228228
&err_cnt);
229229
if (ret)
230230
goto clear;
@@ -234,7 +234,7 @@ dump_syn_reg_values(struct llcc_drv_data *drv, u32 bank, int err_type)
234234
edac_printk(KERN_CRIT, EDAC_LLCC, "%s: Error count: 0x%4x\n",
235235
reg_data.name, err_cnt);
236236

237-
ret = regmap_read(drv->regmaps[bank], reg_data.ways_status_reg,
237+
ret = regmap_read(drv->regmaps[bank], regs.ways_status_reg,
238238
&err_ways);
239239
if (ret)
240240
goto clear;
@@ -295,7 +295,7 @@ static irqreturn_t llcc_ecc_irq_handler(int irq, void *edev_ctl)
295295

296296
/* Iterate over the banks and look for Tag RAM or Data RAM errors */
297297
for (i = 0; i < drv->num_banks; i++) {
298-
ret = regmap_read(drv->regmaps[i], DRP_INTERRUPT_STATUS,
298+
ret = regmap_read(drv->regmaps[i], drv->edac_reg_offset->drp_interrupt_status,
299299
&drp_error);
300300

301301
if (!ret && (drp_error & SB_ECC_ERROR)) {
@@ -310,7 +310,7 @@ static irqreturn_t llcc_ecc_irq_handler(int irq, void *edev_ctl)
310310
if (!ret)
311311
irq_rc = IRQ_HANDLED;
312312

313-
ret = regmap_read(drv->regmaps[i], TRP_INTERRUPT_0_STATUS,
313+
ret = regmap_read(drv->regmaps[i], drv->edac_reg_offset->trp_interrupt_0_status,
314314
&trp_error);
315315

316316
if (!ret && (trp_error & SB_ECC_ERROR)) {
@@ -342,7 +342,7 @@ static int qcom_llcc_edac_probe(struct platform_device *pdev)
342342
int ecc_irq;
343343
int rc;
344344

345-
rc = qcom_llcc_core_setup(llcc_driv_data->bcast_regmap);
345+
rc = qcom_llcc_core_setup(llcc_driv_data, llcc_driv_data->bcast_regmap);
346346
if (rc)
347347
return rc;
348348

drivers/soc/qcom/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,5 @@ obj-$(CONFIG_QCOM_RPMHPD) += rpmhpd.o
3232
obj-$(CONFIG_QCOM_RPMPD) += rpmpd.o
3333
obj-$(CONFIG_QCOM_KRYO_L2_ACCESSORS) += kryo-l2-accessors.o
3434
obj-$(CONFIG_QCOM_ICC_BWMON) += icc-bwmon.o
35-
obj-$(CONFIG_QCOM_INLINE_CRYPTO_ENGINE) += ice.o
35+
qcom_ice-objs += ice.o
36+
obj-$(CONFIG_QCOM_INLINE_CRYPTO_ENGINE) += qcom_ice.o

drivers/soc/qcom/icc-bwmon.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -773,12 +773,12 @@ static int bwmon_probe(struct platform_device *pdev)
773773
bwmon->max_bw_kbps = UINT_MAX;
774774
opp = dev_pm_opp_find_bw_floor(dev, &bwmon->max_bw_kbps, 0);
775775
if (IS_ERR(opp))
776-
return dev_err_probe(dev, ret, "failed to find max peak bandwidth\n");
776+
return dev_err_probe(dev, PTR_ERR(opp), "failed to find max peak bandwidth\n");
777777

778778
bwmon->min_bw_kbps = 0;
779779
opp = dev_pm_opp_find_bw_ceil(dev, &bwmon->min_bw_kbps, 0);
780780
if (IS_ERR(opp))
781-
return dev_err_probe(dev, ret, "failed to find min peak bandwidth\n");
781+
return dev_err_probe(dev, PTR_ERR(opp), "failed to find min peak bandwidth\n");
782782

783783
bwmon->dev = dev;
784784

drivers/soc/qcom/ramp_controller.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ static int qcom_ramp_controller_probe(struct platform_device *pdev)
296296
return -ENOMEM;
297297

298298
qrc->desc = device_get_match_data(&pdev->dev);
299-
if (!qrc)
299+
if (!qrc->desc)
300300
return -EINVAL;
301301

302302
qrc->regmap = devm_regmap_init_mmio(&pdev->dev, base, &qrc_regmap_config);

drivers/soc/qcom/rmtfs_mem.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ static int qcom_rmtfs_mem_probe(struct platform_device *pdev)
233233
num_vmids = 0;
234234
} else if (num_vmids < 0) {
235235
dev_err(&pdev->dev, "failed to count qcom,vmid elements: %d\n", num_vmids);
236+
ret = num_vmids;
236237
goto remove_cdev;
237238
} else if (num_vmids > NUM_MAX_VMIDS) {
238239
dev_warn(&pdev->dev,

drivers/soc/qcom/rpmh-rsc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1073,7 +1073,7 @@ static int rpmh_rsc_probe(struct platform_device *pdev)
10731073
drv->ver.minor = rsc_id & (MINOR_VER_MASK << MINOR_VER_SHIFT);
10741074
drv->ver.minor >>= MINOR_VER_SHIFT;
10751075

1076-
if (drv->ver.major == 3 && drv->ver.minor >= 0)
1076+
if (drv->ver.major == 3)
10771077
drv->regs = rpmh_rsc_reg_offset_ver_3_0;
10781078
else
10791079
drv->regs = rpmh_rsc_reg_offset_ver_2_7;

drivers/soc/qcom/rpmhpd.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,21 @@ static const struct rpmhpd_desc sm8150_desc = {
342342
.num_pds = ARRAY_SIZE(sm8150_rpmhpds),
343343
};
344344

345+
static struct rpmhpd *sa8155p_rpmhpds[] = {
346+
[SA8155P_CX] = &cx_w_mx_parent,
347+
[SA8155P_CX_AO] = &cx_ao_w_mx_parent,
348+
[SA8155P_EBI] = &ebi,
349+
[SA8155P_GFX] = &gfx,
350+
[SA8155P_MSS] = &mss,
351+
[SA8155P_MX] = &mx,
352+
[SA8155P_MX_AO] = &mx_ao,
353+
};
354+
355+
static const struct rpmhpd_desc sa8155p_desc = {
356+
.rpmhpds = sa8155p_rpmhpds,
357+
.num_pds = ARRAY_SIZE(sa8155p_rpmhpds),
358+
};
359+
345360
/* SM8250 RPMH powerdomains */
346361
static struct rpmhpd *sm8250_rpmhpds[] = {
347362
[SM8250_CX] = &cx_w_mx_parent,
@@ -519,6 +534,7 @@ static const struct rpmhpd_desc sc8280xp_desc = {
519534

520535
static const struct of_device_id rpmhpd_match_table[] = {
521536
{ .compatible = "qcom,qdu1000-rpmhpd", .data = &qdu1000_desc },
537+
{ .compatible = "qcom,sa8155p-rpmhpd", .data = &sa8155p_desc },
522538
{ .compatible = "qcom,sa8540p-rpmhpd", .data = &sa8540p_desc },
523539
{ .compatible = "qcom,sa8775p-rpmhpd", .data = &sa8775p_desc },
524540
{ .compatible = "qcom,sc7180-rpmhpd", .data = &sc7180_desc },

include/dt-bindings/power/qcom-rpmpd.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,15 @@
9090
#define SM8150_MMCX 9
9191
#define SM8150_MMCX_AO 10
9292

93+
/* SA8155P is a special case, kept for backwards compatibility */
94+
#define SA8155P_CX SM8150_CX
95+
#define SA8155P_CX_AO SM8150_CX_AO
96+
#define SA8155P_EBI SM8150_EBI
97+
#define SA8155P_GFX SM8150_GFX
98+
#define SA8155P_MSS SM8150_MSS
99+
#define SA8155P_MX SM8150_MX
100+
#define SA8155P_MX_AO SM8150_MX_AO
101+
93102
/* SM8250 Power Domain Indexes */
94103
#define SM8250_CX 0
95104
#define SM8250_CX_AO 1

0 commit comments

Comments
 (0)