PHYS_TO_VM_PAGE() function looks up a page in more segments, but first_page is connected only to the segment associated with vm_page_array. There could be more dynamically created segments for fictitious pages.
Probably, it's not so big problem on architectures where RAM physical address starts from zero. However, it's not a case for many ARM platforms.
On the other hand, AFAIK, fictitious pages under pv management are used only in new drm code.