/*
 * 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);
