I need my driver to return phys_addr_t
type value through an ioctl
call. I need to return this value through a struct which is passed through arg
. The question is what type do I use in this struct?
For example, say the following struct is passed through an arg
struct myStruct { int input1; char input2; <type> physAddr; } ; someStruct.physAddr = virt_to_phys(virtAddr);
virt_to_phys
returns a phys_addr_t
, however this type doesn’t seem to exist in any of the standard includes. So my question is what type do I need to use in user space for phys_addr_t
?
Advertisement
Answer
Under the full kernel source, in include/linux/types.h
we have:
#ifdef CONFIG_PHYS_ADDR_T_64BIT typedef u64 phys_addr_t; #else typedef u32 phys_addr_t; #endif
So, to be safe, just use u64
.
Note that this definition is removed from /usr/include/linux/types.h
.
However, if you are writing a custom utility that interacts with a custom device and its custom driver, it is okay to skip the /usr/include
versions and build directly against the version in (e.g.) /usr/src/kernel/...
).
This is not recommended for regular programs [of course]. But, if you are doing a hybrid system that has a lot of things going between the utility and the driver, you can craft it any way you’d like.
For example, a realtime hidef video encoding platform I wrote code for did this. The driver sent data to the device. The device sent data back. The data was sent to the utility/control program which modified the data and sent it back, etc. This was all done with a lot of custom ioctl
calls, so we could do whatever was required.