Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for FreeBSD on 23.4.3 #1785

Open
wants to merge 16 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -111,3 +111,31 @@ script:
make -j8
- ccache -s
- ccache -z

jobs:
include:
- os: linux
- os: freebsd
compiler: clang
before_install:
- sudo pkg install -y meson pkgconf libdrm libXext libXfixes wayland
- sudo pkg install -y -x '^mesa($|-libs)'
install:
- sudo ln -sf /usr/local/libdata/pkgconfig /usr/local/lib/
- git clone https://github.com/intel/gmmlib.git
- | # Workaround until https://github.com/intel/gmmlib/pull/68 is merged
if ! fgrep -q freebsd gmmlib/.travis.yml; then
(cd gmmlib && git fetch origin pull/68/head:freebsd && git checkout freebsd)
fi
- (cd gmmlib && cmake -B _build -G Ninja && cmake --build _build && sudo cmake --install _build)
- git clone https://github.com/intel/libva.git
- (cd libva && meson _build && meson compile -C _build && sudo meson install -C _build)
script:
- ccache -s
- ccache -z
- cmake -B _build -G Ninja
-DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache
-DBUILD_TYPE=Release -DBUILD_CMRTLIB=OFF -DMEDIA_RUN_TEST_SUITE=OFF
- cmake --build _build
- ccache -s
- ccache -z
2 changes: 1 addition & 1 deletion cmrtlib/linux/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ set(CMRT_VERSION ${CMRT_VERSION_MAJOR}.${CMRT_VERSION_MINOR}.${CMRT_VERSION_PATC

set_target_properties(igfxcmrt PROPERTIES VERSION ${CMRT_VERSION})
set_target_properties(igfxcmrt PROPERTIES SOVERSION ${CMRT_VERSION_MAJOR})
target_link_libraries( igfxcmrt dl va rt ${GCC_SECURE_LINK_FLAGS})
target_link_libraries( igfxcmrt ${CMAKE_DL_LIBS} va rt ${GCC_SECURE_LINK_FLAGS})

include(GNUInstallDirs)

Expand Down
125 changes: 5 additions & 120 deletions cmrtlib/linux/hardware/drm_device.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,21 +39,20 @@
#include <limits.h>
#include <signal.h>
#include <time.h>
#include <sys/sysmacros.h> //<sys/types.h>
#include <sys/types.h>
#include <sys/stat.h>
#define stat_t struct stat
#include <sys/ioctl.h>
#include <sys/time.h>
#include <stdarg.h>
#ifdef MAJOR_IN_MKDEV
#ifdef __sun //#ifdef MAJOR_IN_MKDEV
#include <sys/mkdev.h>
#endif
#ifdef MAJOR_IN_SYSMACROS
#if defined(__GLIBC__) || defined(__linux__) //#ifdef MAJOR_IN_SYSMACROS
#include <sys/sysmacros.h>
#endif
#include <math.h>
#include <string>
#include <cstring>

#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))

Expand Down Expand Up @@ -125,7 +124,7 @@ typedef void *drmAddress, **drmAddressPtr; /**< For mapped regions */
#define MAX3( A, B, C ) ((A) > (B) ? MAX2(A, C) : MAX2(B, C))

#define __align_mask(value, mask) (((value) + (mask)) & ~(mask))
#define ALIGN_CEIL(value, alignment) __align_mask(value, (__typeof__(value))((alignment) - 1))
#define ALIGN(value, alignment) __align_mask(value, (__typeof__(value))((alignment) - 1))
#define DRM_PLATFORM_DEVICE_NAME_LEN 512

typedef struct _drmPciBusInfo {
Expand Down Expand Up @@ -231,21 +230,6 @@ drm_device_validate_flags(uint32_t flags)
return (flags & ~DRM_DEVICE_GET_PCI_REVISION);
}

static bool
drm_device_has_rdev(drmDevicePtr device, dev_t find_rdev)
{
struct stat sbuf;

for (int i = 0; i < DRM_NODE_MAX; i++) {
if (device->available_nodes & 1 << i) {
if (stat(device->nodes[i], &sbuf) == 0 &&
sbuf.st_rdev == find_rdev)
return true;
}
}
return false;
}

static int drmGetMaxNodeName(void)
{
return sizeof(DRM_DIR_NAME) +
Expand Down Expand Up @@ -305,7 +289,7 @@ static drmDevicePtr drmDeviceAlloc(unsigned int type, const char *node,
unsigned int i;
char *ptr;

max_node_length = ALIGN_CEIL(drmGetMaxNodeName(), sizeof(void *));
max_node_length = ALIGN(drmGetMaxNodeName(), sizeof(void *));

extra = DRM_NODE_MAX * (sizeof(void *) + max_node_length);

Expand Down Expand Up @@ -1205,105 +1189,6 @@ int drmGetDevices(drmDevicePtr devices[], int max_devices)
return drmGetDevices2(DRM_DEVICE_GET_PCI_REVISION, devices, max_devices);
}

/**
* Get information about the opened drm device
*
* \param fd file descriptor of the drm device
* \param flags feature/behaviour bitmask
* \param device the address of a drmDevicePtr where the information
* will be allocated in stored
*
* \return zero on success, negative error code otherwise.
*
* \note Unlike drmGetDevice it does not retrieve the pci device revision field
* unless the DRM_DEVICE_GET_PCI_REVISION \p flag is set.
*/
int drmGetDevice2(int fd, uint32_t flags, drmDevicePtr *device)
{
drmDevicePtr local_devices[MAX_DRM_NODES];
drmDevicePtr d;
DIR *sysdir;
struct dirent *dent;
struct stat sbuf;
int subsystem_type;
int maj, min;
int ret, i, node_count;
dev_t find_rdev;

if (drm_device_validate_flags(flags))
return -EINVAL;

if (fd == -1 || device == NULL)
return -EINVAL;

if (fstat(fd, &sbuf))
return -errno;

find_rdev = sbuf.st_rdev;
maj = major(sbuf.st_rdev);
min = minor(sbuf.st_rdev);

if (!drmNodeIsDRM(maj, min) || !S_ISCHR(sbuf.st_mode))
return -EINVAL;

subsystem_type = drmParseSubsystemType(maj, min);
if (subsystem_type < 0)
return subsystem_type;

sysdir = opendir(DRM_DIR_NAME);
if (!sysdir)
return -errno;

i = 0;
while ((dent = readdir(sysdir))) {
ret = process_device(&d, dent->d_name, subsystem_type, true, flags);
if (ret)
continue;

if (i >= MAX_DRM_NODES) {
fprintf(stderr, "More than %d drm nodes detected. "
"Please report a bug - that should not happen.\n"
"Skipping extra nodes\n", MAX_DRM_NODES);
break;
}
local_devices[i] = d;
i++;
}
node_count = i;

drmFoldDuplicatedDevices(local_devices, node_count);

*device = NULL;

for (i = 0; i < node_count; i++) {
if (!local_devices[i])
continue;

if (drm_device_has_rdev(local_devices[i], find_rdev))
*device = local_devices[i];
else
drmFreeDevice(&local_devices[i]);
}

closedir(sysdir);
if (*device == NULL)
return -ENODEV;
return 0;
}

/**
* Get information about the opened drm device
*
* \param fd file descriptor of the drm device
* \param device the address of a drmDevicePtr where the information
* will be allocated in stored
*
* \return zero on success, negative error code otherwise.
*/
int drmGetDevice(int fd, drmDevicePtr *device)
{
return drmGetDevice2(fd, DRM_DEVICE_GET_PCI_REVISION, device);
}

static int32_t GetRendererFileDescriptor(char * drm_node)
{
Expand Down
6 changes: 3 additions & 3 deletions cmrtlib/linux/share/cm_def_os.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,15 @@
#define Display unsigned int
#endif

#include <cstdlib>
#include <cstring>
#include "pthread.h"
#include <malloc.h>


////////////////////////////////////////////////////////////////////////////////////
// MS-specific defines/typedefs, which are absent under Linux but still used
////////////////////////////////////////////////////////////////////////////////////
#define _aligned_malloc(size, alignment) memalign(alignment, size)
#define _aligned_malloc(size, alignment) aligned_alloc(alignment, size)
#define _aligned_free(ptr) free(ptr)
typedef uint8_t BOOLEAN, *PBOOLEAN;
////////////////////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -101,7 +101,7 @@ typedef enum _VACMTEXTUREFILTERTYPE {

inline void * CM_ALIGNED_MALLOC(size_t size, size_t alignment)
{
return memalign(alignment, size);
return aligned_alloc(alignment, size);
}

inline void CM_ALIGNED_FREE(void * memory)
Expand Down
3 changes: 1 addition & 2 deletions cmrtlib/linux/share/cm_rt_def_os.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@
#include <stdlib.h>
#include <stdint.h>
#include <math.h>
#include <malloc.h>
#include <string.h>
#include <sys/time.h>
#include <pthread.h>
Expand Down Expand Up @@ -175,7 +174,7 @@ template<> inline const char * CM_TYPE_NAME_UNMANGLED<double>() { return "double

inline void * CM_ALIGNED_MALLOC(size_t size, size_t alignment)
{
return memalign(alignment, size);
return aligned_alloc(alignment, size);
}

inline void CM_ALIGNED_FREE(void * memory)
Expand Down
1 change: 0 additions & 1 deletion media_driver/agnostic/ult/cm/buffer_up_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
*/

#include "cm_test.h"
#include <malloc.h>

class BufferUPTest: public CmTest
{
Expand Down
1 change: 0 additions & 1 deletion media_driver/cmake/linux/media_compile_flags_linux.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,6 @@ endif()
if(NOT ${PLATFORM} STREQUAL "android")
set(MEDIA_COMPILER_FLAGS_COMMON
${MEDIA_COMPILER_FLAGS_COMMON}
-D__linux__
-fno-tree-pre
-fPIC
-Wl,--no-as-needed
Expand Down
21 changes: 21 additions & 0 deletions media_driver/linux/common/cm/hal/cm_innerdef_os.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,15 @@
#include "mos_os.h"
#include "media_libva_common.h"
#include <sys/types.h>
#if defined(__linux__)
#include <sys/syscall.h>
#elif defined(__DragonFly__) || defined(__FreeBSD__)
#include <pthread_np.h>
#elif defined(__NetBSD__)
#include <lwp.h>
#elif defined(__sun)
#include <thread.h>
#endif
#include <unistd.h>


Expand Down Expand Up @@ -86,5 +94,18 @@ inline void GetLocalTime(PSYSTEMTIME psystime)
#endif

#define CmGetCurProcessId() getpid()
#if defined(__linux__)
#define CmGetCurThreadId() syscall(SYS_gettid)
#elif defined(__DragonFly__) || defined(__FreeBSD__)
#define CmGetCurThreadId() pthread_getthreadid_np()
#elif defined(__NetBSD__)
#define CmGetCurThreadId() _lwp_self()
#elif defined(__OpenBSD__)
#define CmGetCurThreadId() getthrid()
#elif defined(__sun)
#define CmGetCurThreadId() thr_self()
#else
#warning "Cannot get kernel thread identifier on this platform."
#define CmGetCurThreadId() (uintptr_t)pthread_self()
#endif

3 changes: 3 additions & 0 deletions media_driver/linux/common/cm/hal/osservice/cm_mem_os.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@
#include <smmintrin.h>

typedef uintptr_t UINT_PTR;
#ifdef __fastcall
#undef __fastcall
#endif
#define __fastcall
#define __noop

Expand Down
37 changes: 35 additions & 2 deletions media_driver/linux/common/codec/ddi/media_libva_decoder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,40 @@
#include <X11/Xutil.h>
#endif

#if defined(__linux__)
#include <linux/fb.h>
#define DEFAULT_FBDEV "/dev/graphics/fb0"
#elif defined(__DragonFly__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__sun)
#include <sys/fbio.h>
# if defined(__sun)
#define DEFAULT_FBDEV "/dev/fb"
# else
#define DEFAULT_FBDEV "/dev/ttyv0"
# endif
#define FBIOGET_VSCREENINFO FBIOGTYPE
#define fb_var_screeninfo fbtype
#define xres fb_width
#define yres fb_height
#elif defined(__NetBSD__) || defined(__OpenBSD__)
#include <dev/wscons/wsconsio.h>
# if defined(__OpenBSD__)
#define DEFAULT_FBDEV "/dev/ttyC0"
# else
#define DEFAULT_FBDEV "/dev/ttyE0"
# endif
#define FBIOGET_VSCREENINFO WSDISPLAYIO_GINFO
#define fb_var_screeninfo wsdisplay_fbinfo
#define xres width
#define yres height
#else
#warning "Cannot query framebuffer properties on this platform."
#define DEFAULT_FBDEV "/dev/fb0"
#define FBIOGET_VSCREENINFO 0
struct fb_var_screeninfo {
uint32_t xres;
uint32_t yres;
};
#endif

typedef MediaDdiFactory<DdiMediaDecode, DDI_DECODE_CONFIG_ATTR> DdiDecodeFactory;

Expand All @@ -64,8 +97,8 @@ static int32_t DdiDecode_GetDisplayInfo(VADriverContextP ctx)
vsinfo.xres = 0;
vsinfo.yres = 0;

fd = open("/dev/graphics/fb0",O_RDONLY);
if(fd >= 0)
fd = open(DEFAULT_FBDEV,O_RDONLY);
if(fd > 0)
{
if(ioctl(fd, FBIOGET_VSCREENINFO, &vsinfo) < 0)
{
Expand Down
2 changes: 0 additions & 2 deletions media_driver/linux/common/ddi/media_libva.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,6 @@
#include <X11/Xutil.h>
#endif

#include <linux/fb.h>

#include "media_libva.h"

#include "media_libva_util.h"
Expand Down
7 changes: 4 additions & 3 deletions media_driver/linux/ult/libdrm_mock/xf86drm_mock.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,16 +47,17 @@
#include <signal.h>
#include <time.h>
#include <sys/types.h>
#include <sys/sysmacros.h>
#include <sys/stat.h>
#define stat_t struct stat
#include <sys/ioctl.h>
#include <sys/time.h>
#include <stdarg.h>
#ifdef HAVE_SYS_MKDEV_H
#ifdef __sun //#ifdef MAJOR_IN_MKDEV
# include <sys/mkdev.h> /* defines major(), minor(), and makedev() on Solaris */
#endif
#include <sys/sysmacros.h>
#if defined(__GLIBC__) || defined(__linux__) //#ifdef MAJOR_IN_SYSMACROS
# include <sys/sysmacros.h>
#endif

/* Not all systems have MAP_FAILED defined */
#ifndef MAP_FAILED
Expand Down
Loading