Skip to content
This repository was archived by the owner on Sep 24, 2020. It is now read-only.

Commit de2d9b5

Browse files
Anson-HuangShawn Guo
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) Fixes: 721cabf ("soc: imx: move PGC handling to a new GPC driver") Signed-off-by: Anson Huang <[email protected]> Reviewed-by: Fabio Estevam <[email protected]> Signed-off-by: Shawn Guo <[email protected]>
1 parent 2ceb278 commit de2d9b5

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)
@@ -318,10 +325,24 @@ static const struct of_device_id imx_gpc_dt_ids[] = {
318325
{ }
319326
};
320327

328+
static const struct regmap_range yes_ranges[] = {
329+
regmap_reg_range(GPC_CNTR, GPC_CNTR),
330+
regmap_reg_range(GPC_PGC_PCI_PDN, GPC_PGC_PCI_SR),
331+
regmap_reg_range(GPC_PGC_GPU_PDN, GPC_PGC_GPU_SR),
332+
regmap_reg_range(GPC_PGC_DISP_PDN, GPC_PGC_DISP_SR),
333+
};
334+
335+
static const struct regmap_access_table access_table = {
336+
.yes_ranges = yes_ranges,
337+
.n_yes_ranges = ARRAY_SIZE(yes_ranges),
338+
};
339+
321340
static const struct regmap_config imx_gpc_regmap_config = {
322341
.reg_bits = 32,
323342
.val_bits = 32,
324343
.reg_stride = 4,
344+
.rd_table = &access_table,
345+
.wr_table = &access_table,
325346
.max_register = 0x2ac,
326347
};
327348

0 commit comments

Comments
 (0)