drm/nouveau/core: type-safe printk macros
These require an explicit pointers to nvkm_object/nvkm_subdev/nvkm_device, depending on which macros are used. This is unlike the previous macros which take a void *, and work for anything derived from nvkm_object (by way of some awful heuristics). The output will be a bit confused until everything has been transitioned, as the logging format used is a more standard style that previously. In addition, usage of pr_cont(), which doesn't work correctly with the dev_*() printk functions (and was potentially racy to begin with), will be replaced. Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
parent
5444204036
commit
6594363b9f
|
@ -52,4 +52,16 @@ int nvkm_client_notify_new(struct nvkm_object *, struct nvkm_event *,
|
|||
int nvkm_client_notify_del(struct nvkm_client *, int index);
|
||||
int nvkm_client_notify_get(struct nvkm_client *, int index);
|
||||
int nvkm_client_notify_put(struct nvkm_client *, int index);
|
||||
|
||||
/* logging for client-facing objects */
|
||||
#define nvif_printk(o,l,p,f,a...) do { \
|
||||
struct nvkm_object *_object = (o); \
|
||||
struct nvkm_client *_client = nvkm_client(_object); \
|
||||
if (_client->debug >= NV_DBG_##l) \
|
||||
printk(KERN_##p "nouveau: %s: "f, _client->name, ##a); \
|
||||
} while(0)
|
||||
#define nvif_error(o,f,a...) nvif_printk((o), ERROR, ERR, f, ##a)
|
||||
#define nvif_debug(o,f,a...) nvif_printk((o), DEBUG, INFO, f, ##a)
|
||||
#define nvif_trace(o,f,a...) nvif_printk((o), TRACE, INFO, f, ##a)
|
||||
#define nvif_ioctl(o,f,a...) nvif_trace((o), "ioctl: "f, ##a)
|
||||
#endif
|
||||
|
|
|
@ -214,4 +214,19 @@ enum nv_bus_type {
|
|||
int nvkm_device_create_(void *, enum nv_bus_type type, u64 name,
|
||||
const char *sname, const char *cfg, const char *dbg,
|
||||
int, void **);
|
||||
|
||||
/* device logging */
|
||||
#define nvdev_printk_(d,l,p,f,a...) do { \
|
||||
struct nvkm_device *_device = (d); \
|
||||
if (_device->engine.subdev.debug >= (l)) \
|
||||
dev_##p(_device->dev, f, ##a); \
|
||||
} while(0)
|
||||
#define nvdev_printk(d,l,p,f,a...) nvdev_printk_((d), NV_DBG_##l, p, f, ##a)
|
||||
#define nvdev_fatal(d,f,a...) nvdev_printk((d), FATAL, crit, f, ##a)
|
||||
#define nvdev_error(d,f,a...) nvdev_printk((d), ERROR, err, f, ##a)
|
||||
#define nvdev_warn(d,f,a...) nvdev_printk((d), WARN, notice, f, ##a)
|
||||
#define nvdev_info(d,f,a...) nvdev_printk((d), INFO, info, f, ##a)
|
||||
#define nvdev_debug(d,f,a...) nvdev_printk((d), DEBUG, info, f, ##a)
|
||||
#define nvdev_trace(d,f,a...) nvdev_printk((d), TRACE, info, f, ##a)
|
||||
#define nvdev_spam(d,f,a...) nvdev_printk((d), SPAM, dbg, f, ##a)
|
||||
#endif
|
||||
|
|
|
@ -18,4 +18,5 @@ struct nvkm_bitfield {
|
|||
};
|
||||
|
||||
void nvkm_bitfield_print(const struct nvkm_bitfield *, u32 value);
|
||||
void nvkm_snprintbf(char *, int, const struct nvkm_bitfield *, u32 value);
|
||||
#endif
|
||||
|
|
|
@ -11,7 +11,7 @@ struct nvkm_subdev {
|
|||
struct nvkm_device *device;
|
||||
|
||||
struct mutex mutex;
|
||||
const char *name;
|
||||
const char *name, *sname;
|
||||
u32 debug;
|
||||
u32 unit;
|
||||
|
||||
|
@ -53,11 +53,20 @@ void _nvkm_subdev_dtor(struct nvkm_object *);
|
|||
int _nvkm_subdev_init(struct nvkm_object *);
|
||||
int _nvkm_subdev_fini(struct nvkm_object *, bool suspend);
|
||||
|
||||
#define s_printk(s,l,f,a...) do { \
|
||||
if ((s)->debug >= OS_DBG_##l) { \
|
||||
nv_printk((s)->base.parent, (s)->name, l, f, ##a); \
|
||||
} \
|
||||
/* subdev logging */
|
||||
#define nvkm_printk_(s,l,p,f,a...) do { \
|
||||
struct nvkm_subdev *_subdev = (s); \
|
||||
if (_subdev->debug >= (l)) \
|
||||
dev_##p(_subdev->device->dev, "%s: "f, _subdev->sname, ##a); \
|
||||
} while(0)
|
||||
#define nvkm_printk(s,l,p,f,a...) nvkm_printk_((s), NV_DBG_##l, p, f, ##a)
|
||||
#define nvkm_fatal(s,f,a...) nvkm_printk((s), FATAL, crit, f, ##a)
|
||||
#define nvkm_error(s,f,a...) nvkm_printk((s), ERROR, err, f, ##a)
|
||||
#define nvkm_warn(s,f,a...) nvkm_printk((s), WARN, notice, f, ##a)
|
||||
#define nvkm_info(s,f,a...) nvkm_printk((s), INFO, info, f, ##a)
|
||||
#define nvkm_debug(s,f,a...) nvkm_printk((s), DEBUG, info, f, ##a)
|
||||
#define nvkm_trace(s,f,a...) nvkm_printk((s), TRACE, info, f, ##a)
|
||||
#define nvkm_spam(s,f,a...) nvkm_printk((s), SPAM, dbg, f, ##a)
|
||||
|
||||
#include <core/engine.h>
|
||||
#endif
|
||||
|
|
|
@ -64,3 +64,20 @@ nvkm_bitfield_print(const struct nvkm_bitfield *bf, u32 value)
|
|||
if (value)
|
||||
pr_cont(" (unknown bits 0x%08x)", value);
|
||||
}
|
||||
|
||||
void
|
||||
nvkm_snprintbf(char *data, int size, const struct nvkm_bitfield *bf, u32 value)
|
||||
{
|
||||
bool space = false;
|
||||
while (size >= 1 && bf->name) {
|
||||
if (value & bf->mask) {
|
||||
int this = snprintf(data, size, "%s%s",
|
||||
space ? " " : "", bf->name);
|
||||
size -= this;
|
||||
data += this;
|
||||
space = true;
|
||||
}
|
||||
bf++;
|
||||
}
|
||||
data[0] = '\0';
|
||||
}
|
||||
|
|
|
@ -111,6 +111,7 @@ nvkm_subdev_create_(struct nvkm_object *parent, struct nvkm_object *engine,
|
|||
|
||||
__mutex_init(&subdev->mutex, subname, &oclass->lock_class_key);
|
||||
subdev->name = subname;
|
||||
subdev->sname = sysname;
|
||||
|
||||
if (parent) {
|
||||
struct nvkm_device *device = nv_device(parent);
|
||||
|
|
Loading…
Reference in New Issue