Skip to content

Commit fd3599b

Browse files
Anson-Huangintel-lab-lkp
authored andcommitted
soc: imx: gpc: restrict register range for regmap access
GPC registers are NOT continuous, some registers are reserved and accessing them from userspace will trigger external abort, add regmap register access table to avoid below abort: root@imx6slevk:~# cat /sys/kernel/debug/regmap/20dc000.gpc/registers [ 108.480477] Unhandled fault: imprecise external abort (0x1406) at 0xb6db5004 [ 108.487985] pgd = 42b54bfd [ 108.490741] [b6db5004] *pgd=ba1b7831 [ 108.494386] Internal error: : 1406 [#1] SMP ARM [ 108.498943] Modules linked in: [ 108.502043] CPU: 0 PID: 389 Comm: cat Not tainted 4.18.0-rc1-00074-gc9f1f60-dirty torvalds#482 [ 108.509982] Hardware name: Freescale i.MX6 SoloLite (Device Tree) [ 108.516123] PC is at regmap_mmio_read32le+0x20/0x24 [ 108.521031] LR is at regmap_mmio_read+0x40/0x60 [ 108.525586] pc : [<c059cf74>] lr : [<c059d1ac>] psr: 20060093 [ 108.531875] sp : eccf1d98 ip : eccf1da8 fp : eccf1da4 [ 108.537122] r10: ec2d3800 r9 : eccf1f60 r8 : ecfc0000 [ 108.542370] r7 : eccf1e2c r6 : eccf1e2c r5 : 00000028 r4 : ec338e00 [ 108.548920] r3 : 00000000 r2 : eccf1e2c r1 : f0980028 r0 : 00000000 [ 108.555474] Flags: nzCv IRQs off FIQs on Mode SVC_32 ISA ARM Segment none [ 108.562720] Control: 10c5387d Table: acf4004a DAC: 00000051 [ 108.568491] Process cat (pid: 389, stack limit = 0xd4318a65) [ 108.574174] Stack: (0xeccf1d98 to 0xeccf2000) Signed-off-by: Anson Huang <[email protected]>
1 parent 6632f20 commit fd3599b

File tree

1 file changed

+21
-0
lines changed

1 file changed

+21
-0
lines changed

drivers/soc/imx/gpc.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,16 @@
2727
#define GPC_PGC_SW2ISO_SHIFT 0x8
2828
#define GPC_PGC_SW_SHIFT 0x0
2929

30+
#define GPC_PGC_PCI_PDN 0x200
31+
#define GPC_PGC_PCI_SR 0x20c
32+
3033
#define GPC_PGC_GPU_PDN 0x260
3134
#define GPC_PGC_GPU_PUPSCR 0x264
3235
#define GPC_PGC_GPU_PDNSCR 0x268
36+
#define GPC_PGC_GPU_SR 0x26c
37+
38+
#define GPC_PGC_DISP_PDN 0x240
39+
#define GPC_PGC_DISP_SR 0x24c
3340

3441
#define GPU_VPU_PUP_REQ BIT(1)
3542
#define GPU_VPU_PDN_REQ BIT(0)
@@ -323,10 +330,24 @@ static const struct of_device_id imx_gpc_dt_ids[] = {
323330
{ }
324331
};
325332

333+
static const struct regmap_range yes_ranges[] = {
334+
regmap_reg_range(GPC_CNTR, GPC_CNTR),
335+
regmap_reg_range(GPC_PGC_PCI_PDN, GPC_PGC_PCI_SR),
336+
regmap_reg_range(GPC_PGC_GPU_PDN, GPC_PGC_GPU_SR),
337+
regmap_reg_range(GPC_PGC_DISP_PDN, GPC_PGC_DISP_SR),
338+
};
339+
340+
static const struct regmap_access_table access_table = {
341+
.yes_ranges = yes_ranges,
342+
.n_yes_ranges = ARRAY_SIZE(yes_ranges),
343+
};
344+
326345
static const struct regmap_config imx_gpc_regmap_config = {
327346
.reg_bits = 32,
328347
.val_bits = 32,
329348
.reg_stride = 4,
349+
.rd_table = &access_table,
350+
.wr_table = &access_table,
330351
.max_register = 0x2ac,
331352
};
332353

0 commit comments

Comments
 (0)