Skip to content

Commit

Permalink
ptp: add debugfs interface to see applied channel masks
Browse files Browse the repository at this point in the history
Use debugfs to be able to view channel mask applied to every timestamp
event queue.

Every time the device is opened, a new entry is created in
`$DEBUGFS_MOUNTPOINT/ptpN/$INSTANCE_ADDRESS/mask`.

The mask value can be viewed grouped in 32bit decimal values using cat,
or converted to hexadecimal with the included `ptpchmaskfmt.sh` script.
32 bit values are listed from least significant to most significant.

Signed-off-by: Xabier Marquiegui <reibax@gmail.com>
Suggested-by: Vinicius Costa Gomes <vinicius.gomes@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Xabier Marquiegui authored and David S. Miller committed Oct 15, 2023
1 parent c5a445b commit 403376d
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 0 deletions.
14 changes: 14 additions & 0 deletions drivers/ptp/ptp_chardev.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/timekeeping.h>
#include <linux/debugfs.h>

#include <linux/nospec.h>

Expand Down Expand Up @@ -106,6 +107,7 @@ int ptp_open(struct posix_clock_context *pccontext, fmode_t fmode)
struct ptp_clock *ptp =
container_of(pccontext->clk, struct ptp_clock, clock);
struct timestamp_event_queue *queue;
char debugfsname[32];

queue = kzalloc(sizeof(*queue), GFP_KERNEL);
if (!queue)
Expand All @@ -119,6 +121,17 @@ int ptp_open(struct posix_clock_context *pccontext, fmode_t fmode)
spin_lock_init(&queue->lock);
list_add_tail(&queue->qlist, &ptp->tsevqs);
pccontext->private_clkdata = queue;

/* Debugfs contents */
sprintf(debugfsname, "0x%p", queue);
queue->debugfs_instance =
debugfs_create_dir(debugfsname, ptp->debugfs_root);
queue->dfs_bitmap.array = (u32 *)queue->mask;
queue->dfs_bitmap.n_elements =
DIV_ROUND_UP(PTP_MAX_CHANNELS, BITS_PER_BYTE * sizeof(u32));
debugfs_create_u32_array("mask", 0444, queue->debugfs_instance,
&queue->dfs_bitmap);

return 0;
}

Expand All @@ -128,6 +141,7 @@ int ptp_release(struct posix_clock_context *pccontext)
unsigned long flags;

if (queue) {
debugfs_remove(queue->debugfs_instance);
pccontext->private_clkdata = NULL;
spin_lock_irqsave(&queue->lock, flags);
list_del(&queue->qlist);
Expand Down
7 changes: 7 additions & 0 deletions drivers/ptp/ptp_clock.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include <linux/slab.h>
#include <linux/syscalls.h>
#include <linux/uaccess.h>
#include <linux/debugfs.h>
#include <uapi/linux/sched/types.h>

#include "ptp_private.h"
Expand Down Expand Up @@ -185,6 +186,7 @@ static void ptp_clock_release(struct device *dev)
spin_unlock_irqrestore(&tsevq->lock, flags);
bitmap_free(tsevq->mask);
kfree(tsevq);
debugfs_remove(ptp->debugfs_root);
ida_free(&ptp_clocks_map, ptp->index);
kfree(ptp);
}
Expand Down Expand Up @@ -218,6 +220,7 @@ struct ptp_clock *ptp_clock_register(struct ptp_clock_info *info,
struct ptp_clock *ptp;
struct timestamp_event_queue *queue = NULL;
int err = 0, index, major = MAJOR(ptp_devt);
char debugfsname[8];
size_t size;

if (info->n_alarm > PTP_MAX_ALARMS)
Expand Down Expand Up @@ -339,6 +342,10 @@ struct ptp_clock *ptp_clock_register(struct ptp_clock_info *info,
return ERR_PTR(err);
}

/* Debugfs initialization */
sprintf(debugfsname, "ptp%d", ptp->index);
ptp->debugfs_root = debugfs_create_dir(debugfsname, NULL);

return ptp;

no_pps:
Expand Down
4 changes: 4 additions & 0 deletions drivers/ptp/ptp_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include <linux/time.h>
#include <linux/list.h>
#include <linux/bitmap.h>
#include <linux/debugfs.h>

#define PTP_MAX_TIMESTAMPS 128
#define PTP_BUF_TIMESTAMPS 30
Expand All @@ -30,6 +31,8 @@ struct timestamp_event_queue {
spinlock_t lock;
struct list_head qlist;
unsigned long *mask;
struct dentry *debugfs_instance;
struct debugfs_u32_array dfs_bitmap;
};

struct ptp_clock {
Expand Down Expand Up @@ -57,6 +60,7 @@ struct ptp_clock {
struct mutex n_vclocks_mux; /* protect concurrent n_vclocks access */
bool is_virtual_clock;
bool has_cycles;
struct dentry *debugfs_root;
};

#define info_to_vclock(d) container_of((d), struct ptp_vclock, info)
Expand Down
14 changes: 14 additions & 0 deletions tools/testing/selftests/ptp/ptpchmaskfmt.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0

# Simple helper script to transform ptp debugfs timestamp event queue filtering
# masks from decimal values to hexadecimal values

# Only takes the debugfs mask file path as an argument
DEBUGFS_MASKFILE="${1}"

#shellcheck disable=SC2013,SC2086
for int in $(cat "$DEBUGFS_MASKFILE") ; do
printf '0x%08X ' "$int"
done
echo

0 comments on commit 403376d

Please sign in to comment.