static int acpi_timer_attach(device_t dev) { char desc[40]; int i, j; ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); /* * If all tests of the counter succeed, use the ACPI-fast method. If * at least one failed, default to using the safe routine, which reads * the timer multiple times to get a consistent value before returning. */ j = 0; for (i = 0; i < 10; i++) j += acpi_timer_test(); if (j == 10) { if (acpi_timer_resolution == 32) { acpi_cputimer.name = "ACPI-fast"; acpi_cputimer.count = acpi_timer_get_timecount; } else { acpi_cputimer.name = "ACPI-fast24"; acpi_cputimer.count = acpi_timer_get_timecount24; } } else { if (acpi_timer_resolution == 32) acpi_cputimer.name = "ACPI-safe"; else acpi_cputimer.name = "ACPI-safe24"; acpi_cputimer.count = acpi_timer_get_timecount_safe; } ksprintf(desc, "%u-bit timer at 3.579545MHz", acpi_timer_resolution); device_set_desc_copy(dev, desc); cputimer_register(&acpi_cputimer); cputimer_select(&acpi_cputimer, 0); return (0); }
static int acpi_timer_probe(device_t dev) { char desc[40]; int i, j, rid, rtype; ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); if (dev != acpi_timer_dev) return (ENXIO); rid = 0; rtype = AcpiGbl_FADT.XPmTimerBlock.SpaceId ? SYS_RES_IOPORT : SYS_RES_MEMORY; acpi_timer_reg = bus_alloc_resource_any(dev, rtype, &rid, RF_ACTIVE); if (acpi_timer_reg == NULL) { device_printf(dev, "couldn't allocate resource (%s 0x%lx)\n", (rtype == SYS_RES_IOPORT) ? "port" : "mem", (u_long)AcpiGbl_FADT.XPmTimerBlock.Address); return (ENXIO); } acpi_timer_bsh = rman_get_bushandle(acpi_timer_reg); acpi_timer_bst = rman_get_bustag(acpi_timer_reg); if ((AcpiGbl_FADT.Flags & ACPI_FADT_32BIT_TIMER) != 0) acpi_counter_mask = 0xffffffff; else acpi_counter_mask = 0x00ffffff; /* * If all tests of the counter succeed, use the ACPI-fast method. If * at least one failed, default to using the safe routine, which reads * the timer multiple times to get a consistent value before returning. */ j = 0; for (i = 0; i < 10; i++) j += acpi_timer_test(); if (j == 10) { if (acpi_counter_mask == 0xffffffff) { acpi_cputimer.name = "ACPI-fast"; acpi_cputimer.count = acpi_timer_get_timecount; } else { acpi_cputimer.name = "ACPI-fast24"; acpi_cputimer.count = acpi_timer_get_timecount24; } } else { if (acpi_counter_mask == 0xffffffff) acpi_cputimer.name = "ACPI-safe"; else acpi_cputimer.name = "ACPI-safe24"; acpi_cputimer.count = acpi_timer_get_timecount_safe; } ksprintf(desc, "%d-bit timer at 3.579545MHz", (AcpiGbl_FADT.Flags & ACPI_FADT_32BIT_TIMER) ? 32 : 24); device_set_desc_copy(dev, desc); cputimer_register(&acpi_cputimer); cputimer_select(&acpi_cputimer, 0); /* Release the resource, we'll allocate it again during attach. */ bus_release_resource(dev, rtype, rid, acpi_timer_reg); return (0); }
static int acpi_timer_probe(device_t dev) { char desc[40]; int i, j, rid, rtype; ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); if (dev != acpi_timer_dev) return (ENXIO); switch (AcpiGbl_FADT.XPmTimerBlock.SpaceId) { case ACPI_ADR_SPACE_SYSTEM_MEMORY: rtype = SYS_RES_MEMORY; break; case ACPI_ADR_SPACE_SYSTEM_IO: rtype = SYS_RES_IOPORT; break; default: return (ENXIO); } rid = 0; acpi_timer_reg = bus_alloc_resource_any(dev, rtype, &rid, RF_ACTIVE); if (acpi_timer_reg == NULL) { device_printf(dev, "couldn't allocate resource (%s 0x%lx)\n", (rtype == SYS_RES_IOPORT) ? "port" : "mem", (u_long)AcpiGbl_FADT.XPmTimerBlock.Address); return (ENXIO); } acpi_timer_bsh = rman_get_bushandle(acpi_timer_reg); acpi_timer_bst = rman_get_bustag(acpi_timer_reg); if (AcpiGbl_FADT.Flags & ACPI_FADT_32BIT_TIMER) acpi_timer_timecounter.tc_counter_mask = 0xffffffff; else acpi_timer_timecounter.tc_counter_mask = 0x00ffffff; acpi_timer_timecounter.tc_frequency = acpi_timer_frequency; acpi_timer_timecounter.tc_flags = TC_FLAGS_SUSPEND_SAFE; if (testenv("debug.acpi.timer_test")) acpi_timer_boot_test(); /* * If all tests of the counter succeed, use the ACPI-fast method. If * at least one failed, default to using the safe routine, which reads * the timer multiple times to get a consistent value before returning. */ j = 0; if (bootverbose) printf("ACPI timer:"); for (i = 0; i < 10; i++) j += acpi_timer_test(); if (bootverbose) printf(" -> %d\n", j); if (j == 10) { acpi_timer_timecounter.tc_name = "ACPI-fast"; acpi_timer_timecounter.tc_get_timecount = acpi_timer_get_timecount; acpi_timer_timecounter.tc_quality = 900; } else { acpi_timer_timecounter.tc_name = "ACPI-safe"; acpi_timer_timecounter.tc_get_timecount = acpi_timer_get_timecount_safe; acpi_timer_timecounter.tc_quality = 850; } tc_init(&acpi_timer_timecounter); sprintf(desc, "%d-bit timer at %u.%06uMHz", (AcpiGbl_FADT.Flags & ACPI_FADT_32BIT_TIMER) != 0 ? 32 : 24, acpi_timer_frequency / 1000000, acpi_timer_frequency % 1000000); device_set_desc_copy(dev, desc); /* Release the resource, we'll allocate it again during attach. */ bus_release_resource(dev, rtype, rid, acpi_timer_reg); return (0); }