Jump to content

Testers needed: CPU Power Management for SB and IB Xeon(s) or i7-39xx on X79 or C60x chipset


omni
 Share

494 posts in this topic

Recommended Posts

fabiosun, using a different system definition was a good idea. i tried the macmini6,2 and speed stepping works much butter.

downclocking to 1200Mhz works, and also pstates 21 and 26. also turboboost is doing it's job.

 

It don't know if this is the right way using another system definition, but I also think to remember, that the iMac speed stepping has also some issues?!?!

The imac 13 sysdef gave me only >3000Mhz like macpro61.

 

Edit: x86Platform*.kext did load of course!

post-301536-0-03113000-1390592961_thumb.png

Link to comment
Share on other sites

Interesting observation... After reading Klonkrieger's latest post about using a different smbios, I decided to do some tests of my own.  Using iMac13,2 and Omni's patched AICPM, my system shows it stepping down to 12x with corresponding wattage in both IPG and HWMonitor and maxing at max turbo.  AICPUPMI lists only 2 pstates, 12 and 40.  I have to run with APLF added to SSDT with a value other than "Zero" (or else my system locks at 12x), so I added an extra step (1100 for my processor) and used "APLF, One" so I can idle at 1200.  Running stock AICPM from 13C44 results in cpu locked at 32x.

 

IOReg shows X86PlatformPlugin loaded with Cstates and Pstates.  Geekbench score confirms my OC value and idle temps the same with lowest clock.  I plan to try a few other SMBIOS values and check the results. Perhaps check with Clover as well.

Link to comment
Share on other sites

I tried with macmini6,2 as well and I noticed more P-States.

 

Perhaps this has to do with the ringFreqTables definition for Mac mini in the platform definition?

 

<key>ringFreqTables</key>
      <array>
        <array>
          <dict>
            <key>gtFreq</key>
            <integer>700</integer>
            <key>ringFreq</key>
            <integer>1100</integer>
          </dict>
          <dict>
            <key>gtFreq</key>
            <integer>750</integer>
            <key>ringFreq</key>
            <integer>1100</integer>
          </dict>
          <dict>
            <key>gtFreq</key>
            <integer>800</integer>
            <key>ringFreq</key>
            <integer>1200</integer>
          </dict>
          <dict>
            <key>gtFreq</key>
            <integer>850</integer>
            <key>ringFreq</key>
            <integer>1300</integer>
          </dict>
          <dict>
            <key>gtFreq</key>
            <integer>900</integer>
            <key>ringFreq</key>
            <integer>1600</integer>
          </dict>
          <dict>
            <key>gtFreq</key>
            <integer>950</integer>
            <key>ringFreq</key>
            <integer>1700</integer>
          </dict>
          <dict>
            <key>gtFreq</key>
            <integer>1000</integer>
            <key>ringFreq</key>
            <integer>1800</integer>
          </dict>
          <dict>
            <key>gtFreq</key>
            <integer>1050</integer>
            <key>ringFreq</key>
            <integer>1900</integer>
          </dict>
          <dict>
            <key>gtFreq</key>
            <integer>1100</integer>
            <key>ringFreq</key>
            <integer>2000</integer>
          </dict>
          <dict>
            <key>gtFreq</key>
            <integer>1150</integer>
            <key>ringFreq</key>
            <integer>2100</integer>
          </dict>
          <dict>
            <key>gtFreq</key>
            <integer>1200</integer>
            <key>ringFreq</key>
            <integer>2200</integer>
          </dict>
          <dict>
            <key>gtFreq</key>
            <integer>1250</integer>
            <key>ringFreq</key>
            <integer>2300</integer>
          </dict>
          <dict>
            <key>gtFreq</key>
            <integer>1300</integer>
            <key>ringFreq</key>
            <integer>2300</integer>
          </dict>
        </array>
      </array>

 

 

 

Obviously these frequencies don't match what we run, so some creative editing is required...

Link to comment
Share on other sites

If I was to guesstimate, gtFreq refers to the iGPU frequency, and ringFreq would be the CPU frequency.

 

Last entry is Turbo mode 1300MHz for HD 4000, and 2300MHz+ for CPU (up to 3.6GHz Turbo Boost as 3400, 3500, 3600)

 

EDIT: although it could also be for a SB CPU as well which has CPU at 2.3GHz and Turbo Boost as 3100, 3300, 3400 but I doubt since macmini6,x was IB.

 

Link to comment
Share on other sites

AFAIK you cannot boot without SMBios.plist. At least my system will hang as it needs a platform definition.

 

On another topic I've been looking at something else, namely the following lines (if you have them) in kernel log:

 

X86PlatformShim::buildCPUPerformanceArray - fCPUPerformanceArray[19] = 52
X86PlatformShim::buildCPUPerformanceArray - fCPUPerformanceArray[20] = 48
X86PlatformShim::buildCPUPerformanceArray - fCPUPerformanceArray[21] = 45
X86PlatformShim::buildCPUPerformanceArray - fCPUPerformanceArray[22] = 42
X86PlatformShim::buildCPUPerformanceArray - fCPUPerformanceArray[23] = 39
X86PlatformShim::buildCPUPerformanceArray - fCPUPerformanceArray[24] = 36
X86PlatformShim::sendStepper - Setting initial plimit value to PMin 24
X86PlatformShim::start - registering pLimitNotificationCallback for cpu plimits
X86PlatformPlugin::setPLimitRange - CPU Limit Range [0, 24]
X86PlatformPlugin::cgDispatchCallback - no initial cpu-plimit-notification plimit value sent
X86PlatformShim::start - registering pLimitNotificationCallback for cpu idle plimits
X86PlatformPlugin::setPLimitRange - Force Idle Limit Range [0, 100]
X86PlatformPlugin::cgDispatchCallback - no initial cpu-idle-plimit-notification plimit value sent
 
What caught my attention is X86PlatformPlugin::cgDispatchCallback - no initial cpu-plimit-notification plimit value sent tells me that AICPM did not send the P-Limit when asked about it.
 
Even though this limit is known and defined, I had to patch the function that handles it in my AICPM version because I was getting a KP. Obviously for those that use a virgin kext it does not matter, but for everyone else is might be a show stopper getting/reaching lower states.
 
The function in question is _i386_SetPStateLimit for anyone who wants to take a look at, and I'd appreciate more help about it at this point.
Link to comment
Share on other sites

fabiosun, using a different system definition was a good idea. i tried the macmini6,2 and speed stepping works much butter.

downclocking to 1200Mhz works, and also pstates 21 and 26. also turboboost is doing it's job.

 

It don't know if this is the right way using another system definition, but I also think to remember, that the iMac speed stepping has also some issues?!?!

The imac 13 sysdef gave me only >3000Mhz like macpro61.

 

Edit: x86Platform*.kext did load of course!

Interesting! i use Mac-F65AE981FFA204ED.plist to replace Mac-F60DEB81FF30ACF6.plist

Mac-F65AE981FFA204ED=MacMini6.2
Mac-F60DEB81FF30ACF6=MacPro6.1

The path of the this plist:

/System/Library/Extensions/IOPlatformPluginFamily.kext/Contents/PlugIns/X86PlatformPlugin.kext/Contents/Resources/

See what i can get

kernel[0]: AICPUPMI: CPU P-States [ 36 ]
kernel[0]: AICPUPMI: CPU P-States [ 12 36 ]
kernel[0]: AICPUPMI: CPU P-States [ 12 13 36 37 ]
kernel[0]: AICPUPMI: CPU P-States [ 12 13 36 37 38 ]
kernel[0]: AICPUPMI: CPU P-States [ 12 13 24 36 37 38 ]
kernel[0]: AICPUPMI: CPU P-States [ 12 13 24 30 36 37 38 ]

Used the old version AppleIntelCPUPowerManagementInfo.kext,the newest one will get KP

 

If i ues Mac-F60DEB81FF30ACF6.plist(MacPro6.1) only get 12x 36x 37x 38x and most of time the HW just show 36x and 37x,nearly no 12x show

 

Debug:

kernel[0]: AppleIntelCPUPowerManagement: Turbo Ratios 1122
kernel[0]: AppleIntelCPUPowerManagement: (built 20:35:09 Oct 17 2013) initialization complete
kernel[0]: SMC: successfully initialized
kernel[0]: AppleIntelCPUPowerManagementClient: ready

kernel[0]: X86PlatformPlugin::init() - kIOPPFBootArgs boot-args set debugLevel 3, debugFlags 3
kernel[0]: X86PlatformPlugin::start - fPanicErrors 0
kernel[0]: X86PlatformPlugin::startDelayedPlatformDatabaseRead - Mac-F60DEB81FF30ACF6.plist
kernel[0]: X86PlatformPlugin::getCPUPStates - P 0: coreFreq 3800, power 130000, latency 10, busLatency 10, control 0x2600, status 0x2600
kernel[0]: X86PlatformPlugin::getCPUPStates - P 1: coreFreq 3700, power 130000, latency 10, busLatency 10, control 0x2500, status 0x2500
kernel[0]: X86PlatformPlugin::getCPUPStates - P 2: coreFreq 3600, power 130000, latency 10, busLatency 10, control 0x2400, status 0x2400
kernel[0]: X86PlatformPlugin::getCPUPStates - P 3: coreFreq 3500, power 124956, latency 10, busLatency 10, control 0x2300, status 0x2300
kernel[0]: X86PlatformPlugin::getCPUPStates - P 4: coreFreq 3400, power 120003, latency 10, busLatency 10, control 0x2200, status 0x2200
kernel[0]: X86PlatformPlugin::getCPUPStates - P 5: coreFreq 3300, power 115138, latency 10, busLatency 10, control 0x2100, status 0x2100
kernel[0]: X86PlatformPlugin::getCPUPStates - P 6: coreFreq 3200, power 110362, latency 10, busLatency 10, control 0x2000, status 0x2000
kernel[0]: X86PlatformPlugin::getCPUPStates - P 7: coreFreq 3100, power 105674, latency 10, busLatency 10, control 0x1f00, status 0x1f00
kernel[0]: X86PlatformPlugin::getCPUPStates - P 8: coreFreq 3000, power 101072, latency 10, busLatency 10, control 0x1e00, status 0x1e00
kernel[0]: X86PlatformPlugin::getCPUPStates - P 9: coreFreq 2900, power 96557, latency 10, busLatency 10, control 0x1d00, status 0x1d00
kernel[0]: X86PlatformPlugin::getCPUPStates - P10: coreFreq 2800, power 92127, latency 10, busLatency 10, control 0x1c00, status 0x1c00
kernel[0]: X86PlatformPlugin::getCPUPStates - P11: coreFreq 2700, power 87783, latency 10, busLatency 10, control 0x1b00, status 0x1b00
kernel[0]: X86PlatformPlugin::getCPUPStates - P12: coreFreq 2600, power 83522, latency 10, busLatency 10, control 0x1a00, status 0x1a00
kernel[0]: X86PlatformPlugin::getCPUPStates - P13: coreFreq 2500, power 79345, latency 10, busLatency 10, control 0x1900, status 0x1900
kernel[0]: X86PlatformPlugin::getCPUPStates - P14: coreFreq 2400, power 75251, latency 10, busLatency 10, control 0x1800, status 0x1800
kernel[0]: X86PlatformPlugin::getCPUPStates - P15: coreFreq 2300, power 71238, latency 10, busLatency 10, control 0x1700, status 0x1700
kernel[0]: X86PlatformPlugin::getCPUPStates - P16: coreFreq 2200, power 67308, latency 10, busLatency 10, control 0x1600, status 0x1600
kernel[0]: X86PlatformPlugin::getCPUPStates - P17: coreFreq 2100, power 63457, latency 10, busLatency 10, control 0x1500, status 0x1500
kernel[0]: X86PlatformPlugin::getCPUPStates - P18: coreFreq 2000, power 59687, latency 10, busLatency 10, control 0x1400, status 0x1400
kernel[0]: X86PlatformPlugin::getCPUPStates - P19: coreFreq 1900, power 55996, latency 10, busLatency 10, control 0x1300, status 0x1300
kernel[0]: X86PlatformPlugin::getCPUPStates - P20: coreFreq 1800, power 52384, latency 10, busLatency 10, control 0x1200, status 0x1200
kernel[0]: X86PlatformPlugin::getCPUPStates - P21: coreFreq 1700, power 48849, latency 10, busLatency 10, control 0x1100, status 0x1100
kernel[0]: X86PlatformPlugin::getCPUPStates - P22: coreFreq 1600, power 45392, latency 10, busLatency 10, control 0x1000, status 0x1000
kernel[0]: X86PlatformPlugin::getCPUPStates - P23: coreFreq 1500, power 42011, latency 10, busLatency 10, control 0xf00, status 0xf00
kernel[0]: X86PlatformPlugin::getCPUPStates - P24: coreFreq 1400, power 38706, latency 10, busLatency 10, control 0xe00, status 0xe00
kernel[0]: X86PlatformPlugin::getCPUPStates - P25: coreFreq 1300, power 35476, latency 10, busLatency 10, control 0xd00, status 0xd00
kernel[0]: X86PlatformPlugin::getCPUPStates - P26: coreFreq 1200, power 32320, latency 10, busLatency 10, control 0xc00, status 0xc00
kernel[0]: X86PlatformPlugin::publishACPIStates - Succeeded in getting max non-turbo PState 2
kernel[0]: X86PlatformPlugin::publishACPIStates - Succeeded in getting max efficient PState ratio difference 1
kernel[0]: X86PlatformPlugin::publishACPIStates - Found max efficient PState to be 25

part2:

kernel[0]: X86PlatformPlugin::cgPublishCPUStates - Got all the CPU callbacks!
kernel[0]: X86PlatformPlugin::configResourceHandler - setting Thermal Profile from resource
kernel[0]: X86PlatformPlugin::cgConfigResourceHandler - waiting for commandWake on num proccessors to be 0: 0
kernel[0]: X86PlatformPlugin::setRingTable - AICPM failed to load ring table with status 0x0: Get=0, Load=0, Install=0
kernel[0]: X86PlatformPlugin::configResourceHandler - Failed to set ring table!
kernel[0]: X86PlatformShim::setPStateEntryInfoAICPM - PState[0]: vid 0x0, voltage 7000, frequency 3800, multiplier 038
kernel[0]: X86PlatformShim::setPStateEntryInfoAICPM - PState[1]: vid 0x0, voltage 7000, frequency 3700, multiplier 037
kernel[0]: X86PlatformShim::setPStateEntryInfoAICPM - PState[2]: vid 0x0, voltage 7000, frequency 3600, multiplier 036
kernel[0]: X86PlatformShim::setPStateEntryInfoAICPM - PState[3]: vid 0x0, voltage 7000, frequency 3500, multiplier 035
kernel[0]: X86PlatformShim::setPStateEntryInfoAICPM - PState[4]: vid 0x0, voltage 7000, frequency 3400, multiplier 034
kernel[0]: X86PlatformShim::setPStateEntryInfoAICPM - PState[5]: vid 0x0, voltage 7000, frequency 3300, multiplier 033
kernel[0]: X86PlatformShim::setPStateEntryInfoAICPM - PState[6]: vid 0x0, voltage 7000, frequency 3200, multiplier 032
kernel[0]: X86PlatformShim::setPStateEntryInfoAICPM - PState[7]: vid 0x0, voltage 7000, frequency 3100, multiplier 031
kernel[0]: X86PlatformShim::setPStateEntryInfoAICPM - PState[8]: vid 0x0, voltage 7000, frequency 3000, multiplier 030
kernel[0]: X86PlatformShim::setPStateEntryInfoAICPM - PState[9]: vid 0x0, voltage 7000, frequency 2900, multiplier 029
kernel[0]: X86PlatformShim::setPStateEntryInfoAICPM - PState[10]: vid 0x0, voltage 7000, frequency 2800, multiplier 028
kernel[0]: X86PlatformShim::setPStateEntryInfoAICPM - PState[11]: vid 0x0, voltage 7000, frequency 2700, multiplier 027
kernel[0]: X86PlatformShim::setPStateEntryInfoAICPM - PState[12]: vid 0x0, voltage 7000, frequency 2600, multiplier 026
kernel[0]: X86PlatformShim::setPStateEntryInfoAICPM - PState[13]: vid 0x0, voltage 7000, frequency 2500, multiplier 025
kernel[0]: X86PlatformShim::setPStateEntryInfoAICPM - PState[14]: vid 0x0, voltage 7000, frequency 2400, multiplier 024
kernel[0]: X86PlatformShim::setPStateEntryInfoAICPM - PState[15]: vid 0x0, voltage 7000, frequency 2300, multiplier 023
kernel[0]: X86PlatformShim::setPStateEntryInfoAICPM - PState[16]: vid 0x0, voltage 7000, frequency 2200, multiplier 022
kernel[0]: X86PlatformShim::setPStateEntryInfoAICPM - PState[17]: vid 0x0, voltage 7000, frequency 2100, multiplier 021
kernel[0]: X86PlatformShim::setPStateEntryInfoAICPM - PState[18]: vid 0x0, voltage 7000, frequency 2000, multiplier 020
kernel[0]: X86PlatformShim::setPStateEntryInfoAICPM - PState[19]: vid 0x0, voltage 7000, frequency 1900, multiplier 019
kernel[0]: X86PlatformShim::setPStateEntryInfoAICPM - PState[20]: vid 0x0, voltage 7000, frequency 1800, multiplier 018
kernel[0]: X86PlatformShim::setPStateEntryInfoAICPM - PState[21]: vid 0x0, voltage 7000, frequency 1700, multiplier 017
kernel[0]: X86PlatformShim::setPStateEntryInfoAICPM - PState[22]: vid 0x0, voltage 7000, frequency 1600, multiplier 016
kernel[0]: X86PlatformShim::setPStateEntryInfoAICPM - PState[23]: vid 0x0, voltage 7000, frequency 1500, multiplier 015
kernel[0]: X86PlatformShim::setPStateEntryInfoAICPM - PState[24]: vid 0x0, voltage 7000, frequency 1400, multiplier 014
kernel[0]: X86PlatformShim::setPStateEntryInfoAICPM - PState[25]: vid 0x0, voltage 7000, frequency 1300, multiplier 013
kernel[0]: X86PlatformShim::setPStateEntryInfoAICPM - PState[26]: vid 0x0, voltage 7000, frequency 1200, multiplier 012

kernel[0]: X86PlatformPlugin::publishACPIStates - Succeeded in getting max non-turbo PState 2
kernel[0]: X86PlatformPlugin::publishACPIStates - Succeeded in getting max efficient PState ratio difference 1 
kernel[0]: X86PlatformPlugin::publishACPIStates - Found max efficient PState to be 25 
kernel[0]: X86PlatformShim::start - registering pLimitNotificationCallback for cpu plimits 
kernel[0]: X86PlatformPlugin::setPLimitRange - CPU Limit Range [0, 26] 
kernel[0]: X86PlatformPlugin::cgDispatchCallback - no initial cpu-plimit-notification plimit value sent 
kernel[0]: X86PlatformShim::start - registering pLimitNotificationCallback for cpu idle plimitskernel[0]: X86PlatformPlugin::setPLimitRange - Force Idle Limit Range [0, 100] 
kernel[0]: X86PlatformPlugin::cgDispatchCallback - no initial cpu-idle-plimit-notification plimit value sent 
May still have some error need to fix,but much better than ever.
 
So you guys may have a try!

 

IPG:

 

gOBgMI9.png

 

HWMonitor:

 

LB9LmXu.png

Link to comment
Share on other sites

fabiosun,

 

something must be generating a platform definition, else you just couldn't boot the system up afaik.

 

you are still missing Cx_RESIDENCY values and your TURBO_RATIO_LIMIT is totally wrong, set the last one in your BIOS manually. There's no Xeon that can clock at 3600MHz Turbo with all 8 cores, it would self destruct. :D

Link to comment
Share on other sites

fabiosun,

 

the 0x2424242424242424 value is the 36x multiplier, but not it being 0x2121212121212121 it still makes no sense to me. What kind of a CPU do you have that can clock Turbo Boost with 8 cores that high?

 

Generally there would be a fall-off, so 1 core 36x, 2-3 cores 34x, 4-8 cores 32x ... something like that.

 

The IOPlatformPlugin is where the platform definitions reside, but something still needs to define *your* system's platform before those definitions are invoked for parameters. Maybe the boot loader is automatically setting up the platform is the SMBios.plist is missing?

 

You still need to fix those Cx_RESIDENCY values though.

Link to comment
Share on other sites

But you know that 0x2121212121222324 seems more correct than any of the other ones. I just never heard any Xeon-E running at max Turbo Boost with all the cores.

 

There has to be some setting in your BIOS for the C-States, even my crappy BIOS has it. :D

 

​I tested more platform definitions and for my SB-E Xeon, I get better performance and temperatures when running in legacy (ACPI) mode as Macmini5,2. It actually clocks down to 12x and up to 36x and have 8 P-states.

 

When running as an iMac12,2 I get marginally better single and multi core result but it does not show 12x in HWMonitor.

 

My Cinebench R15 score for the multi-core is 2188 or so. That's for a dual 8-core Xeon.

 

Maybe I should just drop Mavericks and go back to Mountain Lion...hmm.

Link to comment
Share on other sites

omni I know your point of view on this and I want to thank you for your great help.

 

I would ask where could be a platform definition (OEM) in my installation if I have no SMBios.plist and SSDT.plist files in EXTRA folder (my system start correctly without those files)

 

 

 

chameleon or clover is going to inject some kind of mac model if you have no smbios specified.. What is About this Mac showing when you use no smbios? 

Link to comment
Share on other sites

Omni: you're correct about Xeons and turbo, it's out of their TDP range. A weird analogy would be; Imagine driving your car on a very high octane fuel, with twin turbos and nitro injected into it.

 

@fabiosun and @joe75: Don't know about chameleon but clover looks at your system and injects mac model based on sys. specs if I'm not mistaken.

 

About x86Platform, for chameleon use, I think plugintype=1, for clover add the keys into the config file, I personally added that into the ssdt, since both clover and chameleon being very stubborn and not injecting that for some odd reason.

Link to comment
Share on other sites

I am running 10.9.2 13C4 afaik, and my system had x12 and x36 with SMBios Mac Pro 5.1. With 6.1 only x36 and with Mac Mini 6.1 only x36. Then i installed the AICPInfo kext which gave me the KP. I think its because my CPU is an ES which means the CPU ID is not matched.

Link to comment
Share on other sites

I am running 10.9.2 13C4 afaik, and my system had x12 and x36 with SMBios Mac Pro 5.1. With 6.1 only x36 and with Mac Mini 6.1 only x36. Then i installed the AICPInfo kext which gave me the KP. I think its because my CPU is an ES which means the CPU ID is not matched.

Don't install AICPUPMI.  If you want to use it, load it after boot.  If it still gives you KPs, compile it form source and it should work.

Link to comment
Share on other sites

 

Why rampage_dev on your blog .....does not prove with facts, attacking screen, why not show the steps with a log?

 

Mhmm ....him dont have a sandy bridge ...so please you are a mod here ...why rampage_ dev is not involved in this discussion?

Link to comment
Share on other sites

This might be a silly question but can anyone tell me what the actual edit to the ssdt file is at cpu0 to set plugintype=1? Thanks!

 

It would be inside DSDT not SSDT, afaik.

 

Under your processor CPU0 or CP00, in the _DSM method:

 

Method (_DSM, 4, NotSerialized)
           {
               Store ("Writing plugin-type to Registry!", Debug)
               Store (Package (0x02)
               {
                   "plugin-type", 
                   0x01
               }, Local0)
               DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
               Return (Local0)
           }
 

 

Link to comment
Share on other sites

Why rampage_dev on your blog .....does not prove with facts, attacking screen, why not show the steps with a log?

 

Mhmm ....him dont have a sandy bridge ...so please you are a mod here ...why rampage_ dev is not involved in this discussion?

 

Err, this sounds like an invitation for an argument, and I'd like to focus on what I'm presenting here, so please let's stay with that.

 

As it stands right now, my patch is required for all CPUs with a model number 0x2d which are SB-E and SB-EP (Xeon). The IB CPUs will get automatically detected by an untouched AICPM from Trashcan Pro 10.9 (13A4023), or 10.9.2 beta (13C44), if they are model number 0x3e.

 

 

I tried using kextload from within OSX to load AICPMInfo kext, as soon as it completed the system locked up.

 

This is not a place to report problems with AICPMI.

 

Please go to Pike's blog at http://pikeralpha.wordpress.com and contact him directly there.

 

  • Like 1
Link to comment
Share on other sites

Err, this sounds like an invitation for an argument, and I'd like to focus on what I'm presenting here, so please let's stay with that.

 .

 

 

mine is not an invitation, and I am convinced are following this topic, I personally do not care who intervenes or no to your question, but the mod has linked the blog .... and I have not invited anyone .... . clear .....??

Link to comment
Share on other sites

 Share

×
×
  • Create New...