Date: Tue, 11 Jan 2011 22:17:48 GMT From: John Baldwin <jhb@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 187714 for review Message-ID: <201101112217.p0BMHmOf088172@skunkworks.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@187714?ac=10 Change 187714 by jhb@jhb_jhbbsd on 2011/01/11 22:17:04 IFC @187713 Affected files ... .. //depot/projects/smpng/sys/arm/include/metadata.h#7 integrate .. //depot/projects/smpng/sys/conf/files#269 integrate .. //depot/projects/smpng/sys/dev/acpica/Osd/OsdInterrupt.c#19 integrate .. //depot/projects/smpng/sys/dev/acpica/acpi.c#130 integrate .. //depot/projects/smpng/sys/dev/usb/serial/uplcom.c#20 integrate .. //depot/projects/smpng/sys/kern/kern_intr.c#107 integrate .. //depot/projects/smpng/sys/kern/sched_ule.c#113 integrate .. //depot/projects/smpng/sys/powerpc/powermac/fcu.c#2 integrate .. //depot/projects/smpng/sys/sys/priority.h#6 integrate Differences ... ==== //depot/projects/smpng/sys/arm/include/metadata.h#7 (text+ko) ==== @@ -23,12 +23,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/arm/include/metadata.h,v 1.7 2010/07/11 21:11:23 raj Exp $ + * $FreeBSD: src/sys/arm/include/metadata.h,v 1.8 2011/01/11 22:07:39 marcel Exp $ */ #ifndef _MACHINE_METADATA_H_ #define _MACHINE_METADATA_H_ -#define MODINFOMD_DTBP 0x1001 +#define MODINFOMD_BOOTINFO 0x1001 +#define MODINFOMD_DTBP 0x1002 #endif /* !_MACHINE_METADATA_H_ */ ==== //depot/projects/smpng/sys/conf/files#269 (text+ko) ==== @@ -1,4 +1,4 @@ -# $FreeBSD: src/sys/conf/files,v 1.1552 2011/01/03 20:37:31 rmacklem Exp $ +# $FreeBSD: src/sys/conf/files,v 1.1553 2011/01/11 21:46:29 thompsa Exp $ # # The long compile-with and dependency lines are required because of # limitations in config: backslash-newline doesn't work in strings, and @@ -1812,6 +1812,20 @@ # dev/usb/wlan/if_rum.c optional rum dev/usb/wlan/if_run.c optional run +runfw.c optional runfw \ + compile-with "${AWK} -f $S/tools/fw_stub.awk runfw:runfw -mrunfw -c${.TARGET}" \ + no-implicit-rule before-depend local \ + clean "runfw.c" +runfw.fwo optional runfw \ + dependency "runfw" \ + compile-with "${LD} -b binary -d -warn-common -r -d -o ${.TARGET} runfw" \ + no-implicit-rule \ + clean "runfw.fwo" +runfw optional runfw \ + dependency "$S/contrib/dev/run/rt2870.fw.uu" \ + compile-with "uudecode -o ${.TARGET} $S/contrib/dev/run/rt2870.fw.uu" \ + no-obj no-implicit-rule \ + clean "runfw" dev/usb/wlan/if_uath.c optional uath dev/usb/wlan/if_upgt.c optional upgt dev/usb/wlan/if_ural.c optional ural ==== //depot/projects/smpng/sys/dev/acpica/Osd/OsdInterrupt.c#19 (text+ko) ==== @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/acpica/Osd/OsdInterrupt.c,v 1.26 2011/01/10 21:09:38 jkim Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/acpica/Osd/OsdInterrupt.c,v 1.27 2011/01/11 19:20:01 jkim Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -91,6 +91,18 @@ return (FILTER_STRAY); } +static void +acpi_intr_destroy(device_t dev, struct acpi_intr *ai) +{ + + if (ai->ai_handle != NULL) + bus_teardown_intr(dev, ai->ai_irq, ai->ai_handle); + if (ai->ai_irq != NULL) + bus_release_resource(dev, SYS_RES_IRQ, ai->ai_rid, ai->ai_irq); + bus_delete_resource(dev, SYS_RES_IRQ, ai->ai_rid); + free(ai, M_ACPIINTR); +} + ACPI_STATUS AcpiOsInstallInterruptHandler(UINT32 InterruptNumber, ACPI_OSD_HANDLER ServiceRoutine, void *Context) @@ -123,6 +135,8 @@ ai->ai_number = InterruptNumber; ai->ai_handler = ServiceRoutine; ai->ai_context = Context; + SLIST_INSERT_HEAD(&acpi_intr_list, ai, ai_link); + mtx_unlock(&acpi_intr_lock); /* * If the MADT contained an interrupt override directive for the SCI, @@ -151,19 +165,13 @@ device_printf(sc->acpi_dev, "could not set up interrupt\n"); goto error; } - SLIST_INSERT_HEAD(&acpi_intr_list, ai, ai_link); - mtx_unlock(&acpi_intr_lock); return_ACPI_STATUS (AE_OK); error: + mtx_lock(&acpi_intr_lock); + SLIST_REMOVE(&acpi_intr_list, ai, acpi_intr, ai_link); mtx_unlock(&acpi_intr_lock); - if (ai->ai_handle != NULL) - bus_teardown_intr(sc->acpi_dev, ai->ai_irq, ai->ai_handle); - if (ai->ai_irq != NULL) - bus_release_resource(sc->acpi_dev, SYS_RES_IRQ, ai->ai_rid, - ai->ai_irq); - bus_delete_resource(sc->acpi_dev, SYS_RES_IRQ, ai->ai_rid); - free(ai, M_ACPIINTR); + acpi_intr_destroy(sc->acpi_dev, ai); return_ACPI_STATUS (AE_ALREADY_EXISTS); } @@ -195,10 +203,7 @@ mtx_unlock(&acpi_intr_lock); if (ai == NULL) return_ACPI_STATUS (AE_NOT_EXIST); - bus_teardown_intr(sc->acpi_dev, ai->ai_irq, ai->ai_handle); - bus_release_resource(sc->acpi_dev, SYS_RES_IRQ, ai->ai_rid, ai->ai_irq); - bus_delete_resource(sc->acpi_dev, SYS_RES_IRQ, ai->ai_rid); - free(ai, M_ACPIINTR); + acpi_intr_destroy(sc->acpi_dev, ai); return_ACPI_STATUS (AE_OK); } ==== //depot/projects/smpng/sys/dev/acpica/acpi.c#130 (text+ko) ==== @@ -28,7 +28,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi.c,v 1.297 2010/12/23 18:50:14 jhb Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi.c,v 1.298 2011/01/11 19:26:39 jkim Exp $"); #include "opt_acpi.h" #include <sys/param.h> @@ -3044,6 +3044,20 @@ /* * ACPICA Event Handlers (FixedEvent, also called from button notify handler) */ +static void +acpi_invoke_sleep_eventhandler(void *context) +{ + + EVENTHANDLER_INVOKE(acpi_sleep_event, *(int *)context); +} + +static void +acpi_invoke_wake_eventhandler(void *context) +{ + + EVENTHANDLER_INVOKE(acpi_wakeup_event, *(int *)context); +} + UINT32 acpi_event_power_button_sleep(void *context) { @@ -3051,8 +3065,9 @@ ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); - EVENTHANDLER_INVOKE(acpi_sleep_event, sc->acpi_power_button_sx); - + if (ACPI_FAILURE(AcpiOsExecute(OSL_NOTIFY_HANDLER, + acpi_invoke_sleep_eventhandler, &sc->acpi_power_button_sx))) + return_VALUE (ACPI_INTERRUPT_NOT_HANDLED); return_VALUE (ACPI_INTERRUPT_HANDLED); } @@ -3063,8 +3078,9 @@ ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); - EVENTHANDLER_INVOKE(acpi_wakeup_event, sc->acpi_power_button_sx); - + if (ACPI_FAILURE(AcpiOsExecute(OSL_NOTIFY_HANDLER, + acpi_invoke_wake_eventhandler, &sc->acpi_power_button_sx))) + return_VALUE (ACPI_INTERRUPT_NOT_HANDLED); return_VALUE (ACPI_INTERRUPT_HANDLED); } @@ -3075,8 +3091,9 @@ ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); - EVENTHANDLER_INVOKE(acpi_sleep_event, sc->acpi_sleep_button_sx); - + if (ACPI_FAILURE(AcpiOsExecute(OSL_NOTIFY_HANDLER, + acpi_invoke_sleep_eventhandler, &sc->acpi_sleep_button_sx))) + return_VALUE (ACPI_INTERRUPT_NOT_HANDLED); return_VALUE (ACPI_INTERRUPT_HANDLED); } @@ -3087,8 +3104,9 @@ ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); - EVENTHANDLER_INVOKE(acpi_wakeup_event, sc->acpi_sleep_button_sx); - + if (ACPI_FAILURE(AcpiOsExecute(OSL_NOTIFY_HANDLER, + acpi_invoke_wake_eventhandler, &sc->acpi_sleep_button_sx))) + return_VALUE (ACPI_INTERRUPT_NOT_HANDLED); return_VALUE (ACPI_INTERRUPT_HANDLED); } ==== //depot/projects/smpng/sys/dev/usb/serial/uplcom.c#20 (text+ko) ==== @@ -1,7 +1,7 @@ /* $NetBSD: uplcom.c,v 1.21 2001/11/13 06:24:56 lukem Exp $ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/usb/serial/uplcom.c,v 1.28 2011/01/11 13:59:06 jhb Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/usb/serial/uplcom.c,v 1.29 2011/01/11 19:05:55 gavin Exp $"); /*- * Copyright (c) 2001-2003, 2005 Shunsuke Akiyama <akiyama@jp.FreeBSD.org>. @@ -254,12 +254,12 @@ UPLCOM_DEV(ALCOR, AU9720), /* Alcor AU9720 USB 2.0-RS232 */ UPLCOM_DEV(ANCHOR, SERIAL), /* Anchor Serial adapter */ UPLCOM_DEV(ATEN, UC232A), /* PLANEX USB-RS232 URS-03 */ - UPLCOM_DEV(BELKIN, F5U257), /* Belkin F5U257 */ + UPLCOM_DEV(BELKIN, F5U257), /* Belkin F5U257 USB to Serial */ UPLCOM_DEV(COREGA, CGUSBRS232R), /* Corega CG-USBRS232R */ UPLCOM_DEV(EPSON, CRESSI_EDY), /* Cressi Edy diving computer */ UPLCOM_DEV(EPSON, N2ITION3), /* Zeagle N2iTion3 diving computer */ - UPLCOM_DEV(ELECOM, UCSGT), /* ELECOM UC-SGT */ - UPLCOM_DEV(ELECOM, UCSGT0), /* ELECOM UC-SGT */ + UPLCOM_DEV(ELECOM, UCSGT), /* ELECOM UC-SGT Serial Adapter */ + UPLCOM_DEV(ELECOM, UCSGT0), /* ELECOM UC-SGT Serial Adapter */ UPLCOM_DEV(HAL, IMR001), /* HAL Corporation Crossam2+USB */ UPLCOM_DEV(HP, LD220), /* HP LD220 POS Display */ UPLCOM_DEV(IODATA, USBRSAQ), /* I/O DATA USB-RSAQ */ @@ -285,17 +285,17 @@ UPLCOM_DEV(PROLIFIC, RSAQ3), /* I/O DATA USB-RSAQ3 */ UPLCOM_DEV(PROLIFIC, UIC_MSR206), /* UIC MSR206 Card Reader */ UPLCOM_DEV(PROLIFIC2, PL2303), /* Prolific adapter */ - UPLCOM_DEV(RADIOSHACK, USBCABLE), + UPLCOM_DEV(RADIOSHACK, USBCABLE), /* Radio Shack USB Adapter */ UPLCOM_DEV(RATOC, REXUSB60), /* RATOC REX-USB60 */ UPLCOM_DEV(SAGEM, USBSERIAL), /* Sagem USB-Serial Controller */ UPLCOM_DEV(SAMSUNG, I330), /* Samsung I330 phone cradle */ UPLCOM_DEV(SANWA, KB_USB2), /* Sanwa KB-USB2 Multimeter cable */ - UPLCOM_DEV(SIEMENS3, EF81), /* Seimens EF81 */ - UPLCOM_DEV(SIEMENS3, SX1), /* Seimens SX1 */ - UPLCOM_DEV(SIEMENS3, X65), /* Seimens X65 */ - UPLCOM_DEV(SIEMENS3, X75), /* Seimens X75 */ + UPLCOM_DEV(SIEMENS3, EF81), /* Siemens EF81 */ + UPLCOM_DEV(SIEMENS3, SX1), /* Siemens SX1 */ + UPLCOM_DEV(SIEMENS3, X65), /* Siemens X65 */ + UPLCOM_DEV(SIEMENS3, X75), /* Siemens X75 */ UPLCOM_DEV(SITECOM, SERIAL), /* Sitecom USB to Serial */ - UPLCOM_DEV(SMART, PL2303), /* SMART Technologies */ + UPLCOM_DEV(SMART, PL2303), /* SMART Technologies USB to Serial */ UPLCOM_DEV(SONY, QN3), /* Sony QN3 phone cable */ UPLCOM_DEV(SONYERICSSON, DATAPILOT), /* Sony Ericsson Datapilot */ UPLCOM_DEV(SONYERICSSON, DCU10), /* Sony Ericsson DCU-10 Cable */ @@ -305,7 +305,7 @@ UPLCOM_DEV(SYNTECH, CPT8001C), /* Syntech CPT-8001C Barcode scanner */ UPLCOM_DEV(TDK, UHA6400), /* TDK USB-PHS Adapter UHA6400 */ UPLCOM_DEV(TDK, UPA9664), /* TDK USB-PHS Adapter UPA9664 */ - UPLCOM_DEV(TRIPPLITE, U209), /* Tripp-Lite U209-000-R */ + UPLCOM_DEV(TRIPPLITE, U209), /* Tripp-Lite U209-000-R USB to Serial */ UPLCOM_DEV(YCCABLE, PL2303), /* YC Cable USB-Serial */ }; #undef UPLCOM_DEV ==== //depot/projects/smpng/sys/kern/kern_intr.c#107 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/kern/kern_intr.c,v 1.177 2010/06/10 16:14:05 mav Exp $"); +__FBSDID("$FreeBSD: src/sys/kern/kern_intr.c,v 1.178 2011/01/11 22:15:30 jhb Exp $"); #include "opt_ddb.h" @@ -130,22 +130,18 @@ INTR_TYPE_CAM | INTR_TYPE_MISC | INTR_TYPE_CLK | INTR_TYPE_AV); switch (flags) { case INTR_TYPE_TTY: - pri = PI_TTYLOW; + pri = PI_TTY; break; case INTR_TYPE_BIO: - /* - * XXX We need to refine this. BSD/OS distinguishes - * between tape and disk priorities. - */ pri = PI_DISK; break; case INTR_TYPE_NET: pri = PI_NET; break; case INTR_TYPE_CAM: - pri = PI_DISK; /* XXX or PI_CAM? */ + pri = PI_DISK; break; - case INTR_TYPE_AV: /* Audio/video */ + case INTR_TYPE_AV: pri = PI_AV; break; case INTR_TYPE_CLK: @@ -1082,7 +1078,7 @@ *eventp = ie; } error = intr_event_add_handler(ie, name, NULL, handler, arg, - (pri * RQ_PPQ) + PI_SOFT, flags, cookiep); + PI_SWI(pri), flags, cookiep); if (error) return (error); if (pri == SWI_CLOCK) { @@ -1656,18 +1652,13 @@ case PI_AV: db_printf("AV "); break; - case PI_TTYHIGH: - case PI_TTYLOW: + case PI_TTY: db_printf("TTY "); break; - case PI_TAPE: - db_printf("TAPE"); - break; case PI_NET: db_printf("NET "); break; case PI_DISK: - case PI_DISKLOW: db_printf("DISK"); break; case PI_DULL: ==== //depot/projects/smpng/sys/kern/sched_ule.c#113 (text+ko) ==== @@ -36,7 +36,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/kern/sched_ule.c,v 1.287 2011/01/10 20:48:10 jhb Exp $"); +__FBSDID("$FreeBSD: src/sys/kern/sched_ule.c,v 1.288 2011/01/11 22:13:19 jhb Exp $"); #include "opt_hwpmc_hooks.h" #include "opt_kdtrace.h" @@ -1388,7 +1388,7 @@ int score; int pri; - if (td->td_pri_class != PRI_TIMESHARE) + if (PRI_BASE(td->td_pri_class) != PRI_TIMESHARE) return; /* * If the score is interactive we place the thread in the realtime @@ -2124,7 +2124,7 @@ ts = td->td_sched; if (td->td_pri_class & PRI_FIFO_BIT) return; - if (td->td_pri_class == PRI_TIMESHARE) { + if (PRI_BASE(td->td_pri_class) == PRI_TIMESHARE) { /* * We used a tick; charge it to the thread so * that we can compute our interactivity. ==== //depot/projects/smpng/sys/powerpc/powermac/fcu.c#2 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/powerpc/powermac/fcu.c,v 1.1 2010/10/15 20:08:16 andreast Exp $"); +__FBSDID("$FreeBSD: src/sys/powerpc/powermac/fcu.c,v 1.2 2011/01/11 21:18:29 andreast Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -62,19 +62,20 @@ #define FCU_PWM_FAIL 0x2b #define FCU_PWM_AVAILABLE 0x2c #define FCU_PWM_ACTIVE 0x2d -#define FCU_PWM_READ(x) 0x31 + (x) * 2 -#define FCU_PWM_SET(x) 0x30 + (x) * 2 +#define FCU_PWM_RPM(x) 0x31 + (x) * 2 /* Get RPM. */ +#define FCU_PWM_SGET(x) 0x30 + (x) * 2 /* Set or get PWM. */ struct fcu_fan { int id; - cell_t min_rpm; - cell_t max_rpm; + cell_t min; + cell_t max; char location[32]; enum { FCU_FAN_RPM, FCU_FAN_PWM } type; int setpoint; + int rpm; }; struct fcu_softc { @@ -85,6 +86,14 @@ int sc_nfans; }; +/* We can read the PWM and the RPM from a PWM controlled fan. + * Offer both values via sysctl. + */ +enum { + FCU_PWM_SYSCTL_PWM = 1 << 8, + FCU_PWM_SYSCTL_RPM = 2 << 8 +}; + static int fcu_rpm_shift; /* Regular bus attachment functions */ @@ -96,6 +105,9 @@ static int fcu_fill_fan_prop(device_t dev); static int fcu_fan_set_rpm(device_t dev, struct fcu_fan *fan, int rpm); static int fcu_fan_get_rpm(device_t dev, struct fcu_fan *fan, int *rpm); +static int fcu_fan_set_pwm(device_t dev, struct fcu_fan *fan, int pwm); +static int fcu_fan_get_pwm(device_t dev, struct fcu_fan *fan, int *pwm, + int *rpm); static int fcu_fanrpm_sysctl(SYSCTL_HANDLER_ARGS); static void fcu_start(void *xdev); static int fcu_write(device_t dev, uint32_t addr, uint8_t reg, uint8_t *buf, @@ -246,34 +258,21 @@ sc = device_get_softc(dev); /* Clamp to allowed range */ - rpm = max(fan->min_rpm, rpm); - rpm = min(fan->max_rpm, rpm); + rpm = max(fan->min, rpm); + rpm = min(fan->max, rpm); if (fan->type == FCU_FAN_RPM) { reg = FCU_RPM_SET(fan->id); fan->setpoint = rpm; - } else if (fan->type == FCU_FAN_PWM) { - reg = FCU_PWM_SET(fan->id); - if (rpm > 3500) - rpm = 3500; - if (rpm < 500) - rpm = 500; - fan->setpoint = rpm; - /* PWM 30: 550 rpm, PWM 255: 3400 rpm. */ - rpm = (rpm * 255) / 3500; } else { device_printf(dev, "Unknown fan type: %d\n", fan->type); return (EIO); } - if (fan->type == FCU_FAN_RPM) { - buf[0] = rpm >> (8 - fcu_rpm_shift); - buf[1] = rpm << fcu_rpm_shift; - fcu_write(sc->sc_dev, sc->sc_addr, reg, buf, 2); - } else { - buf[0] = rpm; - fcu_write(sc->sc_dev, sc->sc_addr, reg, buf, 1); - } + buf[0] = rpm >> (8 - fcu_rpm_shift); + buf[1] = rpm << fcu_rpm_shift; + + fcu_write(sc->sc_dev, sc->sc_addr, reg, buf, 2); return (0); } @@ -313,7 +312,63 @@ return (ENXIO); } reg = FCU_RPM_READ(fan->id); - } else if (fan->type == FCU_FAN_PWM) { + + } else { + device_printf(dev, "Unknown fan type: %d\n", fan->type); + return (EIO); + } + + /* It seems that we can read the fans rpm. */ + fcu_read_1(sc->sc_dev, sc->sc_addr, reg, buff); + + *rpm = (buff[0] << (8 - fcu_rpm_shift)) | buff[1] >> fcu_rpm_shift; + + return (0); +} + +static int +fcu_fan_set_pwm(device_t dev, struct fcu_fan *fan, int pwm) +{ + uint8_t reg; + struct fcu_softc *sc; + uint8_t buf[2]; + + sc = device_get_softc(dev); + + /* Clamp to allowed range */ + pwm = max(fan->min, pwm); + pwm = min(fan->max, pwm); + + if (fan->type == FCU_FAN_PWM) { + reg = FCU_PWM_SGET(fan->id); + if (pwm > 100) + pwm = 100; + if (pwm < 30) + pwm = 30; + fan->setpoint = pwm; + } else { + device_printf(dev, "Unknown fan type: %d\n", fan->type); + return (EIO); + } + + buf[0] = (pwm * 2550) / 1000; + + fcu_write(sc->sc_dev, sc->sc_addr, reg, buf, 1); + + return (0); +} + +static int +fcu_fan_get_pwm(device_t dev, struct fcu_fan *fan, int *pwm, int *rpm) +{ + uint8_t reg; + struct fcu_softc *sc; + uint8_t buf[2]; + uint8_t active = 0, avail = 0, fail = 0; + + sc = device_get_softc(dev); + + if (fan->type == FCU_FAN_PWM) { /* Check if the fan is available. */ reg = FCU_PWM_AVAILABLE; fcu_read_1(sc->sc_dev, sc->sc_addr, reg, &avail); @@ -337,16 +392,21 @@ fan->id); return (ENXIO); } - reg = FCU_PWM_READ(fan->id); + reg = FCU_PWM_SGET(fan->id); } else { device_printf(dev, "Unknown fan type: %d\n", fan->type); return (EIO); } - /* It seems that we can read the fans rpm. */ - fcu_read_1(sc->sc_dev, sc->sc_addr, reg, buff); + /* It seems that we can read the fans pwm. */ + fcu_read_1(sc->sc_dev, sc->sc_addr, reg, buf); + + *pwm = (buf[0] * 1000) / 2550; - *rpm = (buff[0] << (8 - fcu_rpm_shift)) | buff[1] >> fcu_rpm_shift; + /* Now read the rpm. */ + reg = FCU_PWM_RPM(fan->id); + fcu_read_1(sc->sc_dev, sc->sc_addr, reg, buf); + *rpm = (buf[0] << (8 - fcu_rpm_shift)) | buf[1] >> fcu_rpm_shift; return (0); } @@ -412,18 +472,41 @@ device_t fcu; struct fcu_softc *sc; struct fcu_fan *fan; - int rpm = 0, error; + int rpm = 0, pwm = 0, error; fcu = arg1; sc = device_get_softc(fcu); - fan = &sc->sc_fans[arg2]; - fcu_fan_get_rpm(fcu, fan, &rpm); - error = sysctl_handle_int(oidp, &rpm, 0, req); + fan = &sc->sc_fans[arg2 & 0x00ff]; + if (fan->type == FCU_FAN_RPM) { + fcu_fan_get_rpm(fcu, fan, &rpm); + error = sysctl_handle_int(oidp, &rpm, 0, req); + } else { + fcu_fan_get_pwm(fcu, fan, &pwm, &rpm); + + switch (arg2 & 0xff00) { + case FCU_PWM_SYSCTL_PWM: + error = sysctl_handle_int(oidp, &pwm, 0, req); + break; + case FCU_PWM_SYSCTL_RPM: + error = sysctl_handle_int(oidp, &rpm, 0, req); + break; + default: + /* This should never happen */ + error = -1; + }; + } + + /* We can only read the RPM from a PWM controlled fan, so return. */ + if ((arg2 & 0xff00) == FCU_PWM_SYSCTL_RPM) + return (0); if (error || !req->newptr) return (error); - return (fcu_fan_set_rpm(fcu, fan, rpm)); + if (fan->type == FCU_FAN_RPM) + return (fcu_fan_set_rpm(fcu, fan, rpm)); + else + return (fcu_fan_set_pwm(fcu, fan, pwm)); } static void @@ -432,7 +515,6 @@ struct fcu_softc *sc; struct sysctl_oid *oid, *fanroot_oid; struct sysctl_ctx_list *ctx; - phandle_t child; char sysctl_name[32]; int i, j; @@ -440,8 +522,6 @@ sc->sc_nfans = 0; - child = ofw_bus_get_node(dev); - /* Count the actual number of fans. */ sc->sc_nfans = fcu_fill_fan_prop(dev); @@ -472,35 +552,69 @@ } sysctl_name[j] = 0; - sc->sc_fans[i].min_rpm = 2400 >> fcu_rpm_shift; - sc->sc_fans[i].max_rpm = 56000 >> fcu_rpm_shift; - fcu_fan_get_rpm(dev, &sc->sc_fans[i], &sc->sc_fans[i].setpoint); + if (sc->sc_fans[i].type == FCU_FAN_RPM) { + sc->sc_fans[i].min = 2400 >> fcu_rpm_shift; + sc->sc_fans[i].max = 56000 >> fcu_rpm_shift; + fcu_fan_get_rpm(dev, &sc->sc_fans[i], + &sc->sc_fans[i].setpoint); + + oid = SYSCTL_ADD_NODE(ctx, SYSCTL_CHILDREN(fanroot_oid), + OID_AUTO, sysctl_name, + CTLFLAG_RD, 0, "Fan Information"); + SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(oid), OID_AUTO, + "minrpm", CTLTYPE_INT | CTLFLAG_RD, + &(sc->sc_fans[i].min), sizeof(cell_t), + "Minimum allowed RPM"); + SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(oid), OID_AUTO, + "maxrpm", CTLTYPE_INT | CTLFLAG_RD, + &(sc->sc_fans[i].max), sizeof(cell_t), + "Maximum allowed RPM"); + /* I use i to pass the fan id. */ + SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(oid), OID_AUTO, + "rpm", CTLTYPE_INT | CTLFLAG_RW, dev, i, + fcu_fanrpm_sysctl, "I", "Fan RPM"); + } else { + sc->sc_fans[i].min = 30; + sc->sc_fans[i].max = 100; + fcu_fan_get_pwm(dev, &sc->sc_fans[i], + &sc->sc_fans[i].setpoint, + &sc->sc_fans[i].rpm); - oid = SYSCTL_ADD_NODE(ctx, SYSCTL_CHILDREN(fanroot_oid), - OID_AUTO, sysctl_name, CTLFLAG_RD, 0, - "Fan Information"); - SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(oid), OID_AUTO, "minrpm", - CTLTYPE_INT | CTLFLAG_RD, - &(sc->sc_fans[i].min_rpm), sizeof(cell_t), - "Minimum allowed RPM"); - SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(oid), OID_AUTO, "maxrpm", - CTLTYPE_INT | CTLFLAG_RD, - &(sc->sc_fans[i].max_rpm), sizeof(cell_t), - "Maximum allowed RPM"); - /* I use i to pass the fan id. */ - SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(oid), OID_AUTO, "rpm", - CTLTYPE_INT | CTLFLAG_RW, dev, i, - fcu_fanrpm_sysctl, "I", "Fan RPM"); + oid = SYSCTL_ADD_NODE(ctx, SYSCTL_CHILDREN(fanroot_oid), + OID_AUTO, sysctl_name, + CTLFLAG_RD, 0, "Fan Information"); + SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(oid), OID_AUTO, + "minpwm", CTLTYPE_INT | CTLFLAG_RD, + &(sc->sc_fans[i].min), sizeof(cell_t), + "Minimum allowed PWM in %"); + SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(oid), OID_AUTO, + "maxpwm", CTLTYPE_INT | CTLFLAG_RD, + &(sc->sc_fans[i].max), sizeof(cell_t), + "Maximum allowed PWM in %"); + /* I use i to pass the fan id or'ed with the type + * of info I want to display/modify. + */ + SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(oid), OID_AUTO, + "pwm", CTLTYPE_INT | CTLFLAG_RW, dev, + FCU_PWM_SYSCTL_PWM | i, + fcu_fanrpm_sysctl, "I", "Fan PWM in %"); + SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(oid), OID_AUTO, + "rpm", CTLTYPE_INT | CTLFLAG_RD, dev, + FCU_PWM_SYSCTL_RPM | i, + fcu_fanrpm_sysctl, "I", "Fan RPM"); + } } /* Dump fan location, type & RPM. */ if (bootverbose) { device_printf(dev, "Fans\n"); for (i = 0; i < sc->sc_nfans; i++) { - device_printf(dev, "Location: %s type: %d ID: %d RPM: %d\n", - sc->sc_fans[i].location, + device_printf(dev, "Location: %s type: %d ID: %d " + "RPM: %d\n", sc->sc_fans[i].location, sc->sc_fans[i].type, sc->sc_fans[i].id, - sc->sc_fans[i].setpoint); + (sc->sc_fans[i].type == FCU_FAN_RPM) ? + sc->sc_fans[i].setpoint : + sc->sc_fans[i].rpm ); } } } ==== //depot/projects/smpng/sys/sys/priority.h#6 (text+ko) ==== @@ -28,7 +28,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/sys/priority.h,v 1.5 2011/01/06 22:09:37 jhb Exp $ + * $FreeBSD: src/sys/sys/priority.h,v 1.6 2011/01/11 22:15:30 jhb Exp $ */ #ifndef _SYS_PRIORITY_H_ @@ -85,14 +85,12 @@ #define PI_REALTIME (PRI_MIN_ITHD + 0) #define PI_AV (PRI_MIN_ITHD + 4) -#define PI_TTYHIGH (PRI_MIN_ITHD + 8) -#define PI_TAPE (PRI_MIN_ITHD + 12) -#define PI_NET (PRI_MIN_ITHD + 16) -#define PI_DISK (PRI_MIN_ITHD + 20) -#define PI_TTYLOW (PRI_MIN_ITHD + 24) -#define PI_DISKLOW (PRI_MIN_ITHD + 28) -#define PI_DULL (PRI_MIN_ITHD + 32) -#define PI_SOFT (PRI_MIN_ITHD + 36) +#define PI_NET (PRI_MIN_ITHD + 8) +#define PI_DISK (PRI_MIN_ITHD + 12) +#define PI_TTY (PRI_MIN_ITHD + 16) +#define PI_DULL (PRI_MIN_ITHD + 20) +#define PI_SOFT (PRI_MIN_ITHD + 24) +#define PI_SWI(x) (PI_SOFT + (x) * RQ_PPQ) #define PRI_MIN_KERN (64) #define PRI_MAX_KERN (PRI_MIN_REALTIME - 1)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201101112217.p0BMHmOf088172>
