Cleaned up extended lspci

This commit is contained in:
Vladimir 'phcoder' Serbinenko 2009-11-06 22:53:07 +01:00
parent cdef0f7f52
commit 9b0a46a19d

View file

@ -115,6 +115,14 @@ grub_pci_get_class (int class, int subclass)
return 0; return 0;
} }
static const struct grub_arg_option options[] =
{
{"iospace", 'i', 0, "show I/O spaces", 0, 0},
{0, 0, 0, 0, 0, 0}
};
static int iospace;
static int NESTED_FUNC_ATTR static int NESTED_FUNC_ATTR
grub_lspci_iter (int bus, int dev, int func, grub_pci_id_t pciid) grub_lspci_iter (int bus, int dev, int func, grub_pci_id_t pciid)
{ {
@ -144,42 +152,47 @@ grub_lspci_iter (int bus, int dev, int func, grub_pci_id_t pciid)
grub_printf ("\n"); grub_printf ("\n");
reg = 4; if (iospace)
for (i = 0; i < 6; i++)
{ {
grub_uint64_t space; reg = 4;
addr = grub_pci_make_address (dev, reg); for (i = 0; i < 6; i++)
space = grub_pci_read (addr);
reg++;
if (space == 0)
continue;
switch (space & GRUB_PCI_ADDR_SPACE_MASK)
{ {
case GRUB_PCI_ADDR_SPACE_IO: grub_uint64_t space;
grub_printf ("IO space %d at 0x%llx\n", i, addr = grub_pci_make_address (dev, reg);
(unsigned long long) (space & GRUB_PCI_ADDR_IO_MASK)); space = grub_pci_read (addr);
break;
case GRUB_PCI_ADDR_SPACE_MEMORY:
if ((space & GRUB_PCI_ADDR_MEM_TYPE_MASK)
== GRUB_PCI_ADDR_MEM_TYPE_64)
{
space |= grub_pci_make_address (dev, reg);
reg++;
grub_printf ("64-bit memory space %d at 0x%16llx [%s]\n", i,
(unsigned long long) (space & GRUB_PCI_ADDR_MEM_MASK),
space & GRUB_PCI_ADDR_MEM_PREFETCH
? "prefetchable" : "non-prefetchable");
reg++;
if (space == 0)
continue;
switch (space & GRUB_PCI_ADDR_SPACE_MASK)
{
case GRUB_PCI_ADDR_SPACE_IO:
grub_printf ("\tIO space %d at 0x%llx\n", i, (unsigned long long)
(space & GRUB_PCI_ADDR_IO_MASK));
break;
case GRUB_PCI_ADDR_SPACE_MEMORY:
if ((space & GRUB_PCI_ADDR_MEM_TYPE_MASK)
== GRUB_PCI_ADDR_MEM_TYPE_64)
{
space |= grub_pci_make_address (dev, reg);
reg++;
grub_printf ("\t64-bit memory space %d at 0x0%16llx [%s]\n",
i, (unsigned long long)
(space & GRUB_PCI_ADDR_MEM_MASK),
space & GRUB_PCI_ADDR_MEM_PREFETCH
? "prefetchable" : "non-prefetchable");
}
else
grub_printf ("\t32-bit memory space %d at 0x0%16llx [%s]\n", i,
(unsigned long long)
(space & GRUB_PCI_ADDR_MEM_MASK),
space & GRUB_PCI_ADDR_MEM_PREFETCH
? "prefetchable" : "non-prefetchable");
break;
} }
else
grub_printf ("32-bit memory space %d at 0x%16llx [%s]\n", i,
(unsigned long long) (space & GRUB_PCI_ADDR_MEM_MASK),
space & GRUB_PCI_ADDR_MEM_PREFETCH
? "prefetchable" : "non-prefetchable");
break;
} }
} }
@ -188,23 +201,24 @@ grub_lspci_iter (int bus, int dev, int func, grub_pci_id_t pciid)
} }
static grub_err_t static grub_err_t
grub_cmd_lspci (grub_command_t cmd __attribute__ ((unused)), grub_cmd_lspci (grub_extcmd_t cmd,
int argc __attribute__ ((unused)), int argc __attribute__ ((unused)),
char **args __attribute__ ((unused))) char **args __attribute__ ((unused)))
{ {
iospace = cmd->state[0].set;
grub_pci_iterate (grub_lspci_iter); grub_pci_iterate (grub_lspci_iter);
return GRUB_ERR_NONE; return GRUB_ERR_NONE;
} }
static grub_command_t cmd; static grub_extcmd_t cmd;
GRUB_MOD_INIT(pci) GRUB_MOD_INIT(pci)
{ {
cmd = grub_register_command ("lspci", grub_cmd_lspci, cmd = grub_register_extcmd ("lspci", grub_cmd_lspci, GRUB_COMMAND_FLAG_BOTH,
0, "List PCI devices"); "lspci [-i]", "List PCI devices", options);
} }
GRUB_MOD_FINI(pci) GRUB_MOD_FINI(pci)
{ {
grub_unregister_command (cmd); grub_unregister_extcmd (cmd);
} }