DF-5518 / diag.c
/* * diag.c -- DF-5518 rig diagnostic: reproduce gpio_intel_attach's * bus_alloc_resource_any(SYS_RES_MEMORY) on the failed gpio_intel0 device * and bisect where it fails (acpi rman reserve vs nexus fallback vs * activate), plus try alternate windows. */ #include <sys/param.h> #include <sys/module.h> #include <sys/kernel.h> #include <sys/systm.h> #include <sys/bus.h> #include <sys/rman.h> static int diag_modevent(module_t mod, int type, void *arg) { devclass_t dc; device_t dev; struct resource *r; int rid; switch (type) { case MOD_LOAD: dc = devclass_find("gpio_intel"); if (dc == NULL) { kprintf("diag: no gpio_intel devclass\n"); return (0); } dev = devclass_get_device(dc, 0); if (dev == NULL) { kprintf("diag: no gpio_intel0\n"); return (0); } rid = 0; r = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, RF_ACTIVE); kprintf("diag: any(rid0) = %p\n", r); if (r != NULL) { bus_release_resource(dev, SYS_RES_MEMORY, rid, r); } rid = 0; r = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid, 0x7d000000, 0x7d007fff, 0x8000, RF_ACTIVE); kprintf("diag: explicit 0x7d000000 = %p\n", r); if (r != NULL) { bus_release_resource(dev, SYS_RES_MEMORY, rid, r); } rid = 0; r = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid, 0x7c000000, 0x7c007fff, 0x8000, RF_ACTIVE); kprintf("diag: explicit 0x7c000000 (undeclared) = %p\n", r); if (r != NULL) { bus_release_resource(dev, SYS_RES_MEMORY, rid, r); } rid = 1; r = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE); kprintf("diag: any irq(rid1) = %p\n", r); if (r != NULL) { bus_release_resource(dev, SYS_RES_IRQ, rid, r); } break; case MOD_UNLOAD: break; default: return (EOPNOTSUPP); } return (0); } static moduledata_t diag_mod = { "diag", diag_modevent, NULL }; DECLARE_MODULE(diag, diag_mod, SI_SUB_DRIVERS, SI_ORDER_ANY); MODULE_VERSION(diag, 1); |