net: mvneta: 64bit platform support
Subsystems (2)
Hi all,
Obviously, current mvneta driver can't work on 64bit platforms. For one thing the BM feature should be explicitly disabled, I just sent out one patch for this purpose.
What's more, the buf_cookie in mvneta_rx_desc need to be carefully considered. The driver use the buf_cookie(u32 type) to store the buffer virtual address, obviously it can't store the virtual address on 64bit platforms. I have two solutions:
solution A: let one reserved type in current mvneta_rx_desc, e.g reserved5 to store the high 32bit virt address, and hack code as the following:
#ifdef CONFIG_64BITrx_desc->reserved5 = high32(data);
#endif
solution B: add one member void **buf_virt_ptrs in mvneta_rx_queue, and point all buf_cookie usage to the according buf_virt_ptrs[i]
Is there any elegant solutions?
Thanks,
Jisheng
Quoted 11 lines · On Wed, 30 Mar 2016 21:37:00 +0800 Jisheng Zhang wrote:
Hi all,
Obviously, current mvneta driver can't work on 64bit platforms. For one thing the BM feature should be explicitly disabled, I just sent out one patch for this purpose.
What's more, the
buf_cookieinmvneta_rx_descneed to be carefully considered. The driver use thebuf_cookie(u32 type)to store the buffer virtual address, obviously it can't store the virtual address on 64bit platforms. I have two solutions:
Quoted 5 lines
solution A: let one reserved type in current
mvneta_rx_desc, e.g reserved5 to store the high 32bit virt address, and hack code as the following:
#ifdefCONFIG_64BITrx_desc->reserved5= high32(data);
#endif
oh, missing some code:
#ifdef CONFIG_64BIT
data = ((u64)rx_desc->reserved5 << 32) | rx_desc->buf_cookie; #else
data = (void*)rx_desc->buf_cookie;
#endif
Quoted 14 lines
solution B: add one member void **buf_virt_ptrs in
mvneta_rx_queue, and point allbuf_cookieusage to the according buf_virt_ptrs[i]Is there any elegant solutions?
Thanks,
Jisheng_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Quoted 8 lines · On Wednesday 30 March 2016 21:45:35 Jisheng Zhang wrote:
oh, missing some code:
#ifdefCONFIG_64BIT
data = ((u64)rx_desc->reserved5 << 32) |rx_desc->buf_cookie; #else
data = (void*)rx_desc->buf_cookie;
#endif
Please use the upper_32_bits() and lower_32_bits() macros to split up the pointer into two halves, and use the 64-bit version of the code above unconditionally, that should both work on all architectures without introducing any overhead.
Arnd