Skip to content

Commit 4134cb9

Browse files
committed
fsi: aspeed: Emit fewer barriers in opb operations
When setting up a read or write to the OPB memory space, we must perform five or six AHB writes. The ordering of these up until the trigger write does not matter, so use writel_relaxed. The generated code goes from (Debian GCC 10.2.1-6): mov r8, r3 mcr 15, 0, sl, cr7, cr10, {4} str sl, [r6, #20] mcr 15, 0, sl, cr7, cr10, {4} str r3, [r6, #24] mcr 15, 0, sl, cr7, cr10, {4} str r1, [r6, #28] mcr 15, 0, sl, cr7, cr10, {4} str r2, [r6, #32] mcr 15, 0, sl, cr7, cr10, {4} mov r1, #1 str r1, [r6, #64] ; 0x40 mcr 15, 0, sl, cr7, cr10, {4} str r1, [r6, #4] to this: str r3, [r7, #20] str r2, [r7, #24] str r1, [r7, #28] str r3, [r7, #64] mov r8, #0 mcr 15, 0, r8, cr7, cr10, {4} str r3, [r7, #4] Signed-off-by: Joel Stanley <[email protected]> Acked-by: Jeremy Kerr <[email protected]> Reviewed-by: Eddie James <[email protected]> Tested-by: Eddie James <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Joel Stanley <[email protected]>
1 parent 9108109 commit 4134cb9

File tree

1 file changed

+17
-9
lines changed

1 file changed

+17
-9
lines changed

drivers/fsi/fsi-master-aspeed.c

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -101,11 +101,15 @@ static int __opb_write(struct fsi_master_aspeed *aspeed, u32 addr,
101101
u32 reg, status;
102102
int ret;
103103

104-
writel(CMD_WRITE, base + OPB0_RW);
105-
writel(transfer_size, base + OPB0_XFER_SIZE);
106-
writel(addr, base + OPB0_FSI_ADDR);
107-
writel(val, base + OPB0_FSI_DATA_W);
108-
writel(0x1, base + OPB_IRQ_CLEAR);
104+
/*
105+
* The ordering of these writes up until the trigger
106+
* write does not matter, so use writel_relaxed.
107+
*/
108+
writel_relaxed(CMD_WRITE, base + OPB0_RW);
109+
writel_relaxed(transfer_size, base + OPB0_XFER_SIZE);
110+
writel_relaxed(addr, base + OPB0_FSI_ADDR);
111+
writel_relaxed(val, base + OPB0_FSI_DATA_W);
112+
writel_relaxed(0x1, base + OPB_IRQ_CLEAR);
109113
writel(0x1, base + OPB_TRIGGER);
110114

111115
ret = readl_poll_timeout(base + OPB_IRQ_STATUS, reg,
@@ -149,10 +153,14 @@ static int __opb_read(struct fsi_master_aspeed *aspeed, uint32_t addr,
149153
u32 result, reg;
150154
int status, ret;
151155

152-
writel(CMD_READ, base + OPB0_RW);
153-
writel(transfer_size, base + OPB0_XFER_SIZE);
154-
writel(addr, base + OPB0_FSI_ADDR);
155-
writel(0x1, base + OPB_IRQ_CLEAR);
156+
/*
157+
* The ordering of these writes up until the trigger
158+
* write does not matter, so use writel_relaxed.
159+
*/
160+
writel_relaxed(CMD_READ, base + OPB0_RW);
161+
writel_relaxed(transfer_size, base + OPB0_XFER_SIZE);
162+
writel_relaxed(addr, base + OPB0_FSI_ADDR);
163+
writel_relaxed(0x1, base + OPB_IRQ_CLEAR);
156164
writel(0x1, base + OPB_TRIGGER);
157165

158166
ret = readl_poll_timeout(base + OPB_IRQ_STATUS, reg,

0 commit comments

Comments
 (0)