Re: graphics/drm-61-kmod build failure for main-n276560-83dcc133c876

From: Rainer Hurling <rhurlin_at_gwdg.de>
Date: Sun, 20 Apr 2025 08:13:09 UTC
Am 19.04.25 um 16:02 schrieb Mark Johnston:
> On Sat, Apr 19, 2025 at 06:06:59AM -0700, David Wolfskill wrote:
>> Running:
>> FreeBSD g1-118.catwhisker.org 15.0-CURRENT FreeBSD 15.0-CURRENT #445 main-n276537-7121e9414f29: Fri Apr 18 12:36:30 UTC 2025     root@g1-120.catwhisker.org:/common/S4/obj/usr/src/amd64.amd64/sys/CANARY amd64
>>
>> after updating sources to main-n276560-83dcc133c876, with a ports tree
>> at main-n703265-33b43edfb65d, I find:
>>
>> ...
>> --- i915_gem_mman.o ---
>> /common/S4/obj/usr/src/amd64.amd64/sys/CANARY/common/ports/graphics/drm-61-kmod/work/drm-kmod-drm_v6.1.128_1/drivers/gpu/drm/i915/gem/i915_gem_mman.c:171:77: error: call to undeclared function 'vm_page_next'; ISO C99 and later do not support implicit function declarations [-Werror,-Wimplicit-function-declaration]
>>    171 |                         for (vm_page_t page = vm_page_find_least(vmobj, 0); page != NULL; page = vm_page_next(page)) {
>>        |                                                                                                  ^
>> /common/S4/obj/usr/src/amd64.amd64/sys/CANARY/common/ports/graphics/drm-61-kmod/work/drm-kmod-drm_v6.1.128_1/drivers/gpu/drm/i915/gem/i915_gem_mman.c:171:75: error: incompatible integer to pointer conversion assigning to 'vm_page_t' (aka 'struct vm_page *') from 'int' [-Wint-conversion]
>>    171 |                         for (vm_page_t page = vm_page_find_least(vmobj, 0); page != NULL; page = vm_page_next(page)) {
>>        |                                                                                                ^ ~~~~~~~~~~~~~~~~~~
>> 2 errors generated.
>> *** [i915_gem_mman.o] Error code 1
>>
>> make[1]: stopped making "all" in /common/S4/obj/usr/src/amd64.amd64/sys/CANARY/common/ports/graphics/drm-61-kmod/work/drm-kmod-drm_v6.1.128_1/i915
>> make[1]: 1 error
>> [end of excerpt from typescript -- dhw]
>>
>> This is using METAMODE (as I've done for ages, now); unfortunately:
>>
>> .ERROR_TARGET='all'
>> .ERROR_META_FILE=''
>> .MAKE.LEVEL='2'
>> MAKEFILE=''
>>
>> so not much to be gained there (that I can see).
> 
> Something like the following diff is needed.  It needs to be built
> against the latest main, where __FreeBSD_version is bumped.
> 
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_mman.c b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
> index 2a9946c7d0..f61eeefe7a 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_mman.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
> @@ -34,6 +34,7 @@
>   #include <vm/vm_object.h>
>   #include <vm/vm_pager.h>
>   #include <vm/vm_param.h>
> +#include <vm/vm_radix.h>
>   #endif
>   
>   #ifdef __linux__ /* Mute unused function warning. */
> @@ -168,9 +169,16 @@ i915_gem_mmap_ioctl(struct drm_device *dev, void *data,
>   	if ((rv == KERN_SUCCESS) && (args->flags & I915_MMAP_WC)) {
>   		VM_OBJECT_WLOCK(vmobj);
>   		if (vm_object_set_memattr(vmobj, VM_MEMATTR_WRITE_COMBINING) != KERN_SUCCESS) {
> -			for (vm_page_t page = vm_page_find_least(vmobj, 0); page != NULL; page = vm_page_next(page)) {
> +#if __FreeBSD_version >= 1500038
> +			struct pctrie_iter pages;
> +			vm_page_t page;
> +
> +			vm_page_iter_init(&pages, vmobj);
> +			VM_RADIX_FORALL(page, &pages)
> +#else
> +			for (vm_page_t page = vm_page_find_least(vmobj, 0); page != NULL; page = vm_page_next(page))
> +#endif
>   				pmap_page_set_memattr(page, VM_MEMATTR_WRITE_COMBINING);
> -			}
>   		}
>   		VM_OBJECT_WUNLOCK(vmobj);
>   	}
> 

As expected, this error also happens with graphics/drm-66-kmod
:

===> i915 (all)
cc  -O2 -pipe -fno-strict-aliasing -DLINUXKPI_VERSION=60600 
'-DKBUILD_MODNAME="i915kms"' '-DLINUXKPI_PARAM_PREFIX=i915_' 
-DDRM_SYSCTL_PARAM_PREFIX=_i915kms -DCONFIG_DRM_AMDGPU_CIK 
-DCONFIG_DRM_AMDGPU_SI -DCONFIG_DRM_AMD_DC -DCONFIG_DRM_AMD_DC_SI 
-DCONFIG_AMD_PMC -DCONFIG_DRM_EXEC -DCONFIG_DRM_I915_FORCE_PROBE='"*"' 
-DCONFIG_DRM_I915_REQUEST_TIMEOUT=20000 -DCONFIG_DRM_I915_CAPTURE_ERROR 
-DCONFIG_DRM_I915_USERFAULT_AUTOSUSPEND=250 
-DCONFIG_DRM_I915_STOP_TIMEOUT=100 -DCONFIG_DRM_I915_PREEMPT_TIMEOUT=640 
-DCONFIG_DRM_I915_PREEMPT_TIMEOUT_COMPUTE=7500 
-DCONFIG_DRM_I915_HEARTBEAT_INTERVAL=2500 
-DCONFIG_DRM_I915_TIMESLICE_DURATION=1 
-DCONFIG_DRM_I915_MAX_REQUEST_BUSYWAIT=8000 
-DCONFIG_DRM_I915_FENCE_TIMEOUT=10000 -DCONFIG_DRM_MIPI_DSI 
-DCONFIG_DRM_PANEL_ORIENTATION_QUIRKS -DCONFIG_APERTURE_HELPERS 
-DCONFIG_DRM_FBDEV_EMULATION -DCONFIG_DRM_FBDEV_OVERALLOC=100 
-DCONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG -DCONFIG_BACKLIGHT_CLASS_DEVICE 
-DCONFIG_DEBUG_FS -DCONFIG_DMI -DCONFIG_FB -DCONFIG_MTRR -DCONFIG_PCI 
-DCONFIG_PM -DCONFIG_PM_SLEEP -DCONFIG_SMP -DCONFIG_SUSPEND 
-DCONFIG_VIDEO_CMDLINE -DCONFIG_ACPI -DCONFIG_ACPI_SLEEP -DCONFIG_X86 
-DCONFIG_X86_PAT -DCONFIG_64BIT -DCONFIG_AS_MOVNTDQA -DCONFIG_COMPAT 
-DCONFIG_X86_64 -DCONFIG_DRM_AMD_DC_FP  -Werror -D_KERNEL -DKLD_MODULE 
-nostdinc 
-I/usr/ports/graphics/drm-66-kmod/work/drm-kmod-drm_v6.6.25_2/linuxkpi/gplv2/include 
-I/usr/ports/graphics/drm-66-kmod/work/drm-kmod-drm_v6.6.25_2/linuxkpi/bsd/include 
-I/usr/src/sys/compat/linuxkpi/common/include 
-I/usr/src/sys/compat/linuxkpi/dummy/include 
-I/usr/ports/graphics/drm-66-kmod/work/drm-kmod-drm_v6.6.25_2/include 
-I/usr/ports/graphics/drm-66-kmod/work/drm-kmod-drm_v6.6.25_2/include/drm 
-I/usr/ports/graphics/drm-66-kmod/work/drm-kmod-drm_v6.6.25_2/include/uapi 
-I/usr/ports/graphics/drm-66-kmod/work/drm-kmod-drm_v6.6.25_2/drivers/gpu 
-I/usr/ports/graphics/drm-66-kmod/work/drm-kmod-drm_v6.6.25_2/drivers/gpu/drm/i915 
-I/usr/ports/graphics/drm-66-kmod/work/drm-kmod-drm_v6.6.25_2/drivers/gpu/drm/i915/display 
-include 
/usr/ports/graphics/drm-66-kmod/work/drm-kmod-drm_v6.6.25_2/obj/usr/ports/graphics/drm-66-kmod/work/drm-kmod-drm_v6.6.25_2/i915/opt_global.h 
-I. -I/usr/src/sys -I/usr/src/sys/contrib/ck/include -fno-common 
-fno-omit-frame-pointer -mno-omit-leaf-frame-pointer 
-fdebug-prefix-map=./machine=/usr/src/sys/amd64/include 
-fdebug-prefix-map=./x86=/usr/src/sys/x86/include 
-fdebug-prefix-map=./i386=/usr/src/sys/i386/include    -MD 
-MF.depend.i915_gem_mman.o -MTi915_gem_mman.o -mcmodel=kernel 
-mno-red-zone -mno-mmx -mno-sse -msoft-float 
-fno-asynchronous-unwind-tables -ffreestanding -fwrapv -fstack-protector 
  -Wall -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith 
-Wcast-qual -Wundef -Wno-pointer-sign -D__printf__=__freebsd_kprintf__ 
-Wmissing-include-dirs -fdiagnostics-show-option -Wno-unknown-pragmas 
-Wswitch -Wno-error=tautological-compare -Wno-error=empty-body 
-Wno-error=parentheses-equality -Wno-error=unused-function 
-Wno-error=pointer-sign -Wno-error=shift-negative-value 
-Wno-address-of-packed-member -Wno-format-zero-length -Wno-pointer-arith 
-Wno-format -Wno-cast-qual -Wno-unused-but-set-variable  -mno-aes 
-mno-avx  -std=gnu17 -c 
/usr/ports/graphics/drm-66-kmod/work/drm-kmod-drm_v6.6.25_2/drivers/gpu/drm/i915/gem/i915_gem_mman.c 
-o i915_gem_mman.o
/usr/ports/graphics/drm-66-kmod/work/drm-kmod-drm_v6.6.25_2/drivers/gpu/drm/i915/gem/i915_gem_mman.c:171:77: 
error: call to undeclared function 'vm_page_next'; ISO C99 and later do 
not support implicit function declarations 
[-Werror,-Wimplicit-function-declaration]
   171 |                         for (vm_page_t page = 
vm_page_find_least(vmobj, 0); page != NULL; page = vm_page_next(page)) {
       | 
                                  ^
/usr/ports/graphics/drm-66-kmod/work/drm-kmod-drm_v6.6.25_2/drivers/gpu/drm/i915/gem/i915_gem_mman.c:171:75: 
error: incompatible integer to pointer conversion assigning to 
'vm_page_t' (aka 'struct vm_page *') from 'int' [-Wint-conversion]
   171 |                         for (vm_page_t page = 
vm_page_find_least(vmobj, 0); page != NULL; page = vm_page_next(page)) {
       | 
                                ^ ~~~~~~~~~~~~~~~~~~
2 errors generated.
*** Error code 1

Stop.
make[1]: stopped making "all" in 
/usr/ports/graphics/drm-66-kmod/work/drm-kmod-drm_v6.6.25_2/i915


The patch from Mark also applies for drm-66-kmod, builds and installs 
fine. Many thanks!