Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'pm+acpi-3.14-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm

Pull ACPI and power management fixes from Rafael Wysocki:
"These include two fixes for recent regressions related to ACPI, a
cpufreq fix for breakage overlooked by a previous fix commit, two
intel_pstate fixes for stuff added during the 3.13 cycle that need to
go into -stable, three fixes for older bugs that also are -stable
candidates, ACPI video blacklist changes related to BIOSes that behave
in a special way on Windows 8, several build fixes for CONFIG_PM_SLEEP
unset in ACPI drivers and an ACPI driver cleanup.

Specifics:

- Fix for a recent probing regression in the nouveau driver
introduced by an ACPI change related to the handling of _DSM from
Jiang Liu.

- Fix for a dock station sysfs attribute that stopped working
correctly after recent changes in the ACPI core.

- cpufreq fix taking care of broken code related to CPU removal and
overlooked by a previous recent fix in that area. From Viresh
Kumar.

- Two intel_pstate fixes related to Baytrail support added during the
3.13 cycle (candidates for -stable) from Dirk Brandewie.

- ACPI video fix removing duplicate brightness values from the _BCL
table which makes its user space interface behave sanely. From
Hans de Goede.

- Fix for the powernow-k8 cpufreq driver making it initialize its
per-CPU data structures correctly from Srivatsa S Bhat.

- Fix for an obscure memory leak in the ACPI PCI interrupt allocation
code (related to ISA) from Tomasz Nowicki.

- ACPI video blacklist changes moving several systems that should use
the native backlight interface instead of the ACPI one from the
general ACPI _OSI blacklist the the ACPI video driver's blacklist
where they belong. This consists of an ACPI video driver update
from Aaron Lu and a revert of a previous commit adding systems to
the ACPI _OSI blacklist requested by Takashi Iwai.

- Several fixes for build issues in ACPI drivers occuring when
CONFIG_PM_SLEEP is unset from Shuah Khan.

- Fix for an sscanf() format string in the ACPI Smart Battery
Subsystem (SBS) driver from Luis G.F"

* tag 'pm+acpi-3.14-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
intel_pstate: Add support for Baytrail turbo P states
intel_pstate: Use LFM bus ratio as min ratio/P state
ACPI / nouveau: fix probing regression related to _DSM
Revert "ACPI: Blacklist Win8 OSI for some HP laptop 2013 models"
ACPI / video: Add systems that should favour native backlight interface
ACPI / video: Filter the _BCL table for duplicate brightness values
cpufreq: powernow-k8: Initialize per-cpu data-structures properly
cpufreq: remove sysfs link when a cpu != policy->cpu, is removed
ACPI / PCI: Fix memory leak in acpi_pci_irq_enable()
ACPI / dock: Make 'docked' sysfs attribute work as documented
ACPI / SBS: Fix incorrect sscanf() string
ACPI / thermal: fix thermal driver compile error when CONFIG_PM_SLEEP is undefined
ACPI / SBS: fix SBS driver compile error when CONFIG_PM_SLEEP is undefined
ACPI / fan: fix fan driver compile error when CONFIG_PM_SLEEP is undefined
ACPI / button: fix button driver compile error when CONFIG_PM_SLEEP is undefined
ACPI / battery: fix battery driver compile error when CONFIG_PM_SLEEP is undefined
ACPI / AC: fix AC driver compile error when CONFIG_PM_SLEEP is undefined

+204 -97
+2
drivers/acpi/ac.c
··· 243 243 kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE); 244 244 return 0; 245 245 } 246 + #else 247 + #define acpi_ac_resume NULL 246 248 #endif 247 249 static SIMPLE_DEV_PM_OPS(acpi_ac_pm_ops, NULL, acpi_ac_resume); 248 250
+2
drivers/acpi/battery.c
··· 841 841 acpi_battery_update(battery); 842 842 return 0; 843 843 } 844 + #else 845 + #define acpi_battery_resume NULL 844 846 #endif 845 847 846 848 static SIMPLE_DEV_PM_OPS(acpi_battery_pm, NULL, acpi_battery_resume);
-58
drivers/acpi/blacklist.c
··· 260 260 }, 261 261 { 262 262 .callback = dmi_disable_osi_win8, 263 - .ident = "Dell Inspiron 15R SE", 264 - .matches = { 265 - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 266 - DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 7520"), 267 - }, 268 - }, 269 - { 270 - .callback = dmi_disable_osi_win8, 271 263 .ident = "ThinkPad Edge E530", 272 264 .matches = { 273 265 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), ··· 312 320 .matches = { 313 321 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), 314 322 DMI_MATCH(DMI_PRODUCT_VERSION, "2349D15"), 315 - }, 316 - }, 317 - { 318 - .callback = dmi_disable_osi_win8, 319 - .ident = "HP ProBook 2013 models", 320 - .matches = { 321 - DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 322 - DMI_MATCH(DMI_PRODUCT_NAME, "HP ProBook "), 323 - DMI_MATCH(DMI_PRODUCT_NAME, " G1"), 324 - }, 325 - }, 326 - { 327 - .callback = dmi_disable_osi_win8, 328 - .ident = "HP EliteBook 2013 models", 329 - .matches = { 330 - DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 331 - DMI_MATCH(DMI_PRODUCT_NAME, "HP EliteBook "), 332 - DMI_MATCH(DMI_PRODUCT_NAME, " G1"), 333 - }, 334 - }, 335 - { 336 - .callback = dmi_disable_osi_win8, 337 - .ident = "HP ZBook 14", 338 - .matches = { 339 - DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 340 - DMI_MATCH(DMI_PRODUCT_NAME, "HP ZBook 14"), 341 - }, 342 - }, 343 - { 344 - .callback = dmi_disable_osi_win8, 345 - .ident = "HP ZBook 15", 346 - .matches = { 347 - DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 348 - DMI_MATCH(DMI_PRODUCT_NAME, "HP ZBook 15"), 349 - }, 350 - }, 351 - { 352 - .callback = dmi_disable_osi_win8, 353 - .ident = "HP ZBook 17", 354 - .matches = { 355 - DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 356 - DMI_MATCH(DMI_PRODUCT_NAME, "HP ZBook 17"), 357 - }, 358 - }, 359 - { 360 - .callback = dmi_disable_osi_win8, 361 - .ident = "HP EliteBook 8780w", 362 - .matches = { 363 - DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 364 - DMI_MATCH(DMI_PRODUCT_NAME, "HP EliteBook 8780w"), 365 323 }, 366 324 }, 367 325
+2
drivers/acpi/button.c
··· 80 80 81 81 #ifdef CONFIG_PM_SLEEP 82 82 static int acpi_button_resume(struct device *dev); 83 + #else 84 + #define acpi_button_resume NULL 83 85 #endif 84 86 static SIMPLE_DEV_PM_OPS(acpi_button_pm, NULL, acpi_button_resume); 85 87
+3 -5
drivers/acpi/dock.c
··· 713 713 static ssize_t show_docked(struct device *dev, 714 714 struct device_attribute *attr, char *buf) 715 715 { 716 - struct acpi_device *tmp; 717 - 718 716 struct dock_station *dock_station = dev->platform_data; 717 + struct acpi_device *adev = NULL; 719 718 720 - if (!acpi_bus_get_device(dock_station->handle, &tmp)) 721 - return snprintf(buf, PAGE_SIZE, "1\n"); 722 - return snprintf(buf, PAGE_SIZE, "0\n"); 719 + acpi_bus_get_device(dock_station->handle, &adev); 720 + return snprintf(buf, PAGE_SIZE, "%u\n", acpi_device_enumerated(adev)); 723 721 } 724 722 static DEVICE_ATTR(docked, S_IRUGO, show_docked, NULL); 725 723
+3
drivers/acpi/fan.c
··· 55 55 #ifdef CONFIG_PM_SLEEP 56 56 static int acpi_fan_suspend(struct device *dev); 57 57 static int acpi_fan_resume(struct device *dev); 58 + #else 59 + #define acpi_fan_suspend NULL 60 + #define acpi_fan_resume NULL 58 61 #endif 59 62 static SIMPLE_DEV_PM_OPS(acpi_fan_pm, acpi_fan_suspend, acpi_fan_resume); 60 63
+1
drivers/acpi/pci_irq.c
··· 430 430 pin_name(pin)); 431 431 } 432 432 433 + kfree(entry); 433 434 return 0; 434 435 } 435 436
+3 -1
drivers/acpi/sbs.c
··· 450 450 { 451 451 unsigned long x; 452 452 struct acpi_battery *battery = to_acpi_battery(dev_get_drvdata(dev)); 453 - if (sscanf(buf, "%ld\n", &x) == 1) 453 + if (sscanf(buf, "%lu\n", &x) == 1) 454 454 battery->alarm_capacity = x / 455 455 (1000 * acpi_battery_scale(battery)); 456 456 if (battery->present) ··· 668 668 acpi_sbs_callback(sbs); 669 669 return 0; 670 670 } 671 + #else 672 + #define acpi_sbs_resume NULL 671 673 #endif 672 674 673 675 static SIMPLE_DEV_PM_OPS(acpi_sbs_pm, NULL, acpi_sbs_resume);
+2
drivers/acpi/thermal.c
··· 102 102 103 103 #ifdef CONFIG_PM_SLEEP 104 104 static int acpi_thermal_resume(struct device *dev); 105 + #else 106 + #define acpi_thermal_resume NULL 105 107 #endif 106 108 static SIMPLE_DEV_PM_OPS(acpi_thermal_pm, NULL, acpi_thermal_resume); 107 109
+141 -6
drivers/acpi/video.c
··· 81 81 module_param(allow_duplicates, bool, 0644); 82 82 83 83 /* 84 - * For Windows 8 systems: if set ture and the GPU driver has 85 - * registered a backlight interface, skip registering ACPI video's. 84 + * For Windows 8 systems: used to decide if video module 85 + * should skip registering backlight interface of its own. 86 86 */ 87 - static bool use_native_backlight = false; 88 - module_param(use_native_backlight, bool, 0644); 87 + static int use_native_backlight_param = -1; 88 + module_param_named(use_native_backlight, use_native_backlight_param, int, 0444); 89 + static bool use_native_backlight_dmi = false; 89 90 90 91 static int register_count; 91 92 static struct mutex video_list_lock; ··· 232 231 static int acpi_video_switch_brightness(struct acpi_video_device *device, 233 232 int event); 234 233 234 + static bool acpi_video_use_native_backlight(void) 235 + { 236 + if (use_native_backlight_param != -1) 237 + return use_native_backlight_param; 238 + else 239 + return use_native_backlight_dmi; 240 + } 241 + 235 242 static bool acpi_video_verify_backlight_support(void) 236 243 { 237 - if (acpi_osi_is_win8() && use_native_backlight && 244 + if (acpi_osi_is_win8() && acpi_video_use_native_backlight() && 238 245 backlight_device_registered(BACKLIGHT_RAW)) 239 246 return false; 240 247 return acpi_video_backlight_support(); ··· 407 398 return 0; 408 399 } 409 400 401 + static int __init video_set_use_native_backlight(const struct dmi_system_id *d) 402 + { 403 + use_native_backlight_dmi = true; 404 + return 0; 405 + } 406 + 410 407 static struct dmi_system_id video_dmi_table[] __initdata = { 411 408 /* 412 409 * Broken _BQC workaround http://bugzilla.kernel.org/show_bug.cgi?id=13121 ··· 455 440 .matches = { 456 441 DMI_MATCH(DMI_BOARD_VENDOR, "Acer"), 457 442 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7720"), 443 + }, 444 + }, 445 + { 446 + .callback = video_set_use_native_backlight, 447 + .ident = "ThinkPad T430s", 448 + .matches = { 449 + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), 450 + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T430s"), 451 + }, 452 + }, 453 + { 454 + .callback = video_set_use_native_backlight, 455 + .ident = "ThinkPad X230", 456 + .matches = { 457 + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), 458 + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X230"), 459 + }, 460 + }, 461 + { 462 + .callback = video_set_use_native_backlight, 463 + .ident = "ThinkPad X1 Carbon", 464 + .matches = { 465 + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), 466 + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X1 Carbon"), 467 + }, 468 + }, 469 + { 470 + .callback = video_set_use_native_backlight, 471 + .ident = "Lenovo Yoga 13", 472 + .matches = { 473 + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), 474 + DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo IdeaPad Yoga 13"), 475 + }, 476 + }, 477 + { 478 + .callback = video_set_use_native_backlight, 479 + .ident = "Dell Inspiron 7520", 480 + .matches = { 481 + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 482 + DMI_MATCH(DMI_PRODUCT_VERSION, "Inspiron 7520"), 483 + }, 484 + }, 485 + { 486 + .callback = video_set_use_native_backlight, 487 + .ident = "Acer Aspire 5733Z", 488 + .matches = { 489 + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 490 + DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5733Z"), 491 + }, 492 + }, 493 + { 494 + .callback = video_set_use_native_backlight, 495 + .ident = "Acer Aspire V5-431", 496 + .matches = { 497 + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 498 + DMI_MATCH(DMI_PRODUCT_NAME, "Aspire V5-431"), 499 + }, 500 + }, 501 + { 502 + .callback = video_set_use_native_backlight, 503 + .ident = "HP ProBook 4340s", 504 + .matches = { 505 + DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 506 + DMI_MATCH(DMI_PRODUCT_VERSION, "HP ProBook 4340s"), 507 + }, 508 + }, 509 + { 510 + .callback = video_set_use_native_backlight, 511 + .ident = "HP ProBook 2013 models", 512 + .matches = { 513 + DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 514 + DMI_MATCH(DMI_PRODUCT_NAME, "HP ProBook "), 515 + DMI_MATCH(DMI_PRODUCT_NAME, " G1"), 516 + }, 517 + }, 518 + { 519 + .callback = video_set_use_native_backlight, 520 + .ident = "HP EliteBook 2013 models", 521 + .matches = { 522 + DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 523 + DMI_MATCH(DMI_PRODUCT_NAME, "HP EliteBook "), 524 + DMI_MATCH(DMI_PRODUCT_NAME, " G1"), 525 + }, 526 + }, 527 + { 528 + .callback = video_set_use_native_backlight, 529 + .ident = "HP ZBook 14", 530 + .matches = { 531 + DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 532 + DMI_MATCH(DMI_PRODUCT_NAME, "HP ZBook 14"), 533 + }, 534 + }, 535 + { 536 + .callback = video_set_use_native_backlight, 537 + .ident = "HP ZBook 15", 538 + .matches = { 539 + DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 540 + DMI_MATCH(DMI_PRODUCT_NAME, "HP ZBook 15"), 541 + }, 542 + }, 543 + { 544 + .callback = video_set_use_native_backlight, 545 + .ident = "HP ZBook 17", 546 + .matches = { 547 + DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 548 + DMI_MATCH(DMI_PRODUCT_NAME, "HP ZBook 17"), 549 + }, 550 + }, 551 + { 552 + .callback = video_set_use_native_backlight, 553 + .ident = "HP EliteBook 8780w", 554 + .matches = { 555 + DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 556 + DMI_MATCH(DMI_PRODUCT_NAME, "HP EliteBook 8780w"), 458 557 }, 459 558 }, 460 559 {} ··· 814 685 union acpi_object *o; 815 686 struct acpi_video_device_brightness *br = NULL; 816 687 int result = -EINVAL; 688 + u32 value; 817 689 818 690 if (!ACPI_SUCCESS(acpi_video_device_lcd_query_levels(device, &obj))) { 819 691 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Could not query available " ··· 845 715 printk(KERN_ERR PREFIX "Invalid data\n"); 846 716 continue; 847 717 } 848 - br->levels[count] = (u32) o->integer.value; 718 + value = (u32) o->integer.value; 719 + /* Skip duplicate entries */ 720 + if (count > 2 && br->levels[count - 1] == value) 721 + continue; 722 + 723 + br->levels[count] = value; 849 724 850 725 if (br->levels[count] > max_level) 851 726 max_level = br->levels[count];
-16
drivers/acpi/video_detect.c
··· 168 168 DMI_MATCH(DMI_PRODUCT_NAME, "UL30A"), 169 169 }, 170 170 }, 171 - { 172 - .callback = video_detect_force_vendor, 173 - .ident = "HP EliteBook Revolve 810", 174 - .matches = { 175 - DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 176 - DMI_MATCH(DMI_PRODUCT_NAME, "HP EliteBook Revolve 810 G1"), 177 - }, 178 - }, 179 - { 180 - .callback = video_detect_force_vendor, 181 - .ident = "Lenovo Yoga 13", 182 - .matches = { 183 - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), 184 - DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo IdeaPad Yoga 13"), 185 - }, 186 - }, 187 171 { }, 188 172 }; 189 173
+1 -2
drivers/cpufreq/cpufreq.c
··· 1323 1323 up_read(&policy->rwsem); 1324 1324 1325 1325 if (cpu != policy->cpu) { 1326 - if (!frozen) 1327 - sysfs_remove_link(&dev->kobj, "cpufreq"); 1326 + sysfs_remove_link(&dev->kobj, "cpufreq"); 1328 1327 } else if (cpus > 1) { 1329 1328 new_cpu = cpufreq_nominate_new_policy_cpu(policy, cpu); 1330 1329 if (new_cpu >= 0) {
+13 -4
drivers/cpufreq/intel_pstate.c
··· 34 34 35 35 #define SAMPLE_COUNT 3 36 36 37 - #define BYT_RATIOS 0x66a 38 - #define BYT_VIDS 0x66b 37 + #define BYT_RATIOS 0x66a 38 + #define BYT_VIDS 0x66b 39 + #define BYT_TURBO_RATIOS 0x66c 40 + 39 41 40 42 #define FRAC_BITS 8 41 43 #define int_tofp(X) ((int64_t)(X) << FRAC_BITS) ··· 359 357 { 360 358 u64 value; 361 359 rdmsrl(BYT_RATIOS, value); 362 - return value & 0xFF; 360 + return (value >> 8) & 0xFF; 363 361 } 364 362 365 363 static int byt_get_max_pstate(void) ··· 367 365 u64 value; 368 366 rdmsrl(BYT_RATIOS, value); 369 367 return (value >> 16) & 0xFF; 368 + } 369 + 370 + static int byt_get_turbo_pstate(void) 371 + { 372 + u64 value; 373 + rdmsrl(BYT_TURBO_RATIOS, value); 374 + return value & 0x3F; 370 375 } 371 376 372 377 static void byt_set_pstate(struct cpudata *cpudata, int pstate) ··· 478 469 .funcs = { 479 470 .get_max = byt_get_max_pstate, 480 471 .get_min = byt_get_min_pstate, 481 - .get_turbo = byt_get_max_pstate, 472 + .get_turbo = byt_get_turbo_pstate, 482 473 .set = byt_set_pstate, 483 474 .get_vid = byt_get_vid, 484 475 },
+7 -3
drivers/cpufreq/powernow-k8.c
··· 1076 1076 { 1077 1077 struct powernow_k8_data *data; 1078 1078 struct init_on_cpu init_on_cpu; 1079 - int rc; 1079 + int rc, cpu; 1080 1080 1081 1081 smp_call_function_single(pol->cpu, check_supported_cpu, &rc, 1); 1082 1082 if (rc) ··· 1140 1140 pr_debug("cpu_init done, current fid 0x%x, vid 0x%x\n", 1141 1141 data->currfid, data->currvid); 1142 1142 1143 - per_cpu(powernow_data, pol->cpu) = data; 1143 + /* Point all the CPUs in this policy to the same data */ 1144 + for_each_cpu(cpu, pol->cpus) 1145 + per_cpu(powernow_data, cpu) = data; 1144 1146 1145 1147 return 0; 1146 1148 ··· 1157 1155 static int powernowk8_cpu_exit(struct cpufreq_policy *pol) 1158 1156 { 1159 1157 struct powernow_k8_data *data = per_cpu(powernow_data, pol->cpu); 1158 + int cpu; 1160 1159 1161 1160 if (!data) 1162 1161 return -EINVAL; ··· 1168 1165 1169 1166 kfree(data->powernow_table); 1170 1167 kfree(data); 1171 - per_cpu(powernow_data, pol->cpu) = NULL; 1168 + for_each_cpu(cpu, pol->cpus) 1169 + per_cpu(powernow_data, cpu) = NULL; 1172 1170 1173 1171 return 0; 1174 1172 }
+24 -2
drivers/gpu/drm/nouveau/nouveau_acpi.c
··· 106 106 return 0; 107 107 } 108 108 109 + /* 110 + * On some platforms, _DSM(nouveau_op_dsm_muid, func0) has special 111 + * requirements on the fourth parameter, so a private implementation 112 + * instead of using acpi_check_dsm(). 113 + */ 114 + static int nouveau_check_optimus_dsm(acpi_handle handle) 115 + { 116 + int result; 117 + 118 + /* 119 + * Function 0 returns a Buffer containing available functions. 120 + * The args parameter is ignored for function 0, so just put 0 in it 121 + */ 122 + if (nouveau_optimus_dsm(handle, 0, 0, &result)) 123 + return 0; 124 + 125 + /* 126 + * ACPI Spec v4 9.14.1: if bit 0 is zero, no function is supported. 127 + * If the n-th bit is enabled, function n is supported 128 + */ 129 + return result & 1 && result & (1 << NOUVEAU_DSM_OPTIMUS_CAPS); 130 + } 131 + 109 132 static int nouveau_dsm(acpi_handle handle, int func, int arg) 110 133 { 111 134 int ret = 0; ··· 230 207 1 << NOUVEAU_DSM_POWER)) 231 208 retval |= NOUVEAU_DSM_HAS_MUX; 232 209 233 - if (acpi_check_dsm(dhandle, nouveau_op_dsm_muid, 0x00000100, 234 - 1 << NOUVEAU_DSM_OPTIMUS_CAPS)) 210 + if (nouveau_check_optimus_dsm(dhandle)) 235 211 retval |= NOUVEAU_DSM_HAS_OPT; 236 212 237 213 if (retval & NOUVEAU_DSM_HAS_OPT) {