Contribute
Register

I2C touchpad not working

Status
Not open for further replies.
Joined
Nov 9, 2016
Messages
69
Motherboard
Lenovo ideapad 330S - Clover
CPU
i5-8250U
Graphics
HD 620 (1920x1080)
I have followed the guide on VoodooI2C documentation page, but without success. My touchpad is at I2C0. Touchpads APCI ID is 0x10 and that's strange, because in this list number 0x10 labeled as GPIO_MISCCFG so there's no corresponding PIN number in this list. But maybe that's not the problem, because in DSDT there is both SBFB and SBFG names, which are returned under _CSR method. In patched DSDT I have deleted SBFI method and if conditions under _CSR. GPI0 path applied.

Attaching IOReg and clover folder.

Code:
/ locked; waiting for lock.
Lock acquired; proceeding.
Kext with invalid signatured (-67050) allowed: <OSKext 0x7fc8820639b0 [0x7fff86bf38f0]> { URL = "VoodooI2CServices.kext/ -- file:///Library/Extensions/VoodooI2C.kext/Contents/PlugIns/", ID = "com.alexandred.VoodooI2CServices" }
Kext with invalid signatured (-67050) allowed: <OSKext 0x7fc88205ad90 [0x7fff86bf38f0]> { URL = "VoodooGPIO.kext/ -- file:///Library/Extensions/VoodooI2C.kext/Contents/PlugIns/", ID = "org.coolstar.VoodooGPIO" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fc87f40f900 [0x7fff86bf38f0]> { URL = "AppleALC.kext/ -- file:///Library/Extensions/", ID = "as.vit9696.AppleALC" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fc87f411b20 [0x7fff86bf38f0]> { URL = "Lilu.kext/ -- file:///Library/Extensions/", ID = "as.vit9696.Lilu" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fc881d90380 [0x7fff86bf38f0]> { URL = "VoodooPS2Mouse.kext/ -- file:///System/Library/Extensions/VoodooPS2Controller.kext/Contents/PlugIns/", ID = "org.rehabman.voodoo.driver.PS2Mouse" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fc881d87fe0 [0x7fff86bf38f0]> { URL = "VoodooPS2Controller.kext/ -- file:///System/Library/Extensions/", ID = "org.rehabman.voodoo.driver.PS2Controller" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fc881d8be20 [0x7fff86bf38f0]> { URL = "VoodooPS2Keyboard.kext/ -- file:///System/Library/Extensions/VoodooPS2Controller.kext/Contents/PlugIns/", ID = "org.rehabman.voodoo.driver.PS2Keyboard" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fc881d894e0 [0x7fff86bf38f0]> { URL = "VoodooPS2Trackpad.kext/ -- file:///System/Library/Extensions/VoodooPS2Controller.kext/Contents/PlugIns/", ID = "org.rehabman.voodoo.driver.PS2Trackpad" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fc881d58030 [0x7fff86bf38f0]> { URL = "VirtualSMC.kext/ -- file:///System/Library/Extensions/", ID = "as.vit9696.VirtualSMC" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fc881ab4920 [0x7fff86bf38f0]> { URL = "AppleBacklightFixup.kext/ -- file:///System/Library/Extensions/", ID = "com.hieplpvip.AppleBacklightFixup" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fc8818b66f0 [0x7fff86bf38f0]> { URL = "SMCBatteryManager.kext/ -- file:///System/Library/Extensions/", ID = "ru.usrsse2.SMCBatteryManager" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fc8818b0120 [0x7fff86bf38f0]> { URL = "WhateverGreen.kext/ -- file:///System/Library/Extensions/", ID = "as.vit9696.WhateverGreen" }
Invalid signature -67050 for kext <OSKext 0x7fc8820639b0 [0x7fff86bf38f0]> { URL = "VoodooI2CServices.kext/ -- file:///Library/Extensions/VoodooI2C.kext/Contents/PlugIns/", ID = "com.alexandred.VoodooI2CServices" }
Invalid signature -67050 for kext <OSKext 0x7fc88205ad90 [0x7fff86bf38f0]> { URL = "VoodooGPIO.kext/ -- file:///Library/Extensions/VoodooI2C.kext/Contents/PlugIns/", ID = "org.coolstar.VoodooGPIO" }
KernelCache ID: 3EA3A5294BDB5041B6FCDBC547C40470
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fbe768bb4d0 [0x7fff86bf38f0]> { URL = "WhateverGreen.kext/ -- file:///System/Library/Extensions/", ID = "as.vit9696.WhateverGreen" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fbe768c19b0 [0x7fff86bf38f0]> { URL = "SMCBatteryManager.kext/ -- file:///System/Library/Extensions/", ID = "ru.usrsse2.SMCBatteryManager" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fbe76ac4390 [0x7fff86bf38f0]> { URL = "AppleBacklightFixup.kext/ -- file:///System/Library/Extensions/", ID = "com.hieplpvip.AppleBacklightFixup" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fbe76caf180 [0x7fff86bf38f0]> { URL = "VirtualSMC.kext/ -- file:///System/Library/Extensions/", ID = "as.vit9696.VirtualSMC" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fbe76cddfb0 [0x7fff86bf38f0]> { URL = "VoodooPS2Controller.kext/ -- file:///System/Library/Extensions/", ID = "org.rehabman.voodoo.driver.PS2Controller" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fbe76cde660 [0x7fff86bf38f0]> { URL = "VoodooPS2Trackpad.kext/ -- file:///System/Library/Extensions/VoodooPS2Controller.kext/Contents/PlugIns/", ID = "org.rehabman.voodoo.driver.PS2Trackpad" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fbe76ce8260 [0x7fff86bf38f0]> { URL = "VoodooPS2Keyboard.kext/ -- file:///System/Library/Extensions/VoodooPS2Controller.kext/Contents/PlugIns/", ID = "org.rehabman.voodoo.driver.PS2Keyboard" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fbe76ce3850 [0x7fff86bf38f0]> { URL = "VoodooPS2Mouse.kext/ -- file:///System/Library/Extensions/VoodooPS2Controller.kext/Contents/PlugIns/", ID = "org.rehabman.voodoo.driver.PS2Mouse" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fbe74408790 [0x7fff86bf38f0]> { URL = "Lilu.kext/ -- file:///Library/Extensions/", ID = "as.vit9696.Lilu" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fbe7440f6a0 [0x7fff86bf38f0]> { URL = "AppleALC.kext/ -- file:///Library/Extensions/", ID = "as.vit9696.AppleALC" }
Kext with invalid signatured (-67050) allowed: <OSKext 0x7fbe746073a0 [0x7fff86bf38f0]> { URL = "VoodooI2CELAN.kext/ -- file:///Library/Extensions/", ID = "me.kishorprins.VoodooI2CELAN" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fbe770d70e0 [0x7fff86bf38f0]> { URL = "VoodooI2C.kext/ -- file:///Library/Extensions/", ID = "com.alexandred.VoodooI2C" }
Kext with invalid signatured (-67050) allowed: <OSKext 0x7fbe77103d80 [0x7fff86bf38f0]> { URL = "VoodooGPIO.kext/ -- file:///Library/Extensions/VoodooI2C.kext/Contents/PlugIns/", ID = "org.coolstar.VoodooGPIO" }
Kext with invalid signatured (-67050) allowed: <OSKext 0x7fbe77109540 [0x7fff86bf38f0]> { URL = "VoodooI2CServices.kext/ -- file:///Library/Extensions/VoodooI2C.kext/Contents/PlugIns/", ID = "com.alexandred.VoodooI2CServices" }
 

Attachments

  • CLOVER.zip
    2.9 MB · Views: 81
  • MacBook Pro.zip
    636 KB · Views: 62
Last edited:
I have followed the guide on VoodooI2C documentation page, but without success. My touchpad is at I2C0. Touchpads APCI ID is 0x10 and that's strange, because in this list number 0x10 labeled as GPIO_MISCCFG so there's no corresponding PIN number in this list. But maybe that's not the problem, because in DSDT there is both SBFB and SBFG names, which are returned under _CSR method. In patched DSDT I have deleted SBFI method and if conditions under _CSR. GPI0 path applied.

Attaching IOReg and clover folder.

Code:
/ locked; waiting for lock.
Lock acquired; proceeding.
Kext with invalid signatured (-67050) allowed: <OSKext 0x7fc8820639b0 [0x7fff86bf38f0]> { URL = "VoodooI2CServices.kext/ -- file:///Library/Extensions/VoodooI2C.kext/Contents/PlugIns/", ID = "com.alexandred.VoodooI2CServices" }
Kext with invalid signatured (-67050) allowed: <OSKext 0x7fc88205ad90 [0x7fff86bf38f0]> { URL = "VoodooGPIO.kext/ -- file:///Library/Extensions/VoodooI2C.kext/Contents/PlugIns/", ID = "org.coolstar.VoodooGPIO" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fc87f40f900 [0x7fff86bf38f0]> { URL = "AppleALC.kext/ -- file:///Library/Extensions/", ID = "as.vit9696.AppleALC" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fc87f411b20 [0x7fff86bf38f0]> { URL = "Lilu.kext/ -- file:///Library/Extensions/", ID = "as.vit9696.Lilu" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fc881d90380 [0x7fff86bf38f0]> { URL = "VoodooPS2Mouse.kext/ -- file:///System/Library/Extensions/VoodooPS2Controller.kext/Contents/PlugIns/", ID = "org.rehabman.voodoo.driver.PS2Mouse" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fc881d87fe0 [0x7fff86bf38f0]> { URL = "VoodooPS2Controller.kext/ -- file:///System/Library/Extensions/", ID = "org.rehabman.voodoo.driver.PS2Controller" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fc881d8be20 [0x7fff86bf38f0]> { URL = "VoodooPS2Keyboard.kext/ -- file:///System/Library/Extensions/VoodooPS2Controller.kext/Contents/PlugIns/", ID = "org.rehabman.voodoo.driver.PS2Keyboard" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fc881d894e0 [0x7fff86bf38f0]> { URL = "VoodooPS2Trackpad.kext/ -- file:///System/Library/Extensions/VoodooPS2Controller.kext/Contents/PlugIns/", ID = "org.rehabman.voodoo.driver.PS2Trackpad" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fc881d58030 [0x7fff86bf38f0]> { URL = "VirtualSMC.kext/ -- file:///System/Library/Extensions/", ID = "as.vit9696.VirtualSMC" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fc881ab4920 [0x7fff86bf38f0]> { URL = "AppleBacklightFixup.kext/ -- file:///System/Library/Extensions/", ID = "com.hieplpvip.AppleBacklightFixup" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fc8818b66f0 [0x7fff86bf38f0]> { URL = "SMCBatteryManager.kext/ -- file:///System/Library/Extensions/", ID = "ru.usrsse2.SMCBatteryManager" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fc8818b0120 [0x7fff86bf38f0]> { URL = "WhateverGreen.kext/ -- file:///System/Library/Extensions/", ID = "as.vit9696.WhateverGreen" }
Invalid signature -67050 for kext <OSKext 0x7fc8820639b0 [0x7fff86bf38f0]> { URL = "VoodooI2CServices.kext/ -- file:///Library/Extensions/VoodooI2C.kext/Contents/PlugIns/", ID = "com.alexandred.VoodooI2CServices" }
Invalid signature -67050 for kext <OSKext 0x7fc88205ad90 [0x7fff86bf38f0]> { URL = "VoodooGPIO.kext/ -- file:///Library/Extensions/VoodooI2C.kext/Contents/PlugIns/", ID = "org.coolstar.VoodooGPIO" }
KernelCache ID: 3EA3A5294BDB5041B6FCDBC547C40470
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fbe768bb4d0 [0x7fff86bf38f0]> { URL = "WhateverGreen.kext/ -- file:///System/Library/Extensions/", ID = "as.vit9696.WhateverGreen" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fbe768c19b0 [0x7fff86bf38f0]> { URL = "SMCBatteryManager.kext/ -- file:///System/Library/Extensions/", ID = "ru.usrsse2.SMCBatteryManager" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fbe76ac4390 [0x7fff86bf38f0]> { URL = "AppleBacklightFixup.kext/ -- file:///System/Library/Extensions/", ID = "com.hieplpvip.AppleBacklightFixup" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fbe76caf180 [0x7fff86bf38f0]> { URL = "VirtualSMC.kext/ -- file:///System/Library/Extensions/", ID = "as.vit9696.VirtualSMC" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fbe76cddfb0 [0x7fff86bf38f0]> { URL = "VoodooPS2Controller.kext/ -- file:///System/Library/Extensions/", ID = "org.rehabman.voodoo.driver.PS2Controller" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fbe76cde660 [0x7fff86bf38f0]> { URL = "VoodooPS2Trackpad.kext/ -- file:///System/Library/Extensions/VoodooPS2Controller.kext/Contents/PlugIns/", ID = "org.rehabman.voodoo.driver.PS2Trackpad" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fbe76ce8260 [0x7fff86bf38f0]> { URL = "VoodooPS2Keyboard.kext/ -- file:///System/Library/Extensions/VoodooPS2Controller.kext/Contents/PlugIns/", ID = "org.rehabman.voodoo.driver.PS2Keyboard" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fbe76ce3850 [0x7fff86bf38f0]> { URL = "VoodooPS2Mouse.kext/ -- file:///System/Library/Extensions/VoodooPS2Controller.kext/Contents/PlugIns/", ID = "org.rehabman.voodoo.driver.PS2Mouse" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fbe74408790 [0x7fff86bf38f0]> { URL = "Lilu.kext/ -- file:///Library/Extensions/", ID = "as.vit9696.Lilu" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fbe7440f6a0 [0x7fff86bf38f0]> { URL = "AppleALC.kext/ -- file:///Library/Extensions/", ID = "as.vit9696.AppleALC" }
Kext with invalid signatured (-67050) allowed: <OSKext 0x7fbe746073a0 [0x7fff86bf38f0]> { URL = "VoodooI2CELAN.kext/ -- file:///Library/Extensions/", ID = "me.kishorprins.VoodooI2CELAN" }
Kext with invalid signatured (-67062) allowed: <OSKext 0x7fbe770d70e0 [0x7fff86bf38f0]> { URL = "VoodooI2C.kext/ -- file:///Library/Extensions/", ID = "com.alexandred.VoodooI2C" }
Kext with invalid signatured (-67050) allowed: <OSKext 0x7fbe77103d80 [0x7fff86bf38f0]> { URL = "VoodooGPIO.kext/ -- file:///Library/Extensions/VoodooI2C.kext/Contents/PlugIns/", ID = "org.coolstar.VoodooGPIO" }
Kext with invalid signatured (-67050) allowed: <OSKext 0x7fbe77109540 [0x7fff86bf38f0]> { URL = "VoodooI2CServices.kext/ -- file:///Library/Extensions/VoodooI2C.kext/Contents/PlugIns/", ID = "com.alexandred.VoodooI2CServices" }
Remove VoodooI2CELAN.kext, install VoodooI2CHID instead. I think your device is a precision trackpad.
Add CoolStar's 2 patches to your config.plist, you can find them here:

If your APIC pin is 0x10 you don't need GPIO interrupts. Put Return (ConcatenateResTemplate (SBFB, SBFI)) in _CRS instead of the original content.
GPIO is only needed when the pin is higher than 0x2F.
Also, don't remove SBFI from your DSDT even if you use GPIO (And don't remove SBFG if you're using APIC). It's not necessary to remove it.

If you need further help, please attach a troubleshooting archive made with gen_debug.sh.
Notice VoodooI2C v2.1.5 is out, you may update the kext if you have 2.1.4.
 
Last edited:
I have added CoolStar's patches to config.plist, restored DSDT to original and applied GPIO patch. Now IOReg has changed and there are VoodooI2C logs in system.log. But trackpad is still not working.
Have tried using both VoodooI2CHID.kext and VoodooI2CELAN.kext - no success.
And according to this line, device is ELAN, isn't it:?
Code:
VoodooI2CControllerDriver::pci8086,9d60 Found I2C device: ELAN0618

Attaching problem reporting files.

Thank you!
 

Attachments

  • debug_2175.zip
    2.9 MB · Views: 64
I have added CoolStar's patches to config.plist, restored DSDT to original and applied GPIO patch. Now IOReg has changed and there are VoodooI2C logs in system.log. But trackpad is still not working.
Have tried using both VoodooI2CHID.kext and VoodooI2CELAN.kext - no success.
And according to this line, device is ELAN, isn't it:?
Code:
VoodooI2CControllerDriver::pci8086,9d60 Found I2C device: ELAN0618

Attaching problem reporting files.

Thank you!
Please use quoted replies so I can be notified when you reply :)
It is an ELAN, but newer ELAN trackpads use the precision trackpad protocol instead of the proprietary ELAN protocol, so you should use VoodooI2CHID with them.

Notice this line:
Bash:
2019-04-16 01:18:07.383674+0300 0x3e8      Default     0x0                  0      0    kernel: (VoodooI2C) VoodooI2CControllerDriver::VoodooI2CDeviceNub Could not find an I2C Serial Bus declaration

Your _OSI -> XOSI patch is disabled in your config.plist. You need to enable it :)
SSDT-XOSI won't work without it.

You can see your APIC pin is 0x33 in IOReg, so you also need to patch TPD0._CRS for GPIO interrupts (As 0x33 is higher than the maximum of 0x2F for APIC interrupts). It's quite simple, just replace its content with Return (ConcatenateResTemplate (SBFB, SBFG)).
 
Please use quoted replies so I can be notified when you reply :)
It is an ELAN, but newer ELAN trackpads use the precision trackpad protocol instead of the proprietary ELAN protocol, so you should use VoodooI2CHID with them.

Notice this line:
Bash:
2019-04-16 01:18:07.383674+0300 0x3e8      Default     0x0                  0      0    kernel: (VoodooI2C) VoodooI2CControllerDriver::VoodooI2CDeviceNub Could not find an I2C Serial Bus declaration

Your _OSI -> XOSI patch is disabled in your config.plist. You need to enable it :)
SSDT-XOSI won't work without it.

You can see your APIC pin is 0x33 in IOReg, so you also need to patch TPD0._CRS for GPIO interrupts (As 0x33 is higher than the maximum of 0x2F for APIC interrupts). It's quite simple, just replace its content with Return (ConcatenateResTemplate (SBFB, SBFG)).

I have enabled XOSI patch and patched my TPD0._CSR. Now when I use VoodooI2CELAN.kext, the trackpad is visible in System Preferences, but not responding to inputs. When I use VoodooI2CHID.kext, trackpad is not working and something is wrong with TPD0 device, because it's preventing the system from booting (verbose boot screenshot attached). Did I mess up TPD0._CSR? I have tried replacing _CSR's contents with Return (ConcatenateResTemplate (SBFB, SBFG)) - same results.

System did boot with VoodooI2CHID.kext after 3 minutes. Attaching logs.

Thank you!
 

Attachments

  • IMG_20190416_114033.jpg
    IMG_20190416_114033.jpg
    3.2 MB · Views: 119
  • debug_29239.zip
    3 MB · Views: 71
I have enabled XOSI patch and patched my TPD0._CSR. Now when I use VoodooI2CELAN.kext, the trackpad is visible in System Preferences, but not responding to inputs. When I use VoodooI2CHID.kext, trackpad is not working and something is wrong with TPD0 device, because it's preventing the system from booting (verbose boot screenshot attached). Did I mess up TPD0._CSR? I have tried replacing _CSR's contents with Return (ConcatenateResTemplate (SBFB, SBFG)) - same results.

System did boot with VoodooI2CHID.kext after 3 minutes. Attaching logs.

Thank you!
You can just remove this part from _CRS:
Code:
                If (LLess (OSYS, 0x07DC))
                {
                    Return (ConcatenateResTemplate (SBFB, SBFG))
                }

                If (LEqual (SDM0, Zero))
                {
                    Return (ConcatenateResTemplate (SBFB, SBFG))
                }
Just leave the last return statement there. There's no point of having 3 identical return statements there :)

Make sure you use a matched version of VoodooI2CHID with VoodooI2C. Try the new v2.1.6 (Make sure you update both VoodooI2C and VoodooI2CHID). You can also give 2.1.4 a shot.

I cannot refer to the ELAN satellite issue, as you didn't attach an archive made when it's used.
Looking at the Linux source code, seems like VoodooI2CELAN should work with your device.
Please attach an archive made with latest v2.1.6 VoodooI2C + VoodooI2CELAN.
 
You can just remove this part from _CRS:
Code:
                If (LLess (OSYS, 0x07DC))
                {
                    Return (ConcatenateResTemplate (SBFB, SBFG))
                }

                If (LEqual (SDM0, Zero))
                {
                    Return (ConcatenateResTemplate (SBFB, SBFG))
                }
Just leave the last return statement there. There's no point of having 3 identical return statements there :)

Make sure you use a matched version of VoodooI2CHID with VoodooI2C. Try the new v2.1.6 (Make sure you update both VoodooI2C and VoodooI2CHID). You can also give 2.1.4 a shot.

I cannot refer to the ELAN satellite issue, as you didn't attach an archive made when it's used.
Looking at the Linux source code, seems like VoodooI2CELAN should work with your device.
Please attach an archive made with latest v2.1.6 VoodooI2C + VoodooI2CELAN.

Same results after updating to v2.1.6:
with ELAN satelite kext - prefpane is showing, no touchpad input
with HID - nothing is showing, system boots for 3 minutes

Attaching debug info.
 

Attachments

  • debug_VoodooI2CELAN.zip
    3.1 MB · Views: 69
  • debug_VoodooI2CHID.zip
    3 MB · Views: 58
Same results after updating to v2.1.6:
with ELAN satelite kext - prefpane is showing, no touchpad input
with HID - nothing is showing, system boots for 3 minutes

Attaching debug info.
Your _OSI -> XOSI rename is still disabled. You only enabled the OSID -> XSID rename I'm not sure you really need.
 
Your _OSI -> XOSI rename is still disabled. You only enabled the OSID -> XSID rename I'm not sure you really need.
Oh.. I feel so dumb.. was sure I had it enabled. Thank you so much!
 
Status
Not open for further replies.
Back
Top