acpithinkpad: fix brightness keys, keyboard backlight value

classic Classic list List threaded Threaded
11 messages Options
Reply | Threaded
Open this post in threaded view
|

acpithinkpad: fix brightness keys, keyboard backlight value

joshua stein-3
Here we go again...

On at least the ThinkPad X1C6, the screen brightness keys (F5 and
F6) do not work and "wsconsctl keyboard.backlight" doesn't report
the correct value when the keyboard backlight is adjusted with
Fn+Space.

These are both caused by the default event mask not including these
events, so explicitly enable them.

But then acpithinkpad has to actually do something for the screen
brightness keys, but it tries the very old CMOS method which doesn't
work on these newer machines[0].  So make it use the ACPI method.

I renamed thinkpad_[gs]et_backlight to thinkpad_[gs]et_kbd_backlight
because it was confusing that they have nothing to do with screen
backlight.


0. "newer machines" being those with MHKV reporting version 2.  If
this diff breaks on older "newer machines", this metric will have to
be changed to something else.


Index: sys/dev/acpi/acpithinkpad.c
===================================================================
RCS file: /cvs/src/sys/dev/acpi/acpithinkpad.c,v
retrieving revision 1.61
diff -u -p -u -p -r1.61 acpithinkpad.c
--- sys/dev/acpi/acpithinkpad.c 1 Jul 2018 19:40:49 -0000 1.61
+++ sys/dev/acpi/acpithinkpad.c 5 Mar 2019 20:00:23 -0000
@@ -124,6 +124,10 @@
 #define THINKPAD_ADAPTIVE_MODE_HOME 1
 #define THINKPAD_ADAPTIVE_MODE_FUNCTION 3
 
+#define THINKPAD_MASK_BRIGHTNESS_UP (1 << 15)
+#define THINKPAD_MASK_BRIGHTNESS_DOWN (1 << 16)
+#define THINKPAD_MASK_KBD_BACKLIGHT (1 << 17)
+
 struct acpithinkpad_softc {
  struct device sc_dev;
 
@@ -134,6 +138,8 @@ struct acpithinkpad_softc {
  struct ksensor sc_sens[THINKPAD_NSENSORS];
  struct ksensordev sc_sensdev;
 
+ uint64_t sc_hkey_version;
+
  uint64_t sc_thinklight;
  const char *sc_thinklight_get;
  const char *sc_thinklight_set;
@@ -161,8 +167,8 @@ int thinkpad_activate(struct device *, i
 /* wscons hook functions */
 void thinkpad_get_thinklight(struct acpithinkpad_softc *);
 void thinkpad_set_thinklight(void *, int);
-int thinkpad_get_backlight(struct wskbd_backlight *);
-int thinkpad_set_backlight(struct wskbd_backlight *);
+int thinkpad_get_kbd_backlight(struct wskbd_backlight *);
+int thinkpad_set_kbd_backlight(struct wskbd_backlight *);
 extern int (*wskbd_get_backlight)(struct wskbd_backlight *);
 extern int (*wskbd_set_backlight)(struct wskbd_backlight *);
 void thinkpad_get_brightness(struct acpithinkpad_softc *);
@@ -284,6 +290,10 @@ thinkpad_attach(struct device *parent, s
 
  printf("\n");
 
+ if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "MHKV", 0, NULL,
+    &sc->sc_hkey_version))
+ sc->sc_hkey_version = THINKPAD_HKEY_VERSION1;
+
 #if NAUDIO > 0 && NWSKBD > 0
  /* Defer speaker mute */
  if (thinkpad_get_volume_mute(sc) == 1)
@@ -299,14 +309,14 @@ thinkpad_attach(struct device *parent, s
     0, NULL, &sc->sc_thinklight) == 0) {
  sc->sc_thinklight_get = "KLCG";
  sc->sc_thinklight_set = "KLCS";
- wskbd_get_backlight = thinkpad_get_backlight;
- wskbd_set_backlight = thinkpad_set_backlight;
+ wskbd_get_backlight = thinkpad_get_kbd_backlight;
+ wskbd_set_backlight = thinkpad_set_kbd_backlight;
  } else if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "MLCG",
     0, NULL, &sc->sc_thinklight) == 0) {
  sc->sc_thinklight_get = "MLCG";
  sc->sc_thinklight_set = "MLCS";
- wskbd_get_backlight = thinkpad_get_backlight;
- wskbd_set_backlight = thinkpad_set_backlight;
+ wskbd_get_backlight = thinkpad_get_kbd_backlight;
+ wskbd_set_backlight = thinkpad_set_kbd_backlight;
  }
 
  if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "PBLG",
@@ -327,13 +337,19 @@ thinkpad_enable_events(struct acpithinkp
  int64_t mask;
  int i;
 
- /* Get the supported event mask */
+ /* Get the default event mask */
  if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "MHKA",
     0, NULL, &mask)) {
  printf("%s: no MHKA\n", DEVNAME(sc));
  return (1);
  }
 
+ /* Enable events we need to know about */
+ mask |= (THINKPAD_MASK_BRIGHTNESS_UP | THINKPAD_MASK_BRIGHTNESS_DOWN |
+    THINKPAD_MASK_KBD_BACKLIGHT);
+
+ DPRINTF(("%s: setting event mask to 0x%llx\n", DEVNAME(sc), mask));
+
  /* Update hotkey mask */
  bzero(args, sizeof(args));
  args[0].type = args[1].type = AML_OBJTYPE_INTEGER;
@@ -380,6 +396,8 @@ thinkpad_hotkey(struct aml_node *node, i
  if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "MHKP",
     0, NULL, &event))
  break;
+
+ DPRINTF(("%s: event 0x%03llx\n", DEVNAME(sc), event));
  if (event == 0)
  break;
 
@@ -535,13 +553,37 @@ thinkpad_volume_mute(struct acpithinkpad
 int
 thinkpad_brightness_up(struct acpithinkpad_softc *sc)
 {
- return (thinkpad_cmos(sc, THINKPAD_CMOS_BRIGHTNESS_UP));
+ int b;
+
+ if (sc->sc_hkey_version == THINKPAD_HKEY_VERSION2) {
+ thinkpad_get_brightness(sc);
+ b = sc->sc_brightness & 0xff;
+ if (b < ((sc->sc_brightness >> 8) & 0xff)) {
+ sc->sc_brightness = b + 1;
+ thinkpad_set_brightness(sc, 0);
+ }
+
+ return (0);
+ } else
+ return (thinkpad_cmos(sc, THINKPAD_CMOS_BRIGHTNESS_UP));
 }
 
 int
 thinkpad_brightness_down(struct acpithinkpad_softc *sc)
 {
- return (thinkpad_cmos(sc, THINKPAD_CMOS_BRIGHTNESS_DOWN));
+ int b;
+
+ if (sc->sc_hkey_version == THINKPAD_HKEY_VERSION2) {
+ thinkpad_get_brightness(sc);
+ b = sc->sc_brightness & 0xff;
+ if (b > 0) {
+ sc->sc_brightness = b - 1;
+ thinkpad_set_brightness(sc, 0);
+ }
+
+ return (0);
+ } else
+ return (thinkpad_cmos(sc, THINKPAD_CMOS_BRIGHTNESS_DOWN));
 }
 
 int
@@ -620,7 +662,7 @@ thinkpad_set_thinklight(void *arg0, int
 }
 
 int
-thinkpad_get_backlight(struct wskbd_backlight *kbl)
+thinkpad_get_kbd_backlight(struct wskbd_backlight *kbl)
 {
  struct acpithinkpad_softc *sc = acpithinkpad_cd.cd_devs[0];
 
@@ -637,7 +679,7 @@ thinkpad_get_backlight(struct wskbd_back
 }
 
 int
-thinkpad_set_backlight(struct wskbd_backlight *kbl)
+thinkpad_set_kbd_backlight(struct wskbd_backlight *kbl)
 {
  struct acpithinkpad_softc *sc = acpithinkpad_cd.cd_devs[0];
  int maxval;
@@ -664,6 +706,8 @@ thinkpad_get_brightness(struct acpithink
 {
  aml_evalinteger(sc->sc_acpi, sc->sc_devnode,
     "PBLG", 0, NULL, &sc->sc_brightness);
+
+ DPRINTF(("%s: %s: 0x%llx\n", DEVNAME(sc), __func__, sc->sc_brightness));
 }
 
 void
@@ -672,11 +716,15 @@ thinkpad_set_brightness(void *arg0, int
  struct acpithinkpad_softc *sc = arg0;
  struct aml_value arg;
 
+ DPRINTF(("%s: %s: 0x%llx\n", DEVNAME(sc), __func__, sc->sc_brightness));
+
  memset(&arg, 0, sizeof(arg));
  arg.type = AML_OBJTYPE_INTEGER;
  arg.v_integer = sc->sc_brightness & 0xff;
  aml_evalname(sc->sc_acpi, sc->sc_devnode,
     "PBLS", 1, &arg, NULL);
+
+ thinkpad_get_brightness(sc);
 }
 
 int

Reply | Threaded
Open this post in threaded view
|

Re: acpithinkpad: fix brightness keys, keyboard backlight value

James Turner-5
On Tue, Mar 05, 2019 at 02:03:13PM -0600, joshua stein wrote:

> Here we go again...
>
> On at least the ThinkPad X1C6, the screen brightness keys (F5 and
> F6) do not work and "wsconsctl keyboard.backlight" doesn't report
> the correct value when the keyboard backlight is adjusted with
> Fn+Space.
>
> These are both caused by the default event mask not including these
> events, so explicitly enable them.
>
> But then acpithinkpad has to actually do something for the screen
> brightness keys, but it tries the very old CMOS method which doesn't
> work on these newer machines[0].  So make it use the ACPI method.
>
> I renamed thinkpad_[gs]et_backlight to thinkpad_[gs]et_kbd_backlight
> because it was confusing that they have nothing to do with screen
> backlight.
>
>
> 0. "newer machines" being those with MHKV reporting version 2.  If
> this diff breaks on older "newer machines", this metric will have to
> be changed to something else.
>

This patch fixes both the brightness buttons and the backlight keyboard
reporting in wsconsctl on my x280.

If this doesn't break older models ok jturner@.

>
> Index: sys/dev/acpi/acpithinkpad.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/acpi/acpithinkpad.c,v
> retrieving revision 1.61
> diff -u -p -u -p -r1.61 acpithinkpad.c
> --- sys/dev/acpi/acpithinkpad.c 1 Jul 2018 19:40:49 -0000 1.61
> +++ sys/dev/acpi/acpithinkpad.c 5 Mar 2019 20:00:23 -0000
> @@ -124,6 +124,10 @@
>  #define THINKPAD_ADAPTIVE_MODE_HOME 1
>  #define THINKPAD_ADAPTIVE_MODE_FUNCTION 3
>  
> +#define THINKPAD_MASK_BRIGHTNESS_UP (1 << 15)
> +#define THINKPAD_MASK_BRIGHTNESS_DOWN (1 << 16)
> +#define THINKPAD_MASK_KBD_BACKLIGHT (1 << 17)
> +
>  struct acpithinkpad_softc {
>   struct device sc_dev;
>  
> @@ -134,6 +138,8 @@ struct acpithinkpad_softc {
>   struct ksensor sc_sens[THINKPAD_NSENSORS];
>   struct ksensordev sc_sensdev;
>  
> + uint64_t sc_hkey_version;
> +
>   uint64_t sc_thinklight;
>   const char *sc_thinklight_get;
>   const char *sc_thinklight_set;
> @@ -161,8 +167,8 @@ int thinkpad_activate(struct device *, i
>  /* wscons hook functions */
>  void thinkpad_get_thinklight(struct acpithinkpad_softc *);
>  void thinkpad_set_thinklight(void *, int);
> -int thinkpad_get_backlight(struct wskbd_backlight *);
> -int thinkpad_set_backlight(struct wskbd_backlight *);
> +int thinkpad_get_kbd_backlight(struct wskbd_backlight *);
> +int thinkpad_set_kbd_backlight(struct wskbd_backlight *);
>  extern int (*wskbd_get_backlight)(struct wskbd_backlight *);
>  extern int (*wskbd_set_backlight)(struct wskbd_backlight *);
>  void thinkpad_get_brightness(struct acpithinkpad_softc *);
> @@ -284,6 +290,10 @@ thinkpad_attach(struct device *parent, s
>  
>   printf("\n");
>  
> + if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "MHKV", 0, NULL,
> +    &sc->sc_hkey_version))
> + sc->sc_hkey_version = THINKPAD_HKEY_VERSION1;
> +
>  #if NAUDIO > 0 && NWSKBD > 0
>   /* Defer speaker mute */
>   if (thinkpad_get_volume_mute(sc) == 1)
> @@ -299,14 +309,14 @@ thinkpad_attach(struct device *parent, s
>      0, NULL, &sc->sc_thinklight) == 0) {
>   sc->sc_thinklight_get = "KLCG";
>   sc->sc_thinklight_set = "KLCS";
> - wskbd_get_backlight = thinkpad_get_backlight;
> - wskbd_set_backlight = thinkpad_set_backlight;
> + wskbd_get_backlight = thinkpad_get_kbd_backlight;
> + wskbd_set_backlight = thinkpad_set_kbd_backlight;
>   } else if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "MLCG",
>      0, NULL, &sc->sc_thinklight) == 0) {
>   sc->sc_thinklight_get = "MLCG";
>   sc->sc_thinklight_set = "MLCS";
> - wskbd_get_backlight = thinkpad_get_backlight;
> - wskbd_set_backlight = thinkpad_set_backlight;
> + wskbd_get_backlight = thinkpad_get_kbd_backlight;
> + wskbd_set_backlight = thinkpad_set_kbd_backlight;
>   }
>  
>   if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "PBLG",
> @@ -327,13 +337,19 @@ thinkpad_enable_events(struct acpithinkp
>   int64_t mask;
>   int i;
>  
> - /* Get the supported event mask */
> + /* Get the default event mask */
>   if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "MHKA",
>      0, NULL, &mask)) {
>   printf("%s: no MHKA\n", DEVNAME(sc));
>   return (1);
>   }
>  
> + /* Enable events we need to know about */
> + mask |= (THINKPAD_MASK_BRIGHTNESS_UP | THINKPAD_MASK_BRIGHTNESS_DOWN |
> +    THINKPAD_MASK_KBD_BACKLIGHT);
> +
> + DPRINTF(("%s: setting event mask to 0x%llx\n", DEVNAME(sc), mask));
> +
>   /* Update hotkey mask */
>   bzero(args, sizeof(args));
>   args[0].type = args[1].type = AML_OBJTYPE_INTEGER;
> @@ -380,6 +396,8 @@ thinkpad_hotkey(struct aml_node *node, i
>   if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "MHKP",
>      0, NULL, &event))
>   break;
> +
> + DPRINTF(("%s: event 0x%03llx\n", DEVNAME(sc), event));
>   if (event == 0)
>   break;
>  
> @@ -535,13 +553,37 @@ thinkpad_volume_mute(struct acpithinkpad
>  int
>  thinkpad_brightness_up(struct acpithinkpad_softc *sc)
>  {
> - return (thinkpad_cmos(sc, THINKPAD_CMOS_BRIGHTNESS_UP));
> + int b;
> +
> + if (sc->sc_hkey_version == THINKPAD_HKEY_VERSION2) {
> + thinkpad_get_brightness(sc);
> + b = sc->sc_brightness & 0xff;
> + if (b < ((sc->sc_brightness >> 8) & 0xff)) {
> + sc->sc_brightness = b + 1;
> + thinkpad_set_brightness(sc, 0);
> + }
> +
> + return (0);
> + } else
> + return (thinkpad_cmos(sc, THINKPAD_CMOS_BRIGHTNESS_UP));
>  }
>  
>  int
>  thinkpad_brightness_down(struct acpithinkpad_softc *sc)
>  {
> - return (thinkpad_cmos(sc, THINKPAD_CMOS_BRIGHTNESS_DOWN));
> + int b;
> +
> + if (sc->sc_hkey_version == THINKPAD_HKEY_VERSION2) {
> + thinkpad_get_brightness(sc);
> + b = sc->sc_brightness & 0xff;
> + if (b > 0) {
> + sc->sc_brightness = b - 1;
> + thinkpad_set_brightness(sc, 0);
> + }
> +
> + return (0);
> + } else
> + return (thinkpad_cmos(sc, THINKPAD_CMOS_BRIGHTNESS_DOWN));
>  }
>  
>  int
> @@ -620,7 +662,7 @@ thinkpad_set_thinklight(void *arg0, int
>  }
>  
>  int
> -thinkpad_get_backlight(struct wskbd_backlight *kbl)
> +thinkpad_get_kbd_backlight(struct wskbd_backlight *kbl)
>  {
>   struct acpithinkpad_softc *sc = acpithinkpad_cd.cd_devs[0];
>  
> @@ -637,7 +679,7 @@ thinkpad_get_backlight(struct wskbd_back
>  }
>  
>  int
> -thinkpad_set_backlight(struct wskbd_backlight *kbl)
> +thinkpad_set_kbd_backlight(struct wskbd_backlight *kbl)
>  {
>   struct acpithinkpad_softc *sc = acpithinkpad_cd.cd_devs[0];
>   int maxval;
> @@ -664,6 +706,8 @@ thinkpad_get_brightness(struct acpithink
>  {
>   aml_evalinteger(sc->sc_acpi, sc->sc_devnode,
>      "PBLG", 0, NULL, &sc->sc_brightness);
> +
> + DPRINTF(("%s: %s: 0x%llx\n", DEVNAME(sc), __func__, sc->sc_brightness));
>  }
>  
>  void
> @@ -672,11 +716,15 @@ thinkpad_set_brightness(void *arg0, int
>   struct acpithinkpad_softc *sc = arg0;
>   struct aml_value arg;
>  
> + DPRINTF(("%s: %s: 0x%llx\n", DEVNAME(sc), __func__, sc->sc_brightness));
> +
>   memset(&arg, 0, sizeof(arg));
>   arg.type = AML_OBJTYPE_INTEGER;
>   arg.v_integer = sc->sc_brightness & 0xff;
>   aml_evalname(sc->sc_acpi, sc->sc_devnode,
>      "PBLS", 1, &arg, NULL);
> +
> + thinkpad_get_brightness(sc);
>  }
>  
>  int
>

--
James Turner

Reply | Threaded
Open this post in threaded view
|

Re: acpithinkpad: fix brightness keys, keyboard backlight value

Sebastian Benoit-3
In reply to this post by joshua stein-3
joshua stein([hidden email]) on 2019.03.05 14:03:13 -0600:

> Here we go again...
>
> On at least the ThinkPad X1C6, the screen brightness keys (F5 and
> F6) do not work and "wsconsctl keyboard.backlight" doesn't report
> the correct value when the keyboard backlight is adjusted with
> Fn+Space.
>
> These are both caused by the default event mask not including these
> events, so explicitly enable them.
>
> But then acpithinkpad has to actually do something for the screen
> brightness keys, but it tries the very old CMOS method which doesn't
> work on these newer machines[0].  So make it use the ACPI method.
>
> I renamed thinkpad_[gs]et_backlight to thinkpad_[gs]et_kbd_backlight
> because it was confusing that they have nothing to do with screen
> backlight.
>
>
> 0. "newer machines" being those with MHKV reporting version 2.  If
> this diff breaks on older "newer machines", this metric will have to
> be changed to something else.

with this the Fn-F5/F6 buttons work on the x270, and it makes
wsconsctl keyboard.backlight show the current setting and wsconsctl
keyboard.backlight=0/50/100 set the keyboard light.

On the x230, the F8/9 brightness keys still work (and the keyboard led is
different of course)

/Benno

> Index: sys/dev/acpi/acpithinkpad.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/acpi/acpithinkpad.c,v
> retrieving revision 1.61
> diff -u -p -u -p -r1.61 acpithinkpad.c
> --- sys/dev/acpi/acpithinkpad.c 1 Jul 2018 19:40:49 -0000 1.61
> +++ sys/dev/acpi/acpithinkpad.c 5 Mar 2019 20:00:23 -0000
> @@ -124,6 +124,10 @@
>  #define THINKPAD_ADAPTIVE_MODE_HOME 1
>  #define THINKPAD_ADAPTIVE_MODE_FUNCTION 3
>  
> +#define THINKPAD_MASK_BRIGHTNESS_UP (1 << 15)
> +#define THINKPAD_MASK_BRIGHTNESS_DOWN (1 << 16)
> +#define THINKPAD_MASK_KBD_BACKLIGHT (1 << 17)
> +
>  struct acpithinkpad_softc {
>   struct device sc_dev;
>  
> @@ -134,6 +138,8 @@ struct acpithinkpad_softc {
>   struct ksensor sc_sens[THINKPAD_NSENSORS];
>   struct ksensordev sc_sensdev;
>  
> + uint64_t sc_hkey_version;
> +
>   uint64_t sc_thinklight;
>   const char *sc_thinklight_get;
>   const char *sc_thinklight_set;
> @@ -161,8 +167,8 @@ int thinkpad_activate(struct device *, i
>  /* wscons hook functions */
>  void thinkpad_get_thinklight(struct acpithinkpad_softc *);
>  void thinkpad_set_thinklight(void *, int);
> -int thinkpad_get_backlight(struct wskbd_backlight *);
> -int thinkpad_set_backlight(struct wskbd_backlight *);
> +int thinkpad_get_kbd_backlight(struct wskbd_backlight *);
> +int thinkpad_set_kbd_backlight(struct wskbd_backlight *);
>  extern int (*wskbd_get_backlight)(struct wskbd_backlight *);
>  extern int (*wskbd_set_backlight)(struct wskbd_backlight *);
>  void thinkpad_get_brightness(struct acpithinkpad_softc *);
> @@ -284,6 +290,10 @@ thinkpad_attach(struct device *parent, s
>  
>   printf("\n");
>  
> + if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "MHKV", 0, NULL,
> +    &sc->sc_hkey_version))
> + sc->sc_hkey_version = THINKPAD_HKEY_VERSION1;
> +
>  #if NAUDIO > 0 && NWSKBD > 0
>   /* Defer speaker mute */
>   if (thinkpad_get_volume_mute(sc) == 1)
> @@ -299,14 +309,14 @@ thinkpad_attach(struct device *parent, s
>      0, NULL, &sc->sc_thinklight) == 0) {
>   sc->sc_thinklight_get = "KLCG";
>   sc->sc_thinklight_set = "KLCS";
> - wskbd_get_backlight = thinkpad_get_backlight;
> - wskbd_set_backlight = thinkpad_set_backlight;
> + wskbd_get_backlight = thinkpad_get_kbd_backlight;
> + wskbd_set_backlight = thinkpad_set_kbd_backlight;
>   } else if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "MLCG",
>      0, NULL, &sc->sc_thinklight) == 0) {
>   sc->sc_thinklight_get = "MLCG";
>   sc->sc_thinklight_set = "MLCS";
> - wskbd_get_backlight = thinkpad_get_backlight;
> - wskbd_set_backlight = thinkpad_set_backlight;
> + wskbd_get_backlight = thinkpad_get_kbd_backlight;
> + wskbd_set_backlight = thinkpad_set_kbd_backlight;
>   }
>  
>   if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "PBLG",
> @@ -327,13 +337,19 @@ thinkpad_enable_events(struct acpithinkp
>   int64_t mask;
>   int i;
>  
> - /* Get the supported event mask */
> + /* Get the default event mask */
>   if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "MHKA",
>      0, NULL, &mask)) {
>   printf("%s: no MHKA\n", DEVNAME(sc));
>   return (1);
>   }
>  
> + /* Enable events we need to know about */
> + mask |= (THINKPAD_MASK_BRIGHTNESS_UP | THINKPAD_MASK_BRIGHTNESS_DOWN |
> +    THINKPAD_MASK_KBD_BACKLIGHT);
> +
> + DPRINTF(("%s: setting event mask to 0x%llx\n", DEVNAME(sc), mask));
> +
>   /* Update hotkey mask */
>   bzero(args, sizeof(args));
>   args[0].type = args[1].type = AML_OBJTYPE_INTEGER;
> @@ -380,6 +396,8 @@ thinkpad_hotkey(struct aml_node *node, i
>   if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "MHKP",
>      0, NULL, &event))
>   break;
> +
> + DPRINTF(("%s: event 0x%03llx\n", DEVNAME(sc), event));
>   if (event == 0)
>   break;
>  
> @@ -535,13 +553,37 @@ thinkpad_volume_mute(struct acpithinkpad
>  int
>  thinkpad_brightness_up(struct acpithinkpad_softc *sc)
>  {
> - return (thinkpad_cmos(sc, THINKPAD_CMOS_BRIGHTNESS_UP));
> + int b;
> +
> + if (sc->sc_hkey_version == THINKPAD_HKEY_VERSION2) {
> + thinkpad_get_brightness(sc);
> + b = sc->sc_brightness & 0xff;
> + if (b < ((sc->sc_brightness >> 8) & 0xff)) {
> + sc->sc_brightness = b + 1;
> + thinkpad_set_brightness(sc, 0);
> + }
> +
> + return (0);
> + } else
> + return (thinkpad_cmos(sc, THINKPAD_CMOS_BRIGHTNESS_UP));
>  }
>  
>  int
>  thinkpad_brightness_down(struct acpithinkpad_softc *sc)
>  {
> - return (thinkpad_cmos(sc, THINKPAD_CMOS_BRIGHTNESS_DOWN));
> + int b;
> +
> + if (sc->sc_hkey_version == THINKPAD_HKEY_VERSION2) {
> + thinkpad_get_brightness(sc);
> + b = sc->sc_brightness & 0xff;
> + if (b > 0) {
> + sc->sc_brightness = b - 1;
> + thinkpad_set_brightness(sc, 0);
> + }
> +
> + return (0);
> + } else
> + return (thinkpad_cmos(sc, THINKPAD_CMOS_BRIGHTNESS_DOWN));
>  }
>  
>  int
> @@ -620,7 +662,7 @@ thinkpad_set_thinklight(void *arg0, int
>  }
>  
>  int
> -thinkpad_get_backlight(struct wskbd_backlight *kbl)
> +thinkpad_get_kbd_backlight(struct wskbd_backlight *kbl)
>  {
>   struct acpithinkpad_softc *sc = acpithinkpad_cd.cd_devs[0];
>  
> @@ -637,7 +679,7 @@ thinkpad_get_backlight(struct wskbd_back
>  }
>  
>  int
> -thinkpad_set_backlight(struct wskbd_backlight *kbl)
> +thinkpad_set_kbd_backlight(struct wskbd_backlight *kbl)
>  {
>   struct acpithinkpad_softc *sc = acpithinkpad_cd.cd_devs[0];
>   int maxval;
> @@ -664,6 +706,8 @@ thinkpad_get_brightness(struct acpithink
>  {
>   aml_evalinteger(sc->sc_acpi, sc->sc_devnode,
>      "PBLG", 0, NULL, &sc->sc_brightness);
> +
> + DPRINTF(("%s: %s: 0x%llx\n", DEVNAME(sc), __func__, sc->sc_brightness));
>  }
>  
>  void
> @@ -672,11 +716,15 @@ thinkpad_set_brightness(void *arg0, int
>   struct acpithinkpad_softc *sc = arg0;
>   struct aml_value arg;
>  
> + DPRINTF(("%s: %s: 0x%llx\n", DEVNAME(sc), __func__, sc->sc_brightness));
> +
>   memset(&arg, 0, sizeof(arg));
>   arg.type = AML_OBJTYPE_INTEGER;
>   arg.v_integer = sc->sc_brightness & 0xff;
>   aml_evalname(sc->sc_acpi, sc->sc_devnode,
>      "PBLS", 1, &arg, NULL);
> +
> + thinkpad_get_brightness(sc);
>  }
>  
>  int
>

Reply | Threaded
Open this post in threaded view
|

Re: acpithinkpad: fix brightness keys, keyboard backlight value

Tracey Emery
In reply to this post by joshua stein-3
On Tue, Mar 05, 2019 at 02:03:13PM -0600, joshua stein wrote:

> Here we go again...
>
> On at least the ThinkPad X1C6, the screen brightness keys (F5 and
> F6) do not work and "wsconsctl keyboard.backlight" doesn't report
> the correct value when the keyboard backlight is adjusted with
> Fn+Space.
>
> These are both caused by the default event mask not including these
> events, so explicitly enable them.
>
> But then acpithinkpad has to actually do something for the screen
> brightness keys, but it tries the very old CMOS method which doesn't
> work on these newer machines[0].  So make it use the ACPI method.
>
> I renamed thinkpad_[gs]et_backlight to thinkpad_[gs]et_kbd_backlight
> because it was confusing that they have nothing to do with screen
> backlight.
>
>
> 0. "newer machines" being those with MHKV reporting version 2.  If
> this diff breaks on older "newer machines", this metric will have to
> be changed to something else.
>
>

This patch fixes the backlight buttons and keyboard brightness reading on the
T740s. Awesome!

Thanks,
Tracey

> Index: sys/dev/acpi/acpithinkpad.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/acpi/acpithinkpad.c,v
> retrieving revision 1.61
> diff -u -p -u -p -r1.61 acpithinkpad.c
> --- sys/dev/acpi/acpithinkpad.c 1 Jul 2018 19:40:49 -0000 1.61
> +++ sys/dev/acpi/acpithinkpad.c 5 Mar 2019 20:00:23 -0000
> @@ -124,6 +124,10 @@
>  #define THINKPAD_ADAPTIVE_MODE_HOME 1
>  #define THINKPAD_ADAPTIVE_MODE_FUNCTION 3
>  
> +#define THINKPAD_MASK_BRIGHTNESS_UP (1 << 15)
> +#define THINKPAD_MASK_BRIGHTNESS_DOWN (1 << 16)
> +#define THINKPAD_MASK_KBD_BACKLIGHT (1 << 17)
> +
>  struct acpithinkpad_softc {
>   struct device sc_dev;
>  
> @@ -134,6 +138,8 @@ struct acpithinkpad_softc {
>   struct ksensor sc_sens[THINKPAD_NSENSORS];
>   struct ksensordev sc_sensdev;
>  
> + uint64_t sc_hkey_version;
> +
>   uint64_t sc_thinklight;
>   const char *sc_thinklight_get;
>   const char *sc_thinklight_set;
> @@ -161,8 +167,8 @@ int thinkpad_activate(struct device *, i
>  /* wscons hook functions */
>  void thinkpad_get_thinklight(struct acpithinkpad_softc *);
>  void thinkpad_set_thinklight(void *, int);
> -int thinkpad_get_backlight(struct wskbd_backlight *);
> -int thinkpad_set_backlight(struct wskbd_backlight *);
> +int thinkpad_get_kbd_backlight(struct wskbd_backlight *);
> +int thinkpad_set_kbd_backlight(struct wskbd_backlight *);
>  extern int (*wskbd_get_backlight)(struct wskbd_backlight *);
>  extern int (*wskbd_set_backlight)(struct wskbd_backlight *);
>  void thinkpad_get_brightness(struct acpithinkpad_softc *);
> @@ -284,6 +290,10 @@ thinkpad_attach(struct device *parent, s
>  
>   printf("\n");
>  
> + if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "MHKV", 0, NULL,
> +    &sc->sc_hkey_version))
> + sc->sc_hkey_version = THINKPAD_HKEY_VERSION1;
> +
>  #if NAUDIO > 0 && NWSKBD > 0
>   /* Defer speaker mute */
>   if (thinkpad_get_volume_mute(sc) == 1)
> @@ -299,14 +309,14 @@ thinkpad_attach(struct device *parent, s
>      0, NULL, &sc->sc_thinklight) == 0) {
>   sc->sc_thinklight_get = "KLCG";
>   sc->sc_thinklight_set = "KLCS";
> - wskbd_get_backlight = thinkpad_get_backlight;
> - wskbd_set_backlight = thinkpad_set_backlight;
> + wskbd_get_backlight = thinkpad_get_kbd_backlight;
> + wskbd_set_backlight = thinkpad_set_kbd_backlight;
>   } else if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "MLCG",
>      0, NULL, &sc->sc_thinklight) == 0) {
>   sc->sc_thinklight_get = "MLCG";
>   sc->sc_thinklight_set = "MLCS";
> - wskbd_get_backlight = thinkpad_get_backlight;
> - wskbd_set_backlight = thinkpad_set_backlight;
> + wskbd_get_backlight = thinkpad_get_kbd_backlight;
> + wskbd_set_backlight = thinkpad_set_kbd_backlight;
>   }
>  
>   if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "PBLG",
> @@ -327,13 +337,19 @@ thinkpad_enable_events(struct acpithinkp
>   int64_t mask;
>   int i;
>  
> - /* Get the supported event mask */
> + /* Get the default event mask */
>   if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "MHKA",
>      0, NULL, &mask)) {
>   printf("%s: no MHKA\n", DEVNAME(sc));
>   return (1);
>   }
>  
> + /* Enable events we need to know about */
> + mask |= (THINKPAD_MASK_BRIGHTNESS_UP | THINKPAD_MASK_BRIGHTNESS_DOWN |
> +    THINKPAD_MASK_KBD_BACKLIGHT);
> +
> + DPRINTF(("%s: setting event mask to 0x%llx\n", DEVNAME(sc), mask));
> +
>   /* Update hotkey mask */
>   bzero(args, sizeof(args));
>   args[0].type = args[1].type = AML_OBJTYPE_INTEGER;
> @@ -380,6 +396,8 @@ thinkpad_hotkey(struct aml_node *node, i
>   if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "MHKP",
>      0, NULL, &event))
>   break;
> +
> + DPRINTF(("%s: event 0x%03llx\n", DEVNAME(sc), event));
>   if (event == 0)
>   break;
>  
> @@ -535,13 +553,37 @@ thinkpad_volume_mute(struct acpithinkpad
>  int
>  thinkpad_brightness_up(struct acpithinkpad_softc *sc)
>  {
> - return (thinkpad_cmos(sc, THINKPAD_CMOS_BRIGHTNESS_UP));
> + int b;
> +
> + if (sc->sc_hkey_version == THINKPAD_HKEY_VERSION2) {
> + thinkpad_get_brightness(sc);
> + b = sc->sc_brightness & 0xff;
> + if (b < ((sc->sc_brightness >> 8) & 0xff)) {
> + sc->sc_brightness = b + 1;
> + thinkpad_set_brightness(sc, 0);
> + }
> +
> + return (0);
> + } else
> + return (thinkpad_cmos(sc, THINKPAD_CMOS_BRIGHTNESS_UP));
>  }
>  
>  int
>  thinkpad_brightness_down(struct acpithinkpad_softc *sc)
>  {
> - return (thinkpad_cmos(sc, THINKPAD_CMOS_BRIGHTNESS_DOWN));
> + int b;
> +
> + if (sc->sc_hkey_version == THINKPAD_HKEY_VERSION2) {
> + thinkpad_get_brightness(sc);
> + b = sc->sc_brightness & 0xff;
> + if (b > 0) {
> + sc->sc_brightness = b - 1;
> + thinkpad_set_brightness(sc, 0);
> + }
> +
> + return (0);
> + } else
> + return (thinkpad_cmos(sc, THINKPAD_CMOS_BRIGHTNESS_DOWN));
>  }
>  
>  int
> @@ -620,7 +662,7 @@ thinkpad_set_thinklight(void *arg0, int
>  }
>  
>  int
> -thinkpad_get_backlight(struct wskbd_backlight *kbl)
> +thinkpad_get_kbd_backlight(struct wskbd_backlight *kbl)
>  {
>   struct acpithinkpad_softc *sc = acpithinkpad_cd.cd_devs[0];
>  
> @@ -637,7 +679,7 @@ thinkpad_get_backlight(struct wskbd_back
>  }
>  
>  int
> -thinkpad_set_backlight(struct wskbd_backlight *kbl)
> +thinkpad_set_kbd_backlight(struct wskbd_backlight *kbl)
>  {
>   struct acpithinkpad_softc *sc = acpithinkpad_cd.cd_devs[0];
>   int maxval;
> @@ -664,6 +706,8 @@ thinkpad_get_brightness(struct acpithink
>  {
>   aml_evalinteger(sc->sc_acpi, sc->sc_devnode,
>      "PBLG", 0, NULL, &sc->sc_brightness);
> +
> + DPRINTF(("%s: %s: 0x%llx\n", DEVNAME(sc), __func__, sc->sc_brightness));
>  }
>  
>  void
> @@ -672,11 +716,15 @@ thinkpad_set_brightness(void *arg0, int
>   struct acpithinkpad_softc *sc = arg0;
>   struct aml_value arg;
>  
> + DPRINTF(("%s: %s: 0x%llx\n", DEVNAME(sc), __func__, sc->sc_brightness));
> +
>   memset(&arg, 0, sizeof(arg));
>   arg.type = AML_OBJTYPE_INTEGER;
>   arg.v_integer = sc->sc_brightness & 0xff;
>   aml_evalname(sc->sc_acpi, sc->sc_devnode,
>      "PBLS", 1, &arg, NULL);
> +
> + thinkpad_get_brightness(sc);
>  }
>  
>  int

Reply | Threaded
Open this post in threaded view
|

Re: acpithinkpad: fix brightness keys, keyboard backlight value

Renato Aguiar
In reply to this post by joshua stein-3
Hi Joshua,

I just tried your patch on T470p and X230.

On T470p, display brightness keys are now working and keyboard
backlight is reported correctly by wsconsctl.

On X230, display brightness keys are still working fine.

Regards,

On Tue, Mar 05 2019, joshua stein wrote:

> Here we go again...
>
> On at least the ThinkPad X1C6, the screen brightness keys (F5
> and
> F6) do not work and "wsconsctl keyboard.backlight" doesn't
> report
> the correct value when the keyboard backlight is adjusted with
> Fn+Space.
>
> These are both caused by the default event mask not including
> these
> events, so explicitly enable them.
>
> But then acpithinkpad has to actually do something for the
> screen
> brightness keys, but it tries the very old CMOS method which
> doesn't
> work on these newer machines[0].  So make it use the ACPI
> method.
>
> I renamed thinkpad_[gs]et_backlight to
> thinkpad_[gs]et_kbd_backlight
> because it was confusing that they have nothing to do with
> screen
> backlight.
>
>
> 0. "newer machines" being those with MHKV reporting version 2.
> If
> this diff breaks on older "newer machines", this metric will
> have to
> be changed to something else.
>
>
> Index: sys/dev/acpi/acpithinkpad.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/acpi/acpithinkpad.c,v
> retrieving revision 1.61
> diff -u -p -u -p -r1.61 acpithinkpad.c
> --- sys/dev/acpi/acpithinkpad.c 1 Jul 2018 19:40:49 -0000
> 1.61
> +++ sys/dev/acpi/acpithinkpad.c 5 Mar 2019 20:00:23 -0000
> @@ -124,6 +124,10 @@
>  #define THINKPAD_ADAPTIVE_MODE_HOME 1
>  #define THINKPAD_ADAPTIVE_MODE_FUNCTION 3
>  
> +#define THINKPAD_MASK_BRIGHTNESS_UP (1 << 15)
> +#define THINKPAD_MASK_BRIGHTNESS_DOWN (1 << 16)
> +#define THINKPAD_MASK_KBD_BACKLIGHT (1 << 17)
> +
>  struct acpithinkpad_softc {
>   struct device sc_dev;
>  
> @@ -134,6 +138,8 @@ struct acpithinkpad_softc {
>   struct ksensor sc_sens[THINKPAD_NSENSORS];
>   struct ksensordev sc_sensdev;
>  
> + uint64_t sc_hkey_version;
> +
>   uint64_t sc_thinklight;
>   const char *sc_thinklight_get;
>   const char *sc_thinklight_set;
> @@ -161,8 +167,8 @@ int thinkpad_activate(struct device *,
> i
>  /* wscons hook functions */
>  void thinkpad_get_thinklight(struct acpithinkpad_softc *);
>  void thinkpad_set_thinklight(void *, int);
> -int thinkpad_get_backlight(struct wskbd_backlight *);
> -int thinkpad_set_backlight(struct wskbd_backlight *);
> +int thinkpad_get_kbd_backlight(struct wskbd_backlight *);
> +int thinkpad_set_kbd_backlight(struct wskbd_backlight *);
>  extern int (*wskbd_get_backlight)(struct wskbd_backlight *);
>  extern int (*wskbd_set_backlight)(struct wskbd_backlight *);
>  void thinkpad_get_brightness(struct acpithinkpad_softc *);
> @@ -284,6 +290,10 @@ thinkpad_attach(struct device *parent, s
>  
>   printf("\n");
>  
> + if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "MHKV",
> 0, NULL,
> +    &sc->sc_hkey_version))
> + sc->sc_hkey_version = THINKPAD_HKEY_VERSION1;
> +
>  #if NAUDIO > 0 && NWSKBD > 0
>   /* Defer speaker mute */
>   if (thinkpad_get_volume_mute(sc) == 1)
> @@ -299,14 +309,14 @@ thinkpad_attach(struct device *parent, s
>      0, NULL, &sc->sc_thinklight) == 0) {
>   sc->sc_thinklight_get = "KLCG";
>   sc->sc_thinklight_set = "KLCS";
> - wskbd_get_backlight = thinkpad_get_backlight;
> - wskbd_set_backlight = thinkpad_set_backlight;
> + wskbd_get_backlight = thinkpad_get_kbd_backlight;
> + wskbd_set_backlight = thinkpad_set_kbd_backlight;
>   } else if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode,
>  "MLCG",
>      0, NULL, &sc->sc_thinklight) == 0) {
>   sc->sc_thinklight_get = "MLCG";
>   sc->sc_thinklight_set = "MLCS";
> - wskbd_get_backlight = thinkpad_get_backlight;
> - wskbd_set_backlight = thinkpad_set_backlight;
> + wskbd_get_backlight = thinkpad_get_kbd_backlight;
> + wskbd_set_backlight = thinkpad_set_kbd_backlight;
>   }
>  
>   if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "PBLG",
> @@ -327,13 +337,19 @@ thinkpad_enable_events(struct acpithinkp
>   int64_t mask;
>   int i;
>  
> - /* Get the supported event mask */
> + /* Get the default event mask */
>   if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "MHKA",
>      0, NULL, &mask)) {
>   printf("%s: no MHKA\n", DEVNAME(sc));
>   return (1);
>   }
>  
> + /* Enable events we need to know about */
> + mask |= (THINKPAD_MASK_BRIGHTNESS_UP |
> THINKPAD_MASK_BRIGHTNESS_DOWN |
> +    THINKPAD_MASK_KBD_BACKLIGHT);
> +
> + DPRINTF(("%s: setting event mask to 0x%llx\n",
> DEVNAME(sc), mask));
> +
>   /* Update hotkey mask */
>   bzero(args, sizeof(args));
>   args[0].type = args[1].type = AML_OBJTYPE_INTEGER;
> @@ -380,6 +396,8 @@ thinkpad_hotkey(struct aml_node *node, i
>   if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode,
>  "MHKP",
>      0, NULL, &event))
>   break;
> +
> + DPRINTF(("%s: event 0x%03llx\n", DEVNAME(sc),
> event));
>   if (event == 0)
>   break;
>  
> @@ -535,13 +553,37 @@ thinkpad_volume_mute(struct acpithinkpad
>  int
>  thinkpad_brightness_up(struct acpithinkpad_softc *sc)
>  {
> - return (thinkpad_cmos(sc, THINKPAD_CMOS_BRIGHTNESS_UP));
> + int b;
> +
> + if (sc->sc_hkey_version == THINKPAD_HKEY_VERSION2) {
> + thinkpad_get_brightness(sc);
> + b = sc->sc_brightness & 0xff;
> + if (b < ((sc->sc_brightness >> 8) & 0xff)) {
> + sc->sc_brightness = b + 1;
> + thinkpad_set_brightness(sc, 0);
> + }
> +
> + return (0);
> + } else
> + return (thinkpad_cmos(sc,
> THINKPAD_CMOS_BRIGHTNESS_UP));
>  }
>  
>  int
>  thinkpad_brightness_down(struct acpithinkpad_softc *sc)
>  {
> - return (thinkpad_cmos(sc, THINKPAD_CMOS_BRIGHTNESS_DOWN));
> + int b;
> +
> + if (sc->sc_hkey_version == THINKPAD_HKEY_VERSION2) {
> + thinkpad_get_brightness(sc);
> + b = sc->sc_brightness & 0xff;
> + if (b > 0) {
> + sc->sc_brightness = b - 1;
> + thinkpad_set_brightness(sc, 0);
> + }
> +
> + return (0);
> + } else
> + return (thinkpad_cmos(sc,
> THINKPAD_CMOS_BRIGHTNESS_DOWN));
>  }
>  
>  int
> @@ -620,7 +662,7 @@ thinkpad_set_thinklight(void *arg0, int
>  }
>  
>  int
> -thinkpad_get_backlight(struct wskbd_backlight *kbl)
> +thinkpad_get_kbd_backlight(struct wskbd_backlight *kbl)
>  {
>   struct acpithinkpad_softc *sc =
>  acpithinkpad_cd.cd_devs[0];
>  
> @@ -637,7 +679,7 @@ thinkpad_get_backlight(struct wskbd_back
>  }
>  
>  int
> -thinkpad_set_backlight(struct wskbd_backlight *kbl)
> +thinkpad_set_kbd_backlight(struct wskbd_backlight *kbl)
>  {
>   struct acpithinkpad_softc *sc =
>  acpithinkpad_cd.cd_devs[0];
>   int maxval;
> @@ -664,6 +706,8 @@ thinkpad_get_brightness(struct acpithink
>  {
>   aml_evalinteger(sc->sc_acpi, sc->sc_devnode,
>      "PBLG", 0, NULL, &sc->sc_brightness);
> +
> + DPRINTF(("%s: %s: 0x%llx\n", DEVNAME(sc), __func__,
> sc->sc_brightness));
>  }
>  
>  void
> @@ -672,11 +716,15 @@ thinkpad_set_brightness(void *arg0, int
>   struct acpithinkpad_softc *sc = arg0;
>   struct aml_value arg;
>  
> + DPRINTF(("%s: %s: 0x%llx\n", DEVNAME(sc), __func__,
> sc->sc_brightness));
> +
>   memset(&arg, 0, sizeof(arg));
>   arg.type = AML_OBJTYPE_INTEGER;
>   arg.v_integer = sc->sc_brightness & 0xff;
>   aml_evalname(sc->sc_acpi, sc->sc_devnode,
>      "PBLS", 1, &arg, NULL);
> +
> + thinkpad_get_brightness(sc);
>  }
>  
>  int


--
Renato Aguiar

Reply | Threaded
Open this post in threaded view
|

Re: acpithinkpad: fix brightness keys, keyboard backlight value

Claudio Jeker
In reply to this post by joshua stein-3
On Tue, Mar 05, 2019 at 02:03:13PM -0600, joshua stein wrote:

> Here we go again...
>
> On at least the ThinkPad X1C6, the screen brightness keys (F5 and
> F6) do not work and "wsconsctl keyboard.backlight" doesn't report
> the correct value when the keyboard backlight is adjusted with
> Fn+Space.
>
> These are both caused by the default event mask not including these
> events, so explicitly enable them.
>
> But then acpithinkpad has to actually do something for the screen
> brightness keys, but it tries the very old CMOS method which doesn't
> work on these newer machines[0].  So make it use the ACPI method.
>
> I renamed thinkpad_[gs]et_backlight to thinkpad_[gs]et_kbd_backlight
> because it was confusing that they have nothing to do with screen
> backlight.
>
>
> 0. "newer machines" being those with MHKV reporting version 2.  If
> this diff breaks on older "newer machines", this metric will have to
> be changed to something else.
>

Tested on an x240 and x270. Both work fine (actually fixes the x270).
Diff reads ok to me. OK claudio@
 

> Index: sys/dev/acpi/acpithinkpad.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/acpi/acpithinkpad.c,v
> retrieving revision 1.61
> diff -u -p -u -p -r1.61 acpithinkpad.c
> --- sys/dev/acpi/acpithinkpad.c 1 Jul 2018 19:40:49 -0000 1.61
> +++ sys/dev/acpi/acpithinkpad.c 5 Mar 2019 20:00:23 -0000
> @@ -124,6 +124,10 @@
>  #define THINKPAD_ADAPTIVE_MODE_HOME 1
>  #define THINKPAD_ADAPTIVE_MODE_FUNCTION 3
>  
> +#define THINKPAD_MASK_BRIGHTNESS_UP (1 << 15)
> +#define THINKPAD_MASK_BRIGHTNESS_DOWN (1 << 16)
> +#define THINKPAD_MASK_KBD_BACKLIGHT (1 << 17)
> +
>  struct acpithinkpad_softc {
>   struct device sc_dev;
>  
> @@ -134,6 +138,8 @@ struct acpithinkpad_softc {
>   struct ksensor sc_sens[THINKPAD_NSENSORS];
>   struct ksensordev sc_sensdev;
>  
> + uint64_t sc_hkey_version;
> +
>   uint64_t sc_thinklight;
>   const char *sc_thinklight_get;
>   const char *sc_thinklight_set;
> @@ -161,8 +167,8 @@ int thinkpad_activate(struct device *, i
>  /* wscons hook functions */
>  void thinkpad_get_thinklight(struct acpithinkpad_softc *);
>  void thinkpad_set_thinklight(void *, int);
> -int thinkpad_get_backlight(struct wskbd_backlight *);
> -int thinkpad_set_backlight(struct wskbd_backlight *);
> +int thinkpad_get_kbd_backlight(struct wskbd_backlight *);
> +int thinkpad_set_kbd_backlight(struct wskbd_backlight *);
>  extern int (*wskbd_get_backlight)(struct wskbd_backlight *);
>  extern int (*wskbd_set_backlight)(struct wskbd_backlight *);
>  void thinkpad_get_brightness(struct acpithinkpad_softc *);
> @@ -284,6 +290,10 @@ thinkpad_attach(struct device *parent, s
>  
>   printf("\n");
>  
> + if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "MHKV", 0, NULL,
> +    &sc->sc_hkey_version))
> + sc->sc_hkey_version = THINKPAD_HKEY_VERSION1;
> +
>  #if NAUDIO > 0 && NWSKBD > 0
>   /* Defer speaker mute */
>   if (thinkpad_get_volume_mute(sc) == 1)
> @@ -299,14 +309,14 @@ thinkpad_attach(struct device *parent, s
>      0, NULL, &sc->sc_thinklight) == 0) {
>   sc->sc_thinklight_get = "KLCG";
>   sc->sc_thinklight_set = "KLCS";
> - wskbd_get_backlight = thinkpad_get_backlight;
> - wskbd_set_backlight = thinkpad_set_backlight;
> + wskbd_get_backlight = thinkpad_get_kbd_backlight;
> + wskbd_set_backlight = thinkpad_set_kbd_backlight;
>   } else if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "MLCG",
>      0, NULL, &sc->sc_thinklight) == 0) {
>   sc->sc_thinklight_get = "MLCG";
>   sc->sc_thinklight_set = "MLCS";
> - wskbd_get_backlight = thinkpad_get_backlight;
> - wskbd_set_backlight = thinkpad_set_backlight;
> + wskbd_get_backlight = thinkpad_get_kbd_backlight;
> + wskbd_set_backlight = thinkpad_set_kbd_backlight;
>   }
>  
>   if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "PBLG",
> @@ -327,13 +337,19 @@ thinkpad_enable_events(struct acpithinkp
>   int64_t mask;
>   int i;
>  
> - /* Get the supported event mask */
> + /* Get the default event mask */
>   if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "MHKA",
>      0, NULL, &mask)) {
>   printf("%s: no MHKA\n", DEVNAME(sc));
>   return (1);
>   }
>  
> + /* Enable events we need to know about */
> + mask |= (THINKPAD_MASK_BRIGHTNESS_UP | THINKPAD_MASK_BRIGHTNESS_DOWN |
> +    THINKPAD_MASK_KBD_BACKLIGHT);
> +
> + DPRINTF(("%s: setting event mask to 0x%llx\n", DEVNAME(sc), mask));
> +
>   /* Update hotkey mask */
>   bzero(args, sizeof(args));
>   args[0].type = args[1].type = AML_OBJTYPE_INTEGER;
> @@ -380,6 +396,8 @@ thinkpad_hotkey(struct aml_node *node, i
>   if (aml_evalinteger(sc->sc_acpi, sc->sc_devnode, "MHKP",
>      0, NULL, &event))
>   break;
> +
> + DPRINTF(("%s: event 0x%03llx\n", DEVNAME(sc), event));
>   if (event == 0)
>   break;
>  
> @@ -535,13 +553,37 @@ thinkpad_volume_mute(struct acpithinkpad
>  int
>  thinkpad_brightness_up(struct acpithinkpad_softc *sc)
>  {
> - return (thinkpad_cmos(sc, THINKPAD_CMOS_BRIGHTNESS_UP));
> + int b;
> +
> + if (sc->sc_hkey_version == THINKPAD_HKEY_VERSION2) {
> + thinkpad_get_brightness(sc);
> + b = sc->sc_brightness & 0xff;
> + if (b < ((sc->sc_brightness >> 8) & 0xff)) {
> + sc->sc_brightness = b + 1;
> + thinkpad_set_brightness(sc, 0);
> + }
> +
> + return (0);
> + } else
> + return (thinkpad_cmos(sc, THINKPAD_CMOS_BRIGHTNESS_UP));
>  }
>  
>  int
>  thinkpad_brightness_down(struct acpithinkpad_softc *sc)
>  {
> - return (thinkpad_cmos(sc, THINKPAD_CMOS_BRIGHTNESS_DOWN));
> + int b;
> +
> + if (sc->sc_hkey_version == THINKPAD_HKEY_VERSION2) {
> + thinkpad_get_brightness(sc);
> + b = sc->sc_brightness & 0xff;
> + if (b > 0) {
> + sc->sc_brightness = b - 1;
> + thinkpad_set_brightness(sc, 0);
> + }
> +
> + return (0);
> + } else
> + return (thinkpad_cmos(sc, THINKPAD_CMOS_BRIGHTNESS_DOWN));
>  }
>  
>  int
> @@ -620,7 +662,7 @@ thinkpad_set_thinklight(void *arg0, int
>  }
>  
>  int
> -thinkpad_get_backlight(struct wskbd_backlight *kbl)
> +thinkpad_get_kbd_backlight(struct wskbd_backlight *kbl)
>  {
>   struct acpithinkpad_softc *sc = acpithinkpad_cd.cd_devs[0];
>  
> @@ -637,7 +679,7 @@ thinkpad_get_backlight(struct wskbd_back
>  }
>  
>  int
> -thinkpad_set_backlight(struct wskbd_backlight *kbl)
> +thinkpad_set_kbd_backlight(struct wskbd_backlight *kbl)
>  {
>   struct acpithinkpad_softc *sc = acpithinkpad_cd.cd_devs[0];
>   int maxval;
> @@ -664,6 +706,8 @@ thinkpad_get_brightness(struct acpithink
>  {
>   aml_evalinteger(sc->sc_acpi, sc->sc_devnode,
>      "PBLG", 0, NULL, &sc->sc_brightness);
> +
> + DPRINTF(("%s: %s: 0x%llx\n", DEVNAME(sc), __func__, sc->sc_brightness));
>  }
>  
>  void
> @@ -672,11 +716,15 @@ thinkpad_set_brightness(void *arg0, int
>   struct acpithinkpad_softc *sc = arg0;
>   struct aml_value arg;
>  
> + DPRINTF(("%s: %s: 0x%llx\n", DEVNAME(sc), __func__, sc->sc_brightness));
> +
>   memset(&arg, 0, sizeof(arg));
>   arg.type = AML_OBJTYPE_INTEGER;
>   arg.v_integer = sc->sc_brightness & 0xff;
>   aml_evalname(sc->sc_acpi, sc->sc_devnode,
>      "PBLS", 1, &arg, NULL);
> +
> + thinkpad_get_brightness(sc);
>  }
>  
>  int
>

--
:wq Claudio

Reply | Threaded
Open this post in threaded view
|

Re: acpithinkpad: fix brightness keys, keyboard backlight value

Stefan Sperling-5
In reply to this post by joshua stein-3
On Tue, Mar 05, 2019 at 02:03:13PM -0600, joshua stein wrote:
> 0. "newer machines" being those with MHKV reporting version 2.  If
> this diff breaks on older "newer machines", this metric will have to
> be changed to something else.

Works fine here on x201 and x250.

Reply | Threaded
Open this post in threaded view
|

Re: acpithinkpad: fix brightness keys, keyboard backlight value

Stuart Henderson
In reply to this post by joshua stein-3
On 2019/03/05 14:03, joshua stein wrote:
> Here we go again...
>
> On at least the ThinkPad X1C6, the screen brightness keys (F5 and
> F6) do not work and "wsconsctl keyboard.backlight" doesn't report
> the correct value when the keyboard backlight is adjusted with
> Fn+Space.
>
> These are both caused by the default event mask not including these
> events, so explicitly enable them.

On X260 the mic mute button is masked by default, adding this to the mask
gets it toggling record.volume.mute:

#define THINKPAD_MASK_MIC_MUTE         (1 << 14)

It wouldn't surprise me if this is the same on newer ones.

> But then acpithinkpad has to actually do something for the screen
> brightness keys, but it tries the very old CMOS method which doesn't
> work on these newer machines[0].  So make it use the ACPI method.

X260 hits the [0] case - MHKV reports 0x100 (THINKPAD_HKEY_VERSION1)
but the ACPI method is required. Forcing sc_hkey_version=THINKPAD_HKEY_VERSION2
gets the buttons working for me. Not sure what it could be conditioned on
other than MHKV though. Would it make sense to use PBLS if present, and
only fallback to the CMOS method if not?

Not sure when PBLS was introduced but I have the range from collected
DSDT files - X32 doesn't have it, X220 does.

keyboard.backlight was already working on this machine.

> I renamed thinkpad_[gs]et_backlight to thinkpad_[gs]et_kbd_backlight
> because it was confusing that they have nothing to do with screen
> backlight.

agreed. this feels like a separate commit; ok sthen@

> 0. "newer machines" being those with MHKV reporting version 2.  If
> this diff breaks on older "newer machines", this metric will have to
> be changed to something else.

It doesn't make things any worse on X260 and is a step in the right
direction, so ok from that point of view, but it would be lovely to get
it working.

DSDT disassembly below.

OpenBSD 6.5-beta (GENERIC.MP) #7: Wed Mar  6 14:45:37 GMT 2019
    [hidden email]:/sys/arch/amd64/compile/GENERIC.MP
real mem = 8438833152 (8047MB)
avail mem = 8173133824 (7794MB)
mpath0 at root
scsibus0 at mpath0: 256 targets
mainbus0 at root
bios0 at mainbus0: SMBIOS rev. 2.8 @ 0xd705d000 (63 entries)
bios0: vendor LENOVO version "R02ET67W (1.40 )" date 08/02/2018
bios0: LENOVO 20F6006YUK
acpi0 at bios0: rev 2
acpi0: sleep states S0 S3 S4 S5
acpi0: tables DSDT FACP UEFI SSDT SSDT ECDT HPET APIC MCFG SSDT SSDT DBGP DBG2 BOOT BATB SLIC SSDT SSDT MSDM DMAR ASF! FPDT UEFI
acpi0: wakeup devices LID_(S4) SLPB(S3) IGBE(S4) EXP8(S4) XHCI(S3)
acpitimer0 at acpi0: 3579545 Hz, 24 bits
acpiec0 at acpi0
acpihpet0 at acpi0: 23999999 Hz
acpimadt0 at acpi0 addr 0xfee00000: PC-AT compat
cpu0 at mainbus0: apid 0 (boot processor)
cpu0: Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz, 2195.80 MHz, 06-4e-03
cpu0: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE,SSE3,PCLMUL,DTES64,MWAIT,DS-CPL,VMX,EST,TM2,SSSE3,SDBG,FMA3,CX16,xTPR,PDCM,PCID,SSE4.1,SSE4.2,x2APIC,MOVBE,POPCNT,DEADLINE,AES,XSAVE,AVX,F16C,RDRAND,NXE,PAGE1GB,RDTSCP,LONG,LAHF,ABM,3DNOWP,PERF,ITSC,FSGSBASE,SGX,BMI1,AVX2,SMEP,BMI2,ERMS,INVPCID,MPX,RDSEED,ADX,SMAP,CLFLUSHOPT,PT,IBRS,IBPB,STIBP,L1DF,SSBD,SENSOR,ARAT,XSAVEOPT,XSAVEC,XGETBV1,XSAVES,MELTDOWN
cpu0: 256KB 64b/line 8-way L2 cache
cpu0: smt 0, core 0, package 0
mtrr: Pentium Pro MTRR support, 10 var ranges, 88 fixed ranges
cpu0: apic clock running at 23MHz
cpu0: mwait min=64, max=64, C-substates=0.2.1.2.4.1.1.1, IBE
cpu1 at mainbus0: apid 2 (application processor)
cpu1: Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz, 2194.87 MHz, 06-4e-03
cpu1: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE,SSE3,PCLMUL,DTES64,MWAIT,DS-CPL,VMX,EST,TM2,SSSE3,SDBG,FMA3,CX16,xTPR,PDCM,PCID,SSE4.1,SSE4.2,x2APIC,MOVBE,POPCNT,DEADLINE,AES,XSAVE,AVX,F16C,RDRAND,NXE,PAGE1GB,RDTSCP,LONG,LAHF,ABM,3DNOWP,PERF,ITSC,FSGSBASE,SGX,BMI1,AVX2,SMEP,BMI2,ERMS,INVPCID,MPX,RDSEED,ADX,SMAP,CLFLUSHOPT,PT,IBRS,IBPB,STIBP,L1DF,SSBD,SENSOR,ARAT,XSAVEOPT,XSAVEC,XGETBV1,XSAVES,MELTDOWN
cpu1: 256KB 64b/line 8-way L2 cache
cpu1: smt 0, core 1, package 0
cpu2 at mainbus0: apid 1 (application processor)
cpu2: Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz, 2194.87 MHz, 06-4e-03
cpu2: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE,SSE3,PCLMUL,DTES64,MWAIT,DS-CPL,VMX,EST,TM2,SSSE3,SDBG,FMA3,CX16,xTPR,PDCM,PCID,SSE4.1,SSE4.2,x2APIC,MOVBE,POPCNT,DEADLINE,AES,XSAVE,AVX,F16C,RDRAND,NXE,PAGE1GB,RDTSCP,LONG,LAHF,ABM,3DNOWP,PERF,ITSC,FSGSBASE,SGX,BMI1,AVX2,SMEP,BMI2,ERMS,INVPCID,MPX,RDSEED,ADX,SMAP,CLFLUSHOPT,PT,IBRS,IBPB,STIBP,L1DF,SSBD,SENSOR,ARAT,XSAVEOPT,XSAVEC,XGETBV1,XSAVES,MELTDOWN
cpu2: 256KB 64b/line 8-way L2 cache
cpu2: smt 1, core 0, package 0
cpu3 at mainbus0: apid 3 (application processor)
cpu3: Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz, 2194.87 MHz, 06-4e-03
cpu3: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE,SSE3,PCLMUL,DTES64,MWAIT,DS-CPL,VMX,EST,TM2,SSSE3,SDBG,FMA3,CX16,xTPR,PDCM,PCID,SSE4.1,SSE4.2,x2APIC,MOVBE,POPCNT,DEADLINE,AES,XSAVE,AVX,F16C,RDRAND,NXE,PAGE1GB,RDTSCP,LONG,LAHF,ABM,3DNOWP,PERF,ITSC,FSGSBASE,SGX,BMI1,AVX2,SMEP,BMI2,ERMS,INVPCID,MPX,RDSEED,ADX,SMAP,CLFLUSHOPT,PT,IBRS,IBPB,STIBP,L1DF,SSBD,SENSOR,ARAT,XSAVEOPT,XSAVEC,XGETBV1,XSAVES,MELTDOWN
cpu3: 256KB 64b/line 8-way L2 cache
cpu3: smt 1, core 1, package 0
ioapic0 at mainbus0: apid 2 pa 0xfec00000, version 20, 120 pins
acpimcfg0 at acpi0
acpimcfg0: addr 0xf8000000, bus 0-63
acpiprt0 at acpi0: bus 0 (PCI0)
acpiprt1 at acpi0: bus -1 (PEG0)
acpiprt2 at acpi0: bus -1 (PEG1)
acpiprt3 at acpi0: bus -1 (PEG2)
acpiprt4 at acpi0: bus 2 (EXP1)
acpiprt5 at acpi0: bus 4 (EXP3)
acpiprt6 at acpi0: bus -1 (EXP4)
acpiprt7 at acpi0: bus -1 (EXP5)
acpiprt8 at acpi0: bus -1 (EXP8)
acpicpu0 at acpi0: C3(200@1034 mwait.1@0x60), C2(200@151 mwait.1@0x33), C1(1000@1 mwait.1), PSS
acpicpu1 at acpi0: C3(200@1034 mwait.1@0x60), C2(200@151 mwait.1@0x33), C1(1000@1 mwait.1), PSS
acpicpu2 at acpi0: C3(200@1034 mwait.1@0x60), C2(200@151 mwait.1@0x33), C1(1000@1 mwait.1), PSS
acpicpu3 at acpi0: C3(200@1034 mwait.1@0x60), C2(200@151 mwait.1@0x33), C1(1000@1 mwait.1), PSS
acpipwrres0 at acpi0: PUBS, resource for XHCI
acpipwrres1 at acpi0: PG00, resource for PEG0
acpipwrres2 at acpi0: PG01, resource for PEG1
acpipwrres3 at acpi0: PG02, resource for PEG2
acpipwrres4 at acpi0: WRST
acpipwrres5 at acpi0: WRST
acpitz0 at acpi0: critical temperature is 128 degC
acpibtn0 at acpi0: LID_
acpibtn1 at acpi0: SLPB
acpipci0 at acpi0 PCI0: 0x00000000 0x00000011 0x00000001
acpicmos0 at acpi0
acpibat0 at acpi0: BAT0 model "45N1773" serial   772 type LION oem "SANYO"
acpibat1 at acpi0: BAT1 model "45N1777" serial   904 type LION oem "SANYO"
acpiac0 at acpi0: AC unit online
acpithinkpad0 at acpi0
"PNP0C14" at acpi0 not configured
"PNP0C14" at acpi0 not configured
"PNP0C14" at acpi0 not configured
acpivideo0 at acpi0: GFX0
acpivout at acpivideo0 not configured
cpu0: Enhanced SpeedStep 2195 MHz: speeds: 2301, 2300, 2200, 2100, 2000, 1800, 1700, 1500, 1400, 1300, 1100, 1000, 800, 700, 500, 400 MHz
pci0 at mainbus0 bus 0
pchb0 at pci0 dev 0 function 0 "Intel Core 6G Host" rev 0x08
inteldrm0 at pci0 dev 2 function 0 "Intel HD Graphics 520" rev 0x07
drm0 at inteldrm0
inteldrm0: msi
error: [drm:pid0:i915_firmware_load_error_print] *ERROR* failed to load firmware i915/skl_dmc_ver1.bin (-22)
error: [drm:pid0:i915_gem_init_hw] *ERROR* Failed to initialize GuC, error -8 (ignored)
inteldrm0: 1920x1080, 32bpp
wsdisplay0 at inteldrm0 mux 1: console (std, vt100 emulation)
wsdisplay0: screen 1-5 added (std, vt100 emulation)
xhci0 at pci0 dev 20 function 0 "Intel 100 Series xHCI" rev 0x21: msi, xHCI 1.0
usb0 at xhci0: USB revision 3.0
uhub0 at usb0 configuration 1 interface 0 "Intel xHCI root hub" rev 3.00/1.00 addr 1
pchtemp0 at pci0 dev 20 function 2 "Intel 100 Series Thermal" rev 0x21
"Intel 100 Series MEI" rev 0x21 at pci0 dev 22 function 0 not configured
ahci0 at pci0 dev 23 function 0 "Intel 100 Series AHCI" rev 0x21: msi, AHCI 1.3.1
ahci0: port 1: 6.0Gb/s
scsibus1 at ahci0: 32 targets
sd0 at scsibus1 targ 1 lun 0: <ATA, Samsung SSD 840, EXT0> SCSI3 0/direct fixed naa.50025388a06ee63b
sd0: 114473MB, 512 bytes/sector, 234441648 sectors, thin
ppb0 at pci0 dev 28 function 0 "Intel 100 Series PCIE" rev 0xf1: msi
pci1 at ppb0 bus 2
rtsx0 at pci1 dev 0 function 0 "Realtek RTS522A Card Reader" rev 0x01: msi
sdmmc0 at rtsx0: 4-bit, dma
ppb1 at pci0 dev 28 function 2 "Intel 100 Series PCIE" rev 0xf1: msi
pci2 at ppb1 bus 4
iwm0 at pci2 dev 0 function 0 "Intel Dual Band Wireless AC 8260" rev 0x3a, msi
pcib0 at pci0 dev 31 function 0 "Intel 100 Series LPC" rev 0x21
"Intel 100 Series PMC" rev 0x21 at pci0 dev 31 function 2 not configured
azalia0 at pci0 dev 31 function 3 "Intel 100 Series HD Audio" rev 0x21: msi
azalia0: codecs: Realtek/0x0293, Intel/0x2809, using Realtek/0x0293
audio0 at azalia0
ichiic0 at pci0 dev 31 function 4 "Intel 100 Series SMBus" rev 0x21: apic 2 int 16
iic0 at ichiic0
em0 at pci0 dev 31 function 6 "Intel I219-V" rev 0x21: msi, address c8:5b:76:cf:a8:ca
isa0 at pcib0
isadma0 at isa0
pckbc0 at isa0 port 0x60/5 irq 1 irq 12
pckbd0 at pckbc0 (kbd slot)
wskbd0 at pckbd0: console keyboard, using wsdisplay0
pms0 at pckbc0 (aux slot)
wsmouse0 at pms0 mux 0
wsmouse1 at pms0 mux 0
pms0: Synaptics clickpad, firmware 8.1, 0x1e2b1 0x943300
pcppi0 at isa0 port 0x61
spkr0 at pcppi0
vmm0 at mainbus0: VMX/EPT
efifb at mainbus0 not configured
ugen0 at uhub0 port 5 "Generic EMV Smartcard Reader" rev 2.01/1.20 addr 2
usbd_free_xfer: xfer=0xfffffd82212dae10 not free
ugen0: setting configuration index 0 failed
ugen1 at uhub0 port 7 "Intel Bluetooth" rev 2.00/0.01 addr 3
uvideo0 at uhub0 port 8 configuration 1 interface 0 "8SSC20F26993L1GZ67N0D3D Integrated Camera" rev 2.00/0.13 addr 4
video0 at uvideo0
ugen2 at uhub0 port 9 "Validity Sensors VFS5011 Fingerprint Reader" rev 1.10/0.78 addr 5
vscsi0 at root
scsibus2 at vscsi0: 256 targets
softraid0 at root
scsibus3 at softraid0: 256 targets
sd1 at scsibus3 targ 1 lun 0: <OPENBSD, SR CRYPTO, 006> SCSI2 0/direct fixed
sd1: 114472MB, 512 bytes/sector, 234439009 sectors
root on sd1a (2daf1f3055275432.a) swap on sd1b dump on sd1b
iwm0: hw rev 0x200, fw ver 16.242414.0, address e4:a4:71:4f:84:36

/*
 * Intel ACPI Component Architecture
 * AML/ASL+ Disassembler version 20190215 (64-bit version)
 * Copyright (c) 2000 - 2019 Intel Corporation
 *
 * Disassembling to symbolic ASL+ operators
 *
 * Disassembly of DSDT.2, Wed Mar  6 15:40:22 2019
 *
 * Original Table Header:
 *     Signature        "DSDT"
 *     Length           0x00012402 (74754)
 *     Revision         0x02
 *     Checksum         0x67
 *     OEM ID           "LENOVO"
 *     OEM Table ID     "TP-R02  "
 *     OEM Revision     0x00001400 (5120)
 *     Compiler ID      "INTL"
 *     Compiler Version 0x20141107 (538185991)
 */
DefinitionBlock ("", "DSDT", 2, "LENOVO", "TP-R02  ", 0x00001400)
{
    /*
     * iASL Warning: There were 12 external control methods found during
     * disassembly, but only 0 were resolved (12 unresolved). Additional
     * ACPI tables may be required to properly disassemble the code. This
     * resulting disassembler output file may not compile because the
     * disassembler did not know how many arguments to assign to the
     * unresolved methods. Note: SSDTs can be dynamically loaded at
     * runtime and may or may not be available via the host OS.
     *
     * To specify the tables needed to resolve external control method
     * references, the -e option can be used to specify the filenames.
     * Example iASL invocations:
     *     iasl -e ssdt1.aml ssdt2.aml ssdt3.aml -d dsdt.aml
     *     iasl -e dsdt.aml ssdt2.aml -d ssdt1.aml
     *     iasl -e ssdt*.aml -d dsdt.aml
     *
     * In addition, the -fe option can be used to specify a file containing
     * control method external declarations with the associated method
     * argument counts. Each line of the file must be of the form:
     *     External (<method pathname>, MethodObj, <argument count>)
     * Invocation:
     *     iasl -fe refs.txt -d dsdt.aml
     *
     * The following methods were unresolved and many not compile properly
     * because the disassembler had to guess at the number of arguments
     * required for each:
     */
    External (_PR_.CFGD, UnknownObj)
    External (_PR_.CLVL, IntObj)
    External (_PR_.ELNG, IntObj)
    External (_PR_.EMNA, IntObj)
    External (_PR_.EPCS, UnknownObj)
    External (_SB_.PCI0.CTCD, MethodObj)    // Warning: Unknown method, guessing 0 arguments
    External (_SB_.PCI0.CTCN, MethodObj)    // Warning: Unknown method, guessing 0 arguments
    External (_SB_.PCI0.CTCU, MethodObj)    // Warning: Unknown method, guessing 0 arguments
    External (_SB_.PCI0.CTNL, UnknownObj)
    External (_SB_.PCI0.GFX0.AINT, MethodObj)    // Warning: Unknown method, guessing 2 arguments
    External (_SB_.PCI0.GFX0.CLID, UnknownObj)
    External (_SB_.PCI0.GFX0.DD1F, UnknownObj)
    External (_SB_.PCI0.GFX0.DRDY, IntObj)
    External (_SB_.PCI0.GFX0.GSCI, MethodObj)    // Warning: Unknown method, guessing 0 arguments
    External (_SB_.PCI0.GFX0.GSSE, MethodObj)    // Warning: Unknown method, guessing 1 arguments
    External (_SB_.PCI0.GFX0.VLOC, MethodObj)    // Warning: Unknown method, guessing 1 arguments
    External (_SB_.PCI0.PTDP, UnknownObj)
    External (_SB_.PCI0.RP09.PEGP.NVST, MethodObj)    // Warning: Unknown method, guessing 0 arguments
    External (_SB_.PCI0.SAT1.PRIM.GTME, UnknownObj)
    External (_SB_.PCI0.SAT1.PRT1, UnknownObj)
    External (_SB_.PCI0.SAT1.SCND.GTME, UnknownObj)
    External (_SB_.PCI0.SAT1.SCND.MSTR, UnknownObj)
    External (_SB_.PCI0.XHCI.PS0X, MethodObj)    // Warning: Unknown method, guessing 0 arguments
    External (_SB_.PCI0.XHCI.PS3X, MethodObj)    // Warning: Unknown method, guessing 0 arguments
    External (_SB_.PCI0.XHCI.URTH.INIR, MethodObj)    // Warning: Unknown method, guessing 0 arguments
    External (_SB_.TPM_.PTS_, MethodObj)    // Warning: Unknown method, guessing 1 arguments
    External (PDC0, UnknownObj)
    External (PDC1, UnknownObj)
    External (PDC2, UnknownObj)
    External (PDC3, UnknownObj)
    External (PDC4, UnknownObj)
    External (PDC5, UnknownObj)
    External (PDC6, UnknownObj)
    External (PDC7, UnknownObj)

    OperationRegion (PRTD, SystemIO, 0x80, 0x04)
    Field (PRTD, DWordAcc, NoLock, Preserve)
    {
        P80H,   32
    }

    Field (PRTD, ByteAcc, NoLock, Preserve)
    {
        P80P,   8
    }

    Method (P8XH, 2, Serialized)
    {
        Name (P80B, Buffer (0x04){})
        CreateDWordField (P80B, 0x00, P80D)
        If ((Arg0 == 0x00))
        {
            P80D = ((P80D & 0xFFFFFF00) | Arg1)
        }

        If ((Arg0 == 0x01))
        {
            P80D = ((P80D & 0xFFFF00FF) | (Arg1 << 0x08))
        }

        If ((Arg0 == 0x02))
        {
            P80D = ((P80D & 0xFF00FFFF) | (Arg1 << 0x10))
        }

        If ((Arg0 == 0x03))
        {
            P80D = ((P80D & 0x00FFFFFF) | (Arg1 << 0x18))
        }

        P80H = P80D /* \P8XH.P80D */
    }

    Method (ADBG, 1, Serialized)
    {
        Return (0x00)
    }

    Scope (\_PR)
    {
        Processor (CPU0, 0x01, 0x00001810, 0x06){}
        Processor (CPU1, 0x02, 0x00001810, 0x06){}
        Processor (CPU2, 0x03, 0x00001810, 0x06){}
        Processor (CPU3, 0x04, 0x00001810, 0x06){}
        Processor (CPU4, 0x05, 0x00001810, 0x06){}
        Processor (CPU5, 0x06, 0x00001810, 0x06){}
        Processor (CPU6, 0x07, 0x00001810, 0x06){}
        Processor (CPU7, 0x08, 0x00001810, 0x06){}
    }

    Scope (\)
    {
        Method (PNTF, 1, NotSerialized)
        {
            If ((\_PR.CFGD & 0x0200))
            {
                If ((((PDC0 & 0x08) && ((Arg0 == 0x80) || (
                    Arg0 == 0x82))) || ((PDC0 & 0x10) && (Arg0 == 0x81))))
                {
                    Notify (\_PR.CPU0, Arg0)
                }

                If ((((PDC1 & 0x08) && ((Arg0 == 0x80) || (
                    Arg0 == 0x82))) || ((PDC1 & 0x10) && (Arg0 == 0x81))))
                {
                    Notify (\_PR.CPU1, Arg0)
                }

                If ((((PDC2 & 0x08) && ((Arg0 == 0x80) || (
                    Arg0 == 0x82))) || ((PDC2 & 0x10) && (Arg0 == 0x81))))
                {
                    Notify (\_PR.CPU2, Arg0)
                }

                If ((((PDC3 & 0x08) && ((Arg0 == 0x80) || (
                    Arg0 == 0x82))) || ((PDC3 & 0x10) && (Arg0 == 0x81))))
                {
                    Notify (\_PR.CPU3, Arg0)
                }

                If ((((PDC4 & 0x08) && ((Arg0 == 0x80) || (
                    Arg0 == 0x82))) || ((PDC4 & 0x10) && (Arg0 == 0x81))))
                {
                    Notify (\_PR.CPU4, Arg0)
                }

                If ((((PDC5 & 0x08) && ((Arg0 == 0x80) || (
                    Arg0 == 0x82))) || ((PDC5 & 0x10) && (Arg0 == 0x81))))
                {
                    Notify (\_PR.CPU5, Arg0)
                }

                If ((((PDC6 & 0x08) && ((Arg0 == 0x80) || (
                    Arg0 == 0x82))) || ((PDC6 & 0x10) && (Arg0 == 0x81))))
                {
                    Notify (\_PR.CPU6, Arg0)
                }

                If ((((PDC7 & 0x08) && ((Arg0 == 0x80) || (
                    Arg0 == 0x82))) || ((PDC7 & 0x10) && (Arg0 == 0x81))))
                {
                    Notify (\_PR.CPU7, Arg0)
                }
            }
            ElseIf (((Arg0 == 0x80) || ((Arg0 == 0x81) || (Arg0 ==
                0x82))))
            {
                Notify (\_PR.CPU0, Arg0)
            }
        }
    }

    Scope (\_PR.CPU0)
    {
        Name (CPC1, Package (0x11)
        {
            0x11,
            0x01,
            ResourceTemplate ()
            {
                Register (FFixedHW,
                    0x08,               // Bit Width
                    0x00,               // Bit Offset
                    0x0000000000000771, // Address
                    0x04,               // Access Size
                    )
            },

            0x10,
            0x00,
            0x00,
            ResourceTemplate ()
            {
                Register (SystemIO,
                    0x08,               // Bit Width
                    0x00,               // Bit Offset
                    0x0000000000001234, // Address
                    0x02,               // Access Size
                    )
            },

            ResourceTemplate ()
            {
                Register (FFixedHW,
                    0x08,               // Bit Width
                    0x10,               // Bit Offset
                    0x0000000000000774, // Address
                    0x04,               // Access Size
                    )
            },

            ResourceTemplate ()
            {
                Register (FFixedHW,
                    0x08,               // Bit Width
                    0x00,               // Bit Offset
                    0x0000000000000774, // Address
                    0x04,               // Access Size
                    )
            },

            ResourceTemplate ()
            {
                Register (FFixedHW,
                    0x08,               // Bit Width
                    0x08,               // Bit Offset
                    0x0000000000000774, // Address
                    0x04,               // Access Size
                    )
            },

            ResourceTemplate ()
            {
                Register (SystemMemory,
                    0x00,               // Bit Width
                    0x00,               // Bit Offset
                    0x0000000000000000, // Address
                    ,)
            },

            ResourceTemplate ()
            {
                Register (SystemMemory,
                    0x00,               // Bit Width
                    0x00,               // Bit Offset
                    0x0000000000000000, // Address
                    ,)
            },

            ResourceTemplate ()
            {
                Register (SystemMemory,
                    0x00,               // Bit Width
                    0x00,               // Bit Offset
                    0x0000000000000000, // Address
                    ,)
            },

            ResourceTemplate ()
            {
                Register (FFixedHW,
                    0x40,               // Bit Width
                    0x00,               // Bit Offset
                    0x00000000000000E7, // Address
                    0x04,               // Access Size
                    )
            },

            ResourceTemplate ()
            {
                Register (FFixedHW,
                    0x40,               // Bit Width
                    0x00,               // Bit Offset
                    0x00000000000000E8, // Address
                    0x04,               // Access Size
                    )
            },

            ResourceTemplate ()
            {
                Register (FFixedHW,
                    0x01,               // Bit Width
                    0x01,               // Bit Offset
                    0x0000000000000777, // Address
                    0x04,               // Access Size
                    )
            },

            ResourceTemplate ()
            {
                Register (FFixedHW,
                    0x01,               // Bit Width
                    0x00,               // Bit Offset
                    0x0000000000000770, // Address
                    0x04,               // Access Size
                    )
            }
        })
        Name (CPC2, Package (0x15)
        {
            0x15,
            0x02,
            ResourceTemplate ()
            {
                Register (FFixedHW,
                    0x08,               // Bit Width
                    0x00,               // Bit Offset
                    0x0000000000000771, // Address
                    0x04,               // Access Size
                    )
            },

            ResourceTemplate ()
            {
                Register (FFixedHW,
                    0x08,               // Bit Width
                    0x08,               // Bit Offset
                    0x00000000000000CE, // Address
                    0x04,               // Access Size
                    )
            },

            ResourceTemplate ()
            {
                Register (FFixedHW,
                    0x08,               // Bit Width
                    0x10,               // Bit Offset
                    0x0000000000000771, // Address
                    0x04,               // Access Size
                    )
            },

            ResourceTemplate ()
            {
                Register (FFixedHW,
                    0x08,               // Bit Width
                    0x18,               // Bit Offset
                    0x0000000000000771, // Address
                    0x04,               // Access Size
                    )
            },

            ResourceTemplate ()
            {
                Register (FFixedHW,
                    0x08,               // Bit Width
                    0x08,               // Bit Offset
                    0x0000000000000771, // Address
                    0x04,               // Access Size
                    )
            },

            ResourceTemplate ()
            {
                Register (FFixedHW,
                    0x08,               // Bit Width
                    0x10,               // Bit Offset
                    0x0000000000000774, // Address
                    0x04,               // Access Size
                    )
            },

            ResourceTemplate ()
            {
                Register (FFixedHW,
                    0x08,               // Bit Width
                    0x00,               // Bit Offset
                    0x0000000000000774, // Address
                    0x04,               // Access Size
                    )
            },

            ResourceTemplate ()
            {
                Register (FFixedHW,
                    0x08,               // Bit Width
                    0x08,               // Bit Offset
                    0x0000000000000774, // Address
                    0x04,               // Access Size
                    )
            },

            ResourceTemplate ()
            {
                Register (SystemMemory,
                    0x00,               // Bit Width
                    0x00,               // Bit Offset
                    0x0000000000000000, // Address
                    ,)
            },

            ResourceTemplate ()
            {
                Register (SystemMemory,
                    0x00,               // Bit Width
                    0x00,               // Bit Offset
                    0x0000000000000000, // Address
                    ,)
            },

            ResourceTemplate ()
            {
                Register (SystemMemory,
                    0x00,               // Bit Width
                    0x00,               // Bit Offset
                    0x0000000000000000, // Address
                    ,)
            },

            ResourceTemplate ()
            {
                Register (FFixedHW,
                    0x40,               // Bit Width
                    0x00,               // Bit Offset
                    0x00000000000000E7, // Address
                    0x04,               // Access Size
                    )
            },

            ResourceTemplate ()
            {
                Register (FFixedHW,
                    0x40,               // Bit Width
                    0x00,               // Bit Offset
                    0x00000000000000E8, // Address
                    0x04,               // Access Size
                    )
            },

            ResourceTemplate ()
            {
                Register (FFixedHW,
                    0x02,               // Bit Width
                    0x01,               // Bit Offset
                    0x0000000000000777, // Address
                    0x04,               // Access Size
                    )
            },

            ResourceTemplate ()
            {
                Register (FFixedHW,
                    0x01,               // Bit Width
                    0x00,               // Bit Offset
                    0x0000000000000770, // Address
                    0x04,               // Access Size
                    )
            },

            0x01,
            ResourceTemplate ()
            {
                Register (FFixedHW,
                    0x0A,               // Bit Width
                    0x20,               // Bit Offset
                    0x0000000000000774, // Address
                    0x04,               // Access Size
                    )
            },

            ResourceTemplate ()
            {
                Register (FFixedHW,
                    0x08,               // Bit Width
                    0x18,               // Bit Offset
                    0x0000000000000774, // Address
                    0x04,               // Access Size
                    )
            },

            0x00
        })
    }

    OperationRegion (MNVS, SystemMemory, 0xD7FCD018, 0x1000)
    Field (MNVS, DWordAcc, NoLock, Preserve)
    {
        Offset (0xD00),
        GAPA,   32,
        GAPL,   32,
        DCKI,   32,
        DCKS,   32,
        VCDL,   1,
        VCDC,   1,
        VCDT,   1,
        VCDD,   1,
            ,   1,
        VCSS,   1,
        VCDB,   1,
        VCIN,   1,
        VVPO,   8,
        BRTN,   8,
        BRLV,   8,
        CDFL,   8,
        CDAH,   8,
        PMOD,   2,
        PDIR,   1,
        PDMA,   1,
        Offset (0xD17),
        LFDC,   1,
        Offset (0xD18),
        C2NA,   1,
        C3NA,   1,
        C4NA,   1,
        C6NA,   1,
        C7NA,   1,
        Offset (0xD19),
        Offset (0xD1A),
            ,   2,
            ,   1,
        NHPS,   1,
        NPME,   1,
        Offset (0xD1B),
        UOPT,   8,
        BTID,   32,
        DPP0,   1,
        DPP1,   1,
        DPP2,   1,
        DPP3,   1,
        DPP4,   1,
        DPP5,   1,
        Offset (0xD21),
        Offset (0xD22),
        TCRT,   16,
        TPSV,   16,
        TTC1,   16,
        TTC2,   16,
        TTSP,   16,
        SRAH,   8,
        SRHE,   8,
        SRE1,   8,
        SRE2,   8,
        SRE3,   8,
        SRE4,   8,
        SRE5,   8,
        SRE6,   8,
        SRU1,   8,
        SRU2,   8,
        SRU3,   8,
        SRU7,   8,
        SRU4,   8,
        SRU5,   8,
        SRU8,   8,
        SRPB,   8,
        SRLP,   8,
        SRSA,   8,
        SRSM,   8,
        CWAC,   1,
        CWAS,   1,
        CWUE,   1,
        CWUS,   1,
        Offset (0xD40),
        CWAP,   16,
        CWAT,   16,
        DBGC,   1,
        Offset (0xD45),
        FS1L,   16,
        FS1M,   16,
        FS1H,   16,
        FS2L,   16,
        FS2M,   16,
        FS2H,   16,
        FS3L,   16,
        FS3M,   16,
        FS3H,   16,
        TATC,   1,
            ,   6,
        TATL,   1,
        TATW,   8,
        TNFT,   4,
        TNTT,   4,
        TDFA,   4,
        TDTA,   4,
        TDFD,   4,
        TDTD,   4,
        TCFA,   4,
        TCTA,   4,
        TCFD,   4,
        TCTD,   4,
        TSFT,   4,
        TSTT,   4,
        TIT0,   8,
        TCR0,   16,
        TPS0,   16,
        TIT1,   8,
        TCR1,   16,
        TPS1,   16,
        TIT2,   8,
        TCR2,   16,
        TPS2,   16,
        TIF0,   8,
        TIF1,   8,
        TIF2,   8,
        Offset (0xD78),
        BTHI,   1,
        Offset (0xD79),
        HDIR,   1,
        HDEH,   1,
        HDSP,   1,
        HDPP,   1,
        HDUB,   1,
        HDMC,   1,
        NFCF,   1,
        Offset (0xD7A),
        TPME,   8,
        BIDE,   4,
        IDET,   4,
            ,   1,
            ,   1,
        Offset (0xD7D),
        DTS0,   8,
        Offset (0xD7F),
        DT00,   1,
        DT01,   1,
        DT02,   1,
        DT03,   1,
        Offset (0xD80),
        LIDB,   1,
        C4WR,   1,
        C4AC,   1,
        ODDX,   1,
        CMPR,   1,
        ILNF,   1,
        PLUX,   1,
        Offset (0xD81),
        Offset (0xD8B),
        WGON,   1,
        Offset (0xD8C),
            ,   4,
            ,   1,
        IDMM,   1,
        Offset (0xD8D),
            ,   3,
            ,   1,
            ,   1,
            ,   1,
        Offset (0xD8E),
        Offset (0xD8F),
            ,   4,
        Offset (0xD90),
        Offset (0xD91),
        SWGP,   8,
        IPMS,   8,
        IPMB,   120,
        IPMR,   24,
        IPMO,   24,
        IPMA,   8,
        VIGD,   1,
        VDSC,   1,
        VMSH,   1,
            ,   1,
        VDSP,   1,
        Offset (0xDAA),
        Offset (0xDAD),
        ASFT,   8,
        PL1L,   8,
        PL1M,   8,
        CHKC,   32,
        CHKE,   32,
        ATRB,   32,
        Offset (0xDBD),
        PPCR,   8,
        TPCR,   5,
        Offset (0xDBF),
        Offset (0xDCE),
        CTPR,   8,
        PPCA,   8,
        TPCA,   5,
        Offset (0xDD1),
        BFWB,   296,
        OSPX,   1,
        OSC4,   1,
        CPPX,   1,
        Offset (0xDF7),
        SPEN,   1,
        SCRM,   1,
            ,   1,
        ETAU,   1,
        IHBC,   1,
        APMD,   1,
        APMF,   1,
        Offset (0xDF8),
        FTPS,   8,
        HIST,   8,
        LPST,   8,
        LWST,   8,
        Offset (0xDFF),
        Offset (0xE00),
        Offset (0xE20),
        HPET,   32,
        PKLI,   16,
        VLCX,   16,
        VNIT,   8,
        VBD0,   8,
        VBDT,   128,
        VBPL,   16,
        VBPH,   16,
        VBML,   8,
        VBMH,   8,
        VEDI,   1024,
        PDCI,   16,
        ISCG,   32,
        ISSP,   1,
        ISWK,   2,
        ISFS,   3,
        Offset (0xEC7),
        SHA1,   160,
        Offset (0xEDC),
        LWCP,   1,
        LWEN,   1,
        IOCP,   1,
        IOEN,   1,
        IOST,   1,
        Offset (0xEDD),
        USBR,   1,
        Offset (0xEDE),
        Offset (0xEDF),
        Offset (0xEE1),
        BT2T,   1,
        Offset (0xEE2),
        TPPP,   8,
        TPPC,   8,
        CTPC,   8,
        FNWK,   8,
        Offset (0xEE7),
        XHCC,   8,
        FCAP,   16,
        VSTD,   1,
        VCQL,   1,
        VTIO,   1,
        VMYH,   1,
        VSTP,   1,
        VCQH,   1,
        VDCC,   1,
        VSFN,   1,
        VDMC,   1,
        Offset (0xEEC),
        CICF,   4,
        CICM,   4,
        MCAP,   16,
        PT1D,   15,
        Offset (0xEF1),
        PT2D,   15,
        Offset (0xEF3)
    }

    Field (MNVS, ByteAcc, NoLock, Preserve)
    {
        Offset (0xB00),
        WITM,   8,
        WSEL,   8,
        WLS0,   8,
        WLS1,   8,
        WLS2,   8,
        WLS3,   8,
        WLS4,   8,
        WLS5,   8,
        WLS6,   8,
        WLS7,   8,
        WLS8,   8,
        WLS9,   8,
        WLSA,   8,
        WLSB,   8,
        WLSC,   8,
        WLSD,   8,
        WENC,   8,
        WKBD,   8,
        WPTY,   8,
        WPAS,   1032,
        WPNW,   1032,
        WSPM,   8,
        WSPS,   8,
        WSMN,   8,
        WSMX,   8,
        WSEN,   8,
        WSKB,   8,
        WASB,   8,
        WASI,   16,
        WASD,   8,
        WASS,   32
    }

    Field (MNVS, ByteAcc, NoLock, Preserve)
    {
        Offset (0xA00),
        DBGB,   1024
    }

    OperationRegion (GNVS, SystemMemory, 0xD7FBC000, 0x0600)
    Field (GNVS, AnyAcc, Lock, Preserve)
    {
        OSYS,   16,
        SMIF,   8,
        PRM0,   8,
        PRM1,   8,
        SCIF,   8,
        PRM2,   8,
        PRM3,   8,
        LCKF,   8,
        PRM4,   8,
        PRM5,   8,
        P80D,   32,
        PWRS,   8,
        DBGS,   8,
        THOF,   8,
        ACT1,   8,
        ACTT,   8,
        PSVT,   8,
        TC1V,   8,
        TC2V,   8,
        TSPV,   8,
        CRTT,   8,
        DTSE,   8,
        DTS1,   8,
        DTS2,   8,
        DTSF,   8,
        Offset (0x1E),
        Offset (0x1F),
        Offset (0x20),
        Offset (0x21),
        Offset (0x22),
        Offset (0x23),
        Offset (0x24),
        Offset (0x25),
        REVN,   8,
        APIC,   8,
        TCNT,   8,
        PCP0,   8,
        PCP1,   8,
        PPCM,   8,
        PPMF,   32,
        C67L,   8,
        NATP,   8,
        CMAP,   8,
        CMBP,   8,
        LPTP,   8,
        FDCP,   8,
        CMCP,   8,
        CIRP,   8,
        SMSC,   8,
        W381,   8,
        SMC1,   8,
        EMAE,   8,
        EMAP,   16,
        EMAL,   16,
        MEFE,   8,
        DSTS,   8,
        MORD,   8,
        TCGP,   8,
        PPRP,   32,
        PPRQ,   8,
        LPPR,   8,
        IDEM,   8,
        BID,    16,
        PLID,   8,
        BTYP,   8,
        OSCC,   8,
        NEXP,   8,
        SBV1,   8,
        SBV2,   8,
        ECON,   8,
        DSEN,   8,
        GPIC,   8,
        CTYP,   8,
        L01C,   8,
        VFN0,   8,
        VFN1,   8,
        VFN2,   8,
        VFN3,   8,
        VFN4,   8,
        VFN5,   8,
        VFN6,   8,
        VFN7,   8,
        VFN8,   8,
        VFN9,   8,
        ATMC,   8,
        PTMC,   8,
        PNHM,   32,
        TBAL,   32,
        TBAH,   32,
        RTIP,   8,
        TSOD,   8,
        PFLV,   8,
        BREV,   8,
        BBID,   8,
        PDTS,   8,
        PKGA,   8,
        PAMT,   8,
        AC0F,   8,
        AC1F,   8,
        DTS3,   8,
        DTS4,   8,
        LTR1,   8,
        LTR2,   8,
        LTR3,   8,
        LTR4,   8,
        LTR5,   8,
        LTR6,   8,
        LTR7,   8,
        LTR8,   8,
        LTR9,   8,
        LTRA,   8,
        LTRB,   8,
        LTRC,   8,
        LTRD,   8,
        LTRE,   8,
        LTRF,   8,
        LTRG,   8,
        LTRH,   8,
        LTRI,   8,
        LTRJ,   8,
        LTRK,   8,
        OBF1,   8,
        OBF2,   8,
        OBF3,   8,
        OBF4,   8,
        OBF5,   8,
        OBF6,   8,
        OBF7,   8,
        OBF8,   8,
        OBF9,   8,
        OBFA,   8,
        OBFB,   8,
        OBFC,   8,
        OBFD,   8,
        OBFE,   8,
        OBFF,   8,
        OBFG,   8,
        OBFH,   8,
        OBFI,   8,
        OBFJ,   8,
        OBFK,   8,
        XTUB,   32,
        XTUS,   32,
        XMPB,   32,
        DDRF,   8,
        RTD3,   8,
        PEP0,   8,
        PEP3,   8,
        DPTF,   8,
        SADE,   8,
        SACR,   8,
        SAHT,   8,
        CTDP,   8,
        LPMP,   8,
        LPMV,   8,
        ECEU,   8,
        TGFG,   16,
        MEMD,   8,
        ATRA,   8,
        PTRA,   8,
        MEMC,   8,
        MEMH,   8,
        FND1,   8,
        FND2,   8,
        AMBD,   8,
        AMAT,   8,
        AMPT,   8,
        AMCT,   8,
        AMHT,   8,
        SKDE,   8,
        SKAT,   8,
        SKPT,   8,
        SKCT,   8,
        SKHT,   8,
        EFDE,   8,
        EFAT,   8,
        EFPT,   8,
        EFCT,   8,
        EFHT,   8,
        VRDE,   8,
        VRAT,   8,
        VRPT,   8,
        VRCT,   8,
        VRHT,   8,
        DPAP,   8,
        DPPP,   8,
        DPCP,   8,
        DCMP,   8,
        TRTV,   8,
        LPOE,   8,
        LPOP,   8,
        LPOS,   8,
        LPOW,   8,
        LPER,   8,
        PPSZ,   32,
        DISE,   8,
        BGMA,   64,
        BGMS,   8,
        BGIA,   16,
        IRMC,   8,
        NFCE,   8,
        CHEN,   8,
        S0ID,   8,
        CTDB,   8,
        DKSM,   8,
        SIO1,   16,
        SIO2,   16,
        SPBA,   16,
        SEC0,   32,
        SEC1,   32,
        SEC2,   32,
        SEC3,   32,
        SEC4,   32,
        SEC5,   32,
        SEC6,   32,
        SEC7,   32,
        SEC8,   32,
        Offset (0x1F4),
        WIFD,   8,
        WFAT,   8,
        WFPT,   8,
        WFCT,   8,
        WFHT,   8,
        PWRE,   8,
        PWRP,   8,
        Offset (0x203),
        XHPR,   8,
        RIC0,   8,
        DVS0,   8,
        DVS1,   8,
        DVS2,   8,
        DVS3,   8,
        GBSX,   8,
        IUBE,   8,
        IUCE,   8,
        IUDE,   8,
        ECNO,   8,
        AUDD,   16,
        IC0D,   16,
        IC1D,   16,
        IC1S,   16,
        VRRD,   16,
        PSCP,   8,
        I20D,   16,
        I21D,   16,
        RCG0,   16,
        ECDB,   8,
        P2ME,   8,
        SSH0,   16,
        SSL0,   16,
        SSD0,   16,
        FMH0,   16,
        FML0,   16,
        FMD0,   16,
        FPH0,   16,
        FPL0,   16,
        FPD0,   16,
        SSH1,   16,
        SSL1,   16,
        SSD1,   16,
        FMH1,   16,
        FML1,   16,
        FMD1,   16,
        FPH1,   16,
        FPL1,   16,
        FPD1,   16,
        M0C0,   16,
        M1C0,   16,
        M2C0,   16,
        M0C1,   16,
        M1C1,   16,
        M2C1,   16,
        M0C2,   16,
        M1C2,   16,
        M0C3,   16,
        M1C3,   16,
        M0C4,   16,
        M1C4,   16,
        M0C5,   16,
        M1C5,   16,
        TBSF,   8,
        GIRQ,   32,
        DMTP,   8,
        DMTD,   8,
        DMSH,   8,
        LANP,   8,
        SHSB,   8,
        PLCS,   8,
        PLVL,   16,
        GN1E,   8,
        G1AT,   8,
        G1PT,   8,
        G1CT,   8,
        G1HT,   8,
        GN2E,   8,
        G2AT,   8,
        G2PT,   8,
        G2CT,   8,
        G2HT,   8,
        WWSD,   8,
        CVSD,   8,
        SSDD,   8,
        INLD,   8,
        IFAT,   8,
        IFPT,   8,
        IFCT,   8,
        IFHT,   8,
        SDWE,   8,
        USBH,   8,
        BCV4,   8,
        WTV0,   8,
        WTV1,   8,
        APFU,   8,
        SOHP,   8,
        GP5F,   8,
        NOHP,   8,
        TBSE,   8,
        WKFN,   8,
        PEPC,   32,
        VRSD,   16,
        PB1E,   8,
        GNID,   8,
        WAND,   8,
        WWAT,   8,
        WWPT,   8,
        WWCT,   8,
        WWHT,   8,
        Offset (0x2A3),
        MPL0,   16,
        CHGE,   8,
        SAC3,   8,
        MEM3,   8,
        AMC3,   8,
        SKC3,   8,
        EFC3,   8,
        VRC3,   8,
        WFC3,   8,
        G1C3,   8,
        G2C3,   8,
        IFC3,   8,
        WWC3,   8,
        WGC3,   8,
        SPST,   8,
        PERE,   8,
        Offset (0x2B7),
        GN3E,   8,
        G3AT,   8,
        G3PT,   8,
        G3CT,   8,
        G3HT,   8,
        GN4E,   8,
        G4AT,   8,
        G4PT,   8,
        G4CT,   8,
        G4HT,   8,
        GN5E,   8,
        G5AT,   8,
        G5PT,   8,
        G5CT,   8,
        G5HT,   8,
        GN6E,   8,
        G6AT,   8,
        G6PT,   8,
        G6CT,   8,
        G6HT,   8,
        ECLP,   8,
        G3C3,   8,
        G4C3,   8,
        G5C3,   8,
        G6C3,   8,
        TSP1,   8,
        TSP2,   8,
        TSP3,   8,
        TSP4,   8,
        TSP5,   8,
        TSP6,   8,
        TSP7,   8,
        TSP8,   8,
        SSP1,   8,
        SSP2,   8,
        SSP3,   8,
        SSP4,   8,
        SSP5,   8,
        SSP6,   8,
        SSP7,   8,
        SSP8,   8,
        MEMS,   8,
        Offset (0x2F8),
        S1DE,   8,
        S1AT,   8,
        S1PT,   8,
        S1CT,   8,
        S1HT,   8,
        S2DE,   8,
        S2AT,   8,
        S2PT,   8,
        S2CT,   8,
        S2HT,   8,
        S3DE,   8,
        S3AT,   8,
        S3PT,   8,
        S3CT,   8,
        S3HT,   8,
        S4DE,   8,
        S4AT,   8,
        S4PT,   8,
        S4CT,   8,
        S4HT,   8,
        S5DE,   8,
        S5AT,   8,
        S5PT,   8,
        S5CT,   8,
        S5HT,   8,
        S6DE,   8,
        S6AT,   8,
        S6PT,   8,
        S6CT,   8,
        S6HT,   8,
        S7DE,   8,
        S7AT,   8,
        S7PT,   8,
        S7CT,   8,
        S7HT,   8,
        S1S3,   8,
        S2S3,   8,
        S3S3,   8,
        S4S3,   8,
        S5S3,   8,
        S6S3,   8,
        S7S3,   8,
        PSME,   8,
        PDT1,   8,
        PLM1,   16,
        PTW1,   16,
        PDT2,   8,
        PLM2,   16,
        PTW2,   16,
        DDT1,   8,
        DDP1,   8,
        DLI1,   16,
        DPL1,   16,
        DTW1,   16,
        DMI1,   16,
        DMA1,   16,
        DMT1,   16,
        DDT2,   8,
        DDP2,   8,
        DLI2,   16,
        DPL2,   16,
        DTW2,   16,
        DMI2,   16,
        DMA2,   16,
        DMT2,   16,
        WIFE,   8,
        DOM1,   8,
        LIM1,   16,
        TIM1,   16,
        DOM2,   8,
        LIM2,   16,
        TIM2,   16,
        DOM3,   8,
        LIM3,   16,
        TIM3,   16,
        TRD0,   8,
        TRL0,   8,
        TRD1,   8,
        TRL1,   8,
        WDM1,   8,
        CID1,   16,
        WDM2,   8,
        CID2,   16,
        Offset (0x364),
        APPE,   8,
        MPL1,   16,
        MPL2,   16,
        SDS0,   8,
        SDS1,   8,
        SDS2,   8,
        SDS3,   8,
        SDS4,   8,
        SDS5,   8,
        SDS6,   8,
        SDS7,   8,
        SDS8,   8,
        SDS9,   8,
        SDSA,   8,
        TPLB,   8,
        TPLH,   16,
        WTVX,   8,
        WITX,   8,
        GPTD,   8,
        GDBT,   16,
        UTKX,   8,
        SPTD,   8,
        GEXN,   8,
        TBTS,   8,
        AICS,   8,
        TARS,   8,
        FPAT,   8,
        FPEN,   8,
        FPGN,   32,
        FPLV,   8,
        CPAD,   16,
        CPAB,   8,
        TNAT,   8,
        CPGN,   32,
        CF2T,   8,
        ATLB,   32,
        SDM0,   8,
        SDM1,   8,
        SDM2,   8,
        SDM3,   8,
        SDM4,   8,
        SDM5,   8,
        SDM6,   8,
        SDM7,   8,
        SDM8,   8,
        SDM9,   8,
        SDMA,   8,
        USTP,   8,
        SSHI,   16,
        SSLI,   16,
        SSDI,   16,
        FMHI,   16,
        FMLI,   16,
        FMDI,   16,
        FPHI,   16,
        FPLI,   16,
        FPDI,   16,
        M0CI,   16,
        M1CI,   16,
        M0CS,   16,
        M1CS,   16,
        M0CU,   16,
        M1CU,   16,
        CAMT,   8,
        DS4D,   16,
        IVDF,   8,
        EIDF,   8,
        GFPS,   32,
        GFPI,   32,
        GNSM,   8,
        GNSC,   8,
        GGNR,   32,
        GBTW,   32,
        GBTK,   32,
        GBTI,   32,
        GPDI,   32,
        GPLI,   32,
        CL00,   8,
        CL01,   8,
        CL02,   8,
        CL03,   8,
        L0EN,   8,
        L1EN,   8,
        L2EN,   8,
        L3EN,   8,
        CDIV,   8,
        C0TP,   8,
        C0CV,   8,
        C0GP,   8,
        C0IB,   8,
        C0IA,   16,
        C0P0,   8,
        C0P1,   8,
        C0P2,   8,
        C0P3,   8,
        C0G0,   8,
        C0G1,   8,
        C0G2,   8,
        C0G3,   8,
        C0F0,   8,
        C0F1,   8,
        C0F2,   8,
        C0F3,   8,
        C0A0,   8,
        C0A1,   8,
        C0A2,   8,
        C0A3,   8,
        C0I0,   8,
        C0I1,   8,
        C0I2,   8,
        C0I3,   8,
        C0PL,   8,
        C1TP,   8,
        C1CV,   8,
        C1GP,   8,
        C1IB,   8,
        C1IA,   16,
        C1P0,   8,
        C1P1,   8,
        C1P2,   8,
        C1P3,   8,
        C1G0,   8,
        C1G1,   8,
        C1G2,   8,
        C1G3,   8,
        C1F0,   8,
        C1F1,   8,
        C1F2,   8,
        C1F3,   8,
        C1A0,   8,
        C1A1,   8,
        C1A2,   8,
        C1A3,   8,
        C1I0,   8,
        C1I1,   8,
        C1I2,   8,
        C1I3,   8,
        C1PL,   8,
        C2TP,   8,
        C2CV,   8,
        C2GP,   8,
        C2IB,   8,
        C2IA,   16,
        C2P0,   8,
        C2P1,   8,
        C2P2,   8,
        C2P3,   8,
        C2G0,   8,
        C2G1,   8,
        C2G2,   8,
        C2G3,   8,
        C2F0,   8,
        C2F1,   8,
        C2F2,   8,
        C2F3,   8,
        C2A0,   8,
        C2A1,   8,
        C2A2,   8,
        C2A3,   8,
        C2I0,   8,
        C2I1,   8,
        C2I2,   8,
        C2I3,   8,
        C2PL,   8,
        C3TP,   8,
        C3CV,   8,
        C3GP,   8,
        C3IB,   8,
        C3IA,   16,
        C3P0,   8,
        C3P1,   8,
        C3P2,   8,
        C3P3,   8,
        C3G0,   8,
        C3G1,   8,
        C3G2,   8,
        C3G3,   8,
        C3F0,   8,
        C3F1,   8,
        C3F2,   8,
        C3F3,   8,
        C3A0,   8,
        C3A1,   8,
        C3A2,   8,
        C3A3,   8,
        C3I0,   8,
        C3I1,   8,
        C3I2,   8,
        C3I3,   8,
        C3PL,   8,
        L0SM,   8,
        L0H0,   8,
        L0H1,   8,
        L0H2,   8,
        L0H3,   8,
        L0H4,   8,
        L0H5,   8,
        L0H6,   8,
        L0H7,   8,
        L0H8,   8,
        L0PL,   8,
        L0M0,   8,
        L0M1,   8,
        L0M2,   8,
        L0M3,   8,
        L0M4,   8,
        L0M5,   8,
        L0M6,   8,
        L0M7,   8,
        L0M8,   8,
        L0M9,   8,
        L0MA,   8,
        L0MB,   8,
        L0MC,   8,
        L0MD,   8,
        L0ME,   8,
        L0MF,   8,
        L0DI,   8,
        L0BS,   8,
        L0A0,   16,
        L0A1,   16,
        L0A2,   16,
        L0A3,   16,
        L0A4,   16,
        L0A5,   16,
        L0A6,   16,
        L0A7,   16,
        L0A8,   16,
        L0A9,   16,
        L0AA,   16,
        L0AB,   16,
        L0D0,   8,
        L0D1,   8,
        L0D2,   8,
        L0D3,   8,
        L0D4,   8,
        L0D5,   8,
        L0D6,   8,
        L0D7,   8,
        L0D8,   8,
        L0D9,   8,
        L0DA,   8,
        L0DB,   8,
        L0DV,   8,
        L0CV,   8,
        L0LU,   8,
        L0NL,   8,
        L0EE,   8,
        L0VC,   8,
        L0FS,   8,
        L0DG,   8,
        L0C0,   8,
        L0C1,   8,
        L0C2,   8,
        L0C3,   8,
        L0CK,   32,
        L0CL,   8,
        L1SM,   8,
        L1H0,   8,
        L1H1,   8,
        L1H2,   8,
        L1H3,   8,
        L1H4,   8,
        L1H5,   8,
        L1H6,   8,
        L1H7,   8,
        L1H8,   8,
        L1PL,   8,
        L1M0,   8,
        L1M1,   8,
        L1M2,   8,
        L1M3,   8,
        L1M4,   8,
        L1M5,   8,
        L1M6,   8,
        L1M7,   8,
        L1M8,   8,
        L1M9,   8,
        L1MA,   8,
        L1MB,   8,
        L1MC,   8,
        L1MD,   8,
        L1ME,   8,
        L1MF,   8,
        L1DI,   8,
        L1BS,   8,
        L1A0,   16,
        L1A1,   16,
        L1A2,   16,
        L1A3,   16,
        L1A4,   16,
        L1A5,   16,
        L1A6,   16,
        L1A7,   16,
        L1A8,   16,
        L1A9,   16,
        L1AA,   16,
        L1AB,   16,
        L1D0,   8,
        L1D1,   8,
        L1D2,   8,
        L1D3,   8,
        L1D4,   8,
        L1D5,   8,
        L1D6,   8,
        L1D7,   8,
        L1D8,   8,
        L1D9,   8,
        L1DA,   8,
        L1DB,   8,
        L1DV,   8,
        L1CV,   8,
        L1LU,   8,
        L1NL,   8,
        L1EE,   8,
        L1VC,   8,
        L1FS,   8,
        L1DG,   8,
        L1C0,   8,
        L1C1,   8,
        L1C2,   8,
        L1C3,   8,
        L1CK,   32,
        L1CL,   8,
        L2SM,   8,
        L2H0,   8,
        L2H1,   8,
        L2H2,   8,
        L2H3,   8,
        L2H4,   8,
        L2H5,   8,
        L2H6,   8,
        L2H7,   8,
        L2H8,   8,
        L2PL,   8,
        L2M0,   8,
        L2M1,   8,
        L2M2,   8,
        L2M3,   8,
        L2M4,   8,
        L2M5,   8,
        L2M6,   8,
        L2M7,   8,
        L2M8,   8,
        L2M9,   8,
        L2MA,   8,
        L2MB,   8,
        L2MC,   8,
        L2MD,   8,
        L2ME,   8,
        L2MF,   8,
        L2DI,   8,
        L2BS,   8,
        L2A0,   16,
        L2A1,   16,
        L2A2,   16,
        L2A3,   16,
        L2A4,   16,
        L2A5,   16,
        L2A6,   16,
        L2A7,   16,
        L2A8,   16,
        L2A9,   16,
        L2AA,   16,
        L2AB,   16,
        L2D0,   8,
        L2D1,   8,
        L2D2,   8,
        L2D3,   8,
        L2D4,   8,
        L2D5,   8,
        L2D6,   8,
        L2D7,   8,
        L2D8,   8,
        L2D9,   8,
        L2DA,   8,
        L2DB,   8,
        L2DV,   8,
        L2CV,   8,
        L2LU,   8,
        L2NL,   8,
        L2EE,   8,
        L2VC,   8,
        L2FS,   8,
        L2DG,   8,
        L2C0,   8,
        L2C1,   8,
        L2C2,   8,
        L2C3,   8,
        L2CK,   32,
        L2CL,   8,
        L3SM,   8,
        L3H0,   8,
        L3H1,   8,
        L3H2,   8,
        L3H3,   8,
        L3H4,   8,
        L3H5,   8,
        L3H6,   8,
        L3H7,   8,
        L3H8,   8,
        L3PL,   8,
        L3M0,   8,
        L3M1,   8,
        L3M2,   8,
        L3M3,   8,
        L3M4,   8,
        L3M5,   8,
        L3M6,   8,
        L3M7,   8,
        L3M8,   8,
        L3M9,   8,
        L3MA,   8,
        L3MB,   8,
        L3MC,   8,
        L3MD,   8,
        L3ME,   8,
        L3MF,   8,
        L3DI,   8,
        L3BS,   8,
        L3A0,   16,
        L3A1,   16,
        L3A2,   16,
        L3A3,   16,
        L3A4,   16,
        L3A5,   16,
        L3A6,   16,
        L3A7,   16,
        L3A8,   16,
        L3A9,   16,
        L3AA,   16,
        L3AB,   16,
        L3D0,   8,
        L3D1,   8,
        L3D2,   8,
        L3D3,   8,
        L3D4,   8,
        L3D5,   8,
        L3D6,   8,
        L3D7,   8,
        L3D8,   8,
        L3D9,   8,
        L3DA,   8,
        L3DB,   8,
        L3DV,   8,
        L3CV,   8,
        L3LU,   8,
        L3NL,   8,
        L3EE,   8,
        L3VC,   8,
        L3FS,   8,
        L3DG,   8,
        L3C0,   8,
        L3C1,   8,
        L3C2,   8,
        L3C3,   8,
        L3CK,   32,
        L3CL,   8,
        ECR1,   8,
        Offset (0x5AA),
        I2SC,   8,
        ODV0,   8,
        ODV1,   8,
        ODV2,   8,
        ODV3,   8,
        ODV4,   8,
        ODV5,   8,
        UBCB,   32,
        EMOD,   8,
        WIFC,   8,
        Offset (0x5BE),
        TPLS,   8,
        TPDB,   8,
        TPDH,   16,
        TPDS,   8,
        AG1L,   64,
        AG1H,   64,
        AG2L,   64,
        AG2H,   64,
        AG3L,   64,
        AG3H,   64,
        HEFE,   8,
        XDCE,   8,
        STXE,   8,
        STX0,   8,
        STX1,   8,
        STX2,   8,
        STX3,   8,
        STX4,   8,
        STX5,   8,
        STX6,   8,
        STX7,   8,
        STX8,   8,
        STX9,   8
    }

    Scope (\_SB)
    {
        Method (_INI, 0, NotSerialized)  // _INI: Initialize
        {
            If (CondRefOf (\_OSI, Local0))
            {
                If (\_OSI ("Windows 2001"))
                {
                    \WNTF = 0x01
                    \WXPF = 0x01
                    \WSPV = 0x00
                    OSYS = 0x07D1
                }

                If (\_OSI ("Windows 2001 SP1"))
                {
                    \WSPV = 0x01
                    OSYS = 0x07D1
                }

                If (\_OSI ("Windows 2001 SP2"))
                {
                    \WSPV = 0x02
                    OSYS = 0x07D2
                }

                If (\_OSI ("Windows 2006"))
                {
                    \WVIS = 0x01
                    OSYS = 0x07D6
                }

                If (\_OSI ("Windows 2009"))
                {
                    \WIN7 = 0x01
                    OSYS = 0x07D9
                }

                If (\_OSI ("Windows 2012"))
                {
                    \WIN8 = 0x01
                    OSYS = 0x07DC
                }

                If (\_OSI ("Windows 2013"))
                {
                    \WIN8 = 0x01
                    OSYS = 0x07DD
                }

                If (\_OSI ("Windows 2015"))
                {
                    \WIN8 = 0x01
                    OSYS = 0x07DF
                }

                If (\_OSI ("Linux"))
                {
                    \LNUX = 0x01
                    OSYS = 0x03E8
                }

                If (\_OSI ("FreeBSD"))
                {
                    \LNUX = 0x01
                    OSYS = 0x03E8
                }
            }
            ElseIf ((\SCMP (\_OS, "Microsoft Windows NT") == Zero))
            {
                \WNTF = 0x01
            }

            If ((\_REV >= 0x02))
            {
                \H8DR = 0x01
            }

            \OSIF = 0x01
            \PWRS = \_SB.PCI0.LPC.EC.AC._PSR ()
            If (\LNUX)
            {
                \_SB.PCI0.LPC.EC.SAUM (0x02)
                \UCMS (0x1C)
            }

            \_SB.PCI0.RID = \SRAH
            If (VIGD)
            {
                \_SB.PCI0.GFX0.RID = \SRHE
            }
            Else
            {
                \_SB.PCI0.PEG0.RID = \SRHE
            }

            \_SB.PCI0.EXP1.RID = \SRE1
            \_SB.PCI0.EXP3.RID = \SRE3
            \_SB.PCI0.EXP4.RID = \SRE4
            \_SB.PCI0.EXP5.RID = \SRE4
            \_SB.PCI0.EXP8.RID = \SRE4
            \_SB.PCI0.LPC.RID = \SRLP
            \_SB.PCI0.SAT1.RID = \SRSA
            \_SB.PCI0.SMBU.RID = \SRSM
        }

        Name (OSCP, 0x00)
        Method (_OSC, 4, Serialized)  // _OSC: Operating System Capabilities
        {
            CreateDWordField (Arg3, 0x00, STS0)
            CreateDWordField (Arg3, 0x04, CAP0)
            If ((Arg0 == ToUUID ("0811b06e-4a27-44f9-8d60-3cbbc22e7b48") /* Platform-wide Capabilities */))
            {
                If ((Arg1 == One))
                {
                    OSCP = CAP0 /* \_SB_._OSC.CAP0 */
                    If ((CAP0 & 0x04))
                    {
                        If (!VMSH)
                        {
                            If ((RTD3 == 0x00))
                            {
                                CAP0 &= 0xFB
                                STS0 |= 0x10
                            }
                        }
                    }

                    If ((CAP0 & 0x20))
                    {
                        \CPPX = 0x01
                    }
                    Else
                    {
                        CAP0 &= 0x9F
                        STS0 |= 0x10
                    }
                }
                Else
                {
                    STS0 &= 0xFFFFFF00
                    STS0 |= 0x0A
                }
            }
            Else
            {
                STS0 &= 0xFFFFFF00
                STS0 |= 0x06
            }

            Return (Arg3)
        }

        Scope (\_SB)
        {
            OperationRegion (ITSS, SystemMemory, 0xFDC43100, 0x0208)
            Field (ITSS, ByteAcc, NoLock, Preserve)
            {
                PARC,   8,
                PBRC,   8,
                PCRC,   8,
                PDRC,   8,
                PERC,   8,
                PFRC,   8,
                PGRC,   8,
                PHRC,   8,
                Offset (0x200),
                    ,   1,
                    ,   1,
                SCGE,   1
            }
        }

        Device (LNKA)
        {
            Name (_HID, EisaId ("PNP0C0F") /* PCI Interrupt Link Device */)  // _HID: Hardware ID
            Name (_UID, 0x01)  // _UID: Unique ID
            Method (_STA, 0, NotSerialized)  // _STA: Status
            {
                If (!VPIR (\_SB.PARC))
                {
                    Return (0x09)
                }
                Else
                {
                    Return (0x0B)
                }
            }

            Name (_PRS, ResourceTemplate ()  // _PRS: Possible Resource Settings
            {
                IRQ (Level, ActiveLow, Shared, )
                    {3,4,5,6,7,9,10,11}
            })
            Method (_DIS, 0, NotSerialized)  // _DIS: Disable Device
            {
                \_SB.PARC |= 0x80
            }

            Name (BUFA, ResourceTemplate ()
            {
                IRQ (Level, ActiveLow, Shared, _Y00)
                    {}
            })
            CreateWordField (BUFA, \_SB.LNKA._Y00._INT, IRA1)  // _INT: Interrupts
            Method (_CRS, 0, NotSerialized)  // _CRS: Current Resource Settings
            {
                Local0 = (\_SB.PARC & 0x8F)
                If (VPIR (Local0))
                {
                    IRA1 = (0x01 << Local0)
                }
                Else
                {
                    IRA1 = 0x00
                }

                Return (BUFA) /* \_SB_.LNKA.BUFA */
            }

            Method (_SRS, 1, NotSerialized)  // _SRS: Set Resource Settings
            {
                CreateWordField (Arg0, 0x01, IRA2)
                FindSetRightBit (IRA2, Local0)
                Local1 = (\_SB.PARC & 0x70)
                Local1 |= Local0--
                \_SB.PARC = Local1
            }
        }

        Device (LNKB)
        {
            Name (_HID, EisaId ("PNP0C0F") /* PCI Interrupt Link Device */)  // _HID: Hardware ID
            Name (_UID, 0x02)  // _UID: Unique ID
            Method (_STA, 0, NotSerialized)  // _STA: Status
            {
                If (!VPIR (\_SB.PBRC))
                {
                    Return (0x09)
                }
                Else
                {
                    Return (0x0B)
                }
            }

            Name (_PRS, ResourceTemplate ()  // _PRS: Possible Resource Settings
            {
                IRQ (Level, ActiveLow, Shared, )
                    {3,4,5,6,7,9,10,11}
            })
            Method (_DIS, 0, NotSerialized)  // _DIS: Disable Device
            {
                \_SB.PBRC |= 0x80
            }

            Name (BUFB, ResourceTemplate ()
            {
                IRQ (Level, ActiveLow, Shared, _Y01)
                    {}
            })
            CreateWordField (BUFB, \_SB.LNKB._Y01._INT, IRB1)  // _INT: Interrupts
            Method (_CRS, 0, NotSerialized)  // _CRS: Current Resource Settings
            {
                Local0 = (\_SB.PBRC & 0x8F)
                If (VPIR (Local0))
                {
                    IRB1 = (0x01 << Local0)
                }
                Else
                {
                    IRB1 = 0x00
                }

                Return (BUFB) /* \_SB_.LNKB.BUFB */
            }

            Method (_SRS, 1, NotSerialized)  // _SRS: Set Resource Settings
            {
                CreateWordField (Arg0, 0x01, IRB2)
                FindSetRightBit (IRB2, Local0)
                Local1 = (\_SB.PBRC & 0x70)
                Local1 |= Local0--
                \_SB.PBRC = Local1
            }
        }

        Device (LNKC)
        {
            Name (_HID, EisaId ("PNP0C0F") /* PCI Interrupt Link Device */)  // _HID: Hardware ID
            Name (_UID, 0x03)  // _UID: Unique ID
            Method (_STA, 0, NotSerialized)  // _STA: Status
            {
                If (!VPIR (\_SB.PCRC))
                {
                    Return (0x09)
                }
                Else
                {
                    Return (0x0B)
                }
            }

            Name (_PRS, ResourceTemplate ()  // _PRS: Possible Resource Settings
            {
                IRQ (Level, ActiveLow, Shared, )
                    {3,4,5,6,7,9,10,11}
            })
            Method (_DIS, 0, NotSerialized)  // _DIS: Disable Device
            {
                \_SB.PCRC |= 0x80
            }

            Name (BUFC, ResourceTemplate ()
            {
                IRQ (Level, ActiveLow, Shared, _Y02)
                    {}
            })
            CreateWordField (BUFC, \_SB.LNKC._Y02._INT, IRC1)  // _INT: Interrupts
            Method (_CRS, 0, NotSerialized)  // _CRS: Current Resource Settings
            {
                Local0 = (\_SB.PCRC & 0x8F)
                If (VPIR (Local0))
                {
                    IRC1 = (0x01 << Local0)
                }
                Else
                {
                    IRC1 = 0x00
                }

                Return (BUFC) /* \_SB_.LNKC.BUFC */
            }

            Method (_SRS, 1, NotSerialized)  // _SRS: Set Resource Settings
            {
                CreateWordField (Arg0, 0x01, IRC2)
                FindSetRightBit (IRC2, Local0)
                Local1 = (\_SB.PCRC & 0x70)
                Local1 |= Local0--
                \_SB.PCRC = Local1
            }
        }

        Device (LNKD)
        {
            Name (_HID, EisaId ("PNP0C0F") /* PCI Interrupt Link Device */)  // _HID: Hardware ID
            Name (_UID, 0x04)  // _UID: Unique ID
            Method (_STA, 0, NotSerialized)  // _STA: Status
            {
                If (!VPIR (\_SB.PDRC))
                {
                    Return (0x09)
                }
                Else
                {
                    Return (0x0B)
                }
            }

            Name (_PRS, ResourceTemplate ()  // _PRS: Possible Resource Settings
            {
                IRQ (Level, ActiveLow, Shared, )
                    {3,4,5,6,7,9,10,11}
            })
            Method (_DIS, 0, NotSerialized)  // _DIS: Disable Device
            {
                \_SB.PDRC |= 0x80
            }

            Name (BUFD, ResourceTemplate ()
            {
                IRQ (Level, ActiveLow, Shared, _Y03)
                    {}
            })
            CreateWordField (BUFD, \_SB.LNKD._Y03._INT, IRD1)  // _INT: Interrupts
            Method (_CRS, 0, NotSerialized)  // _CRS: Current Resource Settings
            {
                Local0 = (\_SB.PDRC & 0x8F)
                If (VPIR (Local0))
                {
                    IRD1 = (0x01 << Local0)
                }
                Else
                {
                    IRD1 = 0x00
                }

                Return (BUFD) /* \_SB_.LNKD.BUFD */
            }

            Method (_SRS, 1, NotSerialized)  // _SRS: Set Resource Settings
            {
                CreateWordField (Arg0, 0x01, IRD2)
                FindSetRightBit (IRD2, Local0)
                Local1 = (\_SB.PDRC & 0x70)
                Local1 |= Local0--
                \_SB.PDRC = Local1
            }
        }

        Device (LNKE)
        {
            Name (_HID, EisaId ("PNP0C0F") /* PCI Interrupt Link Device */)  // _HID: Hardware ID
            Name (_UID, 0x05)  // _UID: Unique ID
            Method (_STA, 0, NotSerialized)  // _STA: Status
            {
                If (!VPIR (\_SB.PERC))
                {
                    Return (0x09)
                }
                Else
                {
                    Return (0x0B)
                }
            }

            Name (_PRS, ResourceTemplate ()  // _PRS: Possible Resource Settings
            {
                IRQ (Level, ActiveLow, Shared, )
                    {3,4,5,6,7,9,10,11}
            })
            Method (_DIS, 0, NotSerialized)  // _DIS: Disable Device
            {
                \_SB.PERC |= 0x80
            }

            Name (BUFE, ResourceTemplate ()
            {
                IRQ (Level, ActiveLow, Shared, _Y04)
                    {}
            })
            CreateWordField (BUFE, \_SB.LNKE._Y04._INT, IRE1)  // _INT: Interrupts
            Method (_CRS, 0, NotSerialized)  // _CRS: Current Resource Settings
            {
                Local0 = (\_SB.PERC & 0x8F)
                If (VPIR (Local0))
                {
                    IRE1 = (0x01 << Local0)
                }
                Else
                {
                    IRE1 = 0x00
                }

                Return (BUFE) /* \_SB_.LNKE.BUFE */
            }

            Method (_SRS, 1, NotSerialized)  // _SRS: Set Resource Settings
            {
                CreateWordField (Arg0, 0x01, IRE2)
                FindSetRightBit (IRE2, Local0)
                Local1 = (\_SB.PERC & 0x70)
                Local1 |= Local0--
                \_SB.PERC = Local1
            }
        }

        Device (LNKF)
        {
            Name (_HID, EisaId ("PNP0C0F") /* PCI Interrupt Link Device */)  // _HID: Hardware ID
            Name (_UID, 0x06)  // _UID: Unique ID
            Method (_STA, 0, NotSerialized)  // _STA: Status
            {
                If (!VPIR (\_SB.PFRC))
                {
                    Return (0x09)
                }
                Else
                {
                    Return (0x0B)
                }
            }

            Name (_PRS, ResourceTemplate ()  // _PRS: Possible Resource Settings
            {
                IRQ (Level, ActiveLow, Shared, )
                    {3,4,5,6,7,9,10,11}
            })
            Method (_DIS, 0, NotSerialized)  // _DIS: Disable Device
            {
                \_SB.PFRC |= 0x80
            }

            Name (BUFF, ResourceTemplate ()
            {
                IRQ (Level, ActiveLow, Shared, _Y05)
                    {}
            })
            CreateWordField (BUFF, \_SB.LNKF._Y05._INT, IRF1)  // _INT: Interrupts
            Method (_CRS, 0, NotSerialized)  // _CRS: Current Resource Settings
            {
                Local0 = (\_SB.PFRC & 0x8F)
                If (VPIR (Local0))
                {
                    IRF1 = (0x01 << Local0)
                }
                Else
                {
                    IRF1 = 0x00
                }

                Return (BUFF) /* \_SB_.LNKF.BUFF */
            }

            Method (_SRS, 1, NotSerialized)  // _SRS: Set Resource Settings
            {
                CreateWordField (Arg0, 0x01, IRF2)
                FindSetRightBit (IRF2, Local0)
                Local1 = (\_SB.PFRC & 0x70)
                Local1 |= Local0--
                \_SB.PFRC = Local1
            }
        }

        Device (LNKG)
        {
            Name (_HID, EisaId ("PNP0C0F") /* PCI Interrupt Link Device */)  // _HID: Hardware ID
            Name (_UID, 0x07)  // _UID: Unique ID
            Method (_STA, 0, NotSerialized)  // _STA: Status
            {
                If (!VPIR (\_SB.PGRC))
                {
                    Return (0x09)
                }
                Else
                {
                    Return (0x0B)
                }
            }

            Name (_PRS, ResourceTemplate ()  // _PRS: Possible Resource Settings
            {
                IRQ (Level, ActiveLow, Shared, )
                    {3,4,5,6,7,9,10,11}
            })
            Method (_DIS, 0, NotSerialized)  // _DIS: Disable Device
            {
                \_SB.PGRC |= 0x80
            }

            Name (BUFG, ResourceTemplate ()
            {
                IRQ (Level, ActiveLow, Shared, _Y06)
                    {}
            })
            CreateWordField (BUFG, \_SB.LNKG._Y06._INT, IRG1)  // _INT: Interrupts
            Method (_CRS, 0, NotSerialized)  // _CRS: Current Resource Settings
            {
                Local0 = (\_SB.PGRC & 0x8F)
                If (VPIR (Local0))
                {
                    IRG1 = (0x01 << Local0)
                }
                Else
                {
                    IRG1 = 0x00
                }

                Return (BUFG) /* \_SB_.LNKG.BUFG */
            }

            Method (_SRS, 1, NotSerialized)  // _SRS: Set Resource Settings
            {
                CreateWordField (Arg0, 0x01, IRG2)
                FindSetRightBit (IRG2, Local0)
                Local1 = (\_SB.PGRC & 0x70)
                Local1 |= Local0--
                \_SB.PGRC = Local1
            }
        }

        Device (LNKH)
        {
            Name (_HID, EisaId ("PNP0C0F") /* PCI Interrupt Link Device */)  // _HID: Hardware ID
            Name (_UID, 0x08)  // _UID: Unique ID
            Method (_STA, 0, NotSerialized)  // _STA: Status
            {
                If (!VPIR (\_SB.PHRC))
                {
                    Return (0x09)
                }
                Else
                {
                    Return (0x0B)
                }
            }

            Name (_PRS, ResourceTemplate ()  // _PRS: Possible Resource Settings
            {
                IRQ (Level, ActiveLow, Shared, )
                    {3,4,5,6,7,9,10,11}
            })
            Method (_DIS, 0, NotSerialized)  // _DIS: Disable Device
            {
                \_SB.PHRC |= 0x80
            }

            Name (BUFH, ResourceTemplate ()
            {
                IRQ (Level, ActiveLow, Shared, _Y07)
                    {}
            })
            CreateWordField (BUFH, \_SB.LNKH._Y07._INT, IRH1)  // _INT: Interrupts
            Method (_CRS, 0, NotSerialized)  // _CRS: Current Resource Settings
            {
                Local0 = (\_SB.PHRC & 0x8F)
                If (VPIR (Local0))
                {
                    IRH1 = (0x01 << Local0)
                }
                Else
                {
                    IRH1 = 0x00
                }

                Return (BUFH) /* \_SB_.LNKH.BUFH */
            }

            Method (_SRS, 1, NotSerialized)  // _SRS: Set Resource Settings
            {
                CreateWordField (Arg0, 0x01, IRH2)
                FindSetRightBit (IRH2, Local0)
                Local1 = (\_SB.PHRC & 0x70)
                Local1 |= Local0--
                \_SB.PHRC = Local1
            }
        }

        Method (VPIR, 1, NotSerialized)
        {
            Local0 = 0x01
            If ((Arg0 & 0x80))
            {
                Local0 = 0x00
            }
            Else
            {
                Local1 = (Arg0 & 0x0F)
                If ((Local1 < 0x03))
                {
                    Local0 = 0x00
                }
                ElseIf (((Local1 == 0x08) || (Local1 == 0x0D)))
                {
                    Local0 = 0x00
                }
            }

            Return (Local0)
        }

        Device (MEM)
        {
            Name (_HID, EisaId ("PNP0C01") /* System Board */)  // _HID: Hardware ID
            Name (MEMS, ResourceTemplate ()
            {
                Memory32Fixed (ReadWrite,
                    0x00000000,         // Address Base
                    0x000A0000,         // Address Length
                    )
                Memory32Fixed (ReadOnly,
                    0x000C0000,         // Address Base
                    0x00000000,         // Address Length
                    _Y08)
                Memory32Fixed (ReadOnly,
                    0x000C4000,         // Address Base
                    0x00000000,         // Address Length
                    _Y09)
                Memory32Fixed (ReadOnly,
                    0x000C8000,         // Address Base
                    0x00000000,         // Address Length
                    _Y0A)
                Memory32Fixed (ReadOnly,
                    0x000CC000,         // Address Base
                    0x00000000,         // Address Length
                    _Y0B)
                Memory32Fixed (ReadOnly,
                    0x000D0000,         // Address Base
                    0x00000000,         // Address Length
                    _Y0C)
                Memory32Fixed (ReadOnly,
                    0x000D4000,         // Address Base
                    0x00000000,         // Address Length
                    _Y0D)
                Memory32Fixed (ReadOnly,
                    0x000D8000,         // Address Base
                    0x00000000,         // Address Length
                    _Y0E)
                Memory32Fixed (ReadOnly,
                    0x000DC000,         // Address Base
                    0x00000000,         // Address Length
                    _Y0F)
                Memory32Fixed (ReadOnly,
                    0x000E0000,         // Address Base
                    0x00000000,         // Address Length
                    _Y10)
                Memory32Fixed (ReadOnly,
                    0x000E4000,         // Address Base
                    0x00000000,         // Address Length
                    _Y11)
                Memory32Fixed (ReadOnly,
                    0x000E8000,         // Address Base
                    0x00000000,         // Address Length
                    _Y12)
                Memory32Fixed (ReadOnly,
                    0x000EC000,         // Address Base
                    0x00000000,         // Address Length
                    _Y13)
                Memory32Fixed (ReadOnly,
                    0x000F0000,         // Address Base
                    0x00010000,         // Address Length
                    )
                Memory32Fixed (ReadWrite,
                    0x00100000,         // Address Base
                    0x01EE0000,         // Address Length
                    _Y14)
                Memory32Fixed (ReadOnly,
                    0xFEC00000,         // Address Base
                    0x00140000,         // Address Length
                    )
                Memory32Fixed (ReadOnly,
                    0xFED4C000,         // Address Base
                    0x012B4000,         // Address Length
                    )
            })
            CreateDWordField (MEMS, \_SB.MEM._Y08._LEN, MC0L)  // _LEN: Length
            CreateDWordField (MEMS, \_SB.MEM._Y09._LEN, MC4L)  // _LEN: Length
            CreateDWordField (MEMS, \_SB.MEM._Y0A._LEN, MC8L)  // _LEN: Length
            CreateDWordField (MEMS, \_SB.MEM._Y0B._LEN, MCCL)  // _LEN: Length
            CreateDWordField (MEMS, \_SB.MEM._Y0C._LEN, MD0L)  // _LEN: Length
            CreateDWordField (MEMS, \_SB.MEM._Y0D._LEN, MD4L)  // _LEN: Length
            CreateDWordField (MEMS, \_SB.MEM._Y0E._LEN, MD8L)  // _LEN: Length
            CreateDWordField (MEMS, \_SB.MEM._Y0F._LEN, MDCL)  // _LEN: Length
            CreateDWordField (MEMS, \_SB.MEM._Y10._LEN, ME0L)  // _LEN: Length
            CreateDWordField (MEMS, \_SB.MEM._Y11._LEN, ME4L)  // _LEN: Length
            CreateDWordField (MEMS, \_SB.MEM._Y12._LEN, ME8L)  // _LEN: Length
            CreateDWordField (MEMS, \_SB.MEM._Y13._LEN, MECL)  // _LEN: Length
            CreateBitField (MEMS, \_SB.MEM._Y08._RW, MC0W)  // _RW_: Read-Write Status
            CreateBitField (MEMS, \_SB.MEM._Y09._RW, MC4W)  // _RW_: Read-Write Status
            CreateBitField (MEMS, \_SB.MEM._Y0A._RW, MC8W)  // _RW_: Read-Write Status
            CreateBitField (MEMS, \_SB.MEM._Y0B._RW, MCCW)  // _RW_: Read-Write Status
            CreateBitField (MEMS, \_SB.MEM._Y0C._RW, MD0W)  // _RW_: Read-Write Status
            CreateBitField (MEMS, \_SB.MEM._Y0D._RW, MD4W)  // _RW_: Read-Write Status
            CreateBitField (MEMS, \_SB.MEM._Y0E._RW, MD8W)  // _RW_: Read-Write Status
            CreateBitField (MEMS, \_SB.MEM._Y0F._RW, MDCW)  // _RW_: Read-Write Status
            CreateBitField (MEMS, \_SB.MEM._Y10._RW, ME0W)  // _RW_: Read-Write Status
            CreateBitField (MEMS, \_SB.MEM._Y11._RW, ME4W)  // _RW_: Read-Write Status
            CreateBitField (MEMS, \_SB.MEM._Y12._RW, ME8W)  // _RW_: Read-Write Status
            CreateBitField (MEMS, \_SB.MEM._Y13._RW, MECW)  // _RW_: Read-Write Status
            CreateDWordField (MEMS, \_SB.MEM._Y14._BAS, MEB1)  // _BAS: Base Address
            CreateDWordField (MEMS, \_SB.MEM._Y14._LEN, MEL1)  // _LEN: Length
            Method (_CRS, 0, NotSerialized)  // _CRS: Current Resource Settings
            {
                Local0 = (\_SB.PCI0.PAM1 & 0x03)
                If (Local0)
                {
                    MC0L = 0x4000
                    If ((Local0 & 0x02))
                    {
                        MC0W = 0x01
                    }
                }

                Local0 = (\_SB.PCI0.PAM1 & 0x30)
                If (Local0)
                {
                    MC4L = 0x4000
                    If ((Local0 & 0x20))
                    {
                        MC4W = 0x01
                    }
                }

                Local0 = (\_SB.PCI0.PAM2 & 0x03)
                If (Local0)
                {
                    MC8L = 0x4000
                    If ((Local0 & 0x02))
                    {
                        MC8W = 0x01
                    }
                }

                Local0 = (\_SB.PCI0.PAM2 & 0x30)
                If (Local0)
                {
                    MCCL = 0x4000
                    If ((Local0 & 0x20))
                    {
                        MCCW = 0x01
                    }
                }

                Local0 = (\_SB.PCI0.PAM3 & 0x03)
                If (Local0)
                {
                    MD0L = 0x4000
                    If ((Local0 & 0x02))
                    {
                        MD0W = 0x01
                    }
                }

                Local0 = (\_SB.PCI0.PAM3 & 0x30)
                If (Local0)
                {
                    MD4L = 0x4000
                    If ((Local0 & 0x20))
                    {
                        MD4W = 0x01
                    }
                }

                Local0 = (\_SB.PCI0.PAM4 & 0x03)
                If (Local0)
                {
                    MD8L = 0x4000
                    If ((Local0 & 0x02))
                    {
                        MD8W = 0x01
                    }
                }

                Local0 = (\_SB.PCI0.PAM4 & 0x30)
                If (Local0)
                {
                    MDCL = 0x4000
                    If ((Local0 & 0x20))
                    {
                        MDCW = 0x01
                    }
                }

                Local0 = (\_SB.PCI0.PAM5 & 0x03)
                If (Local0)
                {
                    ME0L = 0x4000
                    If ((Local0 & 0x02))
                    {
                        ME0W = 0x01
                    }
                }

                Local0 = (\_SB.PCI0.PAM5 & 0x30)
                If (Local0)
                {
                    ME4L = 0x4000
                    If ((Local0 & 0x20))
                    {
                        ME4W = 0x01
                    }
                }

                Local0 = (\_SB.PCI0.PAM6 & 0x03)
                If (Local0)
                {
                    ME8L = 0x4000
                    If ((Local0 & 0x02))
                    {
                        ME8W = 0x01
                    }
                }

                Local0 = (\_SB.PCI0.PAM6 & 0x30)
                If (Local0)
                {
                    MECL = 0x4000
                    If ((Local0 & 0x20))
                    {
                        MECW = 0x01
                    }
                }

                MEL1 = (\MEMX - MEB1) /* \_SB_.MEM_.MEB1 */
                Return (MEMS) /* \_SB_.MEM_.MEMS */
            }
        }

        Device (LID)
        {
            Name (_HID, EisaId ("PNP0C0D") /* Lid Device */)  // _HID: Hardware ID
            Method (_LID, 0, NotSerialized)  // _LID: Lid Status
            {
                If (((\ILNF == 0x00) && (\PLUX == 0x00)))
                {
                    If (\H8DR)
                    {
                        Return (\_SB.PCI0.LPC.EC.HPLD)
                    }
                    ElseIf ((\RBEC (0x46) & 0x04))
                    {
                        Return (0x01)
                    }
                    Else
                    {
                        Return (0x00)
                    }
                }
                Else
                {
                    Return (0x01)
                }
            }

            Method (_PRW, 0, NotSerialized)  // _PRW: Power Resources for Wake
            {
                If (\LWCP)
                {
                    Return (Package (0x02)
                    {
                        0x17,
                        0x04
                    })
                }
                Else
                {
                    Return (Package (0x02)
                    {
                        0x17,
                        0x03
                    })
                }
            }

            Method (_PSW, 1, NotSerialized)  // _PSW: Power State Wake
            {
                If (\H8DR)
                {
                    If (Arg0)
                    {
                        \_SB.PCI0.LPC.EC.HWLO = 0x01
                    }
                    Else
                    {
                        \_SB.PCI0.LPC.EC.HWLO = 0x00
                    }
                }
                ElseIf (Arg0)
                {
                    \MBEC (0x32, 0xFF, 0x04)
                }
                Else
                {
                    \MBEC (0x32, 0xFB, 0x00)
                }

                If (\LWCP)
                {
                    If (Arg0)
                    {
                        \LWEN = 0x01
                    }
                    Else
                    {
                        \LWEN = 0x00
                    }
                }
            }
        }

        Device (SLPB)
        {
            Name (_HID, EisaId ("PNP0C0E") /* Sleep Button Device */)  // _HID: Hardware ID
            Method (_PRW, 0, NotSerialized)  // _PRW: Power Resources for Wake
            {
                Return (Package (0x02)
                {
                    0x17,
                    0x03
                })
            }

            Method (_PSW, 1, NotSerialized)  // _PSW: Power State Wake
            {
                If (\H8DR)
                {
                    If (Arg0)
                    {
                        \_SB.PCI0.LPC.EC.HWFN = 0x01
                    }
                    Else
                    {
                        \_SB.PCI0.LPC.EC.HWFN = 0x00
                    }
                }
                ElseIf (Arg0)
                {
                    \MBEC (0x32, 0xFF, 0x10)
                }
                Else
                {
                    \MBEC (0x32, 0xEF, 0x00)
                }
            }
        }

        Device (PCI0)
        {
            Name (_BBN, 0x00)  // _BBN: BIOS Bus Number
            Name (_ADR, 0x00)  // _ADR: Address
            Name (RID, 0x00)
            Name (_S3D, 0x02)  // _S3D: S3 Device State
            Name (LRRT, Package (0x23)
            {
                Package (0x04)
                {
                    0x0001FFFF,
                    0x00,
                    \_SB.LNKA,
                    0x00
                },

                Package (0x04)
                {
                    0x0001FFFF,
                    0x01,
                    \_SB.LNKB,
                    0x00
                },

                Package (0x04)
                {
                    0x0001FFFF,
                    0x02,
                    \_SB.LNKC,
                    0x00
                },

                Package (0x04)
                {
                    0x0001FFFF,
                    0x03,
                    \_SB.LNKD,
                    0x00
                },

                Package (0x04)
                {
                    0x0002FFFF,
                    0x00,
                    \_SB.LNKA,
                    0x00
                },

                Package (0x04)
                {
                    0x0004FFFF,
                    0x00,
                    \_SB.LNKA,
                    0x00
                },

                Package (0x04)
                {
                    0x0005FFFF,
                    0x00,
                    \_SB.LNKA,
                    0x00
                },

                Package (0x04)
                {
                    0x0008FFFF,
                    0x00,
                    \_SB.LNKA,
                    0x00
                },

                Package (0x04)
                {
                    0x0014FFFF,
                    0x00,
                    \_SB.LNKA,
                    0x00
                },

                Package (0x04)
                {
                    0x0014FFFF,
                    0x01,
                    \_SB.LNKB,
                    0x00
                },

                Package (0x04)
                {
                    0x0014FFFF,
                    0x02,
                    \_SB.LNKC,
                    0x00
                },

                Package (0x04)
                {
                    0x0014FFFF,
                    0x03,
                    \_SB.LNKD,
                    0x00
                },

                Package (0x04)
                {
                    0x0016FFFF,
                    0x00,
                    \_SB.LNKA,
                    0x00
                },

                Package (0x04)
                {
                    0x0016FFFF,
                    0x01,
                    \_SB.LNKB,
                    0x00
                },

                Package (0x04)
                {
                    0x0016FFFF,
                    0x02,
                    \_SB.LNKC,
                    0x00
                },

                Package (0x04)
                {
                    0x0016FFFF,
                    0x03,
                    \_SB.LNKD,
                    0x00
                },

                Package (0x04)
                {
                    0x0017FFFF,
                    0x00,
                    \_SB.LNKA,
                    0x00
                },

                Package (0x04)
                {
                    0x001CFFFF,
                    0x00,
                    \_SB.LNKA,
                    0x00
                },

                Package (0x04)
                {
                    0x001CFFFF,
                    0x01,
                    \_SB.LNKB,
                    0x00
                },

                Package (0x04)
                {
                    0x001CFFFF,
                    0x02,
                    \_SB.LNKC,
                    0x00
                },

                Package (0x04)
                {
                    0x001CFFFF,
                    0x03,
                    \_SB.LNKD,
                    0x00
                },

                Package (0x04)
                {
                    0x001DFFFF,
                    0x00,
                    \_SB.LNKA,
                    0x00
                },

                Package (0x04)
                {
                    0x001DFFFF,
                    0x01,
                    \_SB.LNKB,
                    0x00
                },

                Package (0x04)
                {
                    0x001DFFFF,
                    0x02,
                    \_SB.LNKC,
                    0x00
                },

                Package (0x04)
                {
                    0x001DFFFF,
                    0x03,
                    \_SB.LNKD,
                    0x00
                },

                Package (0x04)
                {
                    0x001EFFFF,
                    0x00,
                    \_SB.LNKA,
                    0x00
                },

                Package (0x04)
                {
                    0x001EFFFF,
                    0x01,
                    \_SB.LNKB,
                    0x00
                },

                Package (0x04)
                {
                    0x001EFFFF,
                    0x02,
                    \_SB.LNKC,
                    0x00
                },

                Package (0x04)
                {
                    0x001EFFFF,
                    0x03,
                    \_SB.LNKD,
                    0x00
                },

                Package (0x04)
                {
                    0x001FFFFF,
                    0x00,
                    \_SB.LNKA,
                    0x00
                },

                Package (0x04)
                {
                    0x001FFFFF,
                    0x01,
                    \_SB.LNKB,
                    0x00
                },

                Package (0x04)
                {
                    0x001FFFFF,
                    0x02,
                    \_SB.LNKC,
                    0x00
                },

                Package (0x04)
                {
                    0x001FFFFF,
                    0x03,
                    \_SB.LNKD,
                    0x00
                },

                Package (0x04)
                {
                    0x001FFFFF,
                    0x04,
                    \_SB.LNKA,
                    0x00
                },

                Package (0x04)
                {
                    0x001FFFFF,
                    0x06,
                    \_SB.LNKC,
                    0x00
                }
            })
            Name (ARRT, Package (0x2A)
            {
                Package (0x04)
                {
                    0x0001FFFF,
                    0x00,
                    0x00,
                    0x10
                },

                Package (0x04)
                {
                    0x0001FFFF,
                    0x01,
                    0x00,
                    0x11
                },

                Package (0x04)
                {
                    0x0001FFFF,
                    0x02,
                    0x00,
                    0x12
                },

                Package (0x04)
                {
                    0x0001FFFF,
                    0x03,
                    0x00,
                    0x13
                },

                Package (0x04)
                {
                    0x0002FFFF,
                    0x00,
                    0x00,
                    0x10
                },

                Package (0x04)
                {
                    0x0004FFFF,
                    0x00,
                    0x00,
                    0x10
                },

                Package (0x04)
                {
                    0x0005FFFF,
                    0x00,
                    0x00,
                    0x10
                },

                Package (0x04)
                {
                    0x0008FFFF,
                    0x00,
                    0x00,
                    0x10
                },

                Package (0x04)
                {
                    0x0014FFFF,
                    0x00,
                    0x00,
                    0x10
                },

                Package (0x04)
                {
                    0x0014FFFF,
                    0x01,
                    0x00,
                    0x11
                },

                Package (0x04)
                {
                    0x0014FFFF,
                    0x02,
                    0x00,
                    0x12
                },

                Package (0x04)
                {
                    0x0014FFFF,
                    0x03,
                    0x00,
                    0x13
                },

                Package (0x04)
                {
                    0x0015FFFF,
                    0x00,
                    0x00,
                    0x10
                },

                Package (0x04)
                {
                    0x0015FFFF,
                    0x01,
                    0x00,
                    0x11
                },

                Package (0x04)
                {
                    0x0015FFFF,
                    0x02,
                    0x00,
                    0x12
                },

                Package (0x04)
                {
                    0x0015FFFF,
                    0x03,
                    0x00,
                    0x13
                },

                Package (0x04)
                {
                    0x0016FFFF,
                    0x00,
                    0x00,
                    0x10
                },

                Package (0x04)
                {
                    0x0016FFFF,
                    0x01,
                    0x00,
                    0x11
                },

                Package (0x04)
                {
                    0x0016FFFF,
                    0x02,
                    0x00,
                    0x12
                },

                Package (0x04)
                {
                    0x0016FFFF,
                    0x03,
                    0x00,
                    0x13
                },

                Package (0x04)
                {
                    0x0017FFFF,
                    0x00,
                    0x00,
                    0x10
                },

                Package (0x04)
                {
                    0x0019FFFF,
                    0x00,
                    0x00,
                    0x20
                },

                Package (0x04)
                {
                    0x0019FFFF,
                    0x01,
                    0x00,
                    0x21
                },

                Package (0x04)
                {
                    0x0019FFFF,
                    0x02,
                    0x00,
                    0x22
                },

                Package (0x04)
                {
                    0x001CFFFF,
                    0x00,
                    0x00,
                    0x10
                },

                Package (0x04)
                {
                    0x001CFFFF,
                    0x01,
                    0x00,
                    0x11
                },

                Package (0x04)
                {
                    0x001CFFFF,
                    0x02,
                    0x00,
                    0x12
                },

                Package (0x04)
                {
                    0x001CFFFF,
                    0x03,
                    0x00,
                    0x13
                },

                Package (0x04)
                {
                    0x001DFFFF,
                    0x00,
                    0x00,
                    0x10
                },

                Package (0x04)
                {
                    0x001DFFFF,
                    0x01,
                    0x00,
                    0x11
                },

                Package (0x04)
                {
                    0x001DFFFF,
                    0x02,
                    0x00,
                    0x12
                },

                Package (0x04)
                {
                    0x001DFFFF,
                    0x03,
                    0x00,
                    0x13
                },

                Package (0x04)
                {
                    0x001EFFFF,
                    0x00,
                    0x00,
                    0x14
                },

                Package (0x04)
                {
                    0x001EFFFF,
                    0x01,
                    0x00,
                    0x15
                },

                Package (0x04)
                {
                    0x001EFFFF,
                    0x02,
                    0x00,
                    0x16
                },

                Package (0x04)
                {
                    0x001EFFFF,
                    0x03,
                    0x00,
                    0x17
                },

                Package (0x04)
                {
                    0x001FFFFF,
                    0x00,
                    0x00,
                    0x10
                },

                Package (0x04)
                {
                    0x001FFFFF,
                    0x01,
                    0x00,
                    0x11
                },

                Package (0x04)
                {
                    0x001FFFFF,
                    0x02,
                    0x00,
                    0x12
                },

                Package (0x04)
                {
                    0x001FFFFF,
                    0x03,
                    0x00,
                    0x13
                },

                Package (0x04)
                {
                    0x001FFFFF,
                    0x04,
                    0x00,
                    0x14
                },

                Package (0x04)
                {
                    0x001FFFFF,
                    0x06,
                    0x00,
                    0x16
                }
            })
            Method (_PRT, 0, NotSerialized)  // _PRT: PCI Routing Table
            {
                If (\GPIC)
                {
                    ADBG ("APIC mode")
                    Return (ARRT) /* \_SB_.PCI0.ARRT */
                }
                Else
                {
                    ADBG ("8259 mode")
                    Return (LRRT) /* \_SB_.PCI0.LRRT */
                }
            }

            Name (_HID, EisaId ("PNP0A08") /* PCI Express Bus */)  // _HID: Hardware ID
            Name (_CID, EisaId ("PNP0A03") /* PCI Bus */)  // _CID: Compatible ID
            OperationRegion (MHCS, PCI_Config, 0x40, 0xC0)
            Field (MHCS, DWordAcc, NoLock, Preserve)
            {
                Offset (0x40),
                PAM0,   8,
                PAM1,   8,
                PAM2,   8,
                PAM3,   8,
                PAM4,   8,
                PAM5,   8,
                PAM6,   8,
                Offset (0x7C),
                    ,   20,
                TLUD,   12
            }

            Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
            {
                WordBusNumber (ResourceProducer, MinFixed, MaxFixed, PosDecode,
                    0x0000,             // Granularity
                    0x0000,             // Range Minimum
                    0x00FF,             // Range Maximum
                    0x0000,             // Translation Offset
                    0x0100,             // Length
                    ,, _Y22)
                IO (Decode16,
                    0x0CF8,             // Range Minimum
                    0x0CF8,             // Range Maximum
                    0x01,               // Alignment
                    0x08,               // Length
                    )
                WordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
                    0x0000,             // Granularity
                    0x0000,             // Range Minimum
                    0x0CF7,             // Range Maximum
                    0x0000,             // Translation Offset
                    0x0CF8,             // Length
                    ,, , TypeStatic, DenseTranslation)
                WordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
                    0x0000,             // Granularity
                    0x0D00,             // Range Minimum
                    0xFFFF,             // Range Maximum
                    0x0000,             // Translation Offset
                    0xF300,             // Length
                    ,, , TypeStatic, DenseTranslation)
                DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
                    0x00000000,         // Granularity
                    0x000A0000,         // Range Minimum
                    0x000BFFFF,         // Range Maximum
                    0x00000000,         // Translation Offset
                    0x00020000,         // Length
                    ,, , AddressRangeMemory, TypeStatic)
                DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
                    0x00000000,         // Granularity
                    0x000C0000,         // Range Minimum
                    0x000C3FFF,         // Range Maximum
                    0x00000000,         // Translation Offset
                    0x00004000,         // Length
                    ,, _Y15, AddressRangeMemory, TypeStatic)
                DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
                    0x00000000,         // Granularity
                    0x000C4000,         // Range Minimum
                    0x000C7FFF,         // Range Maximum
                    0x00000000,         // Translation Offset
                    0x00004000,         // Length
                    ,, _Y16, AddressRangeMemory, TypeStatic)
                DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
                    0x00000000,         // Granularity
                    0x000C8000,         // Range Minimum
                    0x000CBFFF,         // Range Maximum
                    0x00000000,         // Translation Offset
                    0x00004000,         // Length
                    ,, _Y17, AddressRangeMemory, TypeStatic)
                DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
                    0x00000000,         // Granularity
                    0x000CC000,         // Range Minimum
                    0x000CFFFF,         // Range Maximum
                    0x00000000,         // Translation Offset
                    0x00004000,         // Length
                    ,, _Y18, AddressRangeMemory, TypeStatic)
                DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
                    0x00000000,         // Granularity
                    0x000D0000,         // Range Minimum
                    0x000D3FFF,         // Range Maximum
                    0x00000000,         // Translation Offset
                    0x00004000,         // Length
                    ,, _Y19, AddressRangeMemory, TypeStatic)
                DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
                    0x00000000,         // Granularity
                    0x000D4000,         // Range Minimum
                    0x000D7FFF,         // Range Maximum
                    0x00000000,         // Translation Offset
                    0x00004000,         // Length
                    ,, _Y1A, AddressRangeMemory, TypeStatic)
                DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
                    0x00000000,         // Granularity
                    0x000D8000,         // Range Minimum
                    0x000DBFFF,         // Range Maximum
                    0x00000000,         // Translation Offset
                    0x00004000,         // Length
                    ,, _Y1B, AddressRangeMemory, TypeStatic)
                DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
                    0x00000000,         // Granularity
                    0x000DC000,         // Range Minimum
                    0x000DFFFF,         // Range Maximum
                    0x00000000,         // Translation Offset
                    0x00004000,         // Length
                    ,, _Y1C, AddressRangeMemory, TypeStatic)
                DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
                    0x00000000,         // Granularity
                    0x000E0000,         // Range Minimum
                    0x000E3FFF,         // Range Maximum
                    0x00000000,         // Translation Offset
                    0x00004000,         // Length
                    ,, _Y1D, AddressRangeMemory, TypeStatic)
                DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
                    0x00000000,         // Granularity
                    0x000E4000,         // Range Minimum
                    0x000E7FFF,         // Range Maximum
                    0x00000000,         // Translation Offset
                    0x00004000,         // Length
                    ,, _Y1E, AddressRangeMemory, TypeStatic)
                DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
                    0x00000000,         // Granularity
                    0x000E8000,         // Range Minimum
                    0x000EBFFF,         // Range Maximum
                    0x00000000,         // Translation Offset
                    0x00004000,         // Length
                    ,, _Y1F, AddressRangeMemory, TypeStatic)
                DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
                    0x00000000,         // Granularity
                    0x000EC000,         // Range Minimum
                    0x000EFFFF,         // Range Maximum
                    0x00000000,         // Translation Offset
                    0x00004000,         // Length
                    ,, _Y20, AddressRangeMemory, TypeStatic)
                DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
                    0x00000000,         // Granularity
                    0x00100000,         // Range Minimum
                    0xFEBFFFFF,         // Range Maximum
                    0x00000000,         // Translation Offset
                    0xFEB00000,         // Length
                    ,, _Y21, AddressRangeMemory, TypeStatic)
            })
            CreateDWordField (_CRS, \_SB.PCI0._Y15._LEN, C0LN)  // _LEN: Length
            CreateDWordField (_CRS, \_SB.PCI0._Y16._LEN, C4LN)  // _LEN: Length
            CreateDWordField (_CRS, \_SB.PCI0._Y17._LEN, C8LN)  // _LEN: Length
            CreateDWordField (_CRS, \_SB.PCI0._Y18._LEN, CCLN)  // _LEN: Length
            CreateDWordField (_CRS, \_SB.PCI0._Y19._LEN, D0LN)  // _LEN: Length
            CreateDWordField (_CRS, \_SB.PCI0._Y1A._LEN, D4LN)  // _LEN: Length
            CreateDWordField (_CRS, \_SB.PCI0._Y1B._LEN, D8LN)  // _LEN: Length
            CreateDWordField (_CRS, \_SB.PCI0._Y1C._LEN, DCLN)  // _LEN: Length
            CreateDWordField (_CRS, \_SB.PCI0._Y1D._LEN, E0LN)  // _LEN: Length
            CreateDWordField (_CRS, \_SB.PCI0._Y1E._LEN, E4LN)  // _LEN: Length
            CreateDWordField (_CRS, \_SB.PCI0._Y1F._LEN, E8LN)  // _LEN: Length
            CreateDWordField (_CRS, \_SB.PCI0._Y20._LEN, ECLN)  // _LEN: Length
            CreateDWordField (_CRS, \_SB.PCI0._Y21._MIN, XXMN)  // _MIN: Minimum Base Address
            CreateDWordField (_CRS, \_SB.PCI0._Y21._MAX, XXMX)  // _MAX: Maximum Base Address
            CreateDWordField (_CRS, \_SB.PCI0._Y21._LEN, XXLN)  // _LEN: Length
            CreateWordField (_CRS, \_SB.PCI0._Y22._MAX, B0MX)  // _MAX: Maximum Base Address
            CreateWordField (_CRS, \_SB.PCI0._Y22._LEN, B0LN)  // _LEN: Length
            Method (_INI, 0, Serialized)  // _INI: Initialize
            {
                B0MX = 0x3F
                B0LN = (0x3F + 0x01)
                If (!\OSIF)
                {
                    \_SB._INI ()
                }

                Local0 = (TLUD << 0x14)
                \MEMX = Local0
                XXMN = Local0
                XXLN = ((XXMX - XXMN) + 0x01)
                If ((PAM1 & 0x03))
                {
                    C0LN = 0x00
                }

                If ((PAM1 & 0x30))
                {
                    C4LN = 0x00
                }

                If ((PAM2 & 0x03))
                {
                    C8LN = 0x00
                }

                If ((PAM2 & 0x30))
                {
                    CCLN = 0x00
                }

                If ((PAM3 & 0x03))
                {
                    D0LN = 0x00
                }

                If ((PAM3 & 0x30))
                {
                    D4LN = 0x00
                }

                If ((PAM4 & 0x03))
                {
                    D8LN = 0x00
                }

                If ((PAM4 & 0x30))
                {
                    DCLN = 0x00
                }

                If ((PAM5 & 0x03))
                {
                    E0LN = 0x00
                }

                If ((PAM5 & 0x30))
                {
                    E4LN = 0x00
                }

                If ((PAM6 & 0x03))
                {
                    E8LN = 0x00
                }

                If ((PAM6 & 0x30))
                {
                    ECLN = 0x00
                }
            }

            Name (SUPP, 0x00)
            Name (CTRL, 0x00)
            Method (_OSC, 4, NotSerialized)  // _OSC: Operating System Capabilities
            {
                CreateDWordField (Arg3, 0x00, CDW1)
                CreateDWordField (Arg3, 0x04, CDW2)
                CreateDWordField (Arg3, 0x08, CDW3)
                If ((Arg0 == ToUUID ("33db4d5b-1ff7-401c-9657-7441c03dd766") /* PCI Host Bridge Device */))
                {
                    SUPP = CDW2 /* \_SB_.PCI0._OSC.CDW2 */
                    CTRL = CDW3 /* \_SB_.PCI0._OSC.CDW3 */
                    CTRL &= 0x0D
                    If (!(CDW1 & 0x01))
                    {
                        If ((CTRL & 0x01))
                        {
                            \NHPS = 0x01
                        }

                        If ((CTRL & 0x04))
                        {
                            If (\_SB.PCI0.EXP1.PMEX)
                            {
                                \_SB.PCI0.EXP1.PMEX = 0x00
                                \_SB.PCI0.EXP1.PMSX = 0x01
                            }

                            If (\_SB.PCI0.EXP3.PMEX)
                            {
                                \_SB.PCI0.EXP3.PMEX = 0x00
                                \_SB.PCI0.EXP3.PMSX = 0x01
                            }

                            If (\_SB.PCI0.EXP4.PMEX)
                            {
                                \_SB.PCI0.EXP4.PMEX = 0x00
                                \_SB.PCI0.EXP4.PMSX = 0x01
                            }

                            If (\_SB.PCI0.EXP5.PMEX)
                            {
                                \_SB.PCI0.EXP5.PMEX = 0x00
                                \_SB.PCI0.EXP5.PMSX = 0x01
                            }

                            If (\_SB.PCI0.EXP8.PMEX)
                            {
                                \_SB.PCI0.EXP8.PMEX = 0x00
                                \_SB.PCI0.EXP8.PMSX = 0x01
                            }

                            \_SB.PCI0.LPC.EXPE = 0x00
                            \NPME = 0x01
                        }
                    }

                    If ((Arg1 != 0x01))
                    {
                        CDW1 |= 0x0A
                    }

                    If ((CDW3 != CTRL))
                    {
                        CDW1 |= 0x10
                    }

                    CDW3 = CTRL /* \_SB_.PCI0.CTRL */
                }
                Else
                {
                    CDW1 |= 0x06
                }

                Return (Arg3)
            }

            OperationRegion (HBUS, PCI_Config, 0x00, 0x0100)
            Field (HBUS, DWordAcc, NoLock, Preserve)
            {
                Offset (0x40),
                EPEN,   1,
                    ,   11,
                EPBR,   20,
                Offset (0x48),
                MHEN,   1,
                    ,   14,
                MHBR,   17,
                Offset (0x50),
                GCLK,   1,
                Offset (0x60),
                PXEN,   1,
                PXSZ,   2,
                    ,   23,
                PXBR,   6,
                Offset (0x68),
                DIEN,   1,
                    ,   11,
                DIBR,   20,
                Offset (0x70),
                    ,   20,
                MEBR,   12
            }

            Name (EP_B, 0x00)
            Name (MH_B, 0x00)
            Name (PC_B, 0x00)
            Name (PC_L, 0x00)
            Name (DM_B, 0x00)
            Method (GEPB, 0, Serialized)
            {
                If ((EP_B == 0x00))
                {
                    EP_B = (\_SB.PCI0.EPBR << 0x0C)
                }

                Return (EP_B) /* \_SB_.PCI0.EP_B */
            }

            Method (GMHB, 0, Serialized)
            {
                If ((MH_B == 0x00))
                {
                    MH_B = (\_SB.PCI0.MHBR << 0x0F)
                }

                Return (MH_B) /* \_SB_.PCI0.MH_B */
            }

            Method (GPCB, 0, Serialized)
            {
                If ((PC_B == 0x00))
                {
                    PC_B = (\_SB.PCI0.PXBR << 0x1A)
                }

                Return (PC_B) /* \_SB_.PCI0.PC_B */
            }

            Method (GPCL, 0, Serialized)
            {
                If ((PC_L == 0x00))
                {
                    PC_L = (0x10000000 >> \_SB.PCI0.PXSZ)
                }

                Return (PC_L) /* \_SB_.PCI0.PC_L */
            }

            Method (GDMB, 0, Serialized)
            {
                If ((DM_B == 0x00))
                {
                    DM_B = (\_SB.PCI0.DIBR << 0x0C)
                }

                Return (DM_B) /* \_SB_.PCI0.DM_B */
            }

            Scope (\_SB.PCI0)
            {
                Method (WHIT, 0, NotSerialized)
                {
                    Return (Package (0x01)
                    {
                        Package (0x05)
                        {
                            "?*",
                            "?*",
                            0x00,
                            0x02,
                            0x02
                        }
                    })
                }

                Method (SELF, 0, NotSerialized)
                {
                    Return (Package (0x02)
                    {
                        "LENOVO",
                        "TP-R02  "
                    })
                }
            }

            Device (LPC)
            {
                Name (_ADR, 0x001F0000)  // _ADR: Address
                Name (_S3D, 0x03)  // _S3D: S3 Device State
                Name (RID, 0x00)
                Method (_DSM, 4, Serialized)  // _DSM: Device-Specific Method
                {
                    If (PCIC (Arg0))
                    {
                        Return (PCID (Arg0, Arg1, Arg2, Arg3))
                    }

                    Return (0x00)
                }

                Device (SIO)
                {
                    Name (_HID, EisaId ("PNP0C02") /* PNP Motherboard Resources */)  // _HID: Hardware ID
                    Name (_UID, 0x00)  // _UID: Unique ID
                    Method (_CRS, 0, NotSerialized)  // _CRS: Current Resource Settings
                    {
                        Name (BUF, ResourceTemplate ()
                        {
                            IO (Decode16,
                                0x0010,             // Range Minimum
                                0x0010,             // Range Maximum
                                0x01,               // Alignment
                                0x10,               // Length
                                )
                            IO (Decode16,
                                0x0090,             // Range Minimum
                                0x0090,             // Range Maximum
                                0x01,               // Alignment
                                0x10,               // Length
                                )
                            IO (Decode16,
                                0x0024,             // Range Minimum
                                0x0024,             // Range Maximum
                                0x01,               // Alignment
                                0x02,               // Length
                                )
                            IO (Decode16,
                                0x0028,             // Range Minimum
                                0x0028,             // Range Maximum
                                0x01,               // Alignment
                                0x02,               // Length
                                )
                            IO (Decode16,
                                0x002C,             // Range Minimum
                                0x002C,             // Range Maximum
                                0x01,               // Alignment
                                0x02,               // Length
                                )
                            IO (Decode16,
                                0x0030,             // Range Minimum
                                0x0030,             // Range Maximum
                                0x01,               // Alignment
                                0x02,               // Length
                                )
                            IO (Decode16,
                                0x0034,             // Range Minimum
                                0x0034,             // Range Maximum
                                0x01,               // Alignment
                                0x02,               // Length
                                )
                            IO (Decode16,
                                0x0038,             // Range Minimum
                                0x0038,             // Range Maximum
                                0x01,               // Alignment
                                0x02,               // Length
                                )
                            IO (Decode16,
                                0x003C,             // Range Minimum
                                0x003C,             // Range Maximum
                                0x01,               // Alignment
                                0x02,               // Length
                                )
                            IO (Decode16,
                                0x00A4,             // Range Minimum
                                0x00A4,             // Range Maximum
                                0x01,               // Alignment
                                0x02,               // Length
                                )
                            IO (Decode16,
                                0x00A8,             // Range Minimum
                                0x00A8,             // Range Maximum
                                0x01,               // Alignment
                                0x02,               // Length
                                )
                            IO (Decode16,
                                0x00AC,             // Range Minimum
                                0x00AC,             // Range Maximum
                                0x01,               // Alignment
                                0x02,               // Length
                                )
                            IO (Decode16,
                                0x00B0,             // Range Minimum
                                0x00B0,             // Range Maximum
                                0x01,               // Alignment
                                0x06,               // Length
                                )
                            IO (Decode16,
                                0x00B8,             // Range Minimum
                                0x00B8,             // Range Maximum
                                0x01,               // Alignment
                                0x02,               // Length
                                )
                            IO (Decode16,
                                0x00BC,             // Range Minimum
                                0x00BC,             // Range Maximum
                                0x01,               // Alignment
                                0x02,               // Length
                                )
                            IO (Decode16,
                                0x0050,             // Range Minimum
                                0x0050,             // Range Maximum
                                0x01,               // Alignment
                                0x04,               // Length
                                )
                            IO (Decode16,
                                0x0072,             // Range Minimum
                                0x0072,             // Range Maximum
                                0x01,               // Alignment
                                0x06,               // Length
                                )
                            IO (Decode16,
                                0x1800,             // Range Minimum
                                0x1800,             // Range Maximum
                                0x01,               // Alignment
                                0xA0,               // Length
                                )
                            IO (Decode16,
                                0x0800,             // Range Minimum
                                0x0800,             // Range Maximum
                                0x01,               // Alignment
                                0x80,               // Length
                                )
                            IO (Decode16,
                                0x0880,             // Range Minimum
                                0x0880,             // Range Maximum
                                0x01,               // Alignment
                                0x80,               // Length
                                )
                            IO (Decode16,
                                0x0900,             // Range Minimum
                                0x0900,             // Range Maximum
                                0x01,               // Alignment
                                0x80,               // Length
                                )
                            IO (Decode16,
                                0x0980,             // Range Minimum
                                0x0980,             // Range Maximum
                                0x01,               // Alignment
                                0x80,               // Length
                                )
                            IO (Decode16,
                                0x0A00,             // Range Minimum
                                0x0A00,             // Range Maximum
                                0x01,               // Alignment
                                0x80,               // Length
                                )
                            IO (Decode16,
                                0x0A80,             // Range Minimum
                                0x0A80,             // Range Maximum
                                0x01,               // Alignment
                                0x80,               // Length
                                )
                            IO (Decode16,
                                0x0B00,             // Range Minimum
                                0x0B00,             // Range Maximum
                                0x01,               // Alignment
                                0x80,               // Length
                                )
                            IO (Decode16,
                                0x0B80,             // Range Minimum
                                0x0B80,             // Range Maximum
                                0x01,               // Alignment
                                0x80,               // Length
                                )
                            IO (Decode16,
                                0x15E0,             // Range Minimum
                                0x15E0,             // Range Maximum
                                0x01,               // Alignment
                                0x10,               // Length
                                )
                            IO (Decode16,
                                0x1600,             // Range Minimum
                                0x1600,             // Range Maximum
                                0x01,               // Alignment
                                0x80,               // Length
                                )
                            IO (Decode16,
                                0x1640,             // Range Minimum
                                0x1640,             // Range Maximum
                                0x01,               // Alignment
                                0x20,               // Length
                                )
                            Memory32Fixed (ReadWrite,
                                0xF8000000,         // Address Base
                                0x04000000,         // Address Length
                                )
                            Memory32Fixed (ReadWrite,
                                0xFED10000,         // Address Base
                                0x00004000,         // Address Length
                                )
                            Memory32Fixed (ReadWrite,
                                0xFED18000,         // Address Base
                                0x00001000,         // Address Length
                                )
                            Memory32Fixed (ReadWrite,
                                0xFED19000,         // Address Base
                                0x00001000,         // Address Length
                                )
                            Memory32Fixed (ReadWrite,
                                0xFEB00000,         // Address Base
                                0x00100000,         // Address Length
                                )
                            Memory32Fixed (ReadWrite,
                                0xFED20000,         // Address Base
                                0x00020000,         // Address Length
                                )
                            Memory32Fixed (ReadOnly,
                                0xFED90000,         // Address Base
                                0x00004000,         // Address Length
                                )
                            Memory32Fixed (ReadWrite,
                                0x00000000,         // Address Base
                                0x00000000,         // Address Length
                                _Y23)
                        })
                        CreateDWordField (BUF, \_SB.PCI0.LPC.SIO._CRS._Y23._BAS, SXB)  // _BAS: Base Address
                        SXB = \SXRB
                        CreateDWordField (BUF, \_SB.PCI0.LPC.SIO._CRS._Y23._LEN, SXL)  // _LEN: Length
                        SXL = \SXRS
                        Return (BUF) /* \_SB_.PCI0.LPC_.SIO_._CRS.BUF_ */
                    }
                }

                OperationRegion (LPCS, PCI_Config, 0x00, 0x0100)
                Field (LPCS, AnyAcc, NoLock, Preserve)
                {
                    Offset (0x60),
                    PIRA,   8,
                    PIRB,   8,
                    PIRC,   8,
                    PIRD,   8,
                    SERQ,   8,
                    Offset (0x68),
                    PIRE,   8,
                    PIRF,   8,
                    PIRG,   8,
                    PIRH,   8,
                    Offset (0x80),
                    XU1A,   3,
                        ,   1,
                    XU2A,   3,
                    Offset (0x81),
                    XPA,    2,
                        ,   2,
                    XFA,    1,
                    Offset (0x82),
                    XU1E,   1,
                    XU2E,   1,
                    XPE,    1,
                    XFE,    1,
                    Offset (0x84),
                    XG1E,   1,
                        ,   1,
                    XG1A,   14,
                    Offset (0x88),
                    XG2E,   1,
                        ,   1,
                    XG2A,   14,
                    Offset (0xA0),
                        ,   2,
                    CLKR,   1,
                        ,   7,
                    EXPE,   1,
                    Offset (0xA2),
                    Offset (0xAC),
                    Offset (0xAD),
                    Offset (0xAE),
                    XUSB,   1,
                    Offset (0xB8),
                    GR00,   2,
                        ,   10,
                    GR06,   2
                }

                OperationRegion (GDIO, SystemMemory, 0xFDAF04C0, 0x10)
                Field (GDIO, DWordAcc, NoLock, Preserve)
                {
                        ,   30,
                    DOI0,   1,
                    Offset (0x04),
                        ,   30,
                    DOI1,   1,
                    Offset (0x08),
                        ,   30,
                    DOI2,   1,
                    Offset (0x0C),
                        ,   30,
                    DOI3,   1
                }

                OperationRegion (LPIO, SystemIO, 0x0800, 0x0400)
                Field (LPIO, DWordAcc, NoLock, Preserve)
                {
                    Offset (0x180),
                        ,   3,
                    XHPD,   1,
                    Offset (0x1B0),
                        ,   31,
                    GLIS,   1,
                    Offset (0x308),
                    Offset (0x30C)
                }

                OperationRegion (PMIO, SystemIO, 0x1800, 0x0100)
                Field (PMIO, AnyAcc, NoLock, Preserve)
                {
                    Offset (0x2A),
                        ,   6,
                    XHPE,   1,
                    Offset (0x42),
                        ,   1,
                    SWGE,   1,
                    Offset (0x64),
                        ,   9,
                    Offset (0x8C),
                    SCIS,   1,
                        ,   6
                }

                Device (PIC)
                {
                    Name (_HID, EisaId ("PNP0000") /* 8259-compatible Programmable Interrupt Controller */)  // _HID: Hardware ID
                    Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
                    {
                        IO (Decode16,
                            0x0020,             // Range Minimum
                            0x0020,             // Range Maximum
                            0x01,               // Alignment
                            0x02,               // Length
                            )
                        IO (Decode16,
                            0x00A0,             // Range Minimum
                            0x00A0,             // Range Maximum
                            0x01,               // Alignment
                            0x02,               // Length
                            )
                        IO (Decode16,
                            0x04D0,             // Range Minimum
                            0x04D0,             // Range Maximum
                            0x01,               // Alignment
                            0x02,               // Length
                            )
                        IRQNoFlags ()
                            {2}
                    })
                }

                Device (TIMR)
                {
                    Name (_HID, EisaId ("PNP0100") /* PC-class System Timer */)  // _HID: Hardware ID
                    Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
                    {
                        IO (Decode16,
                            0x0040,             // Range Minimum
                            0x0040,             // Range Maximum
                            0x01,               // Alignment
                            0x04,               // Length
                            )
                        IRQNoFlags ()
                            {0}
                    })
                }

                Device (HPET)
                {
                    Name (_HID, EisaId ("PNP0103") /* HPET System Timer */)  // _HID: Hardware ID
                    Method (_STA, 0, NotSerialized)  // _STA: Status
                    {
                        If ((\WNTF && !\WXPF))
                        {
                            Return (0x00)
                        }
                        Else
                        {
                            Return (0x0F)
                        }

                        Return (0x00)
                    }

                    Name (BUF0, ResourceTemplate ()
                    {
                        Memory32Fixed (ReadOnly,
                            0xFED00000,         // Address Base
                            0x00000400,         // Address Length
                            _Y24)
                    })
                    Method (_CRS, 0, Serialized)  // _CRS: Current Resource Settings
                    {
                        CreateDWordField (BUF0, \_SB.PCI0.LPC.HPET._Y24._BAS, HPT0)  // _BAS: Base Address
                        HPT0 = \HPET
                        Return (BUF0) /* \_SB_.PCI0.LPC_.HPET.BUF0 */
                    }
                }

                Device (SPKR)
                {
                    Name (_HID, EisaId ("PNP0800") /* Microsoft Sound System Compatible Device */)  // _HID: Hardware ID
                    Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
                    {
                        IO (Decode16,
                            0x0061,             // Range Minimum
                            0x0061,             // Range Maximum
                            0x01,               // Alignment
                            0x01,               // Length
                            )
                    })
                }

                Device (RTC)
                {
                    Name (_HID, EisaId ("PNP0B00") /* AT Real-Time Clock */)  // _HID: Hardware ID
                    Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
                    {
                        IO (Decode16,
                            0x0070,             // Range Minimum
                            0x0070,             // Range Maximum
                            0x01,               // Alignment
                            0x02,               // Length
                            )
                        IRQNoFlags ()
                            {8}
                    })
                }

                Device (KBD)
                {
                    Method (_HID, 0, NotSerialized)  // _HID: Hardware ID
                    {
                        If (\WIN8)
                        {
                            Return (0x7100AE30)
                        }

                        Return (0x0303D041)
                    }

                    Name (_CID, EisaId ("PNP0303") /* IBM Enhanced Keyboard (101/102-key, PS/2 Mouse) */)  // _CID: Compatible ID
                    Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
                    {
                        IO (Decode16,
                            0x0060,             // Range Minimum
                            0x0060,             // Range Maximum
                            0x01,               // Alignment
                            0x01,               // Length
                            )
                        IO (Decode16,
                            0x0064,             // Range Minimum
                            0x0064,             // Range Maximum
                            0x01,               // Alignment
                            0x01,               // Length
                            )
                        IRQNoFlags ()
                            {1}
                    })
                }

                Device (MOU)
                {
                    Name (_HID, EisaId ("LEN2014"))  // _HID: Hardware ID
                    Name (_CID, EisaId ("PNP0F13") /* PS/2 Mouse */)  // _CID: Compatible ID
                    Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
                    {
                        IRQNoFlags ()
                            {12}
                    })
                }

                OperationRegion (IMGA, SystemIO, 0x15E0, 0x10)
                Field (IMGA, ByteAcc, NoLock, Preserve)
                {
                    Offset (0x01),
                    Offset (0x02),
                    Offset (0x03),
                    WAKR,   16,
                    Offset (0x0C),
                    GAIX,   8,
                    Offset (0x0E),
                    GADT,   8,
                    Offset (0x10)
                }

                IndexField (GAIX, GADT, ByteAcc, NoLock, Preserve)
                {
                    Offset (0x60),
                    EPWG,   1,
                        ,   1,
                    CSON,   1,
                    DSCI,   1,
                    DSCS,   1,
                    DLAN,   1,
                    Offset (0xC2),
                    GAID,   8
                }

                Device (CWDT)
                {
                    Name (_HID, EisaId ("INT3F0D") /* ACPI Motherboard Resources */)  // _HID: Hardware ID
                    Name (_CID, EisaId ("PNP0C02") /* PNP Motherboard Resources */)  // _CID: Compatible ID
                    Name (BUF0, ResourceTemplate ()
                    {
                        IO (Decode16,
                            0x1854,             // Range Minimum
                            0x1854,             // Range Maximum
                            0x04,               // Alignment
                            0x04,               // Length
                            )
                    })
                    Method (_STA, 0, Serialized)  // _STA: Status
                    {
                        Return (0x0F)
                    }

                    Method (_CRS, 0, Serialized)  // _CRS: Current Resource Settings
                    {
                        Return (BUF0) /* \_SB_.PCI0.LPC_.CWDT.BUF0 */
                    }
                }

                Device (EC)
                {
                    Name (_HID, EisaId ("PNP0C09") /* Embedded Controller Device */)  // _HID: Hardware ID
                    Name (_UID, 0x00)  // _UID: Unique ID
                    Name (_GPE, 0x16)  // _GPE: General Purpose Events
                    Method (_REG, 2, NotSerialized)  // _REG: Region Availability
                    {
                        If ((Arg0 == 0x03))
                        {
                            \H8DR = Arg1
                        }
                    }

                    OperationRegion (ECOR, EmbeddedControl, 0x00, 0x0100)
                    Field (ECOR, ByteAcc, NoLock, Preserve)
                    {
                        HDBM,   1,
                            ,   1,
                            ,   1,
                        HFNE,   1,
                            ,   1,
                            ,   1,
                        HLDM,   1,
                        Offset (0x01),
                        BBLS,   1,
                        BTCM,   1,
                            ,   1,
                            ,   1,
                            ,   1,
                        HBPR,   1,
                        BTPC,   1,
                        Offset (0x02),
                        HDUE,   1,
                            ,   4,
                        SNLK,   1,
                        Offset (0x03),
                            ,   5,
                        HAUM,   2,
                        Offset (0x05),
                        HSPA,   1,
                        Offset (0x06),
                        HSUN,   8,
                        HSRP,   8,
                        Offset (0x0C),
                        HLCL,   8,
                            ,   4,
                        CALM,   1,
                        Offset (0x0E),
                        HFNS,   2,
                        Offset (0x0F),
                            ,   6,
                        NULS,   1,
                        Offset (0x10),
                        HAM0,   8,
                        HAM1,   8,
                        HAM2,   8,
                        HAM3,   8,
                        HAM4,   8,
                        HAM5,   8,
                        HAM6,   8,
                        HAM7,   8,
                        HAM8,   8,
                        HAM9,   8,
                        HAMA,   8,
                        HAMB,   8,
                        HAMC,   8,
                        HAMD,   8,
                        HAME,   8,
                        HAMF,   8,
                        Offset (0x23),
                        HANT,   8,
                        Offset (0x26),
                            ,   2,
                        HANA,   2,
                        Offset (0x27),
                        Offset (0x28),
                            ,   1,
                        SKEM,   1,
                        Offset (0x29),
                        Offset (0x2A),
                        HATR,   8,
                        HT0H,   8,
                        HT0L,   8,
                        HT1H,   8,
                        HT1L,   8,
                        HFSP,   8,
                            ,   6,
                        HMUT,   1,
                        Offset (0x31),
                            ,   2,
                        HUWB,   1,
                            ,   3,
                        VPON,   1,
                        VRST,   1,
                        HWPM,   1,
                        HWLB,   1,
                        HWLO,   1,
                        HWDK,   1,
                        HWFN,   1,
                        HWBT,   1,
                        HWRI,   1,
                        HWBU,   1,
                        HWLU,   1,
                        Offset (0x34),
                            ,   3,
                        PIBS,   1,
                            ,   3,
                        HPLO,   1,
                        Offset (0x36),
                        HWAC,   16,
                        HB0S,   7,
                        HB0A,   1,
                        HB1S,   7,
                        HB1A,   1,
                        HCMU,   1,
                            ,   2,
                        OVRQ,   1,
                        DCBD,   1,
                        DCWL,   1,
                        DCWW,   1,
                        HB1I,   1,
                            ,   1,
                        KBLT,   1,
                        BTPW,   1,
                        FNKC,   1,
                        HUBS,   1,
                        BDPW,   1,
                        BDDT,   1,
                        HUBB,   1,
                        Offset (0x46),
                            ,   1,
                        BTWK,   1,
                        HPLD,   1,
                            ,   1,
                        HPAC,   1,
                        BTST,   1,
                        Offset (0x47),
                        HPBU,   1,
                            ,   1,
                        HBID,   1,
                            ,   3,
                        HBCS,   1,
                        HPNF,   1,
                            ,   1,
                        GSTS,   1,
                            ,   2,
                        HLBU,   1,
                        DOCD,   1,
                        HCBL,   1,
                        Offset (0x49),
                        SLUL,   1,
                        Offset (0x4C),
                        HTMH,   8,
                        HTML,   8,
                        HWAK,   16,
                        HMPR,   8,
                            ,   7,
                        HMDN,   1,
                        Offset (0x78),
                        TMP0,   8,
                        Offset (0x80),
                        Offset (0x81),
                        HIID,   8,
                        Offset (0x83),
                        HFNI,   8,
                        HSPD,   16,
                        Offset (0x88),
                        TSL0,   7,
                        TSR0,   1,
                        TSL1,   7,
                        TSR1,   1,
                        TSL2,   7,
                        TSR2,   1,
                        TSL3,   7,
                        TSR3,   1,
                        Offset (0x8D),
                        HDAA,   3,
                        HDAB,   3,
                        HDAC,   2,
                        Offset (0xB0),
                        HDEN,   32,
                        HDEP,   32,
                        HDEM,   8,
                        HDES,   8,
                        Offset (0xC8),
                        ATMX,   8,
                        HWAT,   8,
                        Offset (0xCC),
                        PWMH,   8,
                        PWML,   8,
                        Offset (0xED),
                            ,   4,
                        HDDD,   1
                    }

                    Method (_INI, 0, NotSerialized)  // _INI: Initialize
                    {
                        If (\H8DR)
                        {
                            HSPA = 0x00
                        }
                        Else
                        {
                            \MBEC (0x05, 0xFE, 0x00)
                        }

                        \_SB.PCI0.LPC.EC.HKEY.WGIN ()
                    }

                    Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
                    {
                        IO (Decode16,
                            0x0062,             // Range Minimum
                            0x0062,             // Range Maximum
                            0x01,               // Alignment
                            0x01,               // Length
                            )
                        IO (Decode16,
                            0x0066,             // Range Minimum
                            0x0066,             // Range Maximum
                            0x01,               // Alignment
                            0x01,               // Length
                            )
                    })
                    Method (LED, 2, NotSerialized)
                    {
                        Local0 = (Arg0 | Arg1)
                        If (\H8DR)
                        {
                            HLCL = Local0
                        }
                        Else
                        {
                            \WBEC (0x0C, Local0)
                        }
                    }

                    Name (BAON, 0x00)
                    Name (WBON, 0x00)
                    Method (BEEP, 1, NotSerialized)
                    {
                        If ((Arg0 == 0x05))
                        {
                            WBON = 0x00
                        }

                        Local2 = WBON /* \_SB_.PCI0.LPC_.EC__.WBON */
                        If (BAON)
                        {
                            If ((Arg0 == 0x00))
                            {
                                BAON = 0x00
                                If (WBON)
                                {
                                    Local0 = 0x03
                                    Local1 = 0x08
                                }
                                Else
                                {
                                    Local0 = 0x00
                                    Local1 = 0x00
                                }
                            }
                            Else
                            {
                                Local0 = 0xFF
                                Local1 = 0xFF
                                If ((Arg0 == 0x11))
                                {
                                    WBON = 0x00
                                }

                                If ((Arg0 == 0x10))
                                {
                                    WBON = 0x01
                                }
                            }
                        }
                        Else
                        {
                            Local0 = Arg0
                            Local1 = 0xFF
                            If ((Arg0 == 0x0F))
                            {
                                Local0 = Arg0
                                Local1 = 0x08
                                BAON = 0x01
                            }

                            If ((Arg0 == 0x11))
                            {
                                Local0 = 0x00
                                Local1 = 0x00
                                WBON = 0x00
                            }

                            If ((Arg0 == 0x10))
                            {
                                Local0 = 0x03
                                Local1 = 0x08
                                WBON = 0x01
                            }
                        }

                        If ((Arg0 == 0x03))
                        {
                            WBON = 0x00
                            If (Local2)
                            {
                                Local0 = 0x07
                                If (((\SPS == 0x03) || (\SPS == 0x04)))
                                {
                                    Local2 = 0x00
                                    Local0 = 0xFF
                                    Local1 = 0xFF
                                }
                            }
                        }

                        If ((Arg0 == 0x07))
                        {
                            If (Local2)
                            {
                                Local2 = 0x00
                                Local0 = 0xFF
                                Local1 = 0xFF
                            }
                        }

                        If (\H8DR)
                        {
                            If ((Local2 && !WBON))
                            {
                                HSRP = 0x00
                                HSUN = 0x00
                                Sleep (0x64)
                            }

                            If ((Local1 != 0xFF))
                            {
                                HSRP = Local1
                            }

                            If ((Local0 != 0xFF))
                            {
                                HSUN = Local0
                            }
                        }
                        Else
                        {
                            If ((Local2 && !WBON))
                            {
                                \WBEC (0x07, 0x00)
                                \WBEC (0x06, 0x00)
                                Sleep (0x64)
                            }

                            If ((Local1 != 0xFF))
                            {
                                \WBEC (0x07, Local1)
                            }

                            If ((Local0 != 0xFF))
                            {
                                \WBEC (0x06, Local0)
                            }
                        }

                        If ((Arg0 == 0x03)){}
                        If ((Arg0 == 0x07))
                        {
                            Sleep (0x01F4)
                        }
                    }

                    Method (EVNT, 1, NotSerialized)
                    {
                        If (\H8DR)
                        {
                            If (Arg0)
                            {
                                HAM5 |= 0x04
                            }
                            Else
                            {
                                HAM5 &= 0xFB
                            }
                        }
                        ElseIf (Arg0)
                        {
                            \MBEC (0x15, 0xFF, 0x04)
                        }
                        Else
                        {
                            \MBEC (0x15, 0xFB, 0x00)
                        }
                    }

                    Name (USPS, 0x00)
                    PowerResource (PUBS, 0x03, 0x0000)
                    {
                        Method (_STA, 0, NotSerialized)  // _STA: Status
                        {
                            If (\H8DR)
                            {
                                Local0 = HUBS /* \_SB_.PCI0.LPC_.EC__.HUBS */
                            }
                            Else
                            {
                                Local0 = (\RBEC (0x3B) & 0x10)
                            }

                            If (Local0)
                            {
                                Return (0x01)
                            }
                            Else
                            {
                                Return (0x00)
                            }
                        }

                        Method (_ON, 0, NotSerialized)  // _ON_: Power On
                        {
                            Local0 = 0x64
                            While ((USPS && Local0))
                            {
                                Sleep (0x01)
                                Local0--
                            }

                            If (\H8DR)
                            {
                                HUBS = 0x01
                            }
                            Else
                            {
                                \MBEC (0x3B, 0xFF, 0x10)
                            }
                        }

                        Method (_OFF, 0, NotSerialized)  // _OFF: Power Off
                        {
                            USPS = 0x01
                            If (\H8DR)
                            {
                                HUBS = 0x00
                            }
                            Else
                            {
                                \MBEC (0x3B, 0xEF, 0x00)
                            }

                            Sleep (0x14)
                            USPS = 0x00
                        }
                    }

                    Method (CHKS, 0, NotSerialized)
                    {
                        Local0 = 0x03E8
                        While (HMPR)
                        {
                            Sleep (0x01)
                            Local0--
                            If (!Local0)
                            {
                                Return (0x8080)
                            }
                        }

                        If (HMDN)
                        {
                            Return (Zero)
                        }

                        Return (0x8081)
                    }

                    Method (LPMD, 0, NotSerialized)
                    {
                        Local0 = 0x00
                        Local1 = 0x00
                        Local2 = 0x00
                        If (\H8DR)
                        {
                            If (HPAC)
                            {
                                If (HPLO)
                                {
                                    Local0 = \LPST
                                }
                                ElseIf ((HWAT < 0x5A))
                                {
                                    If (HB0A)
                                    {
                                        If (((HB0S & 0x10) || ((HB0S & 0x07) < 0x02)))
                                        {
                                            Local1 = 0x01
                                        }
                                    }
                                    Else
                                    {
                                        Local1 = 0x01
                                    }

                                    If (HB1A)
                                    {
                                        If (((HB1S & 0x10) || ((HB1S & 0x07) < 0x02)))
                                        {
                                            Local2 = 0x01
                                        }
                                    }
                                    Else
                                    {
                                        Local2 = 0x01
                                    }

                                    If ((Local1 && Local2))
                                    {
                                        Local0 = \LPST
                                    }
                                }
                            }
                        }
                        ElseIf ((\RBEC (0x46) & 0x10))
                        {
                            If ((\RBEC (0x34) & 0x80))
                            {
                                Local0 = \LPST
                            }
                            ElseIf ((\RBEC (0xC9) < 0x5A))
                            {
                                Local3 = \RBEC (0x38)
                                If ((Local3 & 0x80))
                                {
                                    If (((Local3 & 0x10) || ((Local3 & 0x07) < 0x02)))
                                    {
                                        Local1 = 0x01
                                    }
                                }
                                Else
                                {
                                    Local2 = 0x01
                                }

                                Local3 = \RBEC (0x39)
                                If ((Local3 & 0x80))
                                {
                                    If (((Local3 & 0x10) || ((Local3 & 0x07) < 0x02)))
                                    {
                                        Local1 = 0x01
                                    }
                                }
                                Else
                                {
                                    Local2 = 0x01
                                }

                                If ((Local1 && Local2))
                                {
                                    Local0 = \LPST
                                }
                            }
                        }

                        Return (Local0)
                    }

                    Method (CLPM, 0, NotSerialized)
                    {
                        If ((\_PR.CFGD & 0x01))
                        {
                            If ((\OSPX || \CPPX))
                            {
                                \PNTF (0x80)
                            }
                            Else
                            {
                                Local0 = LPMD ()
                                If (Local0)
                                {
                                    \STEP (0x04)
                                }
                                Else
                                {
                                    \STEP (0x05)
                                }
                            }
                        }
                    }

                    Mutex (MCPU, 0x00)
                    Method (_Q10, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        If (\_SB.PCI0.LPC.EC.HKEY.MHKK (0x01))
                        {
                            \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x1001)
                        }
                    }

                    Method (_Q11, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        Noop
                    }

                    Method (_Q12, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        If (\_SB.PCI0.LPC.EC.HKEY.MHKK (0x02))
                        {
                            \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x1002)
                        }
                    }

                    Method (_Q13, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        If (\_SB.PCI0.LPC.EC.HKEY.DHKC)
                        {
                            \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x1004)
                        }
                        Else
                        {
                            Notify (\_SB.SLPB, 0x80) // Status Change
                        }
                    }

                    Method (_Q64, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        If (\_SB.PCI0.LPC.EC.HKEY.MHKK (0x10))
                        {
                            \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x1005)
                        }
                    }

                    Method (_Q65, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        If (\_SB.PCI0.LPC.EC.HKEY.MHKK (0x20))
                        {
                            \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x1006)
                        }
                    }

                    Method (_Q16, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        If (\_SB.PCI0.LPC.EC.HKEY.MHKK (0x40))
                        {
                            \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x1007)
                        }
                    }

                    Method (_Q17, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        If (\_SB.PCI0.LPC.EC.HKEY.MHKK (0x80))
                        {
                            \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x1008)
                        }
                    }

                    Method (_Q18, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        If (\_SB.PCI0.LPC.EC.HKEY.MHKK (0x0100))
                        {
                            \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x1009)
                        }

                        Noop
                    }

                    Method (_Q1A, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        If (\_SB.PCI0.LPC.EC.HKEY.MHKK (0x0400))
                        {
                            \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x100B)
                        }
                    }

                    Method (_Q1B, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x100C)
                    }

                    Method (_Q62, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        If (\_SB.PCI0.LPC.EC.HKEY.MHKK (0x1000))
                        {
                            \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x100D)
                        }
                    }

                    Method (_Q60, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        If (\_SB.PCI0.LPC.EC.HKEY.MHKK (0x2000))
                        {
                            \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x100E)
                        }
                    }

                    Method (_Q61, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        If (\_SB.PCI0.LPC.EC.HKEY.MHKK (0x4000))
                        {
                            \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x100F)
                        }
                    }

                    Method (_Q1F, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        If (\_SB.PCI0.LPC.EC.HKEY.MHKK (0x00020000))
                        {
                            If ((PKLI & 0x0C00))
                            {
                                \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x1012)
                            }
                        }

                        \UCMS (0x0E)
                    }

                    Method (_Q1C, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        If (\_SB.PCI0.LPC.EC.HKEY.MHKK (0x01000000))
                        {
                            \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x1019)
                        }
                    }

                    Method (_Q1D, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        If (\_SB.PCI0.LPC.EC.HKEY.MHKK (0x02000000))
                        {
                            \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x101A)
                        }
                    }

                    Method (_Q66, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        If (\_SB.PCI0.LPC.EC.HKEY.MHKK (0x10000000))
                        {
                            \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x101D)
                        }
                    }

                    Method (_Q67, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        If (\_SB.PCI0.LPC.EC.HKEY.MHKK (0x20000000))
                        {
                            \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x101E)
                        }
                    }

                    Method (_Q68, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        If (\_SB.PCI0.LPC.EC.HKEY.MHKK (0x40000000))
                        {
                            \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x101F)
                        }
                    }

                    Method (_Q69, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        If (\_SB.PCI0.LPC.EC.HKEY.MHKK (0x80000000))
                        {
                            \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x1020)
                        }
                    }

                    Method (_Q26, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        If (VIGD)
                        {
                            If (\WVIS)
                            {
                                \VBTD ()
                            }

                            \_SB.PCI0.LPC.EC.BRNS ()
                        }
                        Else
                        {
                            \UCMS (0x12)
                        }

                        ADBG ("AC_A0")
                        \_SB.PCI0.LPC.EC.HKEY.DYTC (0x000F4001)
                        ADBG ("AC_A1")
                        Sleep (0x01F4)
                        Notify (AC, 0x80) // Status Change
                        Notify (\_TZ.THM0, 0x80) // Thermal Status Change
                        If (\WXPF)
                        {
                            Acquire (MCPU, 0xFFFF)
                        }

                        PWRS = 0x01
                        If ((\_PR.CFGD & 0x01))
                        {
                            If ((\OSPX || \CPPX))
                            {
                                \PNTF (0x80)
                            }
                        }

                        If (\WXPF)
                        {
                            Sleep (0x64)
                        }

                        If (\OSC4)
                        {
                            \PNTF (0x81)
                        }

                        If (\WXPF)
                        {
                            Release (MCPU)
                        }

                        \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x6040)
                        ATMC ()
                    }

                    Method (_Q27, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        If (VIGD)
                        {
                            If (\WVIS)
                            {
                                \VBTD ()
                            }

                            \_SB.PCI0.LPC.EC.BRNS ()
                        }
                        Else
                        {
                            \UCMS (0x12)
                        }

                        If ((\_SB.LID._LID () == 0x00))
                        {
                            ADBG ("AC_D0")
                            \_SB.PCI0.LPC.EC.HKEY.DYTC (0x001F4001)
                            ADBG ("AC_D1")
                        }

                        Sleep (0x01F4)
                        Notify (AC, 0x80) // Status Change
                        Notify (\_TZ.THM0, 0x80) // Thermal Status Change
                        If (\WXPF)
                        {
                            Acquire (MCPU, 0xFFFF)
                        }

                        PWRS = 0x00
                        If ((\_PR.CFGD & 0x01))
                        {
                            If ((\OSPX || \CPPX))
                            {
                                \PNTF (0x80)
                            }
                        }

                        If (\WXPF)
                        {
                            Sleep (0x64)
                        }

                        If (\OSC4)
                        {
                            \PNTF (0x81)
                        }

                        If (\WXPF)
                        {
                            Release (MCPU)
                        }

                        \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x6040)
                        ATMC ()
                    }

                    Method (_Q2A, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        ADBG ("LIDO")
                        \VCMS (0x01, \_SB.LID._LID ())
                        ADBG ("LIDO0")
                        \_SB.PCI0.LPC.EC.HKEY.DYTC (0x000F4001)
                        ADBG ("LIDO1")
                        If ((\ILNF == 0x00))
                        {
                            If (\IOST)
                            {
                                If (!\ISOC (0x00))
                                {
                                    \IOST = 0x00
                                    \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x60D0)
                                }
                            }

                            \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x5002)
                            If ((\PLUX == 0x00))
                            {
                                If (VIGD)
                                {
                                    \_SB.PCI0.GFX0.VLOC (0x01)
                                }

                                Notify (\_SB.LID, 0x80) // Status Change
                            }
                        }
                    }

                    Method (_Q2B, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        ADBG ("LIDC")
                        \UCMS (0x0D)
                        \VCMS (0x01, \_SB.LID._LID ())
                        If ((\_SB.PCI0.LPC.EC.AC._PSR () == 0x00))
                        {
                            ADBG ("LIDC0")
                            \_SB.PCI0.LPC.EC.HKEY.DYTC (0x001F4001)
                            ADBG ("LIDC1")
                        }

                        If ((\ILNF == 0x00))
                        {
                            If ((\IOEN && !\IOST))
                            {
                                If (!\ISOC (0x01))
                                {
                                    \IOST = 0x01
                                    \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x60D0)
                                }
                            }

                            \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x5001)
                            If ((\PLUX == 0x00))
                            {
                                If (VIGD)
                                {
                                    \_SB.PCI0.GFX0.VLOC (0x00)
                                }

                                Notify (\_SB.LID, 0x80) // Status Change
                            }
                        }
                    }

                    Method (_Q3D, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                    }

                    Method (_Q48, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        If ((\_PR.CFGD & 0x01))
                        {
                            If ((\OSPX || \CPPX))
                            {
                                \PNTF (0x80)
                            }
                            Else
                            {
                                \STEP (0x04)
                            }

                            \_SB.PCI0.LPC.EC.CALM = 0x01
                        }
                    }

                    Method (_Q49, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        If ((\_PR.CFGD & 0x01))
                        {
                            If ((\OSPX || \CPPX))
                            {
                                \PNTF (0x80)
                            }
                            Else
                            {
                                \STEP (0x05)
                            }
                        }
                    }

                    Method (_Q7F, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        Fatal (0x01, 0x80010000, 0x4B01)
                    }

                    Method (_Q4E, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x6011)
                    }

                    Method (_Q4F, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x6012)
                    }

                    Method (_Q46, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x6012)
                    }

                    Method (_Q22, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        CLPM ()
                        If (HB0A)
                        {
                            Notify (BAT0, 0x80) // Status Change
                        }

                        If (HB1A)
                        {
                            Notify (BAT1, 0x80) // Status Change
                        }
                    }

                    Method (_Q4A, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        CLPM ()
                        Notify (BAT0, 0x81) // Information Change
                    }

                    Method (_Q4B, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        CLPM ()
                        Notify (BAT0, 0x80) // Status Change
                    }

                    Method (_Q4D, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        CLPM ()
                        If (\BT2T)
                        {
                            If ((^BAT1.SBLI == 0x01))
                            {
                                Sleep (0x0A)
                                If ((HB1A && (SLUL == 0x00)))
                                {
                                    ^BAT1.XB1S = 0x01
                                    Notify (\_SB.PCI0.LPC.EC.BAT1, 0x01) // Device Check
                                }
                            }
                            ElseIf ((SLUL == 0x01))
                            {
                                ^BAT1.XB1S = 0x00
                                Notify (\_SB.PCI0.LPC.EC.BAT1, 0x03) // Eject Request
                            }
                        }

                        If ((^BAT1.B1ST & ^BAT1.XB1S))
                        {
                            Notify (BAT1, 0x80) // Status Change
                        }
                    }

                    Method (_Q24, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        CLPM ()
                        Notify (BAT0, 0x80) // Status Change
                    }

                    Method (_Q25, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                    {
                        If ((^BAT1.B1ST & ^BAT1.XB1S))
                        {
                            CLPM ()
                            Notify (BAT1, 0x80) // Status Change
                        }
                    }

                    Method (BATW, 1, NotSerialized)
                    {
                        If (\BT2T)
                        {
                            Local0 = \_SB.PCI0.LPC.EC.BAT1.XB1S
                            If ((HB1A && !SLUL))
                            {
                                Local1 = 0x01
                            }
                            Else
                            {
                                Local1 = 0x00
                            }

                            If ((Local0 ^ Local1))
                            {
                                \_SB.PCI0.LPC.EC.BAT1.XB1S = Local1
                                Notify (\_SB.PCI0.LPC.EC.BAT1, 0x01) // Device Check
                            }
                        }
                    }

                    Field (ECOR, ByteAcc, NoLock, Preserve)
                    {
                        Offset (0xA0),
                        SBRC,   16,
                        SBFC,   16,
                        SBAE,   16,
                        SBRS,   16,
                        SBAC,   16,
                        SBVO,   16,
                        SBAF,   16,
                        SBBS,   16
                    }

                    Field (ECOR, ByteAcc, NoLock, Preserve)
                    {
                        Offset (0xA0),
                        SBBM,   16,
                        SBMD,   16,
                        SBCC,   16
                    }

                    Field (ECOR, ByteAcc, NoLock, Preserve)
                    {
                        Offset (0xA0),
                        SBDC,   16,
                        SBDV,   16,
                        SBOM,   16,
                        SBSI,   16,
                        SBDT,   16,
                        SBSN,   16
                    }

                    Field (ECOR, ByteAcc, NoLock, Preserve)
                    {
                        Offset (0xA0),
                        SBCH,   32
                    }

                    Field (ECOR, ByteAcc, NoLock, Preserve)
                    {
                        Offset (0xA0),
                        SBMN,   128
                    }

                    Field (ECOR, ByteAcc, NoLock, Preserve)
                    {
                        Offset (0xA0),
                        SBDN,   128
                    }

                    Mutex (BATM, 0x00)
                    Method (GBIF, 3, NotSerialized)
                    {
                        Acquire (BATM, 0xFFFF)
                        If (Arg2)
                        {
                            HIID = (Arg0 | 0x01)
                            Local7 = SBBM /* \_SB_.PCI0.LPC_.EC__.SBBM */
                            Local7 >>= 0x0F
                            Arg1 [0x00] = (Local7 ^ 0x01)
                            HIID = Arg0
                            If (Local7)
                            {
                                Local1 = (SBFC * 0x0A)
                            }
                            Else
                            {
                                Local1 = SBFC /* \_SB_.PCI0.LPC_.EC__.SBFC */
                            }

                            Arg1 [0x02] = Local1
                            HIID = (Arg0 | 0x02)
                            If (Local7)
                            {
                                Local0 = (SBDC * 0x0A)
                            }
                            Else
                            {
                                Local0 = SBDC /* \_SB_.PCI0.LPC_.EC__.SBDC */
                            }

                            Arg1 [0x01] = Local0
                            Divide (Local1, 0x14, Local2, Arg1 [0x05])
                            If (Local7)
                            {
                                Arg1 [0x06] = 0xC8
                            }
                            ElseIf (SBDV)
                            {
                                Divide (0x00030D40, SBDV, Local2, Arg1 [0x06])
                            }
                            Else
                            {
                                Arg1 [0x06] = 0x00
                            }

                            Arg1 [0x04] = SBDV /* \_SB_.PCI0.LPC_.EC__.SBDV */
                            Local0 = SBSN /* \_SB_.PCI0.LPC_.EC__.SBSN */
                            Name (SERN, Buffer (0x06)
                            {
                                "     "
                            })
                            Local2 = 0x04
                            While (Local0)
                            {
                                Divide (Local0, 0x0A, Local1, Local0)
                                SERN [Local2] = (Local1 + 0x30)
                                Local2--
                            }

                            Arg1 [0x0A] = SERN /* \_SB_.PCI0.LPC_.EC__.GBIF.SERN */
                            HIID = (Arg0 | 0x06)
                            Arg1 [0x09] = SBDN /* \_SB_.PCI0.LPC_.EC__.SBDN */
                            HIID = (Arg0 | 0x04)
                            Name (BTYP, Buffer (0x05)
                            {
                                 0x00, 0x00, 0x00, 0x00, 0x00                     // .....
                            })
                            BTYP = SBCH /* \_SB_.PCI0.LPC_.EC__.SBCH */
                            Arg1 [0x0B] = BTYP /* \_SB_.PCI0.LPC_.EC__.GBIF.BTYP */
                            HIID = (Arg0 | 0x05)
                            Arg1 [0x0C] = SBMN /* \_SB_.PCI0.LPC_.EC__.SBMN */
                        }
                        Else
                        {
                            Arg1 [0x01] = 0xFFFFFFFF
                            Arg1 [0x05] = 0x00
                            Arg1 [0x06] = 0x00
                            Arg1 [0x02] = 0xFFFFFFFF
                        }

                        Release (BATM)
                        Return (Arg1)
                    }

                    Name (B0I0, 0x00)
                    Name (B0I1, 0x00)
                    Name (B0I2, 0x00)
                    Name (B0I3, 0x00)
                    Name (B1I0, 0x00)
                    Name (B1I1, 0x00)
                    Name (B1I2, 0x00)
                    Name (B1I3, 0x00)
                    Method (GBST, 4, NotSerialized)
                    {
                        Acquire (BATM, 0xFFFF)
                        If ((Arg1 & 0x20))
                        {
                            Local0 = 0x02
                        }
                        ElseIf ((Arg1 & 0x40))
                        {
                            Local0 = 0x01
                        }
                        Else
                        {
                            Local0 = 0x00
                        }

                        If ((Arg1 & 0x07)){}
                        Else
                        {
                            Local0 |= 0x04
                        }

                        If (((Arg1 & 0x07) == 0x07))
                        {
                            Local0 = 0x04
                            Local1 = 0x00
                            Local2 = 0x00
                            Local3 = 0x00
                        }
                        Else
                        {
                            HIID = Arg0
                            Local3 = SBVO /* \_SB_.PCI0.LPC_.EC__.SBVO */
                            If (Arg2)
                            {
                                Local2 = (SBRC * 0x0A)
                            }
                            Else
                            {
                                Local2 = SBRC /* \_SB_.PCI0.LPC_.EC__.SBRC */
                            }

                            Local1 = SBAC /* \_SB_.PCI0.LPC_.EC__.SBAC */
                            If ((Local1 >= 0x8000))
                            {
                                If ((Local0 & 0x01))
                                {
                                    Local1 = (0x00010000 - Local1)
                                }
                                Else
                                {
                                    Local1 = 0x00
                                }
                            }
                            ElseIf (!(Local0 & 0x02))
                            {
                                Local1 = 0x00
                            }

                            If (Arg2)
                            {
                                Local1 *= Local3
                                Divide (Local1, 0x03E8, Local7, Local1)
                            }
                        }

                        Local5 = (0x01 << (Arg0 >> 0x04))
                        BSWA |= BSWR /* \_SB_.PCI0.LPC_.EC__.BSWR */
                        If (((\_SB.PCI0.LPC.EC.BSWA & Local5) == 0x00))
                        {
                            Arg3 [0x00] = Local0
                            Arg3 [0x01] = Local1
                            Arg3 [0x02] = Local2
                            Arg3 [0x03] = Local3
                            If ((Arg0 == 0x00))
                            {
                                B0I0 = Local0
                                B0I1 = Local1
                                B0I2 = Local2
                                B0I3 = Local3
                            }
                            Else
                            {
                                B1I0 = Local0
                                B1I1 = Local1
                                B1I2 = Local2
                                B1I3 = Local3
                            }
                        }
                        Else
                        {
                            If (\_SB.PCI0.LPC.EC.AC._PSR ())
                            {
                                If ((Arg0 == 0x00))
                                {
                                    Arg3 [0x00] = B0I0 /* \_SB_.PCI0.LPC_.EC__.B0I0 */
                                    Arg3 [0x01] = B0I1 /* \_SB_.PCI0.LPC_.EC__.B0I1 */
                                    Arg3 [0x02] = B0I2 /* \_SB_.PCI0.LPC_.EC__.B0I2 */
                                    Arg3 [0x03] = B0I3 /* \_SB_.PCI0.LPC_.EC__.B0I3 */
                                }
                                Else
                                {
                                    Arg3 [0x00] = B1I0 /* \_SB_.PCI0.LPC_.EC__.B1I0 */
                                    Arg3 [0x01] = B1I1 /* \_SB_.PCI0.LPC_.EC__.B1I1 */
                                    Arg3 [0x02] = B1I2 /* \_SB_.PCI0.LPC_.EC__.B1I2 */
                                    Arg3 [0x03] = B1I3 /* \_SB_.PCI0.LPC_.EC__.B1I3 */
                                }
                            }
                            Else
                            {
                                Arg3 [0x00] = Local0
                                Arg3 [0x01] = Local1
                                Arg3 [0x02] = Local2
                                Arg3 [0x03] = Local3
                            }

                            If ((((Local0 & 0x04) == 0x00) && ((Local2 > 0x00) &&
                                (Local3 > 0x00))))
                            {
                                BSWA &= ~Local5
                                Arg3 [0x00] = Local0
                                Arg3 [0x01] = Local1
                                Arg3 [0x02] = Local2
                                Arg3 [0x03] = Local3
                            }
                        }

                        Release (BATM)
                        Return (Arg3)
                    }

                    Name (BSWR, 0x00)
                    Name (BSWA, 0x00)
                    Device (BAT0)
                    {
                        Name (_HID, EisaId ("PNP0C0A") /* Control Method Battery */)  // _HID: Hardware ID
                        Name (_UID, 0x00)  // _UID: Unique ID
                        Name (_PCL, Package (0x01)  // _PCL: Power Consumer List
                        {
                            \_SB
                        })
                        Name (B0ST, 0x00)
                        Name (BT0I, Package (0x0D)
                        {
                            0x00,
                            0xFFFFFFFF,
                            0xFFFFFFFF,
                            0x01,
                            0x2A30,
                            0x00,
                            0x00,
                            0x01,
                            0x01,
                            "",
                            "",
                            "",
                            ""
                        })
                        Name (BT0P, Package (0x04){})
                        Method (_STA, 0, NotSerialized)  // _STA: Status
                        {
                            If (\H8DR)
                            {
                                B0ST = HB0A /* \_SB_.PCI0.LPC_.EC__.HB0A */
                            }
                            ElseIf ((\RBEC (0x38) & 0x80))
                            {
                                B0ST = 0x01
                            }
                            Else
                            {
                                B0ST = 0x00
                            }

                            If (B0ST)
                            {
                                Return (0x1F)
                            }
                            Else
                            {
                                Return (0x0F)
                            }
                        }

                        Method (_BIF, 0, NotSerialized)  // _BIF: Battery Information
                        {
                            Local7 = 0x00
                            Local6 = 0x0A
                            While ((!Local7 && Local6))
                            {
                                If (HB0A)
                                {
                                    If (((HB0S & 0x07) == 0x07))
                                    {
                                        Sleep (0x03E8)
                                        Local6--
                                    }
                                    Else
                                    {
                                        Local7 = 0x01
                                    }
                                }
                                Else
                                {
                                    Local6 = 0x00
                                }
                            }

                            Return (GBIF (0x00, BT0I, Local7))
                        }

                        Method (_BST, 0, NotSerialized)  // _BST: Battery Status
                        {
                            Local0 = (DerefOf (BT0I [0x00]) ^ 0x01)
                            Return (GBST (0x00, HB0S, Local0, BT0P))
                        }

                        Method (_BTP, 1, NotSerialized)  // _BTP: Battery Trip Point
                        {
                            HAM4 &= 0xEF
                            If (Arg0)
                            {
                                Local1 = Arg0
                                If (!DerefOf (BT0I [0x00]))
                                {
                                    Divide (Local1, 0x0A, Local0, Local1)
                                }

                                HT0L = (Local1 & 0xFF)
                                HT0H = ((Local1 >> 0x08) & 0xFF)
                                HAM4 |= 0x10
                            }
                        }
                    }

                    Device (BAT1)
                    {
                        Name (_HID, EisaId ("PNP0C0A") /* Control Method Battery */)  // _HID: Hardware ID
                        Name (_UID, 0x01)  // _UID: Unique ID
                        Name (_PCL, Package (0x01)  // _PCL: Power Consumer List
                        {
                            \_SB
                        })
                        Name (B1ST, 0x00)
                        Name (SBLI, 0x01)
                        Name (XB1S, 0x00)
                        Name (BT1I, Package (0x0D)
                        {
                            0x00,
                            0xFFFFFFFF,
                            0xFFFFFFFF,
                            0x01,
                            0x2A30,
                            0x00,
                            0x00,
                            0x01,
                            0x01,
                            "",
                            "",
                            "",
                            ""
                        })
                        Name (BT1P, Package (0x04){})
                        Method (_STA, 0, NotSerialized)  // _STA: Status
                        {
                            If (\H8DR)
                            {
                                If (HB1A)
                                {
                                    B1ST = 0x01
                                    If (\BT2T)
                                    {
                                        If (SLUL)
                                        {
                                            SBLI = 0x01
                                            XB1S = 0x00
                                        }
                                        Else
                                        {
                                            SBLI = 0x00
                                            XB1S = 0x01
                                        }
                                    }
                                    Else
                                    {
                                        XB1S = 0x01
                                    }
                                }
                                Else
                                {
                                    B1ST = 0x00
                                    If (\BT2T)
                                    {
                                        SBLI = 0x01
                                        XB1S = 0x00
                                    }
                                    Else
                                    {
                                        XB1S = 0x00
                                    }
                                }
                            }
                            ElseIf ((\RBEC (0x39) & 0x80))
                            {
                                B1ST = 0x01
                                If (\BT2T)
                                {
                                    If ((\RBEC (0x49) & 0x01))
                                    {
                                        SBLI = 0x01
                                        XB1S = 0x00
                                    }
                                    Else
                                    {
                                        SBLI = 0x00
                                        XB1S = 0x01
                                    }
                                }
                                Else
                                {
                                    XB1S = 0x01
                                }
                            }
                            Else
                            {
                                B1ST = 0x00
                                If (\BT2T)
                                {
                                    SBLI = 0x01
                                    XB1S = 0x00
                                }
                                Else
                                {
                                    XB1S = 0x00
                                }
                            }

                            If (B1ST)
                            {
                                If (XB1S)
                                {
                                    Return (0x1F)
                                }
                                ElseIf (\WNTF)
                                {
                                    Return (0x00)
                                }
                                Else
                                {
                                    Return (0x1F)
                                }
                            }
                            ElseIf (\WNTF)
                            {
                                Return (0x00)
                            }
                            Else
                            {
                                Return (0x0F)
                            }
                        }

                        Method (_BIF, 0, NotSerialized)  // _BIF: Battery Information
                        {
                            Local7 = 0x00
                            Local6 = 0x0A
                            While ((!Local7 && Local6))
                            {
                                If (HB1A)
                                {
                                    If (((HB1S & 0x07) == 0x07))
                                    {
                                        Sleep (0x03E8)
                                        Local6--
                                    }
                                    Else
                                    {
                                        Local7 = 0x01
                                    }
                                }
                                Else
                                {
                                    Local6 = 0x00
                                }
                            }

                            Return (GBIF (0x10, BT1I, Local7))
                        }

                        Method (_BST, 0, NotSerialized)  // _BST: Battery Status
                        {
                            Local0 = (DerefOf (BT1I [0x00]) ^ 0x01)
                            Return (GBST (0x10, HB1S, Local0, BT1P))
                        }

                        Method (_BTP, 1, NotSerialized)  // _BTP: Battery Trip Point
                        {
                            HAM4 &= 0xDF
                            If (Arg0)
                            {
                                Local1 = Arg0
                                If (!DerefOf (BT1I [0x00]))
                                {
                                    Divide (Local1, 0x0A, Local0, Local1)
                                }

                                HT1L = (Local1 & 0xFF)
                                HT1H = ((Local1 >> 0x08) & 0xFF)
                                HAM4 |= 0x20
                            }
                        }
                    }

                    Device (AC)
                    {
                        Name (_HID, "ACPI0003" /* Power Source Device */)  // _HID: Hardware ID
                        Name (_UID, 0x00)  // _UID: Unique ID
                        Name (_PCL, Package (0x01)  // _PCL: Power Consumer List
                        {
                            \_SB
                        })
                        Method (_PSR, 0, NotSerialized)  // _PSR: Power Source
                        {
                            If (\H8DR)
                            {
                                Return (HPAC) /* \_SB_.PCI0.LPC_.EC__.HPAC */
                            }
                            ElseIf ((\RBEC (0x46) & 0x10))
                            {
                                Return (0x01)
                            }
                            Else
                            {
                                Return (0x00)
                            }
                        }

                        Method (_STA, 0, NotSerialized)  // _STA: Status
                        {
                            Return (0x0F)
                        }
                    }

                    Device (HKEY)
                    {
                        Name (_HID, EisaId ("LEN0068"))  // _HID: Hardware ID
                        Method (_STA, 0, NotSerialized)  // _STA: Status
                        {
                            Return (0x0F)
                        }

                        Method (_INI, 0, NotSerialized)  // _INI: Initialize
                        {
                            ADBG ("_INI0")
                            \_SB.PCI0.LPC.EC.HKEY.ANGN = 0x00
                            \_SB.PCI0.LPC.EC.HKEY.DYTC (0x000F0001)
                            ADBG ("_INI1")
                        }

                        Method (MHKV, 0, NotSerialized)
                        {
                            Return (0x0100)
                        }

                        Name (DHKC, 0x00)
                        Name (DHKB, 0x01)
                        Name (DHKH, 0x00)
                        Name (DHKW, 0x00)
                        Name (DHKS, 0x00)
                        Name (DHKD, 0x00)
                        Name (DHKN, 0x0808)
                        Name (DHKT, 0x00)
                        Name (DHWW, 0x00)
                        Mutex (XDHK, 0x00)
                        Method (MHKA, 0, NotSerialized)
                        {
                            Return (0xFFFFFFFB)
                        }

                        Method (MHKN, 0, NotSerialized)
                        {
                            Return (DHKN) /* \_SB_.PCI0.LPC_.EC__.HKEY.DHKN */
                        }

                        Method (MHKK, 1, NotSerialized)
                        {
                            If (DHKC)
                            {
                                Return ((DHKN & Arg0))
                            }
                            Else
                            {
                                Return (Zero)
                            }
                        }

                        Method (MHKM, 2, NotSerialized)
                        {
                            Acquire (XDHK, 0xFFFF)
                            If ((Arg0 > 0x20))
                            {
                                Noop
                            }
                            Else
                            {
                                Local0 = (One << Arg0--)
                                If ((Local0 & 0xFFFFFFFB))
                                {
                                    If (Arg1)
                                    {
                                        DHKN |= Local0 /* \_SB_.PCI0.LPC_.EC__.HKEY.DHKN */
                                    }
                                    Else
                                    {
                                        DHKN &= (Local0 ^ 0xFFFFFFFF)
                                    }
                                }
                                Else
                                {
                                    Noop
                                }
                            }

                            Release (XDHK)
                        }

                        Method (MHKS, 0, NotSerialized)
                        {
                            Notify (\_SB.SLPB, 0x80) // Status Change
                        }

                        Method (MHKC, 1, NotSerialized)
                        {
                            DHKC = Arg0
                        }

                        Method (MHKP, 0, NotSerialized)
                        {
                            Acquire (XDHK, 0xFFFF)
                            If (DHWW)
                            {
                                Local1 = DHWW /* \_SB_.PCI0.LPC_.EC__.HKEY.DHWW */
                                DHWW = Zero
                            }
                            ElseIf (DHKW)
                            {
                                Local1 = DHKW /* \_SB_.PCI0.LPC_.EC__.HKEY.DHKW */
                                DHKW = Zero
                            }
                            ElseIf (DHKD)
                            {
                                Local1 = DHKD /* \_SB_.PCI0.LPC_.EC__.HKEY.DHKD */
                                DHKD = Zero
                            }
                            ElseIf (DHKS)
                            {
                                Local1 = DHKS /* \_SB_.PCI0.LPC_.EC__.HKEY.DHKS */
                                DHKS = Zero
                            }
                            ElseIf (DHKT)
                            {
                                Local1 = DHKT /* \_SB_.PCI0.LPC_.EC__.HKEY.DHKT */
                                DHKT = Zero
                            }
                            Else
                            {
                                Local1 = DHKH /* \_SB_.PCI0.LPC_.EC__.HKEY.DHKH */
                                DHKH = Zero
                            }

                            Release (XDHK)
                            Return (Local1)
                        }

                        Method (MHKE, 1, Serialized)
                        {
                            DHKB = Arg0
                            Acquire (XDHK, 0xFFFF)
                            DHKH = Zero
                            DHKW = Zero
                            DHKS = Zero
                            DHKD = Zero
                            DHKT = Zero
                            DHWW = Zero
                            Release (XDHK)
                        }

                        Method (MHKQ, 1, Serialized)
                        {
                            If (DHKB)
                            {
                                If (DHKC)
                                {
                                    Acquire (XDHK, 0xFFFF)
                                    If ((Arg0 < 0x1000)){}
                                    ElseIf ((Arg0 < 0x2000))
                                    {
                                        DHKH = Arg0
                                    }
                                    ElseIf ((Arg0 < 0x3000))
                                    {
                                        DHKW = Arg0
                                    }
                                    ElseIf ((Arg0 < 0x4000))
                                    {
                                        DHKS = Arg0
                                    }
                                    ElseIf ((Arg0 < 0x5000))
                                    {
                                        DHKD = Arg0
                                    }
                                    ElseIf ((Arg0 < 0x6000))
                                    {
                                        DHKH = Arg0
                                    }
                                    ElseIf ((Arg0 < 0x7000))
                                    {
                                        DHKT = Arg0
                                    }
                                    ElseIf ((Arg0 < 0x8000))
                                    {
                                        DHWW = Arg0
                                    }
                                    Else
                                    {
                                    }

                                    Release (XDHK)
                                    Notify (HKEY, 0x80) // Status Change
                                }
                                ElseIf ((Arg0 == 0x1004))
                                {
                                    Notify (\_SB.SLPB, 0x80) // Status Change
                                }
                            }
                        }

                        Method (MHKB, 1, NotSerialized)
                        {
                            If ((Arg0 == 0x00))
                            {
                                \_SB.PCI0.LPC.EC.BEEP (0x11)
                                \LIDB = 0x00
                            }
                            ElseIf ((Arg0 == 0x01))
                            {
                                \_SB.PCI0.LPC.EC.BEEP (0x10)
                                \LIDB = 0x01
                            }
                            Else
                            {
                            }
                        }

                        Method (MHKD, 0, NotSerialized)
                        {
                            If ((\PLUX == 0x00))
                            {
                                If (VIGD)
                                {
                                    \_SB.PCI0.GFX0.VLOC (0x00)
                                }
                            }
                        }

                        Method (MHQC, 1, NotSerialized)
                        {
                            If (\WNTF)
                            {
                                If ((Arg0 == 0x00))
                                {
                                    Return (\CWAC)
                                }
                                ElseIf ((Arg0 == 0x01))
                                {
                                    Return (\CWAP)
                                }
                                ElseIf ((Arg0 == 0x02))
                                {
                                    Return (\CWAT)
                                }
                                Else
                                {
                                    Noop
                                }
                            }
                            Else
                            {
                                Noop
                            }

                            Return (0x00)
                        }

                        Method (MHGC, 0, NotSerialized)
                        {
                            If (\WNTF)
                            {
                                Acquire (XDHK, 0xFFFF)
                                If (CKC4 (0x00))
                                {
                                    Local0 = 0x03
                                }
                                Else
                                {
                                    Local0 = 0x04
                                }

                                Release (XDHK)
                                Return (Local0)
                            }
                            Else
                            {
                                Noop
                            }

                            Return (0x00)
                        }

                        Method (MHSC, 1, NotSerialized)
                        {
                            If ((\CWAC && \WNTF))
                            {
                                Acquire (XDHK, 0xFFFF)
                                If (\OSC4)
                                {
                                    If ((Arg0 == 0x03))
                                    {
                                        If (!\CWAS)
                                        {
                                            \PNTF (0x81)
                                            \CWAS = 0x01
                                        }
                                    }
                                    ElseIf ((Arg0 == 0x04))
                                    {
                                        If (\CWAS)
                                        {
                                            \PNTF (0x81)
                                            \CWAS = 0x00
                                        }
                                    }
                                    Else
                                    {
                                        Noop
                                    }
                                }

                                Release (XDHK)
                            }
                            Else
                            {
                                Noop
                            }
                        }

                        Method (CKC4, 1, NotSerialized)
                        {
                            Local0 = 0x00
                            If (\C4WR)
                            {
                                If (!\C4AC)
                                {
                                    Local0 |= 0x01
                                }
                            }

                            If (\C4NA)
                            {
                                Local0 |= 0x02
                            }

                            If ((\CWAC && \CWAS))
                            {
                                Local0 |= 0x04
                            }

                            Local0 &= ~Arg0
                            Return (Local0)
                        }

                        Method (MHQE, 0, NotSerialized)
                        {
                            Return (\C4WR)
                        }

                        Method (MHGE, 0, NotSerialized)
                        {
                            If ((\C4WR && \C4AC))
                            {
                                Return (0x04)
                            }

                            Return (0x03)
                        }

                        Method (MHSE, 1, NotSerialized)
                        {
                            If (\C4WR)
                            {
                                Local0 = \C4AC
                                If ((Arg0 == 0x03))
                                {
                                    \C4AC = 0x00
                                    If ((Local0 ^ \C4AC))
                                    {
                                        If (\OSC4)
                                        {
                                            \PNTF (0x81)
                                        }
                                    }
                                }
                                ElseIf ((Arg0 == 0x04))
                                {
                                    \C4AC = 0x01
                                    If ((Local0 ^ \C4AC))
                                    {
                                        If (\OSC4)
                                        {
                                            \PNTF (0x81)
                                        }
                                    }
                                }
                            }
                        }

                        Method (UAWO, 1, NotSerialized)
                        {
                            Return (\UAWS (Arg0))
                        }

                        Method (MLCG, 1, NotSerialized)
                        {
                            Local0 = \KBLS (0x00, 0x00)
                            Return (Local0)
                        }

                        Method (MLCS, 1, NotSerialized)
                        {
                            Local0 = \KBLS (0x01, Arg0)
                            If (!(Local0 & 0x80000000))
                            {
                                If ((Arg0 & 0x00010000))
                                {
                                    \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x6001)
                                }
                                ElseIf (\_SB.PCI0.LPC.EC.HKEY.MHKK (0x00020000))
                                {
                                    \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x1012)
                                }
                            }

                            Return (Local0)
                        }

                        Method (DSSG, 1, NotSerialized)
                        {
                            Local0 = (0x0400 | \PDCI)
                            Return (Local0)
                        }

                        Method (DSSS, 1, NotSerialized)
                        {
                            \PDCI |= Arg0
                        }

                        Method (SBSG, 1, NotSerialized)
                        {
                            Return (\SYBC (0x00, 0x00))
                        }

                        Method (SBSS, 1, NotSerialized)
                        {
                            Return (\SYBC (0x01, Arg0))
                        }

                        Method (PBLG, 1, NotSerialized)
                        {
                            Local0 = \BRLV
                            Local1 = (Local0 | 0x0F00)
                            Return (Local1)
                        }

                        Method (PBLS, 1, NotSerialized)
                        {
                            \BRLV = Arg0
                            If (\VIGD)
                            {
                                \_SB.PCI0.LPC.EC.BRNS ()
                            }
                            Else
                            {
                                \VBRC (\BRLV)
                            }

                            If (!\NBCF)
                            {
                                \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x6050)
                            }

                            Return (0x00)
                        }

                        Method (PMSG, 1, NotSerialized)
                        {
                            Local0 = \PRSM (0x00, 0x00)
                            Return (Local0)
                        }

                        Method (PMSS, 1, NotSerialized)
                        {
                            \PRSM (0x01, Arg0)
                            Return (0x00)
                        }

                        Method (ISSG, 1, NotSerialized)
                        {
                            Local0 = \ISSP
                            If (\ISSP)
                            {
                                Local0 |= 0x01000000
                                Local0 |= (\ISFS << 0x19)
                            }

                            Local0 |= 0x80
                            Local0 |= (\ISCG & 0x30)
                            Return (Local0)
                        }

                        Method (ISSS, 1, NotSerialized)
                        {
                            \ISCG = Arg0
                            Return (0x00)
                        }

                        Method (FFSG, 1, NotSerialized)
                        {
                            Return (0x00)
                        }

                        Method (FFSS, 1, NotSerialized)
                        {
                            Return (0x80000000)
                        }

                        Method (GMKS, 0, NotSerialized)
                        {
                            Return (\FNSC (0x02, 0x00))
                        }

                        Method (SMKS, 1, NotSerialized)
                        {
                            Return (\FNSC (0x03, (Arg0 & 0x00010001)))
                        }

                        Method (INSG, 1, NotSerialized)
                        {
                            Local0 = \IOEN
                            Local0 |= (\IOST << 0x07)
                            Local0 |= (\IOCP << 0x08)
                            Local0 |= 0x10000000
                            Return (Local0)
                        }

                        Method (INSS, 1, NotSerialized)
                        {
                            If ((Arg0 & 0x10000000))
                            {
                                If (\IOCP)
                                {
                                    Local0 = ((Arg0 & 0x80) >> 0x07)
                                    If (!\EZRC (Local0))
                                    {
                                        \IOST = Local0
                                    }
                                }

                                Return (0x00)
                            }

                            If ((\IOCP && (Arg0 & 0x01)))
                            {
                                \IOEN = 0x01
                            }
                            Else
                            {
                                \IOEN = 0x00
                                If (\IOST)
                                {
                                    If (!\ISOC (0x00))
                                    {
                                        \IOST = 0x00
                                    }
                                }
                            }

                            Return (0x00)
                        }
                    }

                    Scope (\_SB.PCI0.LPC.EC.HKEY)
                    {
                        Name (INDV, 0x00)
                        Method (MHQI, 0, NotSerialized)
                        {
                            If ((\IPMS & 0x01))
                            {
                                INDV |= 0x01
                            }

                            If ((\IPMS & 0x02))
                            {
                                INDV |= 0x02
                            }

                            If ((\IPMS & 0x04))
                            {
                                INDV |= 0x0100
                            }

                            If ((\IPMS & 0x08))
                            {
                                INDV |= 0x0200
                            }

                            If ((\IPMS & 0x10))
                            {
                                INDV |= 0x04
                            }

                            Return (INDV) /* \_SB_.PCI0.LPC_.EC__.HKEY.INDV */
                        }

                        Method (MHGI, 1, NotSerialized)
                        {
                            Name (RETB, Buffer (0x10){})
                            CreateByteField (RETB, 0x00, MHGS)
                            Local0 = (0x01 << Arg0)
                            If ((INDV & Local0))
                            {
                                If ((Arg0 == 0x00))
                                {
                                    CreateField (RETB, 0x08, 0x78, BRBU)
                                    BRBU = \IPMB
                                    MHGS = 0x10
                                }
                                ElseIf ((Arg0 == 0x01))
                                {
                                    CreateField (RETB, 0x08, 0x18, RRBU)
                                    RRBU = \IPMR
                                    MHGS = 0x04
                                }
                                ElseIf ((Arg0 == 0x08))
                                {
                                    CreateField (RETB, 0x10, 0x18, ODBU)
                                    CreateByteField (RETB, 0x01, MHGZ)
                                    ODBU = \IPMO
                                    If (((^^BSTS == 0x00) && (^^BDEV == 0x03)))
                                    {
                                        MHGZ |= 0x01 /* \_SB_.PCI0.LPC_.EC__.HKEY.MHGI.MHGZ */
                                        MHGZ |= 0x02 /* \_SB_.PCI0.LPC_.EC__.HKEY.MHGI.MHGZ */
                                    }

                                    MHGS = 0x05
                                }
                                ElseIf ((Arg0 == 0x09))
                                {
                                    CreateField (RETB, 0x10, 0x08, AUBU)
                                    AUBU = \IPMA
                                    RETB [0x01] = 0x01
                                    MHGS = 0x03
                                }
                                ElseIf ((Arg0 == 0x02))
                                {
                                    Local1 = \VDYN (0x00, 0x00)
                                    RETB [0x02] = (Local1 & 0x0F)
                                    Local1 >>= 0x04
                                    RETB [0x01] = (Local1 & 0x0F)
                                    MHGS = 0x03
                                }
                            }

                            Return (RETB) /* \_SB_.PCI0.LPC_.EC__.HKEY.MHGI.RETB */
                        }

                        Method (MHSI, 2, NotSerialized)
                        {
                            Local0 = (0x01 << Arg0)
                            If ((INDV & Local0))
                            {
                                If ((Arg0 == 0x08))
                                {
                                    If (Arg1)
                                    {
                                        If (\H8DR)
                                        {
                                            Local1 = ^^HPBU /* \_SB_.PCI0.LPC_.EC__.HPBU */
                                        }
                                        Else
                                        {
                                            Local1 = (\RBEC (0x47) & 0x01)
                                        }

                                        If (!Local1)
                                        {
                                            ^^BDEV = ^^BGID (0x00)
                                            ^^NBIN (Local1)
                                        }
                                    }
                                }
                                ElseIf ((Arg0 == 0x02))
                                {
                                    \VDYN (0x01, Arg1)
                                }
                            }
                        }
                    }

                    Scope (\_SB.PCI0.LPC.EC)
                    {
                        Method (_Q6A, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                        {
                            If (HDMC)
                            {
                                Noop
                            }
                            ElseIf (\_SB.PCI0.LPC.EC.HKEY.MHKK (0x04000000))
                            {
                                \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x101B)
                            }
                        }
                    }

                    Scope (\_SB.PCI0.LPC.EC.HKEY)
                    {
                        Method (MMTG, 0, NotSerialized)
                        {
                            Local0 = 0x0101
                            If (HDMC)
                            {
                                Local0 |= 0x00010000
                            }

                            Return (Local0)
                        }

                        Method (MMTS, 1, NotSerialized)
                        {
                            If (HDMC)
                            {
                                Noop
                            }
                            ElseIf ((Arg0 == 0x02))
                            {
                                \_SB.PCI0.LPC.EC.LED (0x0E, 0x80)
                            }
                            ElseIf ((Arg0 == 0x03))
                            {
                                \_SB.PCI0.LPC.EC.LED (0x0E, 0xC0)
                            }
                            Else
                            {
                                \_SB.PCI0.LPC.EC.LED (0x0E, 0x00)
                            }
                        }
                    }

                    Scope (\_SB.PCI0.LPC.EC.HKEY)
                    {
                        Method (PWMC, 0, NotSerialized)
                        {
                            Return (0x01)
                        }

                        Method (PWMG, 0, NotSerialized)
                        {
                            Local0 = \_SB.PCI0.LPC.EC.PWMH
                            Local0 <<= 0x08
                            Local0 |= \_SB.PCI0.LPC.EC.PWML
                            Return (Local0)
                        }
                    }

                    Scope (\_SB.PCI0.LPC.EC)
                    {
                        Method (_Q45, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                        {
                            If (DOCD)
                            {
                                Sleep (0x64)
                                \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x4010)
                                Notify (\_SB.PCI0.XHCI.URTH.HSP3, 0x09) // Device PLD Check
                                Notify (\_SB.PCI0.XHCI.URTH.SSP3, 0x09) // Device PLD Check
                            }
                            Else
                            {
                                Sleep (0x64)
                                \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x4011)
                                Notify (\_SB.PCI0.XHCI.URTH.HSP3, 0x09) // Device PLD Check
                                Notify (\_SB.PCI0.XHCI.URTH.SSP3, 0x09) // Device PLD Check
                            }
                        }

                        Method (DKID, 0, NotSerialized)
                        {
                            Local0 = \_SB.PCI0.LPC.DOI0
                            Local1 = \_SB.PCI0.LPC.DOI1
                            Local2 = \_SB.PCI0.LPC.DOI2
                            Local3 = \_SB.PCI0.LPC.DOI3
                            Local0 |= (Local1 << 0x01)
                            Local0 |= (Local2 << 0x02)
                            Local0 |= (Local3 << 0x03)
                            Return (Local0)
                        }
                    }

                    Scope (\_SB.PCI0.LPC.EC.HKEY)
                    {
                        Method (GDKS, 0, NotSerialized)
                        {
                            Local0 = 0x00
                            If ((\_SB.PCI0.LPC.EC.DOCD == 0x01))
                            {
                                Local0 |= 0x01
                                Local1 = \_SB.PCI0.LPC.EC.DKID ()
                                Local1 <<= 0x08
                                Local0 |= Local1
                            }

                            Local0 |= 0x00010000
                            Return (Local0)
                        }
                    }

                    Scope (\_SB.PCI0.LPC.EC)
                    {
                        Method (_Q3F, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                        {
                            \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x6000)
                        }

                        Method (_Q74, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
                        {
                            \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x6060)
                        }
                    }

                    Scope (\_SB.PCI0.LPC.EC.HKEY)
                    {
                        Method (NUMG, 0, NotSerialized)
                        {
                            Local0 = 0x00
                            Return (Local0)
                        }
                    }
                }
            }

            Device (PEG0)
            {
                Name (_ADR, 0x00010000)  // _ADR: Address
                Name (_S3D, 0x03)  // _S3D: S3 Device State
                Name (RID, 0x00)
                Device (PEGP)
                {
                    Name (_ADR, 0x00)  // _ADR: Address
                }
            }

            Device (PEG1)
            {
                Name (_ADR, 0x00010001)  // _ADR: Address
                Device (PEGP)
                {
                    Name (_ADR, 0x00)  // _ADR: Address
                }
            }

            Device (PEG2)
            {
                Name (_ADR, 0x00010002)  // _ADR: Address
                Device (PEGP)
                {
                    Name (_ADR, 0x00)  // _ADR: Address
                }
            }

            Device (GFX0)
            {
                Name (_ADR, 0x00020000)  // _ADR: Address
                Name (RID, 0x00)
            }

            Device (IGBE)
            {
                Name (_ADR, 0x001F0006)  // _ADR: Address
                Name (_S3D, 0x03)  // _S3D: S3 Device State
                Name (RID, 0x00)
                Method (_DSM, 4, Serialized)  // _DSM: Device-Specific Method
                {
                    If (PCIC (Arg0))
                    {
                        Return (PCID (Arg0, Arg1, Arg2, Arg3))
                    }

                    Return (0x00)
                }

                Name (_PRW, Package (0x02)  // _PRW: Power Resources for Wake
                {
                    0x6D,
                    0x04
                })
            }

            Device (EXP1)
            {
                Name (_ADR, 0x001C0000)  // _ADR: Address
                Name (RID, 0x00)
                Method (_INI, 0, NotSerialized)  // _INI: Initialize
                {
                    LTRN = LTR1 /* \LTR1 */
                    LMSL = PML1 /* \PML1 */
                    LNSL = PNL1 /* \PNL1 */
                    OBFN = OBF1 /* \OBF1 */
                }

                Name (LPRT, Package (0x04)
                {
                    Package (0x04)
                    {
                        0xFFFF,
                        0x00,
                        \_SB.LNKA,
                        0x00
                    },

                    Package (0x04)
                    {
                        0xFFFF,
                        0x01,
                        \_SB.LNKB,
                        0x00
                    },

                    Package (0x04)
                    {
                        0xFFFF,
                        0x02,
                        \_SB.LNKC,
                        0x00
                    },

                    Package (0x04)
                    {
                        0xFFFF,
                        0x03,
                        \_SB.LNKD,
                        0x00
                    }
                })
                Name (APRT, Package (0x04)
                {
                    Package (0x04)
                    {
                        0xFFFF,
                        0x00,
                        0x00,
                        0x10
                    },

                    Package (0x04)
                    {
                        0xFFFF,
                        0x01,
                        0x00,
                        0x11
                    },

                    Package (0x04)
                    {
                        0xFFFF,
                        0x02,
                        0x00,
                        0x12
                    },

                    Package (0x04)
                    {
                        0xFFFF,
                        0x03,
                        0x00,
                        0x13
                    }
                })
                Method (_PRT, 0, NotSerialized)  // _PRT: PCI Routing Table
                {
                    If (\GPIC)
                    {
                        Return (APRT) /* \_SB_.PCI0.EXP1.APRT */
                    }
                    Else
                    {
                        Return (LPRT) /* \_SB_.PCI0.EXP1.LPRT */
                    }
                }

                OperationRegion (PXCS, PCI_Config, 0x00, 0x0480)
                Field (PXCS, AnyAcc, NoLock, Preserve)
                {
                    VDID,   32,
                    Offset (0x50),
                    L0SE,   1,
                        ,   3,
                    LDIS,   1,
                    Offset (0x51),
                    Offset (0x52),
                        ,   13,
                    LASX,   1,
                    Offset (0x5A),
                    ABPX,   1,
                        ,   2,
                    PDCX,   1,
                        ,   2,
                    PDSX,   1,
                    Offset (0x5B),
                    Offset (0x60),
                    Offset (0x62),
                    PSPX,   1,
                    Offset (0xA4),
                    D3HT,   2,
                    Offset (0xD8),
                        ,   30,
                    HPEX,   1,
                    PMEX,   1,
                    Offset (0xE2),
                        ,   2,
                    L23E,   1,
                    L23R,   1,
                    Offset (0x324),
                        ,   3,
                    LEDM,   1,
                    Offset (0x420),
                        ,   30,
                    DPGE,   1
                }

                Field (PXCS, AnyAcc, NoLock, WriteAsZeros)
                {
                    Offset (0xDC),
                        ,   30,
                    HPSX,   1,
                    PMSX,   1
                }

                Name (LTRV, Package (0x04)
                {
                    0x00,
                    0x00,
                    0x00,
                    0x00
                })
                Method (_DSM, 4, Serialized)  // _DSM: Device-Specific Method
                {
                    If ((Arg0 == ToUUID ("e5c937d0-3553-4d7a-9117-ea4d19c3434d") /* Device Labeling Interface */))
                    {
                        Switch (ToInteger (Arg2))
                        {
                            Case (0x00)
                            {
                                Name (OPTS, Buffer (0x02)
                                {
                                     0x00, 0x00                                       // ..
                                })
                                CreateBitField (OPTS, 0x00, FUN0)
                                CreateBitField (OPTS, 0x04, FUN4)
                                CreateBitField (OPTS, 0x06, FUN6)
                                CreateBitField (OPTS, 0x08, FUN8)
                                CreateBitField (OPTS, 0x09, FUN9)
                                If ((Arg1 >= 0x02))
                                {
                                    FUN0 = 0x01
                                    If (LTRE)
                                    {
                                        FUN6 = 0x01
                                    }

                                    If (OBFF)
                                    {
                                        FUN4 = 0x01
                                    }

                                    If ((ECR1 == 0x01))
                                    {
                                        If ((Arg1 >= 0x03))
                                        {
                                            FUN8 = 0x01
                                            FUN9 = 0x01
                                        }
                                    }
                                }

                                Return (OPTS) /* \_SB_.PCI0.EXP1._DSM.OPTS */
                            }
                            Case (0x04)
                            {
                                If ((Arg1 >= 0x02))
                                {
                                    If (OBFN)
                                    {
                                        Return (Buffer (0x10)
                                        {
                                            /* 0000 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // ........
                                            /* 0008 */  0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00   // ........
                                        })
                                    }
                                    Else
                                    {
                                        Return (Buffer (0x10)
                                        {
                                            /* 0000 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // ........
                                            /* 0008 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00   // ........
                                        })
                                    }
                                }
                            }
                            Case (0x06)
                            {
                                If ((Arg1 >= 0x02))
                                {
                                    If (LTRN)
                                    {
                                        If (((LMSL == 0x00) || (LNSL == 0x00)))
                                        {
                                            If ((PCHS == SPTH))
                                            {
                                                LMSL = 0x0846
                                                LNSL = 0x0846
                                            }
                                            ElseIf ((PCHS == SPTL))
                                            {
                                                LMSL = 0x1003
                                                LNSL = 0x1003
                                            }
                                        }

                                        LTRV [0x00] = ((LMSL >> 0x0A) & 0x07)
                                        LTRV [0x01] = (LMSL & 0x03FF)
                                        LTRV [0x02] = ((LNSL >> 0x0A) & 0x07)
                                        LTRV [0x03] = (LNSL & 0x03FF)
                                        Return (LTRV) /* \_SB_.PCI0.EXP1.LTRV */
                                    }
                                    Else
                                    {
                                        Return (0x00)
                                    }
                                }
                            }
                            Case (0x08)
                            {
                                If ((ECR1 == 0x01))
                                {
                                    If ((Arg1 >= 0x03))
                                    {
                                        Return (0x01)
                                    }
                                }
                            }
                            Case (0x09)
                            {
                                If ((ECR1 == 0x01))
                                {
                                    If ((Arg1 >= 0x03))
                                    {
                                        Return (Package (0x05)
                                        {
                                            0xC350,
                                            Ones,
                                            Ones,
                                            0xC350,
                                            Ones
                                        })
                                    }
                                }
                            }

                        }
                    }

                    Return (Buffer (0x01)
                    {
                         0x00                                             // .
                    })
                }

                Device (PXSX)
                {
                    Name (_ADR, 0x00)  // _ADR: Address
                }

                Method (HPME, 0, Serialized)
                {
                    If (((VDID != 0xFFFFFFFF) && (PMSX == 0x01)))
                    {
                        PMSX = 0x01
                        PSPX = 0x01
                    }
                }
            }

            Device (EXP3)
            {
                Name (_ADR, 0x001C0002)  // _ADR: Address
                Name (RID, 0x00)
                Method (_INI, 0, NotSerialized)  // _INI: Initialize
                {
                    LTRN = LTR3 /* \LTR3 */
                    LMSL = PML3 /* \PML3 */
                    LNSL = PNL3 /* \PNL3 */
                    OBFN = OBF3 /* \OBF3 */
                }

                Name (LPRT, Package (0x04)
                {
                    Package (0x04)
                    {
                        0xFFFF,
                        0x00,
                        \_SB.LNKC,
                        0x00
                    },

                    Package (0x04)
                    {
                        0xFFFF,
                        0x01,
                        \_SB.LNKD,
                        0x00
                    },

                    Package (0x04)
                    {
                        0xFFFF,
                        0x02,
                        \_SB.LNKA,
                        0x00
                    },

                    Package (0x04)
                    {
                        0xFFFF,
                        0x03,
                        \_SB.LNKB,
                        0x00
                    }
                })
                Name (APRT, Package (0x04)
                {
                    Package (0x04)
                    {
                        0xFFFF,
                        0x00,
                        0x00,
                        0x12
                    },

                    Package (0x04)
                    {
                        0xFFFF,
                        0x01,
                        0x00,
                        0x13
                    },

                    Package (0x04)
                    {
                        0xFFFF,
                        0x02,
                        0x00,
                        0x10
                    },

                    Package (0x04)
                    {
                        0xFFFF,
                        0x03,
                        0x00,
                        0x11
                    }
                })
                Method (_PRT, 0, NotSerialized)  // _PRT: PCI Routing Table
                {
                    If (\GPIC)
                    {
                        Return (APRT) /* \_SB_.PCI0.EXP3.APRT */
                    }
                    Else
                    {
                        Return (LPRT) /* \_SB_.PCI0.EXP3.LPRT */
                    }
                }

                OperationRegion (PXCS, PCI_Config, 0x00, 0x0480)
                Field (PXCS, AnyAcc, NoLock, Preserve)
                {
                    VDID,   32,
                    Offset (0x50),
                    L0SE,   1,
                        ,   3,
                    LDIS,   1,
                    Offset (0x51),
                    Offset (0x52),
                        ,   13,
                    LASX,   1,
                    Offset (0x5A),
                    ABPX,   1,
                        ,   2,
                    PDCX,   1,
                        ,   2,
                    PDSX,   1,
                    Offset (0x5B),
                    Offset (0x60),
                    Offset (0x62),
                    PSPX,   1,
                    Offset (0xA4),
                    D3HT,   2,
                    Offset (0xD8),
                        ,   30,
                    HPEX,   1,
                    PMEX,   1,
                    Offset (0xE2),
                        ,   2,
                    L23E,   1,
                    L23R,   1,
                    Offset (0x324),
                        ,   3,
                    LEDM,   1,
                    Offset (0x420),
                        ,   30,
                    DPGE,   1
                }

                Field (PXCS, AnyAcc, NoLock, WriteAsZeros)
                {
                    Offset (0xDC),
                        ,   30,
                    HPSX,   1,
                    PMSX,   1
                }

                Name (LTRV, Package (0x04)
                {
                    0x00,
                    0x00,
                    0x00,
                    0x00
                })
                Method (_DSM, 4, Serialized)  // _DSM: Device-Specific Method
                {
                    If ((Arg0 == ToUUID ("e5c937d0-3553-4d7a-9117-ea4d19c3434d") /* Device Labeling Interface */))
                    {
                        Switch (ToInteger (Arg2))
                        {
                            Case (0x00)
                            {
                                Name (OPTS, Buffer (0x02)
                                {
                                     0x00, 0x00                                       // ..
                                })
                                CreateBitField (OPTS, 0x00, FUN0)
                                CreateBitField (OPTS, 0x04, FUN4)
                                CreateBitField (OPTS, 0x06, FUN6)
                                CreateBitField (OPTS, 0x08, FUN8)
                                CreateBitField (OPTS, 0x09, FUN9)
                                If ((Arg1 >= 0x02))
                                {
                                    FUN0 = 0x01
                                    If (LTRE)
                                    {
                                        FUN6 = 0x01
                                    }

                                    If (OBFF)
                                    {
                                        FUN4 = 0x01
                                    }

                                    If ((ECR1 == 0x01))
                                    {
                                        If ((Arg1 >= 0x03))
                                        {
                                            FUN8 = 0x01
                                            FUN9 = 0x01
                                        }
                                    }
                                }

                                Return (OPTS) /* \_SB_.PCI0.EXP3._DSM.OPTS */
                            }
                            Case (0x04)
                            {
                                If ((Arg1 >= 0x02))
                                {
                                    If (OBFN)
                                    {
                                        Return (Buffer (0x10)
                                        {
                                            /* 0000 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // ........
                                            /* 0008 */  0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00   // ........
                                        })
                                    }
                                    Else
                                    {
                                        Return (Buffer (0x10)
                                        {
                                            /* 0000 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // ........
                                            /* 0008 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00   // ........
                                        })
                                    }
                                }
                            }
                            Case (0x06)
                            {
                                If ((Arg1 >= 0x02))
                                {
                                    If (LTRN)
                                    {
                                        If (((LMSL == 0x00) || (LNSL == 0x00)))
                                        {
                                            If ((PCHS == SPTH))
                                            {
                                                LMSL = 0x0846
                                                LNSL = 0x0846
                                            }
                                            ElseIf ((PCHS == SPTL))
                                            {
                                                LMSL = 0x1003
                                                LNSL = 0x1003
                                            }
                                        }

                                        LTRV [0x00] = ((LMSL >> 0x0A) & 0x07)
                                        LTRV [0x01] = (LMSL & 0x03FF)
                                        LTRV [0x02] = ((LNSL >> 0x0A) & 0x07)
                                        LTRV [0x03] = (LNSL & 0x03FF)
                                        Return (LTRV) /* \_SB_.PCI0.EXP3.LTRV */
                                    }
                                    Else
                                    {
                                        Return (0x00)
                                    }
                                }
                            }
                            Case (0x08)
                            {
                                If ((ECR1 == 0x01))
                                {
                                    If ((Arg1 >= 0x03))
                                    {
                                        Return (0x01)
                                    }
                                }
                            }
                            Case (0x09)
                            {
                                If ((ECR1 == 0x01))
                                {
                                    If ((Arg1 >= 0x03))
                                    {
                                        Return (Package (0x05)
                                        {
                                            0xC350,
                                            Ones,
                                            Ones,
                                            0xC350,
                                            Ones
                                        })
                                    }
                                }
                            }

                        }
                    }

                    Return (Buffer (0x01)
                    {
                         0x00                                             // .
                    })
                }

                Device (PXSX)
                {
                    Name (_ADR, 0x00)  // _ADR: Address
                }

                Method (HPME, 0, Serialized)
                {
                    If (((VDID != 0xFFFFFFFF) && (PMSX == 0x01)))
                    {
                        PMSX = 0x01
                        PSPX = 0x01
                    }
                }
            }

            Device (EXP4)
            {
                Name (_ADR, 0x001C0003)  // _ADR: Address
                Name (RID, 0x00)
                Method (_INI, 0, NotSerialized)  // _INI: Initialize
                {
                    LTRN = LTR4 /* \LTR4 */
                    LMSL = PML4 /* \PML4 */
                    LNSL = PNL4 /* \PNL4 */
                    OBFN = OBF4 /* \OBF4 */
                }

                Name (LPRT, Package (0x04)
                {
                    Package (0x04)
                    {
                        0xFFFF,
                        0x00,
                        \_SB.LNKD,
                        0x00
                    },

                    Package (0x04)
                    {
                        0xFFFF,
                        0x01,
                        \_SB.LNKA,
                        0x00
                    },

                    Package (0x04)
                    {
                        0xFFFF,
                        0x02,
                        \_SB.LNKB,
                        0x00
                    },

                    Package (0x04)
                    {
                        0xFFFF,
                        0x03,
                        \_SB.LNKC,
                        0x00
                    }
                })
                Name (APRT, Package (0x04)
                {
                    Package (0x04)
                    {
                        0xFFFF,
                        0x00,
                        0x00,
                        0x13
                    },

                    Package (0x04)
                    {
                        0xFFFF,
                        0x01,
                        0x00,
                        0x10
                    },

                    Package (0x04)
                    {
                        0xFFFF,
                        0x02,
                        0x00,
                        0x11
                    },

                    Package (0x04)
                    {
                        0xFFFF,
                        0x03,
                        0x00,
                        0x12
                    }
                })
                Method (_PRT, 0, NotSerialized)  // _PRT: PCI Routing Table
                {
                    If (\GPIC)
                    {
                        Return (APRT) /* \_SB_.PCI0.EXP4.APRT */
                    }
                    Else
                    {
                        Return (LPRT) /* \_SB_.PCI0.EXP4.LPRT */
                    }
                }

                OperationRegion (PXCS, PCI_Config, 0x00, 0x0480)
                Field (PXCS, AnyAcc, NoLock, Preserve)
                {
                    VDID,   32,
                    Offset (0x50),
                    L0SE,   1,
                        ,   3,
                    LDIS,   1,
                    Offset (0x51),
                    Offset (0x52),
                        ,   13,
                    LASX,   1,
                    Offset (0x5A),
                    ABPX,   1,
                        ,   2,
                    PDCX,   1,
                        ,   2,
                    PDSX,   1,
                    Offset (0x5B),
                    Offset (0x60),
                    Offset (0x62),
                    PSPX,   1,
                    Offset (0xA4),
                    D3HT,   2,
                    Offset (0xD8),
                        ,   30,
                    HPEX,   1,
                    PMEX,   1,
                    Offset (0xE2),
                        ,   2,
                    L23E,   1,
                    L23R,   1,
                    Offset (0x324),
                        ,   3,
                    LEDM,   1,
                    Offset (0x420),
                        ,   30,
                    DPGE,   1
                }

                Field (PXCS, AnyAcc, NoLock, WriteAsZeros)
                {
                    Offset (0xDC),
                        ,   30,
                    HPSX,   1,
                    PMSX,   1
                }

                Name (LTRV, Package (0x04)
                {
                    0x00,
                    0x00,
                    0x00,
                    0x00
                })
                Method (_DSM, 4, Serialized)  // _DSM: Device-Specific Method
                {
                    If ((Arg0 == ToUUID ("e5c937d0-3553-4d7a-9117-ea4d19c3434d") /* Device Labeling Interface */))
                    {
                        Switch (ToInteger (Arg2))
                        {
                            Case (0x00)
                            {
                                Name (OPTS, Buffer (0x02)
                                {
                                     0x00, 0x00                                       // ..
                                })
                                CreateBitField (OPTS, 0x00, FUN0)
                                CreateBitField (OPTS, 0x04, FUN4)
                                CreateBitField (OPTS, 0x06, FUN6)
                                CreateBitField (OPTS, 0x08, FUN8)
                                CreateBitField (OPTS, 0x09, FUN9)
                                If ((Arg1 >= 0x02))
                                {
                                    FUN0 = 0x01
                                    If (LTRE)
                                    {
                                        FUN6 = 0x01
                                    }

                                    If (OBFF)
                                    {
                                        FUN4 = 0x01
                                    }

                                    If ((ECR1 == 0x01))
                                    {
                                        If ((Arg1 >= 0x03))
                                        {
                                            FUN8 = 0x01
                                            FUN9 = 0x01
                                        }
                                    }
                                }

                                Return (OPTS) /* \_SB_.PCI0.EXP4._DSM.OPTS */
                            }
                            Case (0x04)
                            {
                                If ((Arg1 >= 0x02))
                                {
                                    If (OBFN)
                                    {
                                        Return (Buffer (0x10)
                                        {
                                            /* 0000 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // ........
                                            /* 0008 */  0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00   // ........
                                        })
                                    }
                                    Else
                                    {
                                        Return (Buffer (0x10)
                                        {
                                            /* 0000 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // ........
                                            /* 0008 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00   // ........
                                        })
                                    }
                                }
                            }
                            Case (0x06)
                            {
                                If ((Arg1 >= 0x02))
                                {
                                    If (LTRN)
                                    {
                                        If (((LMSL == 0x00) || (LNSL == 0x00)))
                                        {
                                            If ((PCHS == SPTH))
                                            {
                                                LMSL = 0x0846
                                                LNSL = 0x0846
                                            }
                                            ElseIf ((PCHS == SPTL))
                                            {
                                                LMSL = 0x1003
                                                LNSL = 0x1003
                                            }
                                        }

                                        LTRV [0x00] = ((LMSL >> 0x0A) & 0x07)
                                        LTRV [0x01] = (LMSL & 0x03FF)
                                        LTRV [0x02] = ((LNSL >> 0x0A) & 0x07)
                                        LTRV [0x03] = (LNSL & 0x03FF)
                                        Return (LTRV) /* \_SB_.PCI0.EXP4.LTRV */
                                    }
                                    Else
                                    {
                                        Return (0x00)
                                    }
                                }
                            }
                            Case (0x08)
                            {
                                If ((ECR1 == 0x01))
                                {
                                    If ((Arg1 >= 0x03))
                                    {
                                        Return (0x01)
                                    }
                                }
                            }
                            Case (0x09)
                            {
                                If ((ECR1 == 0x01))
                                {
                                    If ((Arg1 >= 0x03))
                                    {
                                        Return (Package (0x05)
                                        {
                                            0xC350,
                                            Ones,
                                            Ones,
                                            0xC350,
                                            Ones
                                        })
                                    }
                                }
                            }

                        }
                    }

                    Return (Buffer (0x01)
                    {
                         0x00                                             // .
                    })
                }

                Device (PXSX)
                {
                    Name (_ADR, 0x00)  // _ADR: Address
                }

                Method (HPME, 0, Serialized)
                {
                    If (((VDID != 0xFFFFFFFF) && (PMSX == 0x01)))
                    {
                        PMSX = 0x01
                        PSPX = 0x01
                    }
                }
            }

            Device (EXP5)
            {
                Name (_ADR, 0x001C0004)  // _ADR: Address
                Name (RID, 0x00)
                Method (_INI, 0, NotSerialized)  // _INI: Initialize
                {
                    LTRN = LTR5 /* \LTR5 */
                    LMSL = PML5 /* \PML5 */
                    LNSL = PNL5 /* \PNL5 */
                    OBFN = OBF5 /* \OBF5 */
                }

                Name (LPRT, Package (0x04)
                {
                    Package (0x04)
                    {
                        0xFFFF,
                        0x00,
                        \_SB.LNKA,
                        0x00
                    },

                    Package (0x04)
                    {
                        0xFFFF,
                        0x01,
                        \_SB.LNKB,
                        0x00
                    },

                    Package (0x04)
                    {
                        0xFFFF,
                        0x02,
                        \_SB.LNKC,
                        0x00
                    },

                    Package (0x04)
                    {
                        0xFFFF,
                        0x03,
                        \_SB.LNKD,
                        0x00
                    }
                })
                Name (APRT, Package (0x04)
                {
                    Package (0x04)
                    {
                        0xFFFF,
                        0x00,
                        0x00,
                        0x10
                    },

                    Package (0x04)
                    {
                        0xFFFF,
                        0x01,
                        0x00,
                        0x11
                    },

                    Package (0x04)
                    {
                        0xFFFF,
                        0x02,
                        0x00,
                        0x12
                    },

                    Package (0x04)
                    {
                        0xFFFF,
                        0x03,
                        0x00,
                        0x13
                    }
                })
                Method (_PRT, 0, NotSerialized)  // _PRT: PCI Routing Table
                {
                    If (\GPIC)
                    {
                        Return (APRT) /* \_SB_.PCI0.EXP5.APRT */
                    }
                    Else
                    {
                        Return (LPRT) /* \_SB_.PCI0.EXP5.LPRT */
                    }
                }

                OperationRegion (PXCS, PCI_Config, 0x00, 0x0480)
                Field (PXCS, AnyAcc, NoLock, Preserve)
                {
                    VDID,   32,
                    Offset (0x50),
                    L0SE,   1,
                        ,   3,
                    LDIS,   1,
                    Offset (0x51),
                    Offset (0x52),
                        ,   13,
                    LASX,   1,
                    Offset (0x5A),
                    ABPX,   1,
                        ,   2,
                    PDCX,   1,
                        ,   2,
                    PDSX,   1,
                    Offset (0x5B),
                    Offset (0x60),
                    Offset (0x62),
                    PSPX,   1,
                    Offset (0xA4),
                    D3HT,   2,
                    Offset (0xD8),
                        ,   30,
                    HPEX,   1,
                    PMEX,   1,
                    Offset (0xE2),
                        ,   2,
                    L23E,   1,
                    L23R,   1,
                    Offset (0x324),
                        ,   3,
                    LEDM,   1,
                    Offset (0x420),
                        ,   30,
                    DPGE,   1
                }

                Field (PXCS, AnyAcc, NoLock, WriteAsZeros)
                {
                    Offset (0xDC),
                        ,   30,
                    HPSX,   1,
                    PMSX,   1
                }

                Name (LTRV, Package (0x04)
                {
                    0x00,
                    0x00,
                    0x00,
                    0x00
                })
                Method (_DSM, 4, Serialized)  // _DSM: Device-Specific Method
                {
                    If ((Arg0 == ToUUID ("e5c937d0-3553-4d7a-9117-ea4d19c3434d") /* Device Labeling Interface */))
                    {
                        Switch (ToInteger (Arg2))
                        {
                            Case (0x00)
                            {
                                Name (OPTS, Buffer (0x02)
                                {
                                     0x00, 0x00                                       // ..
                                })
                                CreateBitField (OPTS, 0x00, FUN0)
                                CreateBitField (OPTS, 0x04, FUN4)
                                CreateBitField (OPTS, 0x06, FUN6)
                                CreateBitField (OPTS, 0x08, FUN8)
                                CreateBitField (OPTS, 0x09, FUN9)
                                If ((Arg1 >= 0x02))
                                {
                                    FUN0 = 0x01
                                    If (LTRE)
                                    {
                                        FUN6 = 0x01
                                    }

                                    If (OBFF)
                                    {
                                        FUN4 = 0x01
                                    }

                                    If ((ECR1 == 0x01))
                                    {
                                        If ((Arg1 >= 0x03))
                                        {
                                            FUN8 = 0x01
                                            FUN9 = 0x01
                                        }
                                    }
                                }

                                Return (OPTS) /* \_SB_.PCI0.EXP5._DSM.OPTS */
                            }
                            Case (0x04)
                            {
                                If ((Arg1 >= 0x02))
                                {
                                    If (OBFN)
                                    {
                                        Return (Buffer (0x10)
                                        {
                                            /* 0000 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // ........
                                            /* 0008 */  0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00   // ........
                                        })
                                    }
                                    Else
                                    {
                                        Return (Buffer (0x10)
                                        {
                                            /* 0000 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // ........
                                            /* 0008 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00   // ........
                                        })
                                    }
                                }
                            }
                            Case (0x06)
                            {
                                If ((Arg1 >= 0x02))
                                {
                                    If (LTRN)
                                    {
                                        If (((LMSL == 0x00) || (LNSL == 0x00)))
                                        {
                                            If ((PCHS == SPTH))
                                            {
                                                LMSL = 0x0846
                                                LNSL = 0x0846
                                            }
                                            ElseIf ((PCHS == SPTL))
                                            {
                                                LMSL = 0x1003
                                                LNSL = 0x1003
                                            }
                                        }

                                        LTRV [0x00] = ((LMSL >> 0x0A) & 0x07)
                                        LTRV [0x01] = (LMSL & 0x03FF)
                                        LTRV [0x02] = ((LNSL >> 0x0A) & 0x07)
                                        LTRV [0x03] = (LNSL & 0x03FF)
                                        Return (LTRV) /* \_SB_.PCI0.EXP5.LTRV */
                                    }
                                    Else
                                    {
                                        Return (0x00)
                                    }
                                }
                            }
                            Case (0x08)
                            {
                                If ((ECR1 == 0x01))
                                {
                                    If ((Arg1 >= 0x03))
                                    {
                                        Return (0x01)
                                    }
                                }
                            }
                            Case (0x09)
                            {
                                If ((ECR1 == 0x01))
                                {
                                    If ((Arg1 >= 0x03))
                                    {
                                        Return (Package (0x05)
                                        {
                                            0xC350,
                                            Ones,
                                            Ones,
                                            0xC350,
                                            Ones
                                        })
                                    }
                                }
                            }

                        }
                    }

                    Return (Buffer (0x01)
                    {
                         0x00                                             // .
                    })
                }

                Device (PXSX)
                {
                    Name (_ADR, 0x00)  // _ADR: Address
                }

                Method (HPME, 0, Serialized)
                {
                    If (((VDID != 0xFFFFFFFF) && (PMSX == 0x01)))
                    {
                        PMSX = 0x01
                        PSPX = 0x01
                    }
                }
            }

            Device (EXP8)
            {
                Name (_ADR, 0x001C0007)  // _ADR: Address
                Name (RID, 0x00)
                Method (_INI, 0, NotSerialized)  // _INI: Initialize
                {
                    LTRN = LTR8 /* \LTR8 */
                    LMSL = PML8 /* \PML8 */
                    LNSL = PNL8 /* \PNL8 */
                    OBFN = OBF8 /* \OBF8 */
                }

                Name (_PRW, Package (0x02)  // _PRW: Power Resources for Wake
                {
                    0x69,
                    0x04
                })
                Name (LPRT, Package (0x04)
                {
                    Package (0x04)
                    {
                        0xFFFF,
                        0x00,
                        \_SB.LNKD,
                        0x00
                    },

                    Package (0x04)
                    {
                        0xFFFF,
                        0x01,
                        \_SB.LNKA,
                        0x00
                    },

                    Package (0x04)
                    {
                        0xFFFF,
                        0x02,
                        \_SB.LNKB,
                        0x00
                    },

                    Package (0x04)
                    {
                        0xFFFF,
                        0x03,
                        \_SB.LNKC,
                        0x00
                    }
                })
                Name (APRT, Package (0x04)
                {
                    Package (0x04)
                    {
                        0xFFFF,
                        0x00,
                        0x00,
                        0x13
                    },

                    Package (0x04)
                    {
                        0xFFFF,
                        0x01,
                        0x00,
                        0x10
                    },

                    Package (0x04)
                    {
                        0xFFFF,
                        0x02,
                        0x00,
                        0x11
                    },

                    Package (0x04)
                    {
                        0xFFFF,
                        0x03,
                        0x00,
                        0x12
                    }
                })
                Method (_PRT, 0, NotSerialized)  // _PRT: PCI Routing Table
                {
                    If (\GPIC)
                    {
                        Return (APRT) /* \_SB_.PCI0.EXP8.APRT */
                    }
                    Else
                    {
                        Return (LPRT) /* \_SB_.PCI0.EXP8.LPRT */
                    }
                }

                OperationRegion (PXCS, PCI_Config, 0x00, 0x0480)
                Field (PXCS, AnyAcc, NoLock, Preserve)
                {
                    VDID,   32,
                    Offset (0x50),
                    L0SE,   1,
                        ,   3,
                    LDIS,   1,
                    Offset (0x51),
                    Offset (0x52),
                        ,   13,
                    LASX,   1,
                    Offset (0x5A),
                    ABPX,   1,
                        ,   2,
                    PDCX,   1,
                        ,   2,
                    PDSX,   1,
                    Offset (0x5B),
                    Offset (0x60),
                    Offset (0x62),
                    PSPX,   1,
                    Offset (0xA4),
                    D3HT,   2,
                    Offset (0xD8),
                        ,   30,
                    HPEX,   1,
                    PMEX,   1,
                    Offset (0xE2),
                        ,   2,
                    L23E,   1,
                    L23R,   1,
                    Offset (0x324),
                        ,   3,
                    LEDM,   1,
                    Offset (0x420),
                        ,   30,
                    DPGE,   1
                }

                Field (PXCS, AnyAcc, NoLock, WriteAsZeros)
                {
                    Offset (0xDC),
                        ,   30,
                    HPSX,   1,
                    PMSX,   1
                }

                Name (LTRV, Package (0x04)
                {
                    0x00,
                    0x00,
                    0x00,
                    0x00
                })
                Method (_DSM, 4, Serialized)  // _DSM: Device-Specific Method
                {
                    If ((Arg0 == ToUUID ("e5c937d0-3553-4d7a-9117-ea4d19c3434d") /* Device Labeling Interface */))
                    {
                        Switch (ToInteger (Arg2))
                        {
                            Case (0x00)
                            {
                                Name (OPTS, Buffer (0x02)
                                {
                                     0x00, 0x00                                       // ..
                                })
                                CreateBitField (OPTS, 0x00, FUN0)
                                CreateBitField (OPTS, 0x04, FUN4)
                                CreateBitField (OPTS, 0x06, FUN6)
                                CreateBitField (OPTS, 0x08, FUN8)
                                CreateBitField (OPTS, 0x09, FUN9)
                                If ((Arg1 >= 0x02))
                                {
                                    FUN0 = 0x01
                                    If (LTRE)
                                    {
                                        FUN6 = 0x01
                                    }

                                    If (OBFF)
                                    {
                                        FUN4 = 0x01
                                    }

                                    If ((ECR1 == 0x01))
                                    {
                                        If ((Arg1 >= 0x03))
                                        {
                                            FUN8 = 0x01
                                            FUN9 = 0x01
                                        }
                                    }
                                }

                                Return (OPTS) /* \_SB_.PCI0.EXP8._DSM.OPTS */
                            }
                            Case (0x04)
                            {
                                If ((Arg1 >= 0x02))
                                {
                                    If (OBFN)
                                    {
                                        Return (Buffer (0x10)
                                        {
                                            /* 0000 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // ........
                                            /* 0008 */  0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00   // ........
                                        })
                                    }
                                    Else
                                    {
                                        Return (Buffer (0x10)
                                        {
                                            /* 0000 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // ........
                                            /* 0008 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00   // ........
                                        })
                                    }
                                }
                            }
                            Case (0x06)
                            {
                                If ((Arg1 >= 0x02))
                                {
                                    If (LTRN)
                                    {
                                        If (((LMSL == 0x00) || (LNSL == 0x00)))
                                        {
                                            If ((PCHS == SPTH))
                                            {
                                                LMSL = 0x0846
                                                LNSL = 0x0846
                                            }
                                            ElseIf ((PCHS == SPTL))
                                            {
                                                LMSL = 0x1003
                                                LNSL = 0x1003
                                            }
                                        }

                                        LTRV [0x00] = ((LMSL >> 0x0A) & 0x07)
                                        LTRV [0x01] = (LMSL & 0x03FF)
                                        LTRV [0x02] = ((LNSL >> 0x0A) & 0x07)
                                        LTRV [0x03] = (LNSL & 0x03FF)
                                        Return (LTRV) /* \_SB_.PCI0.EXP8.LTRV */
                                    }
                                    Else
                                    {
                                        Return (0x00)
                                    }
                                }
                            }
                            Case (0x08)
                            {
                                If ((ECR1 == 0x01))
                                {
                                    If ((Arg1 >= 0x03))
                                    {
                                        Return (0x01)
                                    }
                                }
                            }
                            Case (0x09)
                            {
                                If ((ECR1 == 0x01))
                                {
                                    If ((Arg1 >= 0x03))
                                    {
                                        Return (Package (0x05)
                                        {
                                            0xC350,
                                            Ones,
                                            Ones,
                                            0xC350,
                                            Ones
                                        })
                                    }
                                }
                            }

                        }
                    }

                    Return (Buffer (0x01)
                    {
                         0x00                                             // .
                    })
                }

                Device (PXSX)
                {
                    Name (_ADR, 0x00)  // _ADR: Address
                }

                Method (HPME, 0, Serialized)
                {
                    If (((VDID != 0xFFFFFFFF) && (PMSX == 0x01)))
                    {
                        PMSX = 0x01
                        PSPX = 0x01
                    }
                }
            }

            Device (SAT1)
            {
                Name (_ADR, 0x00170000)  // _ADR: Address
                Name (_S3D, 0x03)  // _S3D: S3 Device State
                Name (RID, 0x00)
            }

            Device (SMBU)
            {
                Name (_ADR, 0x001F0004)  // _ADR: Address
                Name (_S3D, 0x03)  // _S3D: S3 Device State
                Name (RID, 0x00)
                Method (_DSM, 4, Serialized)  // _DSM: Device-Specific Method
                {
                    If (PCIC (Arg0))
                    {
                        Return (PCID (Arg0, Arg1, Arg2, Arg3))
                    }

                    Return (0x00)
                }

                OperationRegion (SMBP, PCI_Config, 0x50, 0x04)
                Field (SMBP, DWordAcc, NoLock, Preserve)
                {
                        ,   5,
                    TCOB,   11,
                    Offset (0x04)
                }

                Name (TCBV, 0x00)
                Method (TCBS, 0, NotSerialized)
                {
                    If ((TCBV == 0x00))
                    {
                        TCBV = (\_SB.PCI0.SMBU.TCOB << 0x05)
                    }

                    Return (TCBV) /* \_SB_.PCI0.SMBU.TCBV */
                }

                OperationRegion (TCBA, SystemIO, TCBS (), 0x10)
                Field (TCBA, ByteAcc, NoLock, Preserve)
                {
                    Offset (0x04),
                        ,   9,
                    CPSC,   1
                }
            }

            Device (XHCI)
            {
                Name (_ADR, 0x00140000)  // _ADR: Address
                Name (RID, 0x00)
                Device (URTH)
                {
                    Name (_ADR, 0x00)  // _ADR: Address
                    Device (HSP0)
                    {
                        Name (_ADR, 0x01)  // _ADR: Address
                    }

                    Device (HSP1)
                    {
                        Name (_ADR, 0x02)  // _ADR: Address
                    }

                    Device (HSP2)
                    {
                        Name (_ADR, 0x03)  // _ADR: Address
                    }

                    Device (HSP3)
                    {
                        Name (_ADR, 0x04)  // _ADR: Address
                    }

                    Device (HSP4)
                    {
                        Name (_ADR, 0x05)  // _ADR: Address
                    }

                    Device (HSP5)
                    {
                        Name (_ADR, 0x06)  // _ADR: Address
                    }

                    Device (HSP6)
                    {
                        Name (_ADR, 0x07)  // _ADR: Address
                    }

                    Device (HSP7)
                    {
                        Name (_ADR, 0x08)  // _ADR: Address
                        Device (WCAM)
                        {
                            Name (_ADR, 0x08)  // _ADR: Address
                        }
                    }

                    Device (HSP8)
                    {
                        Name (_ADR, 0x09)  // _ADR: Address
                    }

                    Device (HSP9)
                    {
                        Name (_ADR, 0x0A)  // _ADR: Address
                    }

                    Device (HSPA)
                    {
                        Name (_ADR, 0x0B)  // _ADR: Address
                    }

                    Device (HSPB)
                    {
                        Name (_ADR, 0x0C)  // _ADR: Address
                    }

                    Device (SSP0)
                    {
                        Name (_ADR, 0x0D)  // _ADR: Address
                    }

                    Device (SSP1)
                    {
                        Name (_ADR, 0x0E)  // _ADR: Address
                    }

                    Device (SSP2)
                    {
                        Name (_ADR, 0x0F)  // _ADR: Address
                    }

                    Device (SSP3)
                    {
                        Name (_ADR, 0x10)  // _ADR: Address
                    }

                    Device (SSP4)
                    {
                        Name (_ADR, 0x11)  // _ADR: Address
                    }

                    Device (SSP5)
                    {
                        Name (_ADR, 0x12)  // _ADR: Address
                    }
                }

                Name (_PR0, Package (0x01)  // _PR0: Power Resources for D0
                {
                    \_SB.PCI0.LPC.EC.PUBS
                })
                Name (_PR1, Package (0x01)  // _PR1: Power Resources for D1
                {
                    \_SB.PCI0.LPC.EC.PUBS
                })
                Name (_PR2, Package (0x01)  // _PR2: Power Resources for D2
                {
                    \_SB.PCI0.LPC.EC.PUBS
                })
                Name (_PRW, Package (0x03)  // _PRW: Power Resources for Wake
                {
                    0x6D,
                    0x03,
                    \_SB.PCI0.LPC.EC.PUBS
                })
                Scope (\_SB.PCI0)
                {
                    Scope (\_SB.PCI0.XHCI)
                    {
                        OperationRegion (XPRT, PCI_Config, 0x00, 0x0100)
                        Field (XPRT, AnyAcc, NoLock, Preserve)
                        {
                            DVID,   16,
                            Offset (0x10),
                            XADL,   32,
                            XADH,   32,
                            Offset (0x50),
                                ,   2,
                            STGE,   1,
                            Offset (0xA2),
                                ,   2,
                            D3HE,   1,
                            Offset (0xA8),
                                ,   13,
                            MW13,   1,
                            MW14,   1,
                            Offset (0xAC),
                            Offset (0xB0),
                                ,   13,
                            MB13,   1,
                            MB14,   1,
                            Offset (0xB4),
                            Offset (0xD0),
                            PR2,    32,
                            PR2M,   32,
                            PR3,    32,
                            PR3M,   32
                        }

                        Field (XPRT, ByteAcc, NoLock, Preserve)
                        {
                            Offset (0x74),
                            D0D3,   2,
                            Offset (0x75),
                            PMEE,   1,
                                ,   6,
                            PMES,   1
                        }

                        Name (XFLT, 0x00)
                        Method (_DSM, 4, Serialized)  // _DSM: Device-Specific Method
                        {
                            ADBG ("_DSM")
                            Local0 = (XADH << 0x20)
                            Local0 |= XADL /* \_SB_.PCI0.XHCI.XADL */
                            Local0 &= 0xFFFFFFFFFFFFFFF0
                            OperationRegion (XMIO, SystemMemory, Local0, 0x9000)
                            Field (XMIO, AnyAcc, Lock, Preserve)
                            {
                                Offset (0x550),
                                PCCS,   1,
                                    ,   4,
                                PPLS,   4,
                                PTPP,   1,
                                Offset (0x8420),
                                PRTM,   2
                            }

                            If (PCIC (Arg0))
                            {
                                Return (PCID (Arg0, Arg1, Arg2, Arg3))
                            }

                            If ((Arg0 == ToUUID ("ac340cb7-e901-45bf-b7e6-2b34ec931e23")))
                            {
                                If ((Arg1 == 0x03))
                                {
                                    XFLT = Arg1
                                }

                                If (((PRTM > 0x00) && ((Arg1 == 0x05) || (Arg1 == 0x06))))
                                {
                                    ADBG ("SSIC")
                                    If ((((PCCS == 0x00) || (PTPP == 0x00)) || ((
                                        PPLS >= 0x04) && (PPLS <= 0x0F))))
                                    {
                                        If ((PPLS == 0x08))
                                        {
                                            D3HE = One
                                        }
                                        Else
                                        {
                                            D3HE = Zero
                                        }
                                    }
                                    Else
                                    {
                                        D3HE = One
                                    }
                                }
                            }

                            Return (0x00)
                        }

                        Method (_S3D, 0, NotSerialized)  // _S3D: S3 Device State
                        {
                            Return (0x03)
                        }

                        Method (_S4D, 0, NotSerialized)  // _S4D: S4 Device State
                        {
                            Return (0x03)
                        }

                        Method (_S3W, 0, NotSerialized)  // _S3W: S3 Device Wake State
                        {
                            Return (0x03)
                        }

                        Method (_S4W, 0, NotSerialized)  // _S4W: S4 Device Wake State
                        {
                            Return (0x03)
                        }

                        Method (_S0W, 0, NotSerialized)  // _S0W: S0 Device Wake State
                        {
                            If ((XFLT == Zero))
                            {
                                Return (0x00)
                            }
                            Else
                            {
                                Return (0x03)
                            }
                        }

                        Method (_DSW, 3, NotSerialized)  // _DSW: Device Sleep Wake
                        {
                            PMEE = Arg0
                        }

                        Method (_INI, 0, NotSerialized)  // _INI: Initialize
                        {
                            If (CondRefOf (\_SB.PCI0.XHCI.URTH.INIR))
                            {
                                \_SB.PCI0.XHCI.URTH.INIR ()
                            }
                        }

                        OperationRegion (XHCP, SystemMemory, (\_SB.PCI0.GPCB () + 0x000A0000), 0x0100)
                        Field (XHCP, AnyAcc, Lock, Preserve)
                        {
                            Offset (0x04),
                            PDBM,   16,
                            Offset (0x10),
                            MEMB,   64
                        }

                        Name (XRST, Zero)
                        Method (_PS0, 0, Serialized)  // _PS0: Power State 0
                        {
                            If ((^DVID == 0xFFFF))
                            {
                                Return (Zero)
                            }

                            Local2 = ^MEMB /* \_SB_.PCI0.XHCI.MEMB */
                            Local1 = ^PDBM /* \_SB_.PCI0.XHCI.PDBM */
                            ^PDBM &= ~0x06
                            D3HE = 0x00
                            STGE = 0x00
                            Local3 = ^D0D3 /* \_SB_.PCI0.XHCI.D0D3 */
                            ^D0D3 = 0x00
                            ^MEMB = \XWMB
                            ^PDBM = (Local1 | 0x02)
                            OperationRegion (MC11, SystemMemory, \XWMB, 0x9000)
                            Field (MC11, DWordAcc, Lock, Preserve)
                            {
                                Offset (0x81C4),
                                    ,   2,
                                UPSW,   2
                            }

                            UPSW = 0x00
                            ^PDBM &= ~0x02
                            ^MEMB = Local2
                            ^PDBM = Local1
                            If (CondRefOf (\_SB.PCI0.XHCI.PS0X))
                            {
                                \_SB.PCI0.XHCI.PS0X ()
                            }

                            If ((UWAB && (D0D3 == 0x00)))
                            {
                                MPMC = 0x01
                                While (PMFS)
                                {
                                    Sleep (0x0A)
                                }
                            }
                        }

                        Method (_PS3, 0, Serialized)  // _PS3: Power State 3
                        {
                            If ((^DVID == 0xFFFF))
                            {
                                Return (Zero)
                            }

                            Local2 = ^MEMB /* \_SB_.PCI0.XHCI.MEMB */
                            Local1 = ^PDBM /* \_SB_.PCI0.XHCI.PDBM */
                            ^PDBM &= ~0x06
                            ^D0D3 = 0x00
                            ^MEMB = \XWMB
                            ^PDBM = (Local1 | 0x02)
                            OperationRegion (MC11, SystemMemory, \XWMB, 0x9000)
                            Field (MC11, DWordAcc, Lock, Preserve)
                            {
                                Offset (0x81C4),
                                    ,   2,
                                UPSW,   2
                            }

                            UPSW = 0x03
                            ^PDBM &= ~0x02
                            D3HE = 0x01
                            STGE = 0x01
                            ^D0D3 = 0x03
                            ^MEMB = Local2
                            ^PDBM = Local1
                            If (CondRefOf (\_SB.PCI0.XHCI.PS3X))
                            {
                                \_SB.PCI0.XHCI.PS3X ()
                            }

                            If ((UWAB && (D0D3 == 0x03)))
                            {
                                MPMC = 0x03
                                While (PMFS)
                                {
                                    Sleep (0x0A)
                                }
                            }
                        }

                        Method (CUID, 1, Serialized)
                        {
                            If ((Arg0 == ToUUID ("7c9512a9-1705-4cb4-af7d-506a2423ab71")))
                            {
                                Return (0x01)
                            }

                            Return (0x00)
                        }

                        Scope (\_SB.PCI0.XHCI.URTH)
                        {
                            Method (_PS0, 0, Serialized)  // _PS0: Power State 0
                            {
                                If ((\_SB.PCI0.XHCI.DVID == 0xFFFF))
                                {
                                    Return (Zero)
                                }

                                If (CondRefOf (\_SB.PCI0.XHCI.URTH.PS0X))
                                {
                                    \_SB.PCI0.XHCI.URTH.PS0X ()
                                }
                            }

                            Method (_PS2, 0, Serialized)  // _PS2: Power State 2
                            {
                                If ((\_SB.PCI0.XHCI.DVID == 0xFFFF))
                                {
                                    Return (Zero)
                                }

                                If (CondRefOf (\_SB.PCI0.XHCI.URTH.PS2X))
                                {
                                    \_SB.PCI0.XHCI.URTH.PS2X ()
                                }
                            }

                            Method (_PS3, 0, Serialized)  // _PS3: Power State 3
                            {
                                If ((\_SB.PCI0.XHCI.DVID == 0xFFFF))
                                {
                                    Return (Zero)
                                }

                                If (CondRefOf (\_SB.PCI0.XHCI.URTH.PS3X))
                                {
                                    \_SB.PCI0.XHCI.URTH.PS3X ()
                                }
                            }
                        }
                    }
                }

                Scope (\)
                {
                    Name (UPC0, Package (0x04)
                    {
                        0xFF,
                        0x00,
                        0x00,
                        0x00
                    })
                    Name (PLD0, Buffer (0x10)
                    {
                        /* 0000 */  0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // ........
                        /* 0008 */  0x99, 0x12, 0x80, 0x00, 0x03, 0x00, 0x00, 0x00   // ........
                    })
                    Name (UPC1, Package (0x04)
                    {
                        0x00,
                        0xFF,
                        0x00,
                        0x00
                    })
                    Name (PLD1, Buffer (0x10)
                    {
                        /* 0000 */  0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // ........
                        /* 0008 */  0x30, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00   // 0.......
                    })
                    Name (UPC2, Package (0x04)
                    {
                        0xFF,
                        0x00,
                        0x00,
                        0x00
                    })
                    Name (PLD2, Buffer (0x10)
                    {
                        /* 0000 */  0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // ........
                        /* 0008 */  0x99, 0x10, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00   // ........
                    })
                    Name (UPC3, Package (0x04)
                    {
                        0xFF,
                        0x00,
                        0x00,
                        0x00
                    })
                    Name (PLD3, Buffer (0x10)
                    {
                        /* 0000 */  0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // ........
                        /* 0008 */  0x91, 0x10, 0x80, 0x01, 0x03, 0x00, 0x00, 0x00   // ........
                    })
                    Name (UPC4, Package (0x04)
                    {
                        0xFF,
                        0x00,
                        0x00,
                        0x00
                    })
                    Name (PLD4, Buffer (0x10)
                    {
                        /* 0000 */  0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // ........
                        /* 0008 */  0x91, 0x12, 0x80, 0x01, 0x03, 0x00, 0x00, 0x00   // ........
                    })
                    Name (UPCI, Package (0x04)
                    {
                        0x00,
                        0xFF,
                        0x00,
                        0x00
                    })
                    Name (PLDI, Buffer (0x10)
                    {
                        /* 0000 */  0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // ........
                        /* 0008 */  0x30, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00   // 0.......
                    })
                    Name (PLDC, Buffer (0x14)
                    {
                        /* 0000 */  0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // ........
                        /* 0008 */  0x24, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // $.......
                        /* 0010 */  0xDD, 0x00, 0x95, 0x00                           // ....
                    })
                }

                Scope (\_SB.PCI0.XHCI.URTH.HSP0)
                {
                    Method (_UPC, 0, Serialized)  // _UPC: USB Port Capabilities
                    {
                        Name (UPCP, Package (0x04)
                        {
                            0x00,
                            0x00,
                            0x00,
                            0x00
                        })
                        CopyObject (\UPC0, UPCP) /* \_SB_.PCI0.XHCI.URTH.HSP0._UPC.UPCP */
                        Return (UPCP) /* \_SB_.PCI0.XHCI.URTH.HSP0._UPC.UPCP */
                    }

                    Method (_PLD, 0, Serialized)  // _PLD: Physical Location of Device
                    {
                        Name (PLDP, Buffer (0x10){})
                        PLDP = \PLD0
                        Return (PLDP) /* \_SB_.PCI0.XHCI.URTH.HSP0._PLD.PLDP */
                    }
                }

                Scope (\_SB.PCI0.XHCI.URTH.HSP1)
                {
                    Method (_UPC, 0, Serialized)  // _UPC: USB Port Capabilities
                    {
                        Name (UPCP, Package (0x04)
                        {
                            0x00,
                            0x00,
                            0x00,
                            0x00
                        })
                        CopyObject (\UPC3, UPCP) /* \_SB_.PCI0.XHCI.URTH.HSP1._UPC.UPCP */
                        Return (UPCP) /* \_SB_.PCI0.XHCI.URTH.HSP1._UPC.UPCP */
                    }

                    Method (_PLD, 0, Serialized)  // _PLD: Physical Location of Device
                    {
                        Name (PLDP, Buffer (0x10){})
                        PLDP = \PLD3
                        Return (PLDP) /* \_SB_.PCI0.XHCI.URTH.HSP1._PLD.PLDP */
                    }
                }

                Scope (\_SB.PCI0.XHCI.URTH.HSP2)
                {
                    Method (_UPC, 0, Serialized)  // _UPC: USB Port Capabilities
                    {
                        Name (UPCP, Package (0x04)
                        {
                            0x00,
                            0x00,
                            0x00,
                            0x00
                        })
                        CopyObject (\UPC1, UPCP) /* \_SB_.PCI0.XHCI.URTH.HSP2._UPC.UPCP */
                        Return (UPCP) /* \_SB_.PCI0.XHCI.URTH.HSP2._UPC.UPCP */
                    }

                    Method (_PLD, 0, Serialized)  // _PLD: Physical Location of Device
                    {
                        Name (PLDP, Buffer (0x10){})
                        PLDP = \PLD1
                        Return (PLDP) /* \_SB_.PCI0.XHCI.URTH.HSP2._PLD.PLDP */
                    }
                }

                Scope (\_SB.PCI0.XHCI.URTH.HSP3)
                {
                    Method (_UPC, 0, Serialized)  // _UPC: USB Port Capabilities
                    {
                        Name (UPCP, Package (0x04)
                        {
                            0x00,
                            0x00,
                            0x00,
                            0x00
                        })
                        If ((\_SB.PCI0.LPC.EC.DOCD == 0x01))
                        {
                            CopyObject (\UPC3, UPCP) /* \_SB_.PCI0.XHCI.URTH.HSP3._UPC.UPCP */
                        }
                        Else
                        {
                            CopyObject (\UPCI, UPCP) /* \_SB_.PCI0.XHCI.URTH.HSP3._UPC.UPCP */
                        }

                        Return (UPCP) /* \_SB_.PCI0.XHCI.URTH.HSP3._UPC.UPCP */
                    }

                    Method (_PLD, 0, Serialized)  // _PLD: Physical Location of Device
                    {
                        Name (PLDP, Buffer (0x10){})
                        If ((\_SB.PCI0.LPC.EC.DOCD == 0x01))
                        {
                            PLDP = \PLD3
                        }
                        Else
                        {
                            PLDP = \PLDI
                        }

                        Return (PLDP) /* \_SB_.PCI0.XHCI.URTH.HSP3._PLD.PLDP */
                    }
                }

                Scope (\_SB.PCI0.XHCI.URTH.HSP4)
                {
                    Method (_UPC, 0, Serialized)  // _UPC: USB Port Capabilities
                    {
                        Name (UPCP, Package (0x04)
                        {
                            0x00,
                            0x00,
                            0x00,
                            0x00
                        })
                        CopyObject (\UPCI, UPCP) /* \_SB_.PCI0.XHCI.URTH.HSP4._UPC.UPCP */
                        Return (UPCP) /* \_SB_.PCI0.XHCI.URTH.HSP4._UPC.UPCP */
                    }

                    Method (_PLD, 0, Serialized)  // _PLD: Physical Location of Device
                    {
                        Name (PLDP, Buffer (0x10){})
                        PLDP = \PLDI
                        Return (PLDP) /* \_SB_.PCI0.XHCI.URTH.HSP4._PLD.PLDP */
                    }
                }

                Scope (\_SB.PCI0.XHCI.URTH.HSP5)
                {
                    Method (_UPC, 0, Serialized)  // _UPC: USB Port Capabilities
                    {
                        Name (UPCP, Package (0x04)
                        {
                            0x00,
                            0x00,
                            0x00,
                            0x00
                        })
                        CopyObject (\UPC4, UPCP) /* \_SB_.PCI0.XHCI.URTH.HSP5._UPC.UPCP */
                        Return (UPCP) /* \_SB_.PCI0.XHCI.URTH.HSP5._UPC.UPCP */
                    }

                    Method (_PLD, 0, Serialized)  // _PLD: Physical Location of Device
                    {
                        Name (PLDP, Buffer (0x10){})
                        PLDP = \PLD4
                        Return (PLDP) /* \_SB_.PCI0.XHCI.URTH.HSP5._PLD.PLDP */
                    }
                }

                Scope (\_SB.PCI0.XHCI.URTH.HSP6)
                {
                    Method (_UPC, 0, Serialized)  // _UPC: USB Port Capabilities
                    {
                        Name (UPCP, Package (0x04)
                        {
                            0x00,
                            0x00,
                            0x00,
                            0x00
                        })
                        CopyObject (\UPCI, UPCP) /* \_SB_.PCI0.XHCI.URTH.HSP6._UPC.UPCP */
                        Return (UPCP) /* \_SB_.PCI0.XHCI.URTH.HSP6._UPC.UPCP */
                    }

                    Method (_PLD, 0, Serialized)  // _PLD: Physical Location of Device
                    {
                        Name (PLDP, Buffer (0x10){})
                        PLDP = \PLDI
                        Return (PLDP) /* \_SB_.PCI0.XHCI.URTH.HSP6._PLD.PLDP */
                    }
                }

                Scope (\_SB.PCI0.XHCI.URTH.HSP7)
                {
                    Method (_UPC, 0, Serialized)  // _UPC: USB Port Capabilities
                    {
                        Name (UPCP, Package (0x04)
                        {
                            0x00,
                            0x00,
                            0x00,
                            0x00
                        })
                        CopyObject (\UPCI, UPCP) /* \_SB_.PCI0.XHCI.URTH.HSP7._UPC.UPCP */
                        Return (UPCP) /* \_SB_.PCI0.XHCI.URTH.HSP7._UPC.UPCP */
                    }

                    Method (_PLD, 0, Serialized)  // _PLD: Physical Location of Device
                    {
                        Name (PLDP, Buffer (0x10){})
                        PLDP = \PLDI
                        Return (PLDP) /* \_SB_.PCI0.XHCI.URTH.HSP7._PLD.PLDP */
                    }
                }

                Scope (\_SB.PCI0.XHCI.URTH.HSP8)
                {
                    Method (_UPC, 0, Serialized)  // _UPC: USB Port Capabilities
                    {
                        Name (UPCP, Package (0x04)
                        {
                            0x00,
                            0x00,
                            0x00,
                            0x00
                        })
                        CopyObject (\UPCI, UPCP) /* \_SB_.PCI0.XHCI.URTH.HSP8._UPC.UPCP */
                        Return (UPCP) /* \_SB_.PCI0.XHCI.URTH.HSP8._UPC.UPCP */
                    }

                    Method (_PLD, 0, Serialized)  // _PLD: Physical Location of Device
                    {
                        Name (PLDP, Buffer (0x10){})
                        PLDP = \PLDI
                        Return (PLDP) /* \_SB_.PCI0.XHCI.URTH.HSP8._PLD.PLDP */
                    }
                }

                Scope (\_SB.PCI0.XHCI.URTH.HSP9)
                {
                    Method (_UPC, 0, Serialized)  // _UPC: USB Port Capabilities
                    {
                        Name (UPCP, Package (0x04)
                        {
                            0x00,
                            0x00,
                            0x00,
                            0x00
                        })
                        CopyObject (\UPCI, UPCP) /* \_SB_.PCI0.XHCI.URTH.HSP9._UPC.UPCP */
                        Return (UPCP) /* \_SB_.PCI0.XHCI.URTH.HSP9._UPC.UPCP */
                    }

                    Method (_PLD, 0, Serialized)  // _PLD: Physical Location of Device
                    {
                        Name (PLDP, Buffer (0x10){})
                        PLDP = \PLDI
                        Return (PLDP) /* \_SB_.PCI0.XHCI.URTH.HSP9._PLD.PLDP */
                    }
                }

                Scope (\_SB.PCI0.XHCI.URTH.HSPA)
                {
                    Method (_UPC, 0, Serialized)  // _UPC: USB Port Capabilities
                    {
                        Name (UPCP, Package (0x04)
                        {
                            0x00,
                            0x00,
                            0x00,
                            0x00
                        })
                        CopyObject (\UPCI, UPCP) /* \_SB_.PCI0.XHCI.URTH.HSPA._UPC.UPCP */
                        Return (UPCP) /* \_SB_.PCI0.XHCI.URTH.HSPA._UPC.UPCP */
                    }

                    Method (_PLD, 0, Serialized)  // _PLD: Physical Location of Device
                    {
                        Name (PLDP, Buffer (0x10){})
                        PLDP = \PLDI
                        Return (PLDP) /* \_SB_.PCI0.XHCI.URTH.HSPA._PLD.PLDP */
                    }
                }

                Scope (\_SB.PCI0.XHCI.URTH.HSPB)
                {
                    Method (_UPC, 0, Serialized)  // _UPC: USB Port Capabilities
                    {
                        Name (UPCP, Package (0x04)
                        {
                            0x00,
                            0x00,
                            0x00,
                            0x00
                        })
                        CopyObject (\UPCI, UPCP) /* \_SB_.PCI0.XHCI.URTH.HSPB._UPC.UPCP */
                        Return (UPCP) /* \_SB_.PCI0.XHCI.URTH.HSPB._UPC.UPCP */
                    }

                    Method (_PLD, 0, Serialized)  // _PLD: Physical Location of Device
                    {
                        Name (PLDP, Buffer (0x10){})
                        PLDP = \PLDI
                        Return (PLDP) /* \_SB_.PCI0.XHCI.URTH.HSPB._PLD.PLDP */
                    }
                }

                Scope (\_SB.PCI0.XHCI.URTH.SSP0)
                {
                    Method (_UPC, 0, Serialized)  // _UPC: USB Port Capabilities
                    {
                        Name (UPCP, Package (0x04)
                        {
                            0x00,
                            0x00,
                            0x00,
                            0x00
                        })
                        CopyObject (\UPC0, UPCP) /* \_SB_.PCI0.XHCI.URTH.SSP0._UPC.UPCP */
                        Return (UPCP) /* \_SB_.PCI0.XHCI.URTH.SSP0._UPC.UPCP */
                    }

                    Method (_PLD, 0, Serialized)  // _PLD: Physical Location of Device
                    {
                        Name (PLDP, Buffer (0x10){})
                        PLDP = \PLD0
                        Return (PLDP) /* \_SB_.PCI0.XHCI.URTH.SSP0._PLD.PLDP */
                    }
                }

                Scope (\_SB.PCI0.XHCI.URTH.SSP1)
                {
                    Method (_UPC, 0, Serialized)  // _UPC: USB Port Capabilities
                    {
                        Name (UPCP, Package (0x04)
                        {
                            0x00,
                            0x00,
                            0x00,
                            0x00
                        })
                        CopyObject (\UPC1, UPCP) /* \_SB_.PCI0.XHCI.URTH.SSP1._UPC.UPCP */
                        Return (UPCP) /* \_SB_.PCI0.XHCI.URTH.SSP1._UPC.UPCP */
                    }

                    Method (_PLD, 0, Serialized)  // _PLD: Physical Location of Device
                    {
                        Name (PLDP, Buffer (0x10){})
                        PLDP = \PLD1
                        Return (PLDP) /* \_SB_.PCI0.XHCI.URTH.SSP1._PLD.PLDP */
                    }
                }

                Scope (\_SB.PCI0.XHCI.URTH.SSP2)
                {
                    Method (_UPC, 0, Serialized)  // _UPC: USB Port Capabilities
                    {
                        Name (UPCP, Package (0x04)
                        {
                            0x00,
                            0x00,
                            0x00,
                            0x00
                        })
                        CopyObject (\UPC3, UPCP) /* \_SB_.PCI0.XHCI.URTH.SSP2._UPC.UPCP */
                        Return (UPCP) /* \_SB_.PCI0.XHCI.URTH.SSP2._UPC.UPCP */
                    }

                    Method (_PLD, 0, Serialized)  // _PLD: Physical Location of Device
                    {
                        Name (PLDP, Buffer (0x10){})
                        PLDP = \PLD3
                        Return (PLDP) /* \_SB_.PCI0.XHCI.URTH.SSP2._PLD.PLDP */
                    }
                }

                Scope (\_SB.PCI0.XHCI.URTH.SSP3)
                {
                    Method (_UPC, 0, Serialized)  // _UPC: USB Port Capabilities
                    {
                        Name (UPCP, Package (0x04)
                        {
                            0x00,
                            0x00,
                            0x00,
                            0x00
                        })
                        If ((\_SB.PCI0.LPC.EC.DOCD == 0x01))
                        {
                            CopyObject (\UPC3, UPCP) /* \_SB_.PCI0.XHCI.URTH.SSP3._UPC.UPCP */
                        }
                        Else
                        {
                            CopyObject (\UPCI, UPCP) /* \_SB_.PCI0.XHCI.URTH.SSP3._UPC.UPCP */
                        }

                        Return (UPCP) /* \_SB_.PCI0.XHCI.URTH.SSP3._UPC.UPCP */
                    }

                    Method (_PLD, 0, Serialized)  // _PLD: Physical Location of Device
                    {
                        Name (PLDP, Buffer (0x10){})
                        If ((\_SB.PCI0.LPC.EC.DOCD == 0x01))
                        {
                            PLDP = \PLD3
                        }
                        Else
                        {
                            PLDP = \PLDI
                        }

                        Return (PLDP) /* \_SB_.PCI0.XHCI.URTH.SSP3._PLD.PLDP */
                    }
                }

                Scope (\_SB.PCI0.XHCI.URTH.SSP4)
                {
                    Method (_UPC, 0, Serialized)  // _UPC: USB Port Capabilities
                    {
                        Name (UPCP, Package (0x04)
                        {
                            0x00,
                            0x00,
                            0x00,
                            0x00
                        })
                        CopyObject (\UPCI, UPCP) /* \_SB_.PCI0.XHCI.URTH.SSP4._UPC.UPCP */
                        Return (UPCP) /* \_SB_.PCI0.XHCI.URTH.SSP4._UPC.UPCP */
                    }

                    Method (_PLD, 0, Serialized)  // _PLD: Physical Location of Device
                    {
                        Name (PLDP, Buffer (0x10){})
                        PLDP = \PLDI
                        Return (PLDP) /* \_SB_.PCI0.XHCI.URTH.SSP4._PLD.PLDP */
                    }
                }

                Scope (\_SB.PCI0.XHCI.URTH.SSP5)
                {
                    Method (_UPC, 0, Serialized)  // _UPC: USB Port Capabilities
                    {
                        Name (UPCP, Package (0x04)
                        {
                            0x00,
                            0x00,
                            0x00,
                            0x00
                        })
                        CopyObject (\UPC4, UPCP) /* \_SB_.PCI0.XHCI.URTH.SSP5._UPC.UPCP */
                        Return (UPCP) /* \_SB_.PCI0.XHCI.URTH.SSP5._UPC.UPCP */
                    }

                    Method (_PLD, 0, Serialized)  // _PLD: Physical Location of Device
                    {
                        Name (PLDP, Buffer (0x10){})
                        PLDP = \PLD4
                        Return (PLDP) /* \_SB_.PCI0.XHCI.URTH.SSP5._PLD.PLDP */
                    }
                }

                Scope (\_SB.PCI0.XHCI.URTH.HSP7.WCAM)
                {
                    Method (_STA, 0, NotSerialized)  // _STA: Status
                    {
                        If (\WIN8)
                        {
                            Return (0x0F)
                        }
                        Else
                        {
                            Return (0x00)
                        }
                    }

                    Method (_UPC, 0, Serialized)  // _UPC: USB Port Capabilities
                    {
                        Return (\UPCI)
                    }

                    Method (_PLD, 0, Serialized)  // _PLD: Physical Location of Device
                    {
                        Return (\PLDC)
                    }
                }
            }

            Device (HDEF)
            {
                Name (_ADR, 0x001F0003)  // _ADR: Address
                Name (_S3D, 0x03)  // _S3D: S3 Device State
                Name (RID, 0x00)
                Method (_DSM, 4, NotSerialized)  // _DSM: Device-Specific Method
                {
                    ADBG ("HDAS _DSM")
                    If (PCIC (Arg0))
                    {
                        Return (PCID (Arg0, Arg1, Arg2, Arg3))
                    }

                    Return (0x00)
                }
            }

            Device (HECI)
            {
                Name (_ADR, 0x00160000)  // _ADR: Address
                Name (_S3D, 0x03)  // _S3D: S3 Device State
                Name (RID, 0x00)
                Method (_DSM, 4, Serialized)  // _DSM: Device-Specific Method
                {
                    If (PCIC (Arg0))
                    {
                        Return (PCID (Arg0, Arg1, Arg2, Arg3))
                    }

                    Return (0x00)
                }
            }
        }

        Scope (\_SB.PCI0.LPC.EC)
        {
            Name (BDEV, 0xFF)
            Name (BSTS, 0x00)
            Name (BHKE, 0x00)
            Method (_Q2C, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
            {
                If ((BSTS == 0x00))
                {
                    BDEV = BGID (0x00)
                    NBRE (BDEV)
                }
            }

            Method (_Q2D, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
            {
                BDEV = BGID (0x00)
                NBIN (BDEV)
            }

            Method (_Q38, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
            {
                Local0 = BGID (0x00)
                If ((Local0 == 0x0F))
                {
                    BDIS ()
                    \BHDP (0x01, 0x00)
                    NBEJ (BDEV)
                    BDEV = Local0
                    If ((\BIDE == 0x03))
                    {
                        \_SB.PCI0.SAT1.PRIM.GTME = 0x00
                        \_SB.PCI0.SAT1.SCND.GTME = 0x00
                    }
                }
                ElseIf (HPBU){}
                Else
                {
                    BDEV = Local0
                    NBIN (Local0)
                }
            }

            Method (NBRE, 1, NotSerialized)
            {
                If ((Arg0 < 0x0C))
                {
                    If ((\BIDE == 0x03))
                    {
                        Notify (\_SB.PCI0.SAT1.SCND.MSTR, 0x03) // Eject Request
                    }
                    Else
                    {
                        Notify (\_SB.PCI0.SAT1.PRT1, 0x03) // Eject Request
                    }
                }
            }

            Method (NBEJ, 1, NotSerialized)
            {
                If ((BSTS == 0x00))
                {
                    If ((Arg0 < 0x0C))
                    {
                        If ((\BIDE == 0x03))
                        {
                            Notify (\_SB.PCI0.SAT1.SCND.MSTR, 0x01) // Device Check
                        }
                        Else
                        {
                            Notify (\_SB.PCI0.SAT1.PRT1, 0x01) // Device Check
                        }
                    }
                }

                BEEP (0x00)
                BSTS = 0x00
            }

            Method (NBIN, 1, NotSerialized)
            {
                If ((Arg0 < 0x0C))
                {
                    BEN (0x01)
                    If ((\BIDE == 0x03))
                    {
                        Notify (\_SB.PCI0.SAT1.SCND.MSTR, 0x01) // Device Check
                    }
                    Else
                    {
                        Notify (\_SB.PCI0.SAT1.PRT1, 0x01) // Device Check
                    }
                }

                BEEP (0x00)
                BSTS = 0x00
            }

            Method (BEJ0, 1, NotSerialized)
            {
                If (Arg0)
                {
                    BDIS ()
                    \BHDP (0x01, 0x00)
                    BSTS = 0x01
                    If (BHKE)
                    {
                        BHKE = 0x00
                        \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x3003)
                    }
                }
                Else
                {
                    BSTS = 0x00
                }
            }

            Method (BEJ3, 1, NotSerialized)
            {
                If (Arg0)
                {
                    BDIS ()
                    BSTS = 0x01
                }
                Else
                {
                    BSTS = 0x00
                }
            }

            Method (BPTS, 1, NotSerialized)
            {
                HDBM = 0x01
                If ((BSTS != 0x00))
                {
                    BDEV = 0x0F
                    BSTS = 0x00
                }

                BHKE = 0x00
                BUWK (0x00)
            }

            Method (BWAK, 1, NotSerialized)
            {
                BUWK (0x00)
                Local0 = BGID (0x00)
                If ((BSTS == 0x00))
                {
                    If ((Local0 != BDEV))
                    {
                        NBEJ (BDEV)
                        BDEV = Local0
                        NBIN (Local0)
                    }
                    ElseIf ((\LFDC || (BDEV != 0x0D)))
                    {
                        If ((Local0 != 0x0F))
                        {
                            If (HPBU)
                            {
                                If ((Arg0 <= 0x02)){}
                                Else
                                {
                                    NBRE (Local0)
                                }
                            }
                        }
                    }
                }

                If ((BDEV < 0x0C))
                {
                    \UBIS (0x00)
                }
                Else
                {
                    \UBIS (0x01)
                }
            }

            Method (BDIS, 0, NotSerialized)
            {
                If (!\_SB.PCI0.LPC.CSON)
                {
                    If (!\_SB.PCI0.LPC.GLIS)
                    {
                        \UBIS (0x01)
                    }

                    \_SB.PCI0.LPC.CSON = 0x01
                    \IDET = 0x0F
                }
            }

            Method (BPON, 1, NotSerialized)
            {
                If (\_SB.PCI0.LPC.CSON)
                {
                    \_SB.PCI0.LPC.CSON = 0x00
                    If (\_SB.PCI0.LPC.GLIS)
                    {
                        \UBIS (0x00)
                    }
                }
            }

            Method (BEN, 1, NotSerialized)
            {
                If (\_SB.PCI0.LPC.CSON)
                {
                    BPON (Arg0)
                    If (Arg0)
                    {
                        IRDY ()
                    }
                }
            }

            Method (BSTA, 1, NotSerialized)
            {
                If (\_SB.PCI0.LPC.CSON)
                {
                    Return (0x00)
                }

                BINI ()
                If ((Arg0 == 0x01))
                {
                    Return ((BDEV < 0x0C))
                }

                Return (0x00)
            }

            Method (BUWK, 1, NotSerialized)
            {
                If (\H8DR)
                {
                    If (Arg0)
                    {
                        \_SB.PCI0.LPC.EC.HWBU = 0x01
                    }
                    Else
                    {
                        \_SB.PCI0.LPC.EC.HWBU = 0x00
                    }
                }
                ElseIf (Arg0)
                {
                    \MBEC (0x32, 0xFF, 0x80)
                }
                Else
                {
                    \MBEC (0x32, 0x7F, 0x00)
                }
            }

            Method (BINI, 0, NotSerialized)
            {
                If ((BDEV == 0xFF))
                {
                    BDEV = BGID (0x00)
                }
            }

            Method (BGID, 1, NotSerialized)
            {
                If (Arg0)
                {
                    Local0 = 0xFF
                }
                Else
                {
                    If (\H8DR)
                    {
                        Local1 = HPBU /* \_SB_.PCI0.LPC_.EC__.HPBU */
                        Local2 = HBID /* \_SB_.PCI0.LPC_.EC__.HBID */
                    }
                    Else
                    {
                        Local2 = RBEC (0x47)
                        Local1 = (Local2 & 0x01)
                        Local2 &= 0x04
                        Local2 >>= 0x02
                    }

                    If (Local2)
                    {
                        Local0 = 0x0F
                    }
                    ElseIf (HDUB)
                    {
                        Local0 = 0x0F
                    }
                    ElseIf (((\IDET == 0x03) || (\IDET == 0x06)))
                    {
                        Local0 = \IDET
                    }
                    Else
                    {
                        Local0 = 0x07
                    }

                    If ((Local0 == 0x0F)){}
                }

                If ((\HDUB && (Local0 < 0x0C)))
                {
                    Local0 = 0x0F
                }

                Return (Local0)
            }

            Method (IRDY, 0, NotSerialized)
            {
                Local0 = 0x01F4
                Local1 = 0x3C
                Local2 = Zero
                While (Local1)
                {
                    Sleep (Local0)
                    Local3 = \BCHK ()
                    If (!Local3)
                    {
                        Break
                    }

                    If ((Local3 == 0x02))
                    {
                        Local2 = One
                        Break
                    }

                    Local1--
                }

                Return (Local2)
            }
        }

        Scope (\_SB.PCI0.LPC.EC)
        {
            Method (_Q43, 0, NotSerialized)  // _Qxx: EC Query, xx=0x00-0xFF
            {
                \UCMS (0x18)
            }

            Method (SAUM, 1, NotSerialized)
            {
                If ((Arg0 > 0x03))
                {
                    Noop
                }
                ElseIf (\H8DR)
                {
                    HAUM = Arg0
                }
                Else
                {
                    \MBEC (0x03, 0x9F, (Arg0 << 0x05))
                }
            }
        }

        Scope (\_SB.PCI0.LPC.EC.HKEY)
        {
            Method (GSMS, 1, NotSerialized)
            {
                Return (\AUDC (0x00, 0x00))
            }

            Method (SSMS, 1, NotSerialized)
            {
                Return (\AUDC (0x01, (Arg0 & 0x01)))
            }

            Method (SHDA, 1, NotSerialized)
            {
                Return (\AUDC (0x02, (Arg0 & 0x01)))
            }
        }

        Scope (\_SB.PCI0.LPC.EC)
        {
            Name (BRTW, Package (0x12)
            {
                0x64,
                0x64,
                0x05,
                0x0A,
                0x14,
                0x19,
                0x1E,
                0x23,
                0x28,
                0x2D,
                0x32,
                0x37,
                0x3C,
                0x41,
                0x46,
                0x50,
                0x5A,
                0x64
            })
            Name (BRTB, Package (0x04)
            {
                Package (0x16)
                {
                    0x14,
                    0x04,
                    0x04,
                    0x0A,
                    0x10,
                    0x17,
                    0x1F,
                    0x27,
                    0x30,
                    0x3A,
                    0x44,
                    0x52,
                    0x66,
                    0x7B,
                    0x92,
                    0xB1,
                    0xDA,
                    0xFF,
                    0xDC,
                    0xDC,
                    0x04,
                    0x04
                },

                Package (0x16)
                {
                    0x1E,
                    0x03,
                    0x03,
                    0x06,
                    0x0B,
                    0x0E,
                    0x11,
                    0x16,
                    0x1B,
                    0x21,
                    0x29,
                    0x36,
                    0x48,
                    0x5E,
                    0x7C,
                    0xA6,
                    0xD4,
                    0xFF,
                    0x03AC,
                    0x03AC,
                    0x03,
                    0x03
                },

                Package (0x16)
                {
                    0x28,
                    0x03,
                    0x03,
                    0x05,
                    0x06,
                    0x08,
                    0x0B,
                    0x0E,
                    0x13,
                    0x1C,
                    0x27,
                    0x34,
                    0x46,
                    0x5F,
                    0x7F,
                    0xAA,
                    0xDA,
                    0xFF,
                    0x0393,
                    0x0393,
                    0x03,
                    0x03
                },

                Package (0x16)
                {
                    0x28,
                    0x03,
                    0x03,
                    0x04,
                    0x06,
                    0x08,
                    0x0A,
                    0x0C,
                    0x11,
                    0x18,
                    0x20,
                    0x2C,
                    0x3B,
                    0x50,
                    0x6C,
                    0x92,
                    0xC1,
                    0xFF,
                    0x0393,
                    0x0393,
                    0x03,
                    0x03
                }
            })
            Name (BRTD, Package (0x04)
            {
                Package (0x65)
                {
                    0x03,
                    0x04,
                    0x05,
                    0x06,
                    0x07,
                    0x08,
                    0x09,
                    0x0A,
                    0x0B,
                    0x0C,
                    0x0D,
                    0x0E,
                    0x0F,
                    0x10,
                    0x11,
                    0x12,
                    0x13,
                    0x14,
                    0x15,
                    0x16,
                    0x17,
                    0x18,
                    0x19,
                    0x1A,
                    0x1B,
                    0x1C,
                    0x1D,
                    0x1E,
                    0x1F,
                    0x20,
                    0x21,
                    0x22,
                    0x23,
                    0x24,
                    0x25,
                    0x26,
                    0x27,
                    0x28,
                    0x29,
                    0x2A,
                    0x2B,
                    0x2C,
                    0x2E,
                    0x2F,
                    0x31,
                    0x33,
                    0x35,
                    0x37,
                    0x38,
                    0x3A,
                    0x3C,
                    0x3E,
                    0x40,
                    0x42,
                    0x45,
                    0x47,
                    0x49,
                    0x4B,
                    0x4D,
                    0x50,
                    0x52,
                    0x54,
                    0x57,
                    0x59,
                    0x5C,
                    0x5E,
                    0x61,
                    0x63,
                    0x66,
                    0x68,
                    0x6B,
                    0x6E,
                    0x71,
                    0x73,
                    0x76,
                    0x79,
                    0x7C,
                    0x7F,
                    0x82,
                    0x85,
                    0x88,
                    0x8D,
                    0x92,
                    0x97,
                    0x9D,
                    0xA2,
                    0xA7,
                    0xAD,
                    0xB3,
                    0xB9,
                    0xBE,
                    0xC4,
                    0xCB,
                    0xD1,
                    0xD7,
                    0xDD,
                    0xE4,
                    0xEB,
                    0xF1,
                    0xF8,
                    0xFF
                },

                Package (0x65)
                {
                    0x03,
                    0x04,
                    0x05,
                    0x06,
                    0x07,
                    0x08,
                    0x09,
                    0x0A,
                    0x0B,
                    0x0C,
                    0x0D,
                    0x0E,
                    0x0F,
                    0x10,
                    0x11,
                    0x12,
                    0x13,
                    0x14,
                    0x15,
                    0x16,
                    0x17,
                    0x18,
                    0x19,
                    0x1A,
                    0x1B,
                    0x1C,
                    0x1D,
                    0x1E,
                    0x1F,
                    0x20,
                    0x21,
                    0x22,
                    0x23,
                    0x25,
                    0x26,
                    0x28,
                    0x2A,
                    0x2C,
                    0x2E,
                    0x2F,
                    0x31,
                    0x33,
                    0x35,
                    0x37,
                    0x3A,
                    0x3C,
                    0x3E,
                    0x40,
                    0x42,
                    0x45,
                    0x47,
                    0x4A,
                    0x4C,
                    0x4E,
                    0x51,
                    0x54,
                    0x56,
                    0x59,
                    0x5C,
                    0x5E,
                    0x61,
                    0x64,
                    0x67,
                    0x6A,
                    0x6D,
                    0x70,
                    0x73,
                    0x76,
                    0x79,
                    0x7D,
                    0x80,
                    0x83,
                    0x86,
                    0x8A,
                    0x8D,
                    0x91,
                    0x94,
                    0x98,
                    0x9C,
                    0x9F,
                    0xA3,
                    0xA7,
                    0xAB,
                    0xAF,
                    0xB4,
                    0xB8,
                    0xBC,
                    0xC1,