+2013-01-13 Colin Watson <cjwatson@ubuntu.com>
+
+ Remove nested functions from PCI iterators.
+
+ * grub-core/bus/pci.c (grub_pci_iterate): Add hook_data argument,
+ passed to hook. Update all callers to pass appropriate hook data.
+ * grub-core/bus/emu/pci.c (grub_pci_iterate): Likewise.
+ * include/grub/pci.h (grub_pci_iteratefunc_t): Add data argument.
+ Remove NESTED_FUNC_ATTR from here and from all users.
+ (grub_pci_iterate): Update prototype.
+ * grub-core/bus/cs5536.c (grub_cs5536_find: hook): Make static
+ instead of nested. Rename to ...
+ (grub_cs5536_find_iter): ... this.
+ * grub-core/kern/efi/mm.c (stop_broadcom: find_card): Likewise.
+ * grub-core/kern/mips/loongson/init.c (init_pci: set_card):
+ Likewise.
+ * grub-core/kern/vga_init.c (grub_qemu_init_cirrus: find_card):
+ Likewise.
+ * grub-core/video/bochs.c (grub_video_bochs_setup: find_card):
+ Likewise.
+ * grub-core/video/cirrus.c (grub_video_cirrus_setup: find_card):
+ Likewise.
+ * grub-core/video/efi_uga.c (find_framebuf: find_card): Likewise.
+ * grub-core/video/radeon_fuloong2e.c
+ (grub_video_radeon_fuloong2e_setup: find_card): Likewise.
+ * grub-core/video/sis315pro.c (grub_video_sis315pro_setup:
+ find_card): Likewise.
+ * grub-core/video/sm712.c (grub_video_sm712_setup: find_card):
+ Likewise.
+
2013-01-12 Vladimir Serbinenko <phcoder@gmail.com>
* grub-core/commands/verify.c: Mark messages for translating.
GRUB_MOD_LICENSE ("GPLv3+");
+/* Context for grub_cs5536_find. */
+struct grub_cs5536_find_ctx
+{
+ grub_pci_device_t *devp;
+ int found;
+};
+
+/* Helper for grub_cs5536_find. */
+static int
+grub_cs5536_find_iter (grub_pci_device_t dev, grub_pci_id_t pciid, void *data)
+{
+ struct grub_cs5536_find_ctx *ctx = data;
+
+ if (pciid == GRUB_CS5536_PCIID)
+ {
+ *ctx->devp = dev;
+ ctx->found = 1;
+ return 1;
+ }
+ return 0;
+}
+
int
grub_cs5536_find (grub_pci_device_t *devp)
{
- int found = 0;
- auto int NESTED_FUNC_ATTR hook (grub_pci_device_t dev,
- grub_pci_id_t pciid);
-
- int NESTED_FUNC_ATTR hook (grub_pci_device_t dev,
- grub_pci_id_t pciid)
- {
- if (pciid == GRUB_CS5536_PCIID)
- {
- *devp = dev;
- found = 1;
- return 1;
- }
- return 0;
- }
+ struct grub_cs5536_find_ctx ctx = {
+ .devp = devp,
+ .found = 0
+ };
- grub_pci_iterate (hook);
+ grub_pci_iterate (grub_cs5536_find_iter, &ctx);
- return found;
+ return ctx.found;
}
grub_uint64_t
}
void
-grub_pci_iterate (grub_pci_iteratefunc_t hook)
+grub_pci_iterate (grub_pci_iteratefunc_t hook, void *hook_data)
{
struct pci_device_iterator *iter;
struct pci_slot_match slot;
slot.func = PCI_MATCH_ANY;
iter = pci_slot_match_iterator_create (&slot);
while ((dev = pci_device_next (iter)))
- hook (dev, dev->vendor_id | (dev->device_id << 16));
+ hook (dev, dev->vendor_id | (dev->device_id << 16), hook_data);
pci_iterator_destroy (iter);
}
}
void
-grub_pci_iterate (grub_pci_iteratefunc_t hook)
+grub_pci_iterate (grub_pci_iteratefunc_t hook, void *hook_data)
{
grub_pci_device_t dev;
grub_pci_address_t addr;
continue;
}
- if (hook (dev, id))
+ if (hook (dev, id, hook_data))
return;
/* Probe only func = 0 if the device if not multifunction */
}
/* PCI iteration function... */
-static int NESTED_FUNC_ATTR
-grub_ehci_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid)
+static int
+grub_ehci_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid,
+ void *data __attribute__ ((unused)))
{
grub_uint8_t release;
grub_uint32_t class_code;
static void
grub_ehci_inithw (void)
{
- grub_pci_iterate (grub_ehci_pci_iter);
+ grub_pci_iterate (grub_ehci_pci_iter, NULL);
}
static grub_err_t
/* Iterate over all PCI devices. Determine if a device is an OHCI
controller. If this is the case, initialize it. */
-static int NESTED_FUNC_ATTR
-grub_ohci_pci_iter (grub_pci_device_t dev,
- grub_pci_id_t pciid)
+static int
+grub_ohci_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid,
+ void *data __attribute__ ((unused)))
{
grub_uint32_t interf;
grub_uint32_t base;
static void
grub_ohci_inithw (void)
{
- grub_pci_iterate (grub_ohci_pci_iter);
+ grub_pci_iterate (grub_ohci_pci_iter, NULL);
}
\f
/* Iterate over all PCI devices. Determine if a device is an UHCI
controller. If this is the case, initialize it. */
-static int NESTED_FUNC_ATTR
+static int
grub_uhci_pci_iter (grub_pci_device_t dev,
- grub_pci_id_t pciid __attribute__((unused)))
+ grub_pci_id_t pciid __attribute__((unused)),
+ void *data __attribute__ ((unused)))
{
grub_uint32_t class_code;
grub_uint32_t class;
static void
grub_uhci_inithw (void)
{
- grub_pci_iterate (grub_uhci_pci_iter);
+ grub_pci_iterate (grub_uhci_pci_iter, NULL);
}
static grub_uhci_td_t
#include <grub/pci.h>
#include <grub/command.h>
#include <grub/i18n.h>
+#include <grub/mm.h>
GRUB_MOD_LICENSE ("GPLv3+");
{0, 0, 0, 0, 0}
};
-static int NESTED_FUNC_ATTR
-scan_card (grub_pci_device_t dev, grub_pci_id_t pciid)
+static int
+scan_card (grub_pci_device_t dev, grub_pci_id_t pciid,
+ void *data __attribute__ ((unused)))
{
grub_pci_address_t addr;
int argc __attribute__ ((unused)),
char *argv[] __attribute__ ((unused)))
{
- grub_pci_iterate (scan_card);
+ grub_pci_iterate (scan_card, NULL);
return 0;
}
#include <grub/misc.h>
#include <grub/extcmd.h>
#include <grub/i18n.h>
+#include <grub/mm.h>
GRUB_MOD_LICENSE ("GPLv3+");
static int iospace;
-static int NESTED_FUNC_ATTR
-grub_lspci_iter (grub_pci_device_t dev, grub_pci_id_t pciid)
+static int
+grub_lspci_iter (grub_pci_device_t dev, grub_pci_id_t pciid,
+ void *data __attribute__ ((unused)))
{
grub_uint32_t class;
const char *sclass;
char **args __attribute__ ((unused)))
{
iospace = ctxt->state[0].set;
- grub_pci_iterate (grub_lspci_iter);
+ grub_pci_iterate (grub_lspci_iter, NULL);
return GRUB_ERR_NONE;
}
static grub_uint16_t regaddr;
static const char *varname;
-static int NESTED_FUNC_ATTR
-grub_setpci_iter (grub_pci_device_t dev, grub_pci_id_t pciid)
+static int
+grub_setpci_iter (grub_pci_device_t dev, grub_pci_id_t pciid,
+ void *data __attribute__ ((unused)))
{
grub_uint32_t regval = 0;
grub_pci_address_t addr;
return grub_error (GRUB_ERR_BAD_ARGUMENT,
"option -v isn't valid for writes");
- grub_pci_iterate (grub_setpci_iter);
+ grub_pci_iterate (grub_setpci_iter, NULL);
return GRUB_ERR_NONE;
}
return 1;
}
-static int NESTED_FUNC_ATTR
+static int
grub_ahci_pciinit (grub_pci_device_t dev,
- grub_pci_id_t pciid __attribute__ ((unused)))
+ grub_pci_id_t pciid __attribute__ ((unused)),
+ void *data __attribute__ ((unused)))
{
grub_pci_address_t addr;
grub_uint32_t class;
static grub_err_t
grub_ahci_initialize (void)
{
- grub_pci_iterate (grub_ahci_pciinit);
+ grub_pci_iterate (grub_ahci_pciinit, NULL);
return grub_errno;
}
}
#ifndef GRUB_MACHINE_MIPS_QEMU_MIPS
-static int NESTED_FUNC_ATTR
+static int
grub_pata_pciinit (grub_pci_device_t dev,
- grub_pci_id_t pciid)
+ grub_pci_id_t pciid,
+ void *data __attribute__ ((unused)))
{
static int compat_use[2] = { 0 };
grub_pci_address_t addr;
static grub_err_t
grub_pata_initialize (void)
{
- grub_pci_iterate (grub_pata_pciinit);
+ grub_pci_iterate (grub_pata_pciinit, NULL);
return 0;
}
#else
#if defined (__i386__) || defined (__x86_64__)
-static void
-stop_broadcom (void)
+/* Helper for stop_broadcom. */
+static int
+find_card (grub_pci_device_t dev, grub_pci_id_t pciid,
+ void *data __attribute__ ((unused)))
{
- auto int NESTED_FUNC_ATTR find_card (grub_pci_device_t dev,
- grub_pci_id_t pciid);
-
- int NESTED_FUNC_ATTR find_card (grub_pci_device_t dev,
- grub_pci_id_t pciid)
- {
- grub_pci_address_t addr;
- grub_uint8_t cap;
- grub_uint16_t pm_state;
+ grub_pci_address_t addr;
+ grub_uint8_t cap;
+ grub_uint16_t pm_state;
- if ((pciid & 0xffff) != GRUB_PCI_VENDOR_BROADCOM)
- return 0;
+ if ((pciid & 0xffff) != GRUB_PCI_VENDOR_BROADCOM)
+ return 0;
- addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
- if (grub_pci_read (addr) >> 24 != GRUB_PCI_CLASS_NETWORK)
- return 0;
- cap = grub_pci_find_capability (dev, GRUB_PCI_CAP_POWER_MANAGEMENT);
- if (!cap)
- return 0;
- addr = grub_pci_make_address (dev, cap + 4);
- pm_state = grub_pci_read_word (addr);
- pm_state = pm_state | 0x03;
- grub_pci_write_word (addr, pm_state);
- grub_pci_read_word (addr);
- return 0;
- }
+ addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
+ if (grub_pci_read (addr) >> 24 != GRUB_PCI_CLASS_NETWORK)
+ return 0;
+ cap = grub_pci_find_capability (dev, GRUB_PCI_CAP_POWER_MANAGEMENT);
+ if (!cap)
+ return 0;
+ addr = grub_pci_make_address (dev, cap + 4);
+ pm_state = grub_pci_read_word (addr);
+ pm_state = pm_state | 0x03;
+ grub_pci_write_word (addr, pm_state);
+ grub_pci_read_word (addr);
+ return 0;
+}
- grub_pci_iterate (find_card);
+static void
+stop_broadcom (void)
+{
+ grub_pci_iterate (find_card, NULL);
}
#endif
return GRUB_ERR_NONE;
}
-static void
-init_pci (void)
+/* Helper for init_pci. */
+static int
+set_card (grub_pci_device_t dev, grub_pci_id_t pciid,
+ void *data __attribute__ ((unused)))
{
- auto int NESTED_FUNC_ATTR set_card (grub_pci_device_t dev, grub_pci_id_t pciid);
- int NESTED_FUNC_ATTR set_card (grub_pci_device_t dev, grub_pci_id_t pciid)
- {
- grub_pci_address_t addr;
- /* FIXME: autoscan for BARs and devices. */
- switch (pciid)
- {
- case GRUB_LOONGSON_OHCI_PCIID:
- addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
- grub_pci_write (addr, 0x5025000);
- addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
- grub_pci_write_word (addr, GRUB_PCI_COMMAND_SERR_ENABLE
- | GRUB_PCI_COMMAND_PARITY_ERROR
- | GRUB_PCI_COMMAND_BUS_MASTER
- | GRUB_PCI_COMMAND_MEM_ENABLED);
+ grub_pci_address_t addr;
+ /* FIXME: autoscan for BARs and devices. */
+ switch (pciid)
+ {
+ case GRUB_LOONGSON_OHCI_PCIID:
+ addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
+ grub_pci_write (addr, 0x5025000);
+ addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
+ grub_pci_write_word (addr, GRUB_PCI_COMMAND_SERR_ENABLE
+ | GRUB_PCI_COMMAND_PARITY_ERROR
+ | GRUB_PCI_COMMAND_BUS_MASTER
+ | GRUB_PCI_COMMAND_MEM_ENABLED);
- addr = grub_pci_make_address (dev, GRUB_PCI_REG_STATUS);
- grub_pci_write_word (addr, 0x0200 | GRUB_PCI_STATUS_CAPABILITIES);
- break;
- case GRUB_LOONGSON_EHCI_PCIID:
- addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
- grub_pci_write (addr, 0x5026000);
- addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
- grub_pci_write_word (addr, GRUB_PCI_COMMAND_SERR_ENABLE
- | GRUB_PCI_COMMAND_PARITY_ERROR
- | GRUB_PCI_COMMAND_BUS_MASTER
- | GRUB_PCI_COMMAND_MEM_ENABLED);
+ addr = grub_pci_make_address (dev, GRUB_PCI_REG_STATUS);
+ grub_pci_write_word (addr, 0x0200 | GRUB_PCI_STATUS_CAPABILITIES);
+ break;
+ case GRUB_LOONGSON_EHCI_PCIID:
+ addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
+ grub_pci_write (addr, 0x5026000);
+ addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
+ grub_pci_write_word (addr, GRUB_PCI_COMMAND_SERR_ENABLE
+ | GRUB_PCI_COMMAND_PARITY_ERROR
+ | GRUB_PCI_COMMAND_BUS_MASTER
+ | GRUB_PCI_COMMAND_MEM_ENABLED);
- addr = grub_pci_make_address (dev, GRUB_PCI_REG_STATUS);
- grub_pci_write_word (addr, (1 << GRUB_PCI_STATUS_DEVSEL_TIMING_SHIFT)
- | GRUB_PCI_STATUS_CAPABILITIES);
- break;
- }
- return 0;
- }
+ addr = grub_pci_make_address (dev, GRUB_PCI_REG_STATUS);
+ grub_pci_write_word (addr, (1 << GRUB_PCI_STATUS_DEVSEL_TIMING_SHIFT)
+ | GRUB_PCI_STATUS_CAPABILITIES);
+ break;
+ }
+ return 0;
+}
+static void
+init_pci (void)
+{
*((volatile grub_uint32_t *) GRUB_CPU_LOONGSON_PCI_HIT1_SEL_LO) = 0x8000000c;
*((volatile grub_uint32_t *) GRUB_CPU_LOONGSON_PCI_HIT1_SEL_HI) = 0xffffffff;
*((volatile grub_uint32_t *) (GRUB_MACHINE_PCI_CONTROLLER_HEADER
+ GRUB_PCI_REG_ADDRESS_REG1)) = 0;
- grub_pci_iterate (set_card);
+ grub_pci_iterate (set_card, NULL);
}
void
#ifndef __mips__
#include <grub/pci.h>
+#include <grub/mm.h>
#endif
#include <grub/machine/kernel.h>
#include <grub/misc.h>
grub_vga_palette_write (i, colors[i].r, colors[i].g, colors[i].b);
}
+#ifndef __mips__
+/* Helper for grub_qemu_init_cirrus. */
+static int
+find_card (grub_pci_device_t dev, grub_pci_id_t pciid __attribute__ ((unused)),
+ void *data __attribute__ ((unused)))
+{
+ grub_pci_address_t addr;
+ grub_uint32_t class;
+
+ addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
+ class = grub_pci_read (addr);
+
+ if (((class >> 16) & 0xffff) != GRUB_PCI_CLASS_SUBCLASS_VGA)
+ return 0;
+
+ /* FIXME: chooose addresses dynamically. */
+ addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
+ grub_pci_write (addr, 0xf0000000 | GRUB_PCI_ADDR_MEM_PREFETCH
+ | GRUB_PCI_ADDR_SPACE_MEMORY | GRUB_PCI_ADDR_MEM_TYPE_32);
+ addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG1);
+ grub_pci_write (addr, 0xf2000000
+ | GRUB_PCI_ADDR_SPACE_MEMORY | GRUB_PCI_ADDR_MEM_TYPE_32);
+
+ addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
+ grub_pci_write (addr, GRUB_PCI_COMMAND_MEM_ENABLED
+ | GRUB_PCI_COMMAND_IO_ENABLED);
+
+ return 1;
+}
+#endif
+
void
grub_qemu_init_cirrus (void)
{
#ifndef __mips__
- auto int NESTED_FUNC_ATTR find_card (grub_pci_device_t dev, grub_pci_id_t pciid);
- int NESTED_FUNC_ATTR find_card (grub_pci_device_t dev, grub_pci_id_t pciid __attribute__ ((unused)))
- {
- grub_pci_address_t addr;
- grub_uint32_t class;
-
- addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
- class = grub_pci_read (addr);
-
- if (((class >> 16) & 0xffff) != GRUB_PCI_CLASS_SUBCLASS_VGA)
- return 0;
-
- /* FIXME: chooose addresses dynamically. */
- addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
- grub_pci_write (addr, 0xf0000000 | GRUB_PCI_ADDR_MEM_PREFETCH
- | GRUB_PCI_ADDR_SPACE_MEMORY | GRUB_PCI_ADDR_MEM_TYPE_32);
- addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG1);
- grub_pci_write (addr, 0xf2000000
- | GRUB_PCI_ADDR_SPACE_MEMORY | GRUB_PCI_ADDR_MEM_TYPE_32);
-
- addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
- grub_pci_write (addr, GRUB_PCI_COMMAND_MEM_ENABLED
- | GRUB_PCI_COMMAND_IO_ENABLED);
-
- return 1;
- }
-
- grub_pci_iterate (find_card);
+ grub_pci_iterate (find_card, NULL);
#endif
grub_outb (GRUB_VGA_IO_MISC_COLOR,
return grub_video_fb_set_palette (start, count, palette_data);
}
+/* Helper for grub_video_bochs_setup. */
+static int
+find_card (grub_pci_device_t dev, grub_pci_id_t pciid, void *data)
+{
+ int *found = data;
+ grub_pci_address_t addr;
+ grub_uint32_t class;
+
+ addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
+ class = grub_pci_read (addr);
+
+ if (((class >> 16) & 0xffff) != 0x0300 || pciid != 0x11111234)
+ return 0;
+
+ *found = 1;
+
+ addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
+ framebuffer.base = grub_pci_read (addr) & GRUB_PCI_ADDR_MEM_MASK;
+ framebuffer.dev = dev;
+
+ return 1;
+}
+
static grub_err_t
grub_video_bochs_setup (unsigned int width, unsigned int height,
grub_video_mode_type_t mode_type,
int pitch, bytes_per_pixel;
grub_size_t page_size; /* The size of a page in bytes. */
- auto int NESTED_FUNC_ATTR find_card (grub_pci_device_t dev, grub_pci_id_t pciid);
- int NESTED_FUNC_ATTR find_card (grub_pci_device_t dev, grub_pci_id_t pciid)
- {
- grub_pci_address_t addr;
- grub_uint32_t class;
-
- addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
- class = grub_pci_read (addr);
-
- if (((class >> 16) & 0xffff) != 0x0300 || pciid != 0x11111234)
- return 0;
-
- found = 1;
-
- addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
- framebuffer.base = grub_pci_read (addr) & GRUB_PCI_ADDR_MEM_MASK;
- framebuffer.dev = dev;
-
- return 1;
- }
-
/* Decode depth from mode_type. If it is zero, then autodetect. */
depth = (mode_type & GRUB_VIDEO_MODE_TYPE_DEPTH_MASK)
>> GRUB_VIDEO_MODE_TYPE_DEPTH_POS;
if (page_size > BOCHS_APERTURE_SIZE)
return grub_error (GRUB_ERR_IO, "Not enough video memory for this mode");
- grub_pci_iterate (find_card);
+ grub_pci_iterate (find_card, &found);
if (!found)
return grub_error (GRUB_ERR_IO, "Couldn't find graphics card");
return grub_video_fb_set_palette (start, count, palette_data);
}
+/* Helper for grub_video_cirrus_setup. */
+static int
+find_card (grub_pci_device_t dev, grub_pci_id_t pciid, void *data)
+{
+ int *found = data;
+ grub_pci_address_t addr;
+ grub_uint32_t class;
+
+ addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
+ class = grub_pci_read (addr);
+
+ if (((class >> 16) & 0xffff) != 0x0300 || pciid != 0x00b81013)
+ return 0;
+
+ *found = 1;
+
+ addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
+ framebuffer.base = grub_pci_read (addr) & GRUB_PCI_ADDR_MEM_MASK;
+ framebuffer.dev = dev;
+
+ return 1;
+}
+
static grub_err_t
grub_video_cirrus_setup (unsigned int width, unsigned int height,
grub_video_mode_type_t mode_type,
int found = 0;
int pitch, bytes_per_pixel;
- auto int NESTED_FUNC_ATTR find_card (grub_pci_device_t dev, grub_pci_id_t pciid);
- int NESTED_FUNC_ATTR find_card (grub_pci_device_t dev, grub_pci_id_t pciid)
- {
- grub_pci_address_t addr;
- grub_uint32_t class;
-
- addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
- class = grub_pci_read (addr);
-
- if (((class >> 16) & 0xffff) != 0x0300 || pciid != 0x00b81013)
- return 0;
-
- found = 1;
-
- addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
- framebuffer.base = grub_pci_read (addr) & GRUB_PCI_ADDR_MEM_MASK;
- framebuffer.dev = dev;
-
- return 1;
- }
-
/* Decode depth from mode_type. If it is zero, then autodetect. */
depth = (mode_type & GRUB_VIDEO_MODE_TYPE_DEPTH_MASK)
>> GRUB_VIDEO_MODE_TYPE_DEPTH_POS;
if (framebuffer.page_size > CIRRUS_APERTURE_SIZE)
return grub_error (GRUB_ERR_IO, "Not enough video memory for this mode");
- grub_pci_iterate (find_card);
+ grub_pci_iterate (find_card, &found);
if (!found)
return grub_error (GRUB_ERR_IO, "Couldn't find graphics card");
return 0;
}
-static int
-find_framebuf (grub_uint32_t *fb_base, grub_uint32_t *line_len)
+/* Context for find_framebuf. */
+struct find_framebuf_ctx
{
- int found = 0;
+ grub_uint32_t *fb_base;
+ grub_uint32_t *line_len;
+ int found;
+};
- auto int NESTED_FUNC_ATTR find_card (grub_pci_device_t dev,
- grub_pci_id_t pciid);
+/* Helper for find_framebuf. */
+static int
+find_card (grub_pci_device_t dev, grub_pci_id_t pciid, void *data)
+{
+ struct find_framebuf_ctx *ctx = data;
+ grub_pci_address_t addr;
- int NESTED_FUNC_ATTR find_card (grub_pci_device_t dev,
- grub_pci_id_t pciid)
+ addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
+ if (grub_pci_read (addr) >> 24 == 0x3)
{
- grub_pci_address_t addr;
+ int i;
- addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
- if (grub_pci_read (addr) >> 24 == 0x3)
+ grub_dprintf ("fb", "Display controller: %d:%d.%d\nDevice id: %x\n",
+ grub_pci_get_bus (dev), grub_pci_get_device (dev),
+ grub_pci_get_function (dev), pciid);
+ addr += 8;
+ for (i = 0; i < 6; i++, addr += 4)
{
- int i;
-
- grub_dprintf ("fb", "Display controller: %d:%d.%d\nDevice id: %x\n",
- grub_pci_get_bus (dev), grub_pci_get_device (dev),
- grub_pci_get_function (dev), pciid);
- addr += 8;
- for (i = 0; i < 6; i++, addr += 4)
- {
- grub_uint32_t old_bar1, old_bar2, type;
- grub_uint64_t base64;
+ grub_uint32_t old_bar1, old_bar2, type;
+ grub_uint64_t base64;
- old_bar1 = grub_pci_read (addr);
- if ((! old_bar1) || (old_bar1 & GRUB_PCI_ADDR_SPACE_IO))
- continue;
+ old_bar1 = grub_pci_read (addr);
+ if ((! old_bar1) || (old_bar1 & GRUB_PCI_ADDR_SPACE_IO))
+ continue;
- type = old_bar1 & GRUB_PCI_ADDR_MEM_TYPE_MASK;
- if (type == GRUB_PCI_ADDR_MEM_TYPE_64)
- {
- if (i == 5)
- break;
+ type = old_bar1 & GRUB_PCI_ADDR_MEM_TYPE_MASK;
+ if (type == GRUB_PCI_ADDR_MEM_TYPE_64)
+ {
+ if (i == 5)
+ break;
- old_bar2 = grub_pci_read (addr + 4);
- }
- else
- old_bar2 = 0;
+ old_bar2 = grub_pci_read (addr + 4);
+ }
+ else
+ old_bar2 = 0;
- base64 = old_bar2;
- base64 <<= 32;
- base64 |= (old_bar1 & GRUB_PCI_ADDR_MEM_MASK);
+ base64 = old_bar2;
+ base64 <<= 32;
+ base64 |= (old_bar1 & GRUB_PCI_ADDR_MEM_MASK);
- grub_dprintf ("fb", "%s(%d): 0x%llx\n",
- ((old_bar1 & GRUB_PCI_ADDR_MEM_PREFETCH) ?
- "VMEM" : "MMIO"), i,
- (unsigned long long) base64);
+ grub_dprintf ("fb", "%s(%d): 0x%llx\n",
+ ((old_bar1 & GRUB_PCI_ADDR_MEM_PREFETCH) ?
+ "VMEM" : "MMIO"), i,
+ (unsigned long long) base64);
- if ((old_bar1 & GRUB_PCI_ADDR_MEM_PREFETCH) && (! found))
- {
- *fb_base = base64;
- if (find_line_len (fb_base, line_len))
- found++;
- }
+ if ((old_bar1 & GRUB_PCI_ADDR_MEM_PREFETCH) && (! ctx->found))
+ {
+ *ctx->fb_base = base64;
+ if (find_line_len (ctx->fb_base, ctx->line_len))
+ ctx->found++;
+ }
- if (type == GRUB_PCI_ADDR_MEM_TYPE_64)
- {
- i++;
- addr += 4;
- }
+ if (type == GRUB_PCI_ADDR_MEM_TYPE_64)
+ {
+ i++;
+ addr += 4;
}
}
-
- return found;
}
- grub_pci_iterate (find_card);
- return found;
+ return ctx->found;
+}
+
+static int
+find_framebuf (grub_uint32_t *fb_base, grub_uint32_t *line_len)
+{
+ struct find_framebuf_ctx ctx = {
+ .fb_base = fb_base,
+ .line_len = line_len,
+ .found = 0
+ };
+
+ grub_pci_iterate (find_card, &ctx);
+ return ctx.found;
}
static int
return grub_video_fb_fini ();
}
+#ifndef TEST
+/* Helper for grub_video_radeon_fuloong2e_setup. */
+static int
+find_card (grub_pci_device_t dev, grub_pci_id_t pciid, void *data)
+{
+ int *found = data;
+ grub_pci_address_t addr;
+ grub_uint32_t class;
+
+ addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
+ class = grub_pci_read (addr);
+
+ if (((class >> 16) & 0xffff) != GRUB_PCI_CLASS_SUBCLASS_VGA
+ || pciid != 0x515a1002)
+ return 0;
+
+ *found = 1;
+
+ addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
+ framebuffer.base = grub_pci_read (addr);
+ framebuffer.dev = dev;
+
+ return 1;
+}
+#endif
+
static grub_err_t
grub_video_radeon_fuloong2e_setup (unsigned int width, unsigned int height,
unsigned int mode_type, unsigned int mode_mask __attribute__ ((unused)))
int found = 0;
#ifndef TEST
- auto int NESTED_FUNC_ATTR find_card (grub_pci_device_t dev, grub_pci_id_t pciid);
- int NESTED_FUNC_ATTR find_card (grub_pci_device_t dev, grub_pci_id_t pciid)
- {
- grub_pci_address_t addr;
- grub_uint32_t class;
-
- addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
- class = grub_pci_read (addr);
-
- if (((class >> 16) & 0xffff) != GRUB_PCI_CLASS_SUBCLASS_VGA
- || pciid != 0x515a1002)
- return 0;
-
- found = 1;
-
- addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
- framebuffer.base = grub_pci_read (addr);
- framebuffer.dev = dev;
-
- return 1;
- }
-
/* Decode depth from mode_type. If it is zero, then autodetect. */
depth = (mode_type & GRUB_VIDEO_MODE_TYPE_DEPTH_MASK)
>> GRUB_VIDEO_MODE_TYPE_DEPTH_POS;
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
"Only 640x480x16 is supported");
- grub_pci_iterate (find_card);
+ grub_pci_iterate (find_card, &found);
if (!found)
return grub_error (GRUB_ERR_IO, "Couldn't find graphics card");
#endif
#include "sis315_init.c"
+#ifndef TEST
+/* Helper for grub_video_sis315pro_setup. */
+static int
+find_card (grub_pci_device_t dev, grub_pci_id_t pciid, void *data)
+{
+ int *found = data;
+ grub_pci_address_t addr;
+ grub_uint32_t class;
+
+ addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
+ class = grub_pci_read (addr);
+
+ if (((class >> 16) & 0xffff) != GRUB_PCI_CLASS_SUBCLASS_VGA
+ || pciid != GRUB_SIS315PRO_PCIID)
+ return 0;
+
+ *found = 1;
+
+ addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
+ framebuffer.base = grub_pci_read (addr) & GRUB_PCI_ADDR_MEM_MASK;
+ addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG1);
+ framebuffer.mmiobase = grub_pci_read (addr) & GRUB_PCI_ADDR_MEM_MASK;
+ addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG2);
+ framebuffer.io = (grub_pci_read (addr) & GRUB_PCI_ADDR_IO_MASK)
+ + GRUB_MACHINE_PCI_IO_BASE;
+ framebuffer.dev = dev;
+
+ return 1;
+}
+#endif
+
static grub_err_t
grub_video_sis315pro_setup (unsigned int width, unsigned int height,
unsigned int mode_type,
unsigned i;
#ifndef TEST
- auto int NESTED_FUNC_ATTR find_card (grub_pci_device_t dev, grub_pci_id_t pciid);
- int NESTED_FUNC_ATTR find_card (grub_pci_device_t dev, grub_pci_id_t pciid)
- {
- grub_pci_address_t addr;
- grub_uint32_t class;
-
- addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
- class = grub_pci_read (addr);
-
- if (((class >> 16) & 0xffff) != GRUB_PCI_CLASS_SUBCLASS_VGA
- || pciid != GRUB_SIS315PRO_PCIID)
- return 0;
-
- found = 1;
-
- addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
- framebuffer.base = grub_pci_read (addr) & GRUB_PCI_ADDR_MEM_MASK;
- addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG1);
- framebuffer.mmiobase = grub_pci_read (addr) & GRUB_PCI_ADDR_MEM_MASK;
- addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG2);
- framebuffer.io = (grub_pci_read (addr) & GRUB_PCI_ADDR_IO_MASK)
- + GRUB_MACHINE_PCI_IO_BASE;
- framebuffer.dev = dev;
-
- return 1;
- }
-
/* Decode depth from mode_type. If it is zero, then autodetect. */
depth = (mode_type & GRUB_VIDEO_MODE_TYPE_DEPTH_MASK)
>> GRUB_VIDEO_MODE_TYPE_DEPTH_POS;
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
"Only 640x480x8 is supported");
- grub_pci_iterate (find_card);
+ grub_pci_iterate (find_card, &found);
if (!found)
return grub_error (GRUB_ERR_IO, "Couldn't find graphics card");
#endif
GRUB_SM712_CR_DDA_LOOKUP_REG1_START + idx);
}
+#if !defined (TEST) && !defined(GENINIT)
+/* Helper for grub_video_sm712_setup. */
+static int
+find_card (grub_pci_device_t dev, grub_pci_id_t pciid, void *data)
+{
+ int *found = data;
+ grub_pci_address_t addr;
+ grub_uint32_t class;
+
+ addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
+ class = grub_pci_read (addr);
+
+ if (((class >> 16) & 0xffff) != GRUB_PCI_CLASS_SUBCLASS_VGA
+ || pciid != GRUB_SM712_PCIID)
+ return 0;
+
+ *found = 1;
+
+ addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
+ framebuffer.base = grub_pci_read (addr);
+ framebuffer.dev = dev;
+
+ return 1;
+}
+#endif
+
static grub_err_t
grub_video_sm712_setup (unsigned int width, unsigned int height,
unsigned int mode_type, unsigned int mode_mask __attribute__ ((unused)))
grub_err_t err;
int found = 0;
- auto int NESTED_FUNC_ATTR find_card (grub_pci_device_t dev, grub_pci_id_t pciid);
- int NESTED_FUNC_ATTR find_card (grub_pci_device_t dev, grub_pci_id_t pciid)
- {
- grub_pci_address_t addr;
- grub_uint32_t class;
-
- addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
- class = grub_pci_read (addr);
-
- if (((class >> 16) & 0xffff) != GRUB_PCI_CLASS_SUBCLASS_VGA
- || pciid != GRUB_SM712_PCIID)
- return 0;
-
- found = 1;
-
- addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
- framebuffer.base = grub_pci_read (addr);
- framebuffer.dev = dev;
-
- return 1;
- }
-
/* Decode depth from mode_type. If it is zero, then autodetect. */
depth = (mode_type & GRUB_VIDEO_MODE_TYPE_DEPTH_MASK)
>> GRUB_VIDEO_MODE_TYPE_DEPTH_POS;
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
"Only 1024x600x16 is supported");
- grub_pci_iterate (find_card);
+ grub_pci_iterate (find_card, &found);
if (!found)
return grub_error (GRUB_ERR_IO, "Couldn't find graphics card");
/* Fill mode info details. */
#include <grub/cpu/pci.h>
#endif
-typedef int NESTED_FUNC_ATTR (*grub_pci_iteratefunc_t)
- (grub_pci_device_t dev, grub_pci_id_t pciid);
+typedef int (*grub_pci_iteratefunc_t)
+ (grub_pci_device_t dev, grub_pci_id_t pciid, void *data);
grub_pci_address_t EXPORT_FUNC(grub_pci_make_address) (grub_pci_device_t dev,
int reg);
-void EXPORT_FUNC(grub_pci_iterate) (grub_pci_iteratefunc_t hook);
+void EXPORT_FUNC(grub_pci_iterate) (grub_pci_iteratefunc_t hook,
+ void *hook_data);
struct grub_pci_dma_chunk;