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