Linux debugging

Check our new training course

Linux debugging, tracing, profiling & perf. analysis

Check our new training course
with Creative Commons CC-BY-SA
lecture and lab materials

Bootlin logo

Elixir Cross Referencer

/*
 * Copyright (c) 2018 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <shell/shell.h>
#include <init.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <logging/log.h>
#include <pci/pci.h>

#define LOG_LEVEL CONFIG_LOG_DEFAULT_LEVEL

LOG_MODULE_REGISTER(lspci_shell);

static void list_devices(const struct shell *shell,
			 struct pci_dev_info *dev_info)
{

	shell_fprintf(shell, SHELL_NORMAL,
		      "%x:%x.%x %X:%X class: 0x%X, %u, %s, "
		      "addrs: 0x%X-0x%X, IRQ %d\n",
		      dev_info->bus,
		      dev_info->dev,
		      dev_info->function,
		      dev_info->vendor_id,
		      dev_info->device_id,
		      dev_info->class_type,
		      dev_info->bar,
		      (dev_info->mem_type == BAR_SPACE_MEM) ? "MEM" : "I/O",
		      (u32_t)dev_info->addr,
		      (u32_t)(dev_info->addr + dev_info->size - 1),
		      dev_info->irq);
}

static int cmd_lspci(const struct shell *shell, size_t argc, char **argv)
{
	struct pci_dev_info info = {
		.function = PCI_FUNCTION_ANY,
		.bar = PCI_BAR_ANY,
	};

	pci_bus_scan_init();

	while (pci_bus_scan(&info)) {
		list_devices(shell, &info);
		info.class_type = 0;
		info.vendor_id = 0;
		info.device_id = 0;
		info.function = PCI_FUNCTION_ANY;
		info.bar = PCI_BAR_ANY;
	}

	return 0;
}

SHELL_CMD_REGISTER(lspci, NULL, "List PCI devices", cmd_lspci);