Why
This function takes an offset and a length as argument, not a physical address and a number of pages.
This misuse caused the set_memory_*() and arch_io_reserve_memtype_wc() functions to return EINVAL.
Another problem was the fact that they returned errors as a positive integer, whereas Linux uses negative integers.
How
Physical addresses and number of pages are converted to offset+length in the set_memory_*() functions.
arch_io_reserve_memtype_wc() now calls pmap_change_attr() directly instead of using set_memory_wc().