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