/*
* Copyright (c) 2012, 2013, Intel Corporation.
* All Rights Reserved.
*/
/*
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#include <sys/mdb_modapi.h>
/*
* Defines
*/
/* dcmd options */
/*
* Initialize the proc_t walker by either using the given starting address,
* or reading the value of the kernel's practive pointer. We also allocate
* a proc_t for storage, and save this using the walk_data pointer.
*/
static int
{
mdb_warn("head is NULL");
return (WALK_ERR);
}
return (WALK_DONE);
}
return (WALK_NEXT);
}
/*
* At each step, read a proc_t into our private storage, and then invoke
* the callback function. We terminate when we reach a NULL p_next pointer.
*/
static int
{
int status;
mdb_warn("uncompletement list");
return (WALK_DONE);
}
return (WALK_DONE);
}
return (WALK_DONE);
}
wsp->walk_cbdata);
return (status);
}
/*
* The walker's fini function is invoked at the end of each walk. Since we
* dynamically allocated a proc_t in sp_walk_init, we must free it now.
*/
static void
{
}
static int
{
void *state;
"i915_statep") == -1) {
mdb_warn("failed to read i915_statep");
return (-1);
}
mdb_warn("Failed to read state\n");
return (-1);
}
mdb_warn("Failed to read array\n");
return (-1);
}
mdb_warn("Failed to read drm_dev\n");
return (-1);
}
return (DCMD_OK);
}
static int
{
int ret;
mdb_warn("Failed to read i915 private\n");
return (-1);
}
}
return (ret);
}
void
i915_pciid_help(void)
{
mdb_printf("Print device ID information of Intel graphics card.\n");
}
/* ARGSUSED */
static int
{
int ret;
if (flags & DCMD_ADDRSPEC) {
return (DCMD_OK);
}
mdb_printf(" vendor 0x%x device 0x%x\n",
return (ret);
}
void
i915_gtt_total_help(void)
{
mdb_printf("Print graphics translation table (GTT) size\n");
}
/* ARGSUSED */
static int
{
int ret;
mdb_printf("gtt mappable size 0x%x",
}
return (ret);
}
{
if (obj->user_pin_count > 0)
return ("P");
return ("p");
else
return (" ");
}
{
switch (obj->tiling_mode) {
default:
case I915_TILING_NONE: return " ";
case I915_TILING_X: return "X";
case I915_TILING_Y: return "Y";
}
}
{
switch (type) {
case I915_CACHE_NONE: return " uncached";
case I915_CACHE_LLC: return " snooped (LLC)";
case I915_CACHE_LLC_MLC: return " snooped (LLC+MLC)";
default: return "";
}
}
static void
{
mdb_printf("%p: %s%s %8zdKiB %02x %02x %d %d %d%s%s%s",
mdb_printf(" (gtt offset: %08x, size: %08x)",
char s[3], *t = s;
if (obj->pin_mappable)
*t++ = 'p';
if (obj->fault_mappable)
*t++ = 'f';
*t = '\0';
mdb_printf(" (%s mappable)", s);
}
}
static void
{
/* "size", "gtt_off", "kaddr", "pfn_array" */
mdb_printf(" 0x%-8x 0x%-8x 0x%lx 0x%lx\n",
++count;
if (obj->map_and_fenceable) {
}
}
void
i915_obj_list_node_help(void)
{
mdb_printf("Print objects information for a given list pointer\n"
"Fields printed:\n"
" obj:\tpointer to drm_i915_gem_object structure\n"
" size:\tobject size\n"
" gtt_off:\tobject offset in GTT (graphics address)\n"
" kaddr:\tobject kernel virtual address\n"
" pfn_array:\tArrary which contains object's PFN\n");
}
/* ARGSUSED */
static int
{
if (!(flags & DCMD_ADDRSPEC))
return (DCMD_USAGE);
mdb_warn("failed to read list");
return (DCMD_ERR);
}
if (list.contain_ptr == 0) {
mdb_warn("no object!");
return (DCMD_ERR);
}
mdb_warn("failed to read object infor");
goto err;
}
err:
return (ret);
}
static int
{
mdb_warn("failed to read active_list");
goto err;
}
"kaddr", "pfn_array");
mdb_warn("failed to walk head_list");
goto err;
}
err:
return (ret);
}
void
i915_obj_list_help(void)
{
mdb_printf("Print object lists information\n"
"Fields printed:\n"
" obj:\tpointer to drm_i915_gem_object structure\n"
" size:\tobject size\n"
" gtt_off:\tobject offset in GTT (graphics address)\n"
" kaddr:\tobject kernel virtual address\n"
" pfn_array:\tArrary which contains object's PFN\n"
"Options:\n"
" -a flag:\tprint only active list with flag set\n"
" -i flag:\tprint only inactive list with flag set\n"
" -b flag:\tprint only bound list with flag set\n"
" -u flag:\tprint only unbound list with flag set\n"
"\nWithout the option, print information about all objects in "
"system.\n"
"Please make sure mdb_track is enabled in i915 driver by "
"mdb_track_enable,\n"
"before dump all objects information.\n");
}
/* ARGSUSED */
static int
{
if (flags & DCMD_ADDRSPEC) {
mdb_printf("don't need to set address 0x%lx, just ignore\n",
addr);
}
mdb_printf("\nUsage:\n"
"-a dump active_list\n"
"-i dump inactive_list\n"
"-b dump bound_list\n"
"-u dump unbound_list\n");
return (DCMD_USAGE);
}
goto err;
}
mdb_printf("%u objects, 0x%lx bytes\n",
if (list_flag == 0) {
int mdb_track = 0;
mdb_warn("failed to read mdb_track");
mdb_track = 0;
}
if (mdb_track == 0) {
mdb_printf("mdb_track is not enabled. Please enable "
"it by set drm:mdb_track_enable=1");
goto err;
}
/* dump whole gem objects list */
goto err2;
mdb_warn("failed to read whole gem list");
goto err1;
}
"gtt_off", "kaddr", "pfn_array");
mdb_warn("failed to walk head_list");
goto err;
}
err1:
err2:
goto err;
}
if (list_flag & ACTIVE_LIST) {
"Activate");
goto err;
mdb_printf(" %u [%u] active objects, 0x%lx [0x%lx] bytes\n",
}
if (list_flag & INACTIVE_LIST) {
"Inactivate");
goto err;
mdb_printf(" %u [%u] inactive objects, 0x%lx [0x%lx] bytes\n",
}
if (list_flag & BOUND_LIST) {
"Bound");
goto err;
mdb_printf("%u [%u] objects, 0x%lx [0x%lx] bytes in gtt\n",
}
if (list_flag & UNBOUND_LIST) {
"Unbound");
goto err;
}
err:
return (ret);
}
void
{
mdb_printf("Print ring object information\n"
"Fields printed:\n"
" mmio_base:\tMMIO base address\n"
" obj:\tpointer to ring object's drm_i915_gem_object structure\n"
"Options:\n"
" -l flag:\tprint only BLT ring information with flag set\n"
" -r flag:\tprint only RENDER ring information with flag set\n"
" -s flag:\tprint only BSD ring information with flag set\n"
"Without the option given, print information about all rings.\n");
}
/* ARGSUSED */
static int
{
if (flags & DCMD_ADDRSPEC) {
mdb_printf("don't need to set address 0x%lx, just ignore\n",
addr);
}
mdb_printf("\nUsage:\n"
"-l blt ring information\n"
"-r render ring information\n"
"-s bsd ring information\n");
return (DCMD_USAGE);
}
goto err;
}
if (ring_flag == 0)
ring_flag = 0xff;
if (ring_flag & RENDER_RING) {
mdb_printf("Render ring mmio_base 0x%lx obj 0x%lx\n",
}
mdb_printf("BLT ring mmio_base 0x%lx obj 0x%lx\n",
}
mdb_printf("BSD ring mmio_base 0x%lx obj 0x%lx\n",
}
err:
return (ret);
}
void
i915_gtt_dump_help(void)
{
mdb_printf("Print the address of gtt_dump\n"
"\ngtt_dump is a snapshot of whole GTT table when GPU hang "
"happened.\n"
"Please make sure gpu_dump is enabled in i915 driver before "
"using it.\n"
"\nSee also: \"::help i915_error_reg_dump\"\n");
}
/* ARGSUSED */
static int
{
goto err;
}
else
mdb_printf("There is no gtt_dump");
err:
return (ret);
}
static uint32_t
{
mdb_warn("Failed to read dev_priv->regs\n");
return (ret);
}
return (ret);
}
return (ret);
}
void
i915_register_read_help(void)
{
mdb_printf("Print register value for a given register offset\n");
}
/* ARGSUSED */
static int
{
if (!(flags & DCMD_ADDRSPEC)) {
return (DCMD_USAGE);
}
goto err;
}
goto err;
}
err:
return (ret);
}
void
i915_error_reg_dump_help(void)
{
mdb_printf("Print debug register information\n"
"Registers printed:\n"
" PGTBL_ER:\tPage Table Errors Register\n"
" INSTPM:\tCommand Parser Mode Register\n"
" EIR:\tError Identity Register\n"
" EHR:\tError Header Register\n"
" INSTDONE:\tInstruction Stream Interface Done Register\n"
" INSTDONE1:\tInstruction Stream Interface Done 1\n"
" INSTPS:\tInstruction Parser State Register\n"
" ACTHD:\tActive Head Pointer Register\n"
" DMA_FADD_P:\tPrimary DMA Engine Fetch Address Register\n"
"\ngtt_dump is a snapshot of whole GTT table when GPU hang happened.\n"
"\nSee also: \"::help i915_gtt_dump\"\n");
}
/* ARGSUSED */
static int
{
if (flags & DCMD_ADDRSPEC) {
return (DCMD_OK);
}
goto err1;
goto err2;
}
mdb_printf("\nBlitter command stream:\n");
mdb_printf("\nRender command stream:\n");
else
mdb_printf("no gtt dump\n");
err2:
err1:
return (ret);
}
void
i915_obj_history_help(void)
{
mdb_printf("Print object history information for a given "
"drm_i915_gem_object pointer\n"
"Fields printed:\n"
" event:\tOperation name\n"
" cur_seq:\tCurrent system SeqNO\n"
" last_seq:\tLast SeqNO has been processed\n"
" ring addr:\tPoint to intel_ring_buffer structure\n"
"\nNOTE: Please make sure mdb_track is enabled in i915 driver "
"by setting mdb_track_enable\n");
}
/* ARGSUSED */
static int
{
int mdb_track = 0;
if (!(flags & DCMD_ADDRSPEC)) {
return (DCMD_USAGE);
}
mdb_warn("failed to read gem object infor");
goto err;
}
mdb_warn("failed to read mdb_track");
mdb_track = 0;
}
if (mdb_track == 0) {
mdb_printf("mdb_track is not enabled. Please enable it "
"by set drm:mdb_track_enable=1");
goto err;
}
mdb_printf("Dump obj history\n");
"ring addr");
while (condition) {
mdb_warn("failed to read his_list node");
goto err;
}
break;
mdb_warn("failed to read history node");
goto err;
}
}
err:
return (ret);
}
void
i915_batch_history_help(void)
{
mdb_printf("Print batchbuffer information\n"
"\nAll batchbuffers' information is printed one by one "
"from the latest one to the oldest one.\n"
"The information includes objects number, assigned SeqNO. "
"and objects list.\n"
"\nNOTE: Please make sure mdb_track is enabled in i915 "
"driver by setting mdb_track_enable\n");
}
/* ARGSUSED */
static int
{
int ret, i;
int mdb_track = 0;
mdb_warn("failed to read history node");
goto err;
}
mdb_warn("failed to read mdb_track");
mdb_track = 0;
}
if (mdb_track == 0) {
mdb_printf("mdb_track is not enabled. Please enable it by "
"set drm:mdb_track_enable=1");
goto err;
}
mdb_printf("Dump batchbuffer history\n");
while (condition) {
mdb_warn("failed to read his_list node");
goto err;
}
break;
mdb_warn("failed to read batch node");
goto err;
}
mdb_printf("batch buffer includes %d objects, seqno 0x%x\n",
UM_SLEEP);
mdb_warn("failed to read batch object list");
goto err;
}
for (i = 0; i < batch_node.num; i++) {
}
}
err:
return (ret);
}
static const char *yesno(int v)
{
return (v ? "yes" : "no");
}
void
i915_capabilities_help(void)
{
mdb_printf("Print capability information for Intel graphics card\n"
"Fields printed:\n"
" is_mobile:\tMobile Platform\n"
" is_i85x:\tIntel I85x series graphics card\n"
" is_i915g:\tIntel I915g series graphics card\n"
" is_i945gm:\tIntel I945gm series graphics card\n"
" is_g33:\tIntel G33 series graphics card\n"
" need_gfx_hws:\tNeed setup graphics hardware status page\n"
" is_g4x:\tIntel G4x series graphics card\n"
" is_pineview:\tIntel Pineview series graphics card\n"
" is_broadwater:\tIntel Broadwater series graphics card\n"
" is_crestline:\tIntel Crestline series graphics card\n"
" is_ivybridge:\tIntel Ivybridge series graphics card\n"
" is_valleyview:\tIntel Valleyview series graphics card\n"
" has_force_wake:\tHas force awake\n"
" is_haswell:\tIntel Haswell series graphics card\n"
" has_fbc:\tHas Framebuffer compression\n"
" has_pipe_cxsr:\tHas CxSR\n"
" has_hotplug:\tHas output hotplug\n"
" cursor_needs_physical:\tHas physical cursor object\n"
" has_overlay:\tHas Overlay\n"
" overlay_needs_physical:\tHas physical overlay object\n"
" supports_tv:\tSupport TV output\n"
" has_bsd_ring:\tHas BSD ring\n"
" has_blt_ring:\tHas BLT ring\n"
" has_llc:\tHas last level cache\n");
}
/* ARGSUSED */
static int
{
int ret;
if (flags & DCMD_ADDRSPEC) {
return (DCMD_OK);
}
goto err1;
goto err2;
}
mdb_warn("failed to read i915 chip info");
goto err2;
}
/* BEGIN CSTYLED */
#define SEP_SEMICOLON ;
/* END CSTYLED */
err2:
err1:
return (ret);
}
void
{
mdb_printf("Print request list information for a given list pointer\n"
"The information includes request, SeqNO. and timestamp.\n");
}
/* ARGSUSED */
static int
{
if (!(flags & DCMD_ADDRSPEC))
return (DCMD_USAGE);
mdb_warn("failed to read list");
return (DCMD_ERR);
}
if (list.contain_ptr == 0) {
mdb_warn("no request!");
return (DCMD_ERR);
}
mdb_warn("failed to read request infor");
goto err;
}
err:
return (ret);
}
static int
{
mdb_warn("failed to render ring request list");
goto err;
}
mdb_warn("failed to walk request head_list");
goto err;
}
err:
return (ret);
}
void
{
mdb_printf("Print request list for each ring buffer\n"
"\nSee also: \"::help i915_request_list_node\"\n");
}
/* ARGSUSED */
static int
{
if (flags & DCMD_ADDRSPEC) {
mdb_printf("don't need to set address 0x%lx, just ignore\n",
addr);
}
goto err;
}
"RENDER");
goto err;
}
"BSD");
goto err;
}
"BLT");
goto err;
}
err:
return (ret);
}
static int
{
addr) == -1) {
mdb_warn("failed to read hardware status page");
goto err;
}
if (index < 0) {
mdb_printf("0x%08x: 0x%08x 0x%08x 0x%08x 0x%08x\n",
regs[i + 3]);
}
} else
err:
return (ret);
}
void
{
mdb_printf("Print current SeqNO. for each ring buffer\n");
}
/* ARGSUSED */
static int
{
if (flags & DCMD_ADDRSPEC) {
return (DCMD_OK);
}
goto err;
}
"RENDER", I915_GEM_HWS_INDEX);
goto err;
}
"BSD", I915_GEM_HWS_INDEX);
goto err;
}
"BLT", I915_GEM_HWS_INDEX);
goto err;
}
err:
return (ret);
}
void
{
mdb_printf("Print current Fence registers information\n"
"The information includes object address, user pin flag, tiling mode,\n"
"size, read domain, write domain, read SeqNO, write SeqNO, fence "
"SeqNo,\n"
"catch level, dirty info, object name, pin count, fence reg number,\n"
"GTT offset, pin mappable and fault mappable.\n");
}
/* ARGSUSED */
static int
{
if (flags & DCMD_ADDRSPEC) {
return (DCMD_OK);
}
goto err;
}
for (i = 0; i < dev_priv->num_fence_regs; i++) {
mdb_printf("Fence %d, pin count = %d, object = ",
describe_obj(&obj);
} else {
mdb_printf("unused");
}
mdb_printf("\n");
}
err:
return (ret);
}
void
i915_interrupt_info_help(void)
{
mdb_printf("Print debug register information\n"
"Registers printed:\n"
" IER:\tInterrupt Enable Register\n"
" IIR:\tInterrupt Identity Register\n"
" IMR:\tInterrupt Mask Register\n"
" ISR:\tInterrupt Status Register\n");
}
/* ARGSUSED */
static int
{
if (flags & DCMD_ADDRSPEC) {
return (DCMD_OK);
}
goto err1;
goto err2;
}
mdb_warn("failed to read i915 chip info");
goto err2;
}
if (info.is_valleyview) {
mdb_printf("Pipe %c stat:\t%08x\n",
}
&val);
mdb_printf("Pipe %c stat: %08x\n",
}
} else {
"North Display Interrupt enable: %08x\n",
val);
"North Display Interrupt identity: %08x\n", val);
"North Display Interrupt mask: %08x\n",
val);
"South Display Interrupt enable: %08x\n",
val);
"South Display Interrupt identity: %08x\n", val);
"South Display Interrupt mask: %08x\n",
val);
"Graphics Interrupt enable: %08x\n", val);
"Graphics Interrupt identity: %08x\n",
val);
"Graphics Interrupt mask: %08x\n", val);
}
err2:
err1:
return (ret);
}
void
i915_hws_info_help(void)
{
mdb_printf("Print hardware status page for each RING\n");
}
/* ARGSUSED */
static int
{
if (flags & DCMD_ADDRSPEC) {
return (DCMD_OK);
}
goto err;
}
"RENDER", -1);
goto err;
}
"BSD", -1);
goto err;
}
"BLT", -1);
goto err;
}
err:
return (ret);
}
void
i915_fbc_status_help(void)
{
mdb_printf("Print the status and reason for Framebuffer Compression "
"Enabling\n");
}
/* ARGSUSED */
static int
{
if (flags & DCMD_ADDRSPEC) {
return (DCMD_OK);
}
goto err1;
goto err2;
}
mdb_warn("failed to read i915 chip info");
goto err2;
}
mdb_printf("FBC unsupported on this chipset\n");
goto err2;
}
val &= DPFC_CTL_EN;
} else {
mdb_printf("Failed to read FBC register\n");
goto err2;
}
val &= DPFC_CTL_EN;
} else {
mdb_printf("Failed to read FBC register\n");
goto err2;
}
} else if (info.is_crestline) {
val &= FBC_CTL_EN;
} else {
mdb_printf("Failed to read FBC register\n");
goto err2;
}
}
if (val) {
mdb_printf("FBC enabled\n");
} else {
mdb_printf("FBC disabled: ");
switch (dev_priv->no_fbc_reason) {
case FBC_NO_OUTPUT:
mdb_printf("no outputs");
break;
case FBC_STOLEN_TOO_SMALL:
mdb_printf("not enough stolen memory");
break;
case FBC_UNSUPPORTED_MODE:
mdb_printf("mode not supported");
break;
case FBC_MODE_TOO_LARGE:
mdb_printf("mode too large");
break;
case FBC_BAD_PLANE:
mdb_printf("FBC unsupported on plane");
break;
case FBC_NOT_TILED:
mdb_printf("scanout buffer not tiled");
break;
case FBC_MULTIPLE_PIPES:
mdb_printf("multiple pipes are enabled");
break;
case FBC_MODULE_PARAM:
mdb_printf("disabled per module param (default off)");
break;
default:
mdb_printf("unknown reason");
}
mdb_printf("\n");
}
err2:
err1:
return (ret);
}
/* ARGSUSED */
static int
{
if (flags & DCMD_ADDRSPEC) {
return (DCMD_OK);
}
goto err1;
goto err2;
}
mdb_warn("failed to read i915 chip info");
goto err2;
}
val &= WM1_LP_SR_EN;
} else {
mdb_printf("Failed to read sr register\n");
goto err2;
}
val &= FW_BLC_SELF_EN;
} else {
mdb_printf("Failed to read sr register\n");
goto err2;
}
val &= INSTPM_SELF_EN;
} else {
mdb_printf("Failed to read sr register\n");
goto err2;
}
} else if (info.is_pineview) {
} else {
mdb_printf("Failed to read sr register\n");
goto err2;
}
}
mdb_printf("self-refresh: %s\n",
err2:
err1:
return (ret);
}
void
{
mdb_printf("Print console framebuffer information\n"
"The information includes width, height, depth,\n"
"bits_per_pixel and object structure address\n");
}
/* ARGSUSED */
static int
{
if (flags & DCMD_ADDRSPEC) {
return (DCMD_OK);
}
goto err1;
goto err2;
}
mdb_warn("failed to read intel_fbdev info");
goto err2;
}
mdb_warn("failed to read framebuffer info");
goto err2;
}
mdb_printf("fbcon size: %d x %d, depth %d, %d bpp, obj %p",
mdb_printf("\n");
err2:
err1:
return (ret);
}
/* ARGSUSED */
static int
{
unsigned forcewake_count;
if (flags & DCMD_ADDRSPEC) {
return (DCMD_OK);
}
goto err;
}
err:
return (ret);
}
{
switch (swizzle) {
case I915_BIT_6_SWIZZLE_NONE:
return ("none");
case I915_BIT_6_SWIZZLE_9:
return ("bit9");
case I915_BIT_6_SWIZZLE_9_10:
case I915_BIT_6_SWIZZLE_9_11:
case I915_BIT_6_SWIZZLE_9_17:
return ("unkown");
}
return ("bug");
}
void
i915_swizzle_info_help(void)
{
mdb_printf("Print object swizzle information\n"
"Registers printed:\n"
" TILECTL:\tTile Control\n"
" ARB_MODE:\tArbiter Mode Control Register\n"
" DISP_ARB_CTL:\tDisplay Arbiter Control\n");
}
/* ARGSUSED */
static int
{
if (flags & DCMD_ADDRSPEC) {
return (DCMD_OK);
}
goto err1;
goto err2;
}
mdb_warn("failed to read i915 chip info");
goto err2;
}
mdb_printf("bit6 swizzle for X-tiling = %s\n",
mdb_printf("bit6 swizzle for Y-tiling = %s\n",
}
err2:
err1:
return (ret);
}
void
i915_ppgtt_info_help(void)
{
mdb_printf("Print Per-Process GTT (PPGTT) information\n"
"Registers printed:\n"
" GFX_MODE:\tGraphics Mode Register\n"
" PP_DIR_BASE:\tPage Directory Base Register\n"
" ECOCHK:\tMain Graphic Arbiter Misc Register\n");
}
/* ARGSUSED */
static int
{
if (flags & DCMD_ADDRSPEC) {
return (DCMD_OK);
}
goto err1;
goto err2;
}
mdb_warn("failed to read i915 chip info");
goto err2;
}
}
for (i = 0; i < 3; i ++) {
mdb_printf("RING %d\n", i);
&val);
}
}
mdb_warn("failed to read aliasing_ppgtt info");
goto err2;
}
mdb_printf("aliasing PPGTT:\n");
}
err2:
err1:
return (ret);
}
/*
* MDB module linkage information:
*
* We declare a list of structures describing our dcmds, a list of structures
* describing our walkers, and a function named _mdb_init to return a pointer
* to our module information.
*/
{
"i915_pciid",
"?",
"pciid information",
},
{
"i915_gtt_total",
"?",
"get gtt total size",
},
{
"i915_obj_list",
"[-aibu]",
"i915 objects list information",
},
{
"i915_obj_list_node",
":",
"i915 objects list node information",
},
{
"i915_ringbuffer_info",
"[-lrs]",
"i915 ring buffer information",
},
{
"i915_gtt_dump",
"?",
"dump gtt_dump_add address",
},
{
"i915_register_read",
":",
"read i915 register",
},
{
"i915_error_reg_dump",
"?",
"i915 error registers dump",
},
{
"i915_obj_history",
":",
"i915 objects track information",
},
{
"i915_batch_history",
"?",
"i915 objects track information",
},
{
"i915_capabilities",
"?",
"i915 capabilities information",
},
{
"i915_request_list_node",
":",
"i915 request list node information",
},
{
"i915_gem_request",
"?",
"i915 gem request information",
},
{
"i915_ring_seqno",
"?",
"ring seqno information",
},
{
"i915_gem_fence_regs",
"?",
"fence register information",
},
{
"i915_interrupt",
"?",
"interrupt information",
},
{
"i915_gem_hws",
"?",
"hardware status page",
},
{
"i915_fbc_status",
"?",
"framebuffer compression information",
},
{
"i915_sr_status",
"?",
"Print self-refresh status",
},
{
"i915_gem_framebuffer",
"?",
"Print framebuffer information",
},
{
"i915_gen6_forcewake_count",
"?",
"Print forcewake count",
},
{
"i915_swizzle",
"?",
"Print swizzle information",
},
{
"i915_ppgtt",
"?",
"Print ppgtt information",
},
{ NULL }
};
{
"head_list",
"walk head list",
},
{ NULL }
};
};
const mdb_modinfo_t *
_mdb_init(void)
{
return (&modinfo);
}