Module Name: src Committed By: riastradh Date: Sun Dec 19 11:36:57 UTC 2021
Modified Files: src/sys/external/bsd/drm2/dist/drm/i915: i915_perf.c i915_perf_types.h src/sys/external/bsd/drm2/drm: drm_sysctl.c src/sys/external/bsd/drm2/include/linux: hrtimer.h math64.h ratelimit.h uuid.h Log Message: i915: Adapt i915_perf.c. To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/sys/external/bsd/drm2/dist/drm/i915/i915_perf.c cvs rdiff -u -r1.5 -r1.6 \ src/sys/external/bsd/drm2/dist/drm/i915/i915_perf_types.h cvs rdiff -u -r1.7 -r1.8 src/sys/external/bsd/drm2/drm/drm_sysctl.c cvs rdiff -u -r1.4 -r1.5 src/sys/external/bsd/drm2/include/linux/hrtimer.h \ src/sys/external/bsd/drm2/include/linux/ratelimit.h cvs rdiff -u -r1.10 -r1.11 src/sys/external/bsd/drm2/include/linux/math64.h cvs rdiff -u -r1.2 -r1.3 src/sys/external/bsd/drm2/include/linux/uuid.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_perf.c diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_perf.c:1.4 src/sys/external/bsd/drm2/dist/drm/i915/i915_perf.c:1.5 --- src/sys/external/bsd/drm2/dist/drm/i915/i915_perf.c:1.4 Sun Dec 19 11:33:49 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/i915_perf.c Sun Dec 19 11:36:56 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_perf.c,v 1.4 2021/12/19 11:33:49 riastradh Exp $ */ +/* $NetBSD: i915_perf.c,v 1.5 2021/12/19 11:36:56 riastradh Exp $ */ /* * Copyright © 2015-2016 Intel Corporation @@ -194,7 +194,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_perf.c,v 1.4 2021/12/19 11:33:49 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_perf.c,v 1.5 2021/12/19 11:36:56 riastradh Exp $"); #include <linux/anon_inodes.h> #include <linux/sizes.h> @@ -225,7 +225,12 @@ __KERNEL_RCSID(0, "$NetBSD: i915_perf.c, #include "oa/i915_oa_icl.h" #include "oa/i915_oa_tgl.h" +#ifdef __NetBSD__ +#include <sys/filedesc.h> +#include <sys/poll.h> +#include <sys/select.h> #include <linux/nbsd-namespace.h> +#endif /* HW requires this to be a power of two, between 128k and 16M, though driver * is currently generally designed assuming the largest 16M size is used such @@ -394,7 +399,9 @@ struct i915_oa_config_bo { struct i915_vma *vma; }; +#ifndef __NetBSD__ /* XXX i915 perf sysctl */ static struct ctl_table_header *sysctl_header; +#endif static enum hrtimer_restart oa_poll_check_timer_cb(struct hrtimer *hrtimer); @@ -458,7 +465,7 @@ static u32 gen7_oa_hw_tail_read(struct i } /** - * oa_buffer_check_unlocked - check for data and update tail ptr state + * oa_buffer_check - check for data and update tail ptr state * @stream: i915 stream instance * * This is either called via fops (for blocking reads in user ctx) or the poll @@ -481,10 +488,9 @@ static u32 gen7_oa_hw_tail_read(struct i * * Returns: %true if the OA buffer contains data, else %false */ -static bool oa_buffer_check_unlocked(struct i915_perf_stream *stream) +static bool oa_buffer_check(struct i915_perf_stream *stream) { int report_size = stream->oa_buffer.format_size; - unsigned long flags; unsigned int aged_idx; u32 head, hw_tail, aged_tail, aging_tail; u64 now; @@ -493,7 +499,6 @@ static bool oa_buffer_check_unlocked(str * could result in an OA buffer reset which might reset the head, * tails[] and aged_tail state. */ - spin_lock_irqsave(&stream->oa_buffer.ptr_lock, flags); /* NB: The head we observe here might effectively be a little out of * date (between head and tails[aged_idx].offset if there is currently @@ -567,8 +572,6 @@ static bool oa_buffer_check_unlocked(str } } - spin_unlock_irqrestore(&stream->oa_buffer.ptr_lock, flags); - return aged_tail == INVALID_TAIL_PTR ? false : OA_TAKEN(aged_tail, head) >= report_size; } @@ -589,13 +592,23 @@ static bool oa_buffer_check_unlocked(str * Returns: 0 on success, negative error code on failure. */ static int append_oa_status(struct i915_perf_stream *stream, +#ifdef __NetBSD__ + struct uio *buf, + kauth_cred_t count, /* XXX dummy */ + int offset, /* XXX dummy */ +#else char __user *buf, size_t count, size_t *offset, +#endif enum drm_i915_perf_record_type type) { struct drm_i915_perf_record_header header = { type, 0, sizeof(header) }; +#ifdef __NetBSD__ + /* XXX errno NetBSD->Linux */ + return -uiomove(&header, sizeof(header), buf); +#else if ((count - *offset) < header.size) return -ENOSPC; @@ -605,6 +618,7 @@ static int append_oa_status(struct i915_ (*offset) += header.size; return 0; +#endif } /** @@ -625,9 +639,15 @@ static int append_oa_status(struct i915_ * Returns: 0 on success, negative error code on failure. */ static int append_oa_sample(struct i915_perf_stream *stream, +#ifdef __NetBSD__ + struct uio *buf, + kauth_cred_t count, /* XXX dummy */ + int offset, /* XXX dummy */ +#else char __user *buf, size_t count, size_t *offset, +#endif const u8 *report) { int report_size = stream->oa_buffer.format_size; @@ -638,6 +658,12 @@ static int append_oa_sample(struct i915_ header.pad = 0; header.size = stream->sample_size; +#ifdef __NetBSD__ + /* XXX errno NetBSD->Linux */ + int ret = -uiomove(&header, sizeof(header), buf); + if (ret) + return ret; +#else if ((count - *offset) < header.size) return -ENOSPC; @@ -645,13 +671,22 @@ static int append_oa_sample(struct i915_ if (copy_to_user(buf, &header, sizeof(header))) return -EFAULT; buf += sizeof(header); +#endif if (sample_flags & SAMPLE_OA_REPORT) { +#ifdef __NetBSD__ + ret = -uiomove(__UNCONST(report), report_size, buf); + if (ret) + return ret; +#else if (copy_to_user(buf, report, report_size)) return -EFAULT; +#endif } +#ifndef __NetBSD__ /* done by uiomove */ (*offset) += header.size; +#endif return 0; } @@ -676,17 +711,28 @@ static int append_oa_sample(struct i915_ * * Returns: 0 on success, negative error code on failure. */ +#ifdef __NetBSD__ +static int gen8_append_oa_reports(struct i915_perf_stream *stream, + struct uio *buf, + kauth_cred_t count, /* XXX dummy */ + int offset) /* XXX dummy */ +#else static int gen8_append_oa_reports(struct i915_perf_stream *stream, char __user *buf, size_t count, size_t *offset) +#endif { struct intel_uncore *uncore = stream->uncore; int report_size = stream->oa_buffer.format_size; u8 *oa_buf_base = stream->oa_buffer.vaddr; u32 gtt_offset = i915_ggtt_offset(stream->oa_buffer.vma); u32 mask = (OA_BUFFER_SIZE - 1); +#ifdef __NetBSD__ + size_t start_offset = buf->uio_offset; +#else size_t start_offset = *offset; +#endif unsigned long flags; unsigned int aged_tail_idx; u32 head, tail; @@ -850,7 +896,12 @@ static int gen8_append_oa_reports(struct report32[0] = 0; } - if (start_offset != *offset) { +#ifdef __NetBSD__ + if (start_offset != buf->uio_offset) +#else + if (start_offset != *offset) +#endif + { i915_reg_t oaheadptr; oaheadptr = IS_GEN(stream->perf->i915, 12) ? @@ -893,10 +944,17 @@ static int gen8_append_oa_reports(struct * * Returns: zero on success or a negative error code */ +#ifdef __NetBSD__ +static int gen8_oa_read(struct i915_perf_stream *stream, + struct uio *buf, + kauth_cred_t count, /* XXX dummy */ + int offset) /* XXX dummy */ +#else static int gen8_oa_read(struct i915_perf_stream *stream, char __user *buf, size_t count, size_t *offset) +#endif { struct intel_uncore *uncore = stream->uncore; u32 oastatus; @@ -976,17 +1034,28 @@ static int gen8_oa_read(struct i915_perf * * Returns: 0 on success, negative error code on failure. */ +#ifdef __NetBSD__ +static int gen7_append_oa_reports(struct i915_perf_stream *stream, + struct uio *buf, + kauth_cred_t count, /* XXX dummy */ + int offset) /* XXX dummy */ +#else static int gen7_append_oa_reports(struct i915_perf_stream *stream, char __user *buf, size_t count, size_t *offset) +#endif { struct intel_uncore *uncore = stream->uncore; int report_size = stream->oa_buffer.format_size; u8 *oa_buf_base = stream->oa_buffer.vaddr; u32 gtt_offset = i915_ggtt_offset(stream->oa_buffer.vma); u32 mask = (OA_BUFFER_SIZE - 1); +#ifdef __NetBSD__ + size_t start_offset = buf->uio_offset; +#else size_t start_offset = *offset; +#endif unsigned long flags; unsigned int aged_tail_idx; u32 head, tail; @@ -1073,7 +1142,12 @@ static int gen7_append_oa_reports(struct report32[0] = 0; } - if (start_offset != *offset) { +#ifdef __NetBSD__ + if (start_offset != buf->uio_offset) +#else + if (start_offset != *offset) +#endif + { spin_lock_irqsave(&stream->oa_buffer.ptr_lock, flags); /* We removed the gtt_offset for the copy loop above, indexing @@ -1108,10 +1182,17 @@ static int gen7_append_oa_reports(struct * * Returns: zero on success or a negative error code */ +#ifdef __NetBSD__ +static int gen7_oa_read(struct i915_perf_stream *stream, + struct uio *buf, + kauth_cred_t count, /* XXX dummy */ + int offset) /* XXX dummy */ +#else static int gen7_oa_read(struct i915_perf_stream *stream, char __user *buf, size_t count, size_t *offset) +#endif { struct intel_uncore *uncore = stream->uncore; u32 oastatus1; @@ -1192,12 +1273,19 @@ static int gen7_oa_read(struct i915_perf */ static int i915_oa_wait_unlocked(struct i915_perf_stream *stream) { + unsigned long flags; + int ret; + /* We would wait indefinitely if periodic sampling is not enabled */ if (!stream->periodic) return -EIO; - return wait_event_interruptible(stream->poll_wq, - oa_buffer_check_unlocked(stream)); + spin_lock_irqsave(&stream->oa_buffer.ptr_lock, flags); + DRM_SPIN_WAIT_UNTIL(ret, &stream->poll_wq, &stream->oa_buffer.ptr_lock, + oa_buffer_check(stream)); + spin_unlock_irqrestore(&stream->oa_buffer.ptr_lock, flags); + + return ret; } /** @@ -1210,12 +1298,14 @@ static int i915_oa_wait_unlocked(struct * this starts a poll_wait with the wait queue that our hrtimer callback wakes * when it sees data ready to read in the circular OA buffer. */ +#ifndef __NetBSD__ static void i915_oa_poll_wait(struct i915_perf_stream *stream, struct file *file, poll_table *wait) { poll_wait(file, &stream->poll_wq, wait); } +#endif /** * i915_oa_read - just calls through to &i915_oa_ops->read @@ -1229,10 +1319,17 @@ static void i915_oa_poll_wait(struct i91 * * Returns: zero on success or a negative error code */ +#ifdef __NetBSD__ +static int i915_oa_read(struct i915_perf_stream *stream, + struct uio *buf, + kauth_cred_t count, /* XXX dummy */ + int offset) /* XXX dummy */ +#else static int i915_oa_read(struct i915_perf_stream *stream, char __user *buf, size_t count, size_t *offset) +#endif { return stream->perf->ops.read(stream, buf, count, offset); } @@ -1395,6 +1492,11 @@ static void i915_oa_stream_destroy(struc BUG_ON(stream != perf->exclusive_stream); + spin_lock_destroy(&stream->oa_buffer.ptr_lock); + seldestroy(&stream->poll_selq); + DRM_DESTROY_WAITQUEUE(&stream->poll_wq); + hrtimer_cancel(&stream->poll_check_timer); + /* * Unset exclusive_stream first, it will be checked while disabling * the metric set on gen8+. @@ -2699,7 +2801,9 @@ static const struct i915_perf_stream_ops .enable = i915_oa_stream_enable, .disable = i915_oa_stream_disable, .wait_unlocked = i915_oa_wait_unlocked, +#ifndef __NetBSD__ .poll_wait = i915_oa_poll_wait, +#endif .read = i915_oa_read, }; @@ -2848,7 +2952,8 @@ static int i915_oa_stream_init(struct i9 hrtimer_init(&stream->poll_check_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); stream->poll_check_timer.function = oa_poll_check_timer_cb; - init_waitqueue_head(&stream->poll_wq); + DRM_INIT_WAITQUEUE(&stream->poll_wq, "i915perf"); + selinit(&stream->poll_selq); spin_lock_init(&stream->oa_buffer.ptr_lock); return 0; @@ -2919,6 +3024,16 @@ void i915_oa_init_reg_state(const struct * * Returns: The number of bytes copied or a negative error code on failure. */ +#ifdef __NetBSD__ +static int i915_perf_read_locked(struct i915_perf_stream *stream, + struct file *file, + struct uio *buf, + kauth_cred_t count, /* XXX dummy */ + int ppos) /* XXX dummy */ +{ + return stream->ops->read(stream, buf, count, ppos); +} +#else static ssize_t i915_perf_read_locked(struct i915_perf_stream *stream, struct file *file, char __user *buf, @@ -2936,6 +3051,7 @@ static ssize_t i915_perf_read_locked(str return offset ?: (ret ?: -EAGAIN); } +#endif /** * i915_perf_read - handles read() FOP for i915 perf stream FDs @@ -2955,12 +3071,24 @@ static ssize_t i915_perf_read_locked(str * * Returns: The number of bytes copied or a negative error code on failure. */ +#ifdef __NetBSD__ +static int i915_perf_read(struct file *file, + off_t *offset, + struct uio *buf, + kauth_cred_t count, /* XXX dummy */ + int ppos) /* XXX dummy */ +#else static ssize_t i915_perf_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) +#endif { +#ifdef __NetBSD__ + struct i915_perf_stream *stream = file->f_data; +#else struct i915_perf_stream *stream = file->private_data; +#endif struct i915_perf *perf = stream->perf; ssize_t ret; @@ -2971,7 +3099,13 @@ static ssize_t i915_perf_read(struct fil if (!stream->enabled) return -EIO; - if (!(file->f_flags & O_NONBLOCK)) { +#ifdef __NetBSD__ + buf->uio_offset = *offset; + if (!(file->f_flag & FNONBLOCK)) +#else + if (!(file->f_flags & O_NONBLOCK)) +#endif + { /* There's the small chance of false positives from * stream->ops->wait_unlocked. * @@ -3017,17 +3151,43 @@ static enum hrtimer_restart oa_poll_chec { struct i915_perf_stream *stream = container_of(hrtimer, typeof(*stream), poll_check_timer); + unsigned long flags; - if (oa_buffer_check_unlocked(stream)) { + spin_lock_irqsave(&stream->oa_buffer.ptr_lock, flags); + if (oa_buffer_check(stream)) { stream->pollin = true; - wake_up(&stream->poll_wq); + DRM_SPIN_WAKEUP_ONE(&stream->poll_wq, + &stream->oa_buffer.ptr_lock); + selnotify(&stream->poll_selq, POLLIN|POLLRDNORM, NOTE_SUBMIT); } + spin_unlock_irqrestore(&stream->oa_buffer.ptr_lock, flags); hrtimer_forward_now(hrtimer, ns_to_ktime(POLL_PERIOD)); return HRTIMER_RESTART; } +#ifdef __NetBSD__ + +static int +i915_perf_poll(struct file *fp, int events) +{ + struct i915_perf_stream *stream = fp->f_data; + unsigned long flags; + int revents = 0; + + spin_lock_irqsave(&stream->oa_buffer.ptr_lock, flags); + if (stream->pollin) + revents |= events & (POLLIN|POLLRDNORM); + else + selrecord(curlwp, &stream->poll_selq); + spin_unlock_irqrestore(&stream->oa_buffer.ptr_lock, flags); + + return revents; +} + +#else + /** * i915_perf_poll_locked - poll_wait() with a suitable wait queue for stream * @stream: An i915 perf stream @@ -3089,6 +3249,8 @@ static __poll_t i915_perf_poll(struct fi return ret; } +#endif /* __NetBSD__ */ + /** * i915_perf_enable_locked - handle `I915_PERF_IOCTL_ENABLE` ioctl * @stream: A disabled i915 perf stream @@ -3218,11 +3380,22 @@ static long i915_perf_ioctl_locked(struc * Returns: zero on success or a negative error code. Returns -EINVAL for * an unknown ioctl request. */ +#ifdef __NetBSD__ +static int i915_perf_ioctl(struct file *file, + unsigned long cmd, + void *cookie) +#else static long i915_perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +#endif { +#ifdef __NetBSD__ + unsigned long arg = (unsigned long)(uintptr_t)cookie; + struct i915_perf_stream *stream = file->f_data; +#else struct i915_perf_stream *stream = file->private_data; +#endif struct i915_perf *perf = stream->perf; long ret; @@ -3268,6 +3441,22 @@ static void i915_perf_destroy_locked(str * * Returns: zero on success or a negative error code. */ +#ifdef __NetBSD__ +static int i915_perf_close(struct file *fp) +{ + struct i915_perf_stream *stream = fp->f_data; + struct i915_perf *perf = stream->perf; + + mutex_lock(&perf->lock); + i915_perf_destroy_locked(stream); + mutex_unlock(&perf->lock); + + /* Release the reference the perf stream kept on the driver. */ + drm_dev_put(&perf->i915->drm); + + return 0; +} +#else static int i915_perf_release(struct inode *inode, struct file *file) { struct i915_perf_stream *stream = file->private_data; @@ -3282,8 +3471,41 @@ static int i915_perf_release(struct inod return 0; } +#endif +#ifdef __NetBSD__ +static int +i915_perf_stat(struct file *fp, struct stat *st) +{ + const dev_t devno = 0; /* XXX */ + + memset(st, 0, sizeof(*st)); + + st->st_dev = devno; /* XXX */ + st->st_ino = 0; /* XXX */ + st->st_uid = kauth_cred_geteuid(fp->f_cred); + st->st_gid = kauth_cred_getegid(fp->f_cred); + st->st_mode = S_IFCHR; + st->st_rdev = devno; + + return 0; +} + +static const struct fileops fops = { + .fo_name = "i915perf", + .fo_read = i915_perf_read, + .fo_write = fbadop_write, + .fo_ioctl = i915_perf_ioctl, + .fo_fcntl = fnullop_fcntl, + .fo_poll = i915_perf_poll, + .fo_stat = i915_perf_stat, + .fo_close = i915_perf_close, + .fo_kqfilter = fnullop_kqfilter, /* XXX */ + .fo_restart = fnullop_restart, + .fo_mmap = NULL, +}; +#else static const struct file_operations fops = { .owner = THIS_MODULE, .llseek = no_llseek, @@ -3296,6 +3518,7 @@ static const struct file_operations fops */ .compat_ioctl = i915_perf_ioctl, }; +#endif /** @@ -3421,11 +3644,30 @@ i915_perf_open_ioctl_locked(struct i915_ if (param->flags & I915_PERF_FLAG_FD_NONBLOCK) f_flags |= O_NONBLOCK; +#ifdef __NetBSD__ + struct file *fp; + + /* XXX errno NetBSD->Linux */ + ret = -fd_allocfile(&fp, &stream_fd); + if (ret) + goto err_flags; + + fp->f_type = DTYPE_MISC; + fp->f_flag = FREAD; + if (f_flags & O_NONBLOCK) + fp->f_flag |= FNONBLOCK; + if (f_flags & O_CLOEXEC) + fd_set_exclose(curlwp, stream_fd, true); + fp->f_ops = &fops; + + fd_affix(curproc, fp, stream_fd); +#else stream_fd = anon_inode_getfd("[i915_perf]", &fops, stream, f_flags); if (stream_fd < 0) { ret = stream_fd; goto err_flags; } +#endif if (!(param->flags & I915_PERF_FLAG_DISABLED)) i915_perf_enable_locked(stream); @@ -3541,12 +3783,12 @@ static int read_properties_unlocked(stru break; case DRM_I915_PERF_PROP_OA_FORMAT: if (value == 0 || value >= I915_OA_FORMAT_MAX) { - DRM_DEBUG("Out-of-range OA report format %llu\n", + DRM_DEBUG("Out-of-range OA report format %"PRIu64"\n", value); return -EINVAL; } if (!perf->oa_formats[value].size) { - DRM_DEBUG("Unsupported OA report format %llu\n", + DRM_DEBUG("Unsupported OA report format %"PRIu64"\n", value); return -EINVAL; } @@ -3583,7 +3825,7 @@ static int read_properties_unlocked(stru if (oa_freq_hz > i915_oa_max_sample_rate && !capable(CAP_SYS_ADMIN)) { - DRM_DEBUG("OA exponent would exceed the max sampling frequency (sysctl dev.i915.oa_max_sample_rate) %uHz without root privileges\n", + DRM_DEBUG("OA exponent would exceed the max sampling frequency (sysctl hw.drm2.i915.oa_max_sample_rate) %uHz without root privileges\n", i915_oa_max_sample_rate); return -EACCES; } @@ -3676,7 +3918,9 @@ int i915_perf_open_ioctl(struct drm_devi void i915_perf_register(struct drm_i915_private *i915) { struct i915_perf *perf = &i915->perf; +#ifndef __NetBSD__ int ret; +#endif if (!perf->i915) return; @@ -3687,6 +3931,7 @@ void i915_perf_register(struct drm_i915_ */ mutex_lock(&perf->lock); +#ifndef __NetBSD__ perf->metrics_kobj = kobject_create_and_add("metrics", &i915->drm.primary->kdev->kobj); @@ -3694,6 +3939,7 @@ void i915_perf_register(struct drm_i915_ goto exit; sysfs_attr_init(&perf->test_config.sysfs_metric_id.attr); +#endif if (IS_TIGERLAKE(i915)) { i915_perf_load_test_config_tgl(i915); @@ -3733,10 +3979,12 @@ void i915_perf_register(struct drm_i915_ if (perf->test_config.id == 0) goto sysfs_error; +#ifndef __NetBSD__ /* XXX i915 sysfs */ ret = sysfs_create_group(perf->metrics_kobj, &perf->test_config.sysfs_metric); if (ret) goto sysfs_error; +#endif perf->test_config.perf = perf; kref_init(&perf->test_config.ref); @@ -3744,8 +3992,10 @@ void i915_perf_register(struct drm_i915_ goto exit; sysfs_error: +#ifndef __NetBSD__ kobject_put(perf->metrics_kobj); perf->metrics_kobj = NULL; +#endif exit: mutex_unlock(&perf->lock); @@ -3762,6 +4012,7 @@ exit: */ void i915_perf_unregister(struct drm_i915_private *i915) { +#ifndef __NetBSD__ struct i915_perf *perf = &i915->perf; if (!perf->metrics_kobj) @@ -3772,6 +4023,7 @@ void i915_perf_unregister(struct drm_i91 kobject_put(perf->metrics_kobj); perf->metrics_kobj = NULL; +#endif } static bool gen8_is_valid_flex_addr(struct i915_perf *perf, u32 addr) @@ -3943,6 +4195,7 @@ addr_err: return ERR_PTR(err); } +#ifndef __NetBSD__ /* XXX i915 sysfs */ static ssize_t show_dynamic_id(struct device *dev, struct device_attribute *attr, char *buf) @@ -3952,10 +4205,14 @@ static ssize_t show_dynamic_id(struct de return sprintf(buf, "%d\n", oa_config->id); } +#endif static int create_dynamic_oa_sysfs_entry(struct i915_perf *perf, struct i915_oa_config *oa_config) { +#ifdef __NetBSD__ /* XXX i915 sysfs */ + return 0; +#else sysfs_attr_init(&oa_config->sysfs_metric_id.attr); oa_config->sysfs_metric_id.attr.name = "id"; oa_config->sysfs_metric_id.attr.mode = S_IRUGO; @@ -3970,6 +4227,7 @@ static int create_dynamic_oa_sysfs_entry return sysfs_create_group(perf->metrics_kobj, &oa_config->sysfs_metric); +#endif } /** @@ -4172,7 +4430,9 @@ int i915_perf_remove_config_ioctl(struct GEM_BUG_ON(*arg != oa_config->id); +#ifndef __NetBSD__ sysfs_remove_group(perf->metrics_kobj, &oa_config->sysfs_metric); +#endif idr_remove(&perf->metrics_idr, *arg); @@ -4189,6 +4449,8 @@ err_unlock: return ret; } +#ifndef __NetBSD__ /* XXX i915 perf sysctl */ + static struct ctl_table oa_table[] = { { .procname = "perf_stream_paranoid", @@ -4231,6 +4493,8 @@ static struct ctl_table dev_root[] = { {} }; +#endif /* __NetBSD__ */ + /** * i915_perf_init - initialize i915-perf state on module bind * @i915: i915 device instance @@ -4386,12 +4650,16 @@ static int destroy_config(int id, void * void i915_perf_sysctl_register(void) { +#ifndef __NetBSD__ /* XXX i915 perf sysctl */ sysctl_header = register_sysctl_table(dev_root); +#endif } void i915_perf_sysctl_unregister(void) { +#ifndef __NetBSD__ /* XXX i915 perf sysctl */ unregister_sysctl_table(sysctl_header); +#endif } /** Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_perf_types.h diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_perf_types.h:1.5 src/sys/external/bsd/drm2/dist/drm/i915/i915_perf_types.h:1.6 --- src/sys/external/bsd/drm2/dist/drm/i915/i915_perf_types.h:1.5 Sun Dec 19 11:11:51 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/i915_perf_types.h Sun Dec 19 11:36:57 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_perf_types.h,v 1.5 2021/12/19 11:11:51 riastradh Exp $ */ +/* $NetBSD: i915_perf_types.h,v 1.6 2021/12/19 11:36:57 riastradh Exp $ */ /* SPDX-License-Identifier: MIT */ /* @@ -82,7 +82,7 @@ struct i915_perf_stream_ops { */ void (*disable)(struct i915_perf_stream *stream); -#ifdef notyet +#ifndef __NetBSD__ /** * @poll_wait: Call poll_wait, passing a wait queue that will be woken * once there is something ready to read() for the stream @@ -117,10 +117,17 @@ struct i915_perf_stream_ops { * -%ENOSPC or -%EFAULT, even though these may be squashed before * returning to userspace. */ +#ifdef __NetBSD__ + int (*read)(struct i915_perf_stream *stream, + struct uio *buf, + kauth_cred_t count, /* XXX dummy */ + int offset); /* XXX dummy */ +#else int (*read)(struct i915_perf_stream *stream, char __user *buf, size_t count, size_t *offset); +#endif /** * @destroy: Cleanup any stream specific resources. @@ -227,10 +234,11 @@ struct i915_perf_stream { * @poll_wq: The wait queue that hrtimer callback wakes when it * sees data ready to read in the circular OA buffer. */ -#ifdef __linux__ - wait_queue_head_t poll_wq; -#else +#ifdef __NetBSD__ drm_waitqueue_t poll_wq; + struct selinfo poll_selq; +#else + wait_queue_head_t poll_wq; #endif /** @@ -371,10 +379,17 @@ struct i915_oa_ops { * @read: Copy data from the circular OA buffer into a given userspace * buffer. */ +#ifdef __NetBSD__ + int (*read)(struct i915_perf_stream *stream, + struct uio *buf, + kauth_cred_t count, /* XXX dummy */ + int offset); /* XXX dummy */ +#else int (*read)(struct i915_perf_stream *stream, char __user *buf, size_t count, size_t *offset); +#endif /** * @oa_hw_tail_read: read the OA tail pointer register Index: src/sys/external/bsd/drm2/drm/drm_sysctl.c diff -u src/sys/external/bsd/drm2/drm/drm_sysctl.c:1.7 src/sys/external/bsd/drm2/drm/drm_sysctl.c:1.8 --- src/sys/external/bsd/drm2/drm/drm_sysctl.c:1.7 Mon Aug 27 13:57:24 2018 +++ src/sys/external/bsd/drm2/drm/drm_sysctl.c Sun Dec 19 11:36:57 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: drm_sysctl.c,v 1.7 2018/08/27 13:57:24 riastradh Exp $ */ +/* $NetBSD: drm_sysctl.c,v 1.8 2021/12/19 11:36:57 riastradh Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -29,7 +29,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: drm_sysctl.c,v 1.7 2018/08/27 13:57:24 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: drm_sysctl.c,v 1.8 2021/12/19 11:36:57 riastradh Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -122,7 +122,6 @@ drm_sysctl_node(const char *name, const CTLFLAG_PERMANENT, CTLTYPE_NODE, name, NULL, NULL, 0, NULL, 0, CTL_CREATE, CTL_EOL); } - void drm_sysctl_init(struct drm_sysctl_def *def) @@ -155,7 +154,6 @@ drm_sysctl_init(struct drm_sysctl_def *d continue; } } - if ((error = sysctl_createv(&def->log, 0, &cnode, &cnode, p->mode == 0600 ? CTLFLAG_READWRITE : 0, drm_sysctl_get_type(p), n, Index: src/sys/external/bsd/drm2/include/linux/hrtimer.h diff -u src/sys/external/bsd/drm2/include/linux/hrtimer.h:1.4 src/sys/external/bsd/drm2/include/linux/hrtimer.h:1.5 --- src/sys/external/bsd/drm2/include/linux/hrtimer.h:1.4 Sun Dec 19 11:23:51 2021 +++ src/sys/external/bsd/drm2/include/linux/hrtimer.h Sun Dec 19 11:36:57 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: hrtimer.h,v 1.4 2021/12/19 11:23:51 riastradh Exp $ */ +/* $NetBSD: hrtimer.h,v 1.5 2021/12/19 11:36:57 riastradh Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -48,6 +48,7 @@ struct hrtimer { enum hrtimer_mode { HRTIMER_MODE_ABS, HRTIMER_MODE_REL, + HRTIMER_MODE_REL_PINNED, }; enum hrtimer_restart { Index: src/sys/external/bsd/drm2/include/linux/ratelimit.h diff -u src/sys/external/bsd/drm2/include/linux/ratelimit.h:1.4 src/sys/external/bsd/drm2/include/linux/ratelimit.h:1.5 --- src/sys/external/bsd/drm2/include/linux/ratelimit.h:1.4 Sun Dec 19 01:20:08 2021 +++ src/sys/external/bsd/drm2/include/linux/ratelimit.h Sun Dec 19 11:36:57 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: ratelimit.h,v 1.4 2021/12/19 01:20:08 riastradh Exp $ */ +/* $NetBSD: ratelimit.h,v 1.5 2021/12/19 11:36:57 riastradh Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -39,12 +39,18 @@ #define ratelimit_state linux_ratelimit_state struct ratelimit_state { + volatile int missed; + volatile unsigned rl_lock; struct timeval rl_lasttime; int rl_curpps; unsigned rl_maxpps; }; +enum { + RATELIMIT_MSG_ON_RELEASE, +}; + /* * XXX Assumes hz=100 so this works in static initializers, and/or * hopes the caller just uses DEFAULT_RATELIMIT_INTERVAL and doesn't @@ -55,24 +61,42 @@ struct ratelimit_state { #define DEFINE_RATELIMIT_STATE(n, i, b) \ struct ratelimit_state n = { \ + .missed = 0, \ .rl_lock = 0, \ .rl_lasttime = { .tv_sec = 0, .tv_usec = 0 }, \ .rl_curpps = 0, \ .rl_maxpps = (b)/((i)/100), \ } +static inline void +ratelimit_state_init(struct ratelimit_state *r, int interval, int burst) +{ + + memset(r, 0, sizeof(*r)); + r->rl_maxpps = burst/(interval/hz); +} + +static inline void +ratelimit_set_flags(struct ratelimit_state *r, unsigned long flags) +{ +} + static inline bool __ratelimit(struct ratelimit_state *r) { int ok; - if (atomic_cas_uint(&r->rl_lock, 0, 1)) - return false; + if (atomic_cas_uint(&r->rl_lock, 0, 1)) { + ok = false; + goto out; + } membar_enter(); ok = ppsratecheck(&r->rl_lasttime, &r->rl_curpps, r->rl_maxpps); membar_exit(); r->rl_lock = 0; +out: if (!ok) + atomic_store_relaxed(&r->missed, 1); return ok; } Index: src/sys/external/bsd/drm2/include/linux/math64.h diff -u src/sys/external/bsd/drm2/include/linux/math64.h:1.10 src/sys/external/bsd/drm2/include/linux/math64.h:1.11 --- src/sys/external/bsd/drm2/include/linux/math64.h:1.10 Sun Dec 19 11:23:09 2021 +++ src/sys/external/bsd/drm2/include/linux/math64.h Sun Dec 19 11:36:57 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: math64.h,v 1.10 2021/12/19 11:23:09 riastradh Exp $ */ +/* $NetBSD: math64.h,v 1.11 2021/12/19 11:36:57 riastradh Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -56,6 +56,12 @@ div64_s64(int64_t dividend, int64_t divi return dividend / divisor; } +static inline uint64_t +DIV64_U64_ROUND_UP(uint64_t dividend, uint64_t divisor) +{ + return (dividend + (divisor - 1))/divisor; +} + static inline int64_t div_s64(int64_t dividend, int32_t divisor) { Index: src/sys/external/bsd/drm2/include/linux/uuid.h diff -u src/sys/external/bsd/drm2/include/linux/uuid.h:1.2 src/sys/external/bsd/drm2/include/linux/uuid.h:1.3 --- src/sys/external/bsd/drm2/include/linux/uuid.h:1.2 Sun Dec 19 01:20:15 2021 +++ src/sys/external/bsd/drm2/include/linux/uuid.h Sun Dec 19 11:36:57 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: uuid.h,v 1.2 2021/12/19 01:20:15 riastradh Exp $ */ +/* $NetBSD: uuid.h,v 1.3 2021/12/19 11:36:57 riastradh Exp $ */ /*- * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -34,4 +34,32 @@ #define UUID_STRING_LEN 36 +static inline int +uuid_is_valid(const char uuid[static 36]) +{ + unsigned i; + + for (i = 0; i < 36; i++) { + switch (i) { + case 8: /* xxxxxxxx[-]xxxx-xxxx-xxxx-xxxxxxxxxxxx */ + case 12 + 1: /* xxxxxxxx-xxxx[-]xxxx-xxxx-xxxxxxxxxxxx */ + case 16 + 2: /* xxxxxxxx-xxxx-xxxx[-]xxxx-xxxxxxxxxxxx */ + case 20 + 3: /* xxxxxxxx-xxxx-xxxx-xxxx[-]xxxxxxxxxxxx */ + if (uuid[i] == '-') + continue; + return 0; + default: + if ('0' <= uuid[i] && uuid[i] <= '9') + continue; + if ('a' <= uuid[i] && uuid[i] <= 'f') + continue; + if ('A' <= uuid[i] && uuid[i] <= 'F') + continue; + return 0; + } + } + + return 1; +} + #endif /* _LINUX_UUID_H_ */