Index: acpi_video.c =================================================================== RCS file: /home/ncvs/src/sys/dev/acpica/acpi_video.c,v retrieving revision 1.12 diff -d -u -I\$FreeBSD:.*\$ -I\$NetBSD:.*\$ -I\$OpenBSD:.*\$ -I\$DragonFly:.*\$ -I\$Id:.*\$ -I\$Translation:.*\$ -I\$hrs:.*\$ -r1.12 acpi_video.c --- acpi_video.c 20 Dec 2005 22:42:16 -0000 1.12 +++ acpi_video.c 14 Jul 2006 07:52:33 -0000 @@ -100,25 +100,35 @@ /* events */ #define VID_NOTIFY_SWITCHED 0x80 #define VID_NOTIFY_REPROBE 0x81 +#define VID_NOTIFY_HOTKEY_CYCLE 0x82 +#define VID_NOTIFY_HOTKEY_NEXT 0x83 +#define VID_NOTIFY_HOTKEY_PREV 0x84 /* _DOS (Enable/Disable Output Switching) argument bits */ #define DOS_SWITCH_MASK 3 #define DOS_SWITCH_BY_OSPM 0 #define DOS_SWITCH_BY_BIOS 1 #define DOS_SWITCH_LOCKED 2 +#define DOS_SWITCH_BY_OSPM_NOTIFY 3 #define DOS_BRIGHTNESS_BY_BIOS (1 << 2) /* _DOD and subdev's _ADR */ -#define DOD_DEVID_MASK 0xffff +#define DOD_DEVID_MASK 0xff00 +#define DOD_DEVID_MASK_FULL 0xffff +#define DOD_DEVID_MASK_DISPIDX 0x000f +#define DOD_DEVID_MASK_DISPPORT 0x00f0 #define DOD_DEVID_MONITOR 0x0100 -#define DOD_DEVID_PANEL 0x0110 +#define DOD_DEVID_LCD 0x0110 #define DOD_DEVID_TV 0x0200 +#define DOD_DEVID_EXT 0x0300 +#define DOD_DEVID_INTDFP 0x0400 #define DOD_BIOS (1 << 16) #define DOD_NONVGA (1 << 17) #define DOD_HEAD_ID_SHIFT 18 #define DOD_HEAD_ID_BITS 3 #define DOD_HEAD_ID_MASK \ (((1 << DOD_HEAD_ID_BITS) - 1) << DOD_HEAD_ID_SHIFT) +#define DOD_DEVID_SCHEME_STD (1 << 31) /* _BCL related constants */ #define BCL_FULLPOWER 0 @@ -160,8 +170,8 @@ static struct sysctl_ctx_list acpi_video_sysctl_ctx; static struct sysctl_oid *acpi_video_sysctl_tree; -static struct acpi_video_output_queue lcd_units, crt_units, tv_units, - other_units; +static struct acpi_video_output_queue crt_units, tv_units, + ext_units, lcd_units, other_units; ACPI_SERIAL_DECL(video, "ACPI video"); MALLOC_DEFINE(M_ACPIVIDEO, "acpivideo", "ACPI video extension"); @@ -175,9 +185,10 @@ switch (evt) { case MOD_LOAD: sysctl_ctx_init(&acpi_video_sysctl_ctx); - STAILQ_INIT(&lcd_units); STAILQ_INIT(&crt_units); STAILQ_INIT(&tv_units); + STAILQ_INIT(&ext_units); + STAILQ_INIT(&lcd_units); STAILQ_INIT(&other_units); break; case MOD_UNLOAD: @@ -404,27 +415,50 @@ { struct acpi_video_output *vn, *vo, *vp; int n, x; + int display_index; + int display_port; char name[8], env[32]; const char *type, *desc; struct acpi_video_output_queue *voqh; ACPI_SERIAL_ASSERT(video); + display_index = adr & DOD_DEVID_MASK_DISPIDX; + display_port = (adr & DOD_DEVID_MASK_DISPPORT) >> 4; + + if (!(adr & DOD_DEVID_SCHEME_STD)) { + printf("Ignore non-standard device (%x).\n", + adr & DOD_DEVID_MASK_FULL); + return(NULL); + } + switch (adr & DOD_DEVID_MASK) { case DOD_DEVID_MONITOR: - desc = "CRT monitor"; - type = "crt"; - voqh = &crt_units; - break; - case DOD_DEVID_PANEL: - desc = "LCD panel"; - type = "lcd"; - voqh = &lcd_units; + if ((adr & DOD_DEVID_MASK_FULL) == DOD_DEVID_LCD) { + /* DOD_DEVID_LCD is a common, backward compatible ID */ + desc = "Internal/Integrated Digital Flat Panel"; + type = "lcd"; + voqh = &lcd_units; + } else { + desc = "VGA CRT or VESA Compatible Analog Monitor"; + type = "crt"; + voqh = &crt_units; + } break; case DOD_DEVID_TV: - desc = "TV"; + desc = "TV/HDTV or Analog-Video Monitor"; type = "tv"; voqh = &tv_units; break; + case DOD_DEVID_EXT: + desc = "External Digital Monitor"; + type = "ext"; + voqh = &ext_units; + break; + case DOD_DEVID_INTDFP: + desc = "Internal/Integrated Digital Flat Panel"; + type = "lcd"; + voqh = &lcd_units; + break; default: desc = "unknown output"; type = "out"; @@ -507,15 +541,15 @@ } else printf("%s: softc allocation failed\n", type); - if (bootverbose) { - printf("found %s(%x)", desc, adr & DOD_DEVID_MASK); - if (adr & DOD_BIOS) - printf(", detectable by BIOS"); - if (adr & DOD_NONVGA) - printf(" (not a VGA output)"); - printf(", head #%d\n", - (adr & DOD_HEAD_ID_MASK) >> DOD_HEAD_ID_SHIFT); - } + printf("found %s(%x)", desc, adr & DOD_DEVID_MASK_FULL); + printf(", idx#%x", adr & DOD_DEVID_MASK_DISPIDX); + printf(", port#%x", (adr & DOD_DEVID_MASK_DISPPORT) >> 4); + if (adr & DOD_BIOS) + printf(", detectable by BIOS"); + if (adr & DOD_NONVGA) + printf(" (Non-VGA output device whose power is related to the VGA device)"); + printf(", head #%d\n", + (adr & DOD_HEAD_ID_MASK) >> DOD_HEAD_ID_SHIFT); return (vo); } @@ -557,12 +591,15 @@ case DOD_DEVID_MONITOR: voqh = &crt_units; break; - case DOD_DEVID_PANEL: - voqh = &lcd_units; - break; case DOD_DEVID_TV: voqh = &tv_units; break; + case DOD_DEVID_EXT: + voqh = &ext_units; + break; + case DOD_DEVID_INTDFP: + voqh = &lcd_units; + break; default: voqh = &other_units; } @@ -751,7 +788,7 @@ for (i = 0; i < argset->dod_pkg->Package.Count; i++) { if (acpi_PkgInt32(argset->dod_pkg, i, &val) == 0 && - (val & DOD_DEVID_MASK) == adr) { + (val & DOD_DEVID_MASK_FULL) == adr) { argset->callback(handle, val, argset->context); argset->count++; }