1d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggs/*
2d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggs * Copyright (C) 2010 Nouveau Project
3d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggs *
4d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggs * All Rights Reserved.
5d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggs *
6d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggs * Permission is hereby granted, free of charge, to any person obtaining
7d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggs * a copy of this software and associated documentation files (the
8d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggs * "Software"), to deal in the Software without restriction, including
9d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggs * without limitation the rights to use, copy, modify, merge, publish,
10d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggs * distribute, sublicense, and/or sell copies of the Software, and to
11d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggs * permit persons to whom the Software is furnished to do so, subject to
12d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggs * the following conditions:
13d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggs *
14d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggs * The above copyright notice and this permission notice (including the
15d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggs * next paragraph) shall be included in all copies or substantial
16d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggs * portions of the Software.
17d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggs *
18d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggs * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggs * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggs * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
22d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggs * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggs * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggs * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggs *
26d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggs */
27d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggs
28d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggs#include <linux/ratelimit.h>
29d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggs
308cbe71a6e70b5439ae60bd542231c4b8878a8f1cBen Skeggs#include "nouveau_util.h"
318cbe71a6e70b5439ae60bd542231c4b8878a8f1cBen Skeggs
32d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggsstatic DEFINE_RATELIMIT_STATE(nouveau_ratelimit_state, 3 * HZ, 20);
33d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggs
348cbe71a6e70b5439ae60bd542231c4b8878a8f1cBen Skeggsvoid
358cbe71a6e70b5439ae60bd542231c4b8878a8f1cBen Skeggsnouveau_bitfield_print(const struct nouveau_bitfield *bf, u32 value)
368cbe71a6e70b5439ae60bd542231c4b8878a8f1cBen Skeggs{
378cbe71a6e70b5439ae60bd542231c4b8878a8f1cBen Skeggs	while (bf->name) {
388cbe71a6e70b5439ae60bd542231c4b8878a8f1cBen Skeggs		if (value & bf->mask) {
398cbe71a6e70b5439ae60bd542231c4b8878a8f1cBen Skeggs			printk(" %s", bf->name);
408cbe71a6e70b5439ae60bd542231c4b8878a8f1cBen Skeggs			value &= ~bf->mask;
418cbe71a6e70b5439ae60bd542231c4b8878a8f1cBen Skeggs		}
428cbe71a6e70b5439ae60bd542231c4b8878a8f1cBen Skeggs
438cbe71a6e70b5439ae60bd542231c4b8878a8f1cBen Skeggs		bf++;
448cbe71a6e70b5439ae60bd542231c4b8878a8f1cBen Skeggs	}
458cbe71a6e70b5439ae60bd542231c4b8878a8f1cBen Skeggs
468cbe71a6e70b5439ae60bd542231c4b8878a8f1cBen Skeggs	if (value)
478cbe71a6e70b5439ae60bd542231c4b8878a8f1cBen Skeggs		printk(" (unknown bits 0x%08x)", value);
488cbe71a6e70b5439ae60bd542231c4b8878a8f1cBen Skeggs}
498cbe71a6e70b5439ae60bd542231c4b8878a8f1cBen Skeggs
50bb9b18a390db4a15cd46bbd7472510feb7d4c168Ben Skeggsconst struct nouveau_enum *
51bb9b18a390db4a15cd46bbd7472510feb7d4c168Ben Skeggsnouveau_enum_find(const struct nouveau_enum *en, u32 value)
528cbe71a6e70b5439ae60bd542231c4b8878a8f1cBen Skeggs{
538cbe71a6e70b5439ae60bd542231c4b8878a8f1cBen Skeggs	while (en->name) {
54bb9b18a390db4a15cd46bbd7472510feb7d4c168Ben Skeggs		if (en->value == value)
55bb9b18a390db4a15cd46bbd7472510feb7d4c168Ben Skeggs			return en;
568cbe71a6e70b5439ae60bd542231c4b8878a8f1cBen Skeggs		en++;
578cbe71a6e70b5439ae60bd542231c4b8878a8f1cBen Skeggs	}
588cbe71a6e70b5439ae60bd542231c4b8878a8f1cBen Skeggs
59bb9b18a390db4a15cd46bbd7472510feb7d4c168Ben Skeggs	return NULL;
60bb9b18a390db4a15cd46bbd7472510feb7d4c168Ben Skeggs}
61bb9b18a390db4a15cd46bbd7472510feb7d4c168Ben Skeggs
62bb9b18a390db4a15cd46bbd7472510feb7d4c168Ben Skeggsvoid
63bb9b18a390db4a15cd46bbd7472510feb7d4c168Ben Skeggsnouveau_enum_print(const struct nouveau_enum *en, u32 value)
64bb9b18a390db4a15cd46bbd7472510feb7d4c168Ben Skeggs{
65bb9b18a390db4a15cd46bbd7472510feb7d4c168Ben Skeggs	en = nouveau_enum_find(en, value);
66bb9b18a390db4a15cd46bbd7472510feb7d4c168Ben Skeggs	if (en) {
67bb9b18a390db4a15cd46bbd7472510feb7d4c168Ben Skeggs		printk("%s", en->name);
68bb9b18a390db4a15cd46bbd7472510feb7d4c168Ben Skeggs		return;
69bb9b18a390db4a15cd46bbd7472510feb7d4c168Ben Skeggs	}
70bb9b18a390db4a15cd46bbd7472510feb7d4c168Ben Skeggs
718cbe71a6e70b5439ae60bd542231c4b8878a8f1cBen Skeggs	printk("(unknown enum 0x%08x)", value);
728cbe71a6e70b5439ae60bd542231c4b8878a8f1cBen Skeggs}
738cbe71a6e70b5439ae60bd542231c4b8878a8f1cBen Skeggs
74d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggsint
75d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggsnouveau_ratelimit(void)
76d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggs{
77d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggs	return __ratelimit(&nouveau_ratelimit_state);
78d7facf9dc50acff69de9688088caa78b3cf69ebbBen Skeggs}
79