The warning is, as it states, conversion to and from pointers is not necessarily portable. So for example in ARM architectures, pointers need to be aligned, so $xyz0 is a valid pointer while $xyz1 is not.
This is why fpc throws a warning when you cast between those types.
The problem here is a different one, IOCTL can be implemented by many drivers, using different kinds of data (as long as its the size of a pointer), some need pointers, others need integers. This is why the C binding of IOCTL is:
int ioctl(int fd, unsigned long op, ...);
Note that it uses varargs to enable this format agnostic implementation. The FPC binding on the other hand is:
function FpIOCtl(Handle: cint; Ndx: TIOCtlRequest; Data: Pointer): cint;
Which always takes a pointer, under the assumption that you can just cast your type to pointer.
The Problem here is not the warning, but rather the FPC binding not covering other types, like the C binding does
The reason why the waning is only with a variable, I would assume is because with constants the compiler can check if it is a valid pointer for the target platform, while with a variable, it does not know at compiletime if it is valid or not. But thats just a theory