diff options
author | Harish Mahendrakar <harish.mahendrakar@ittiam.com> | 2022-10-28 09:35:55 -0700 |
---|---|---|
committer | Harish Mahendrakar <harish.mahendrakar@ittiam.com> | 2022-11-12 15:35:39 +0000 |
commit | d99d3d4df731dd71a8dd81b6ccff8c61534d9298 (patch) | |
tree | 22b3437fd8be35a1290fe3715de8e22d07aeaeb4 /vpx_ports/ppc_cpudetect.c | |
parent | f6dd3412d59449abed97e9d5ec938c88f98f0ae3 (diff) | |
download | libvpx-d99d3d4df731dd71a8dd81b6ccff8c61534d9298.tar.gz |
Move libvpx/* to *
This is needed to get the folder structure to be in sync with main
branch of upstream project.
Except the changes in Android.bp and generate_config.sh
(as per the new folder structure), all other changes in this CL
are due to files being moved without any changes in the code.
Bug: 256050947
Test: Builds
Change-Id: Ic62f7b1bd28cc0d2d84c8cb8c6a0062ac7fb68af
Diffstat (limited to 'vpx_ports/ppc_cpudetect.c')
-rw-r--r-- | vpx_ports/ppc_cpudetect.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/vpx_ports/ppc_cpudetect.c b/vpx_ports/ppc_cpudetect.c new file mode 100644 index 000000000..374a0271c --- /dev/null +++ b/vpx_ports/ppc_cpudetect.c @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2017 The WebM project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include <fcntl.h> +#include <unistd.h> +#include <stdint.h> +#include <asm/cputable.h> +#include <linux/auxvec.h> + +#include "./vpx_config.h" +#include "vpx_ports/ppc.h" + +#if CONFIG_RUNTIME_CPU_DETECT +static int cpu_env_flags(int *flags) { + char *env; + env = getenv("VPX_SIMD_CAPS"); + if (env && *env) { + *flags = (int)strtol(env, NULL, 0); + return 0; + } + *flags = 0; + return -1; +} + +static int cpu_env_mask(void) { + char *env; + env = getenv("VPX_SIMD_CAPS_MASK"); + return env && *env ? (int)strtol(env, NULL, 0) : ~0; +} + +int ppc_simd_caps(void) { + int flags; + int mask; + int fd; + ssize_t count; + unsigned int i; + uint64_t buf[64]; + + // If VPX_SIMD_CAPS is set then allow only those capabilities. + if (!cpu_env_flags(&flags)) { + return flags; + } + + mask = cpu_env_mask(); + + fd = open("/proc/self/auxv", O_RDONLY); + if (fd < 0) { + return 0; + } + + while ((count = read(fd, buf, sizeof(buf))) > 0) { + for (i = 0; i < (count / sizeof(*buf)); i += 2) { + if (buf[i] == AT_HWCAP) { +#if HAVE_VSX + if (buf[i + 1] & PPC_FEATURE_HAS_VSX) { + flags |= HAS_VSX; + } +#endif // HAVE_VSX + goto out_close; + } else if (buf[i] == AT_NULL) { + goto out_close; + } + } + } +out_close: + close(fd); + return flags & mask; +} +#else +// If there is no RTCD the function pointers are not used and can not be +// changed. +int ppc_simd_caps(void) { return 0; } +#endif // CONFIG_RUNTIME_CPU_DETECT |