Hi,
That's why I would suggest trying with readq, it should also generate one instruction read x86_64 platforms, I looked a bit more and there is fallback to generate two 32 bit reads on 32bit platforms, so my previous concern about having to write separate handling for those platforms was unneeded. So I would recommend checking using it.
Hi,
The readq/writeq works. Code is optimized unlike memcpy_fromio/memcpy_toio and the defect is not able to reproduce.
(gdb) disas sst_shim32_read64 Dump of assembler code for function sst_shim32_read64: 0x000000000000096c <+0>: call 0x971 <sst_shim32_read64+5> 0x0000000000000971 <+5>: push rbp 0x0000000000000972 <+6>: mov rbp,rsp 0x0000000000000975 <+9>: mov eax,esi 0x0000000000000977 <+11>: mov rax,QWORD PTR [rdi+rax*1] 0x000000000000097b <+15>: pop rbp 0x000000000000097c <+16>: ret End of assembler dump. (gdb) disas sst_shim32_write64 Dump of assembler code for function sst_shim32_write64: 0x000000000000095b <+0>: call 0x960 <sst_shim32_write64+5> 0x0000000000000960 <+5>: push rbp 0x0000000000000961 <+6>: mov rbp,rsp 0x0000000000000964 <+9>: mov eax,esi 0x0000000000000966 <+11>: mov QWORD PTR [rdi+rax*1],rdx 0x000000000000096a <+15>: pop rbp 0x000000000000096b <+16>: ret End of assembler dump.
Regards, Brent
diff --git a/sound/soc/intel/common/sst-dsp.c b/sound/soc/intel/common/sst-dsp.c index ec66be269b69..e96f636387d9 100644 --- a/sound/soc/intel/common/sst-dsp.c +++ b/sound/soc/intel/common/sst-dsp.c @@ -34,16 +34,13 @@ EXPORT_SYMBOL_GPL(sst_shim32_read);
void sst_shim32_write64(void __iomem *addr, u32 offset, u64 value) {
memcpy_toio(addr + offset, &value, sizeof(value));
writeq(value, addr + offset);
} EXPORT_SYMBOL_GPL(sst_shim32_write64);
u64 sst_shim32_read64(void __iomem *addr, u32 offset) {
u64 val;
memcpy_fromio(&val, addr + offset, sizeof(val));
return val;
} EXPORT_SYMBOL_GPL(sst_shim32_read64);return readq(addr + offset);
Thanks, Amadeusz