No announcement yet.

H81 Pro BTC P1.80: Firmware fix request and Ubuntu Firmware Test Suite (fwts) output

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • H81 Pro BTC P1.80: Firmware fix request and Ubuntu Firmware Test Suite (fwts) output

    In the quest for why our H81 Pro BTC P1.80 + Celeron G1820/G1840 won’t enter Package State C6 (pc6), the Ubuntu Firmware Test Suite was run.

    Some tests generate warning that don’t need fixing: like secure boot, that is ok because it is disabled in firmware. That there are default values in DMI/SMBIOS table, that's also not a hot issue.

    The following issues are or might be a problem (feedback is appreciated):

    1. PCIe ASPM is not controlled by Linux kernel
    Because of being disabled in the HPET table, while enabling ASPM doesn't cause stability issues in our case. At least give an option in the firmware to enable PCIe ASPM, f.e. near PCIe speed.

    Them (disassembled) FACP/FADT has incorrect "Boot Flags" stating that PCIe ASPM is not supported:
    Code:
    [000h 0000   4]                    Signature : "FACP"    [Fixed ACPI Description Table (FADT)]
    [004h 0004   4]                 Table Length : 0000010C
    [008h 0008   1]                     Revision : 05
    [009h 0009   1]                     Checksum : 65
    [00Ah 0010   6]                       Oem ID : "ALASKA"
    [010h 0016   8]                 Oem Table ID : "A M I"
    [018h 0024   4]                 Oem Revision : 01072009
    [01Ch 0028   4]              Asl Compiler ID : "AMI "
    [020h 0032   4]        Asl Compiler Revision : 00010013
    ...
    [06Dh 0109   2]   Boot Flags (decoded below) : 0010
                   Legacy Devices Supported (V2) : 0
                8042 Present on ports 60/64 (V2) : 0
                            VGA Not Present (V4) : 0
                          MSI Not Supported (V4) : 0
                    PCIe ASPM Not Supported (V4) : 1 <- So no ASPM
                       CMOS RTC Not Present (V5) : 0
    2. L0s L1 not enabled
    Code:
    WARNING: Test 2, RP 00h:1Ch.05h L0s not enabled.
    WARNING: Test 2, RP 00h:1Ch.05h L1 not enabled.
    WARNING: Test 2, Device 03h:00h.00h L0s not enabled.
    WARNING: Test 2, Device 03h:00h.00h L1 not enabled.
    Device 03h:00h.00h = 03:00.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 11)
    Device 00h:1Ch.05h = 00:1c.5 PCI bridge [0604]: Intel Corporation 8 Series/C220 Series Chipset Family PCI Express Root Port #6 [8086:8c1a] (rev d5)

    3. ACPI table DSDT
    FAILED [HIGH] AMLAsmASL_MSG_SYNTAX: Test 1, Assembler error in line 9917 (fwts v14.08) / 9985 (fwts v14.03):
    Code:
    Line | AML source
    09982|         If (CondRefOf (MDBG))
    09983|         {
    09984|             Return (MDBG) /* External reference */
    09985|             Arg0
        |               ^
        | Error 6126: syntax error, unexpected PARSEOP_ARG0
    09986|         }
    09987|
    09988|         Return (Zero)
    ADVICE: (for Error #6126, ASL_MSG_SYNTAX): The disassembled code cannot be
    reassembled using the strict IASL compiler as it contains syntax errors.
    FAILED [HIGH] SyntaxCheckIASLCompilerAborted: Test 1, Compilation aborted early
    due to a parser detected syntax error.
    ADVICE: Some subsequent errors may not be detected because the compiler had to
    terminate prematurely. If the compiler did not abort early then potentially
    correct code may parse incorrectly producing some or many false positive errors.

    4. ACPI DSDT Method Semantic
    Test 11 of 155: Test _STR (String).
    FAILED [MEDIUM] MethodReturnBadType: Test 11, Method \_SB_.TPM_._STR did not
    return ACPI_TYPE_STRING.
    Test 73 of 155: Test _PCT (Performance Control).
    FAILED [MEDIUM] MethodReturnNullObj: Test 73, \_PR_.CPU0._PCT returned a NULL
    object, and did not return ACPI_TYPE_PACKAGE.

    Full fwts v14.08 logs on paste bin:
    http://pastebin.com/ZQDz6zjv (kernel 3.13)
    http://pastebin.com/6g9EMdSk (kernel 3.17.0-999)

    And full fwts v14.03.1 logs on paste bin:
    http://pastebin.com/XRUV2W3f (kernel 3.13)
    http://pastebin.com/zsye0ywt (kernel 3.16)
    http://pastebin.com/fcwWeVWw (kernel 3.13, acpi_osi=Linux)
    Last edited by ProBackup-nl; 09-01-2014, 03:54 PM. Reason: full fwts logs pastebins; FACP/FADT inserted

  • #2
    Re: H81 Pro BTC P1.80: Firmware fix request and Ubuntu Firmware Test Suite (fwts) output

    It would be nice when these fwts test results are fixed:
    1. microcode: Test if system is using latest microcode.
    microcode: CPU0 sig=0x306c3, pf=0x2, revision=0x9
    microcode: CPU0 updated to revision 0x1a, date = 2014-05-23
    microcode: CPU1 sig=0x306c3, pf=0x2, revision=0x9
    microcode: CPU1 updated to revision 0x1a, date = 2014-05-23


    2. ACPI tables assembler warnings:
    Test 2 of 2: Disassemble and reassemble SSDT


    Checking ACPI table SSDT (#0)


    FAILED [HIGH] AMLAsmASL_MSG_SYNTAX: Test 2, Assembler error in line 221
    Line | AML source
    Code:
    00218|                 0x00000800
    00219|             }
    00220|         })
    00221|         Package (0x06)
         |              ^
         | Error 6126: syntax error, unexpected PARSEOP_PACKAGE
    00222|         {
    00223|             0x80000000,
    00224|             0x80000000,

    ADVICE: (for Error #6126, ASL_MSG_SYNTAX): The disassembled code cannot be
    reassembled using the strict IASL compiler as it contains syntax errors.


    FAILED [HIGH] SyntaxCheckIASLCompilerAborted: Test 2, Compilation aborted early
    due to a parser detected syntax error.


    ADVICE: Some subsequent errors may not be detected because the compiler had to
    terminate prematurely. If the compiler did not abort early then potentially
    correct code may parse incorrectly producing some or many false positive errors.


    Table SSDT (0) reassembly: Found 1 errors, 0 warnings, 0 remarks.




    Checking ACPI table SSDT (#1)


    FAILED [MEDIUM] AMLAsmASL_MSG_RESERVED_NO_RETURN_VAL: Test 2, Assembler warning
    in line 121
    Line | AML source
    Code:
    00118|
    00119|             Store (CPDC (Arg0), Local0)
    00120|             GCAP (Local0)
    00121|             Return (Local0)
         |                         ^
         | Warning 3104: Reserved method should not return a value (_PDC)
    00122|         }
    00123|
    00124|         Method (_OSC, 4, NotSerialized)  // _OSC: Operating System Capabilities

    ADVICE: (for Warning #3104, ASL_MSG_RESERVED_NO_RETURN_VAL): A reserved method
    returned a value however it is not expected to return anything, so this does not
    conform to the expected behaviour. The kernel will most probably ignore the
    return value, so this is not going to produce any run time errors.


    FAILED [LOW] AMLAsmASL_MSG_SERIALIZED_REQUIRED: Test 2, Assembler remark in line
    131
    Line | AML source
    Code:
    00128|             Return (Local0)
    00129|         }
    00130|
    00131|         Method (CPDC, 1, NotSerialized)
         |                   ^
         | Remark 2120: Control Method should be made Serialized (due to creation of named objects within)
    00132|         {
    00133|             CreateDWordField (Arg0, Zero, REVS)
    00134|             CreateDWordField (Arg0, 0x04, SIZE)

    ADVICE: (for Remark #2120, ASL_MSG_SERIALIZED_REQUIRED): A named object is
    created inside a non-serialized method - this method should be serialized. It is
    possible that one thread enters the method and blocks and then a second thread
    also executes the method, ending up in two attempts to create the object and
    causing a failure.


    FAILED [LOW] AMLAsmASL_MSG_SERIALIZED_REQUIRED: Test 2, Assembler remark in line
    150
    Line | AML source
    Code:
    00147|                 }, REVS, SIZE, Local2))
    00148|         }
    00149|
    00150|         Method (COSC, 4, NotSerialized)
         |                   ^
         | Remark 2120: Control Method should be made Serialized (due to creation of named objects within)
    00151|         {
    00152|             CreateDWordField (Arg3, Zero, STS0)
    00153|             CreateDWordField (Arg3, 0x04, CAP0)

    ADVICE: (for Remark #2120, ASL_MSG_SERIALIZED_REQUIRED): A named object is
    created inside a non-serialized method - this method should be serialized. It is
    possible that one thread enters the method and blocks and then a second thread
    also executes the method, ending up in two attempts to create the object and
    causing a failure.


    FAILED [LOW] AMLAsmASL_MSG_NOT_REFERENCED: Test 2, Assembler remark in line 153
    Line | AML source
    Code:
    00150|         Method (COSC, 4, NotSerialized)
    00151|         {
    00152|             CreateDWordField (Arg3, Zero, STS0)
    00153|             CreateDWordField (Arg3, 0x04, CAP0)
         |                                             ^
         | Remark 2089: Object is not referenced    (Name is within method [COSC])
    00154|             CreateDWordField (Arg0, Zero, IID0)
    00155|             CreateDWordField (Arg0, 0x04, IID1)
    00156|             CreateDWordField (Arg0, 0x08, IID2)
    FAILED [LOW] AMLAsmASL_MSG_SERIALIZED_REQUIRED: Test 2, Assembler remark in line
    183
    Line | AML source
    Code:
    00180|             Return (Arg3)
    00181|         }
    00182|
    00183|         Method (GCAP, 1, NotSerialized)
         |                   ^
         | Remark 2120: Control Method should be made Serialized (due to creation of named objects within)
    00184|         {
    00185|             CreateDWordField (Arg0, Zero, STS0)
    00186|             CreateDWordField (Arg0, 0x04, CAP0)

    ADVICE: (for Remark #2120, ASL_MSG_SERIALIZED_REQUIRED): A named object is
    created inside a non-serialized method - this method should be serialized. It is
    possible that one thread enters the method and blocks and then a second thread
    also executes the method, ending up in two attempts to create the object and
    causing a failure.


    FAILED [MEDIUM] AMLAsmASL_MSG_RESERVED_NO_RETURN_VAL: Test 2, Assembler warning
    in line 223
    Line | AML source
    Code:
    00220|         {
    00221|             Store (\_PR.CPU0.CPDC (Arg0), Local0)
    00222|             GCAP (Local0)
    00223|             Return (Local0)
         |                         ^
         | Warning 3104: Reserved method should not return a value (_PDC)
    00224|         }
    00225|
    00226|         Method (_OSC, 4, NotSerialized)  // _OSC: Operating System Capabilities

    ADVICE: (for Warning #3104, ASL_MSG_RESERVED_NO_RETURN_VAL): A reserved method
    returned a value however it is not expected to return anything, so this does not
    conform to the expected behaviour. The kernel will most probably ignore the
    return value, so this is not going to produce any run time errors.


    FAILED [LOW] AMLAsmASL_MSG_SERIALIZED_REQUIRED: Test 2, Assembler remark in line
    263
    Line | AML source
    Code:
    00260|             Return (Zero)
    00261|         }
    00262|
    00263|         Method (APCT, 0, NotSerialized)
         |                   ^
         | Remark 2120: Control Method should be made Serialized (due to creation of named objects within)
    00264|         {
    00265|             If (LAnd (And (CFGD, 0x7A), LNot (And (SDTL, 0x20
    00266|                 ))))

    ADVICE: (for Remark #2120, ASL_MSG_SERIALIZED_REQUIRED): A named object is
    created inside a non-serialized method - this method should be serialized. It is
    possible that one thread enters the method and blocks and then a second thread
    also executes the method, ending up in two attempts to create the object and
    causing a failure.


    FAILED [LOW] AMLAsmASL_MSG_SERIALIZED_REQUIRED: Test 2, Assembler remark in line
    275
    Line | AML source
    Code:
    00272|             }
    00273|         }
    00274|
    00275|         Method (APPT, 0, NotSerialized)
         |                   ^
         | Remark 2120: Control Method should be made Serialized (due to creation of named objects within)
    00276|         {
    00277|             If (LAnd (And (CFGD, One), LNot (And (SDTL, 0x10
    00278|                 ))))

    ADVICE: (for Remark #2120, ASL_MSG_SERIALIZED_REQUIRED): A named object is
    created inside a non-serialized method - this method should be serialized. It is
    possible that one thread enters the method and blocks and then a second thread
    also executes the method, ending up in two attempts to create the object and
    causing a failure.


    FAILED [MEDIUM] AMLAsmASL_MSG_RESERVED_NO_RETURN_VAL: Test 2, Assembler warning
    in line 294
    Line | AML source
    Code:
    00291|         {
    00292|             Store (\_PR.CPU0.CPDC (Arg0), Local0)
    00293|             GCAP (Local0)
    00294|             Return (Local0)
         |                         ^
         | Warning 3104: Reserved method should not return a value (_PDC)
    00295|         }
    00296|
    00297|         Method (_OSC, 4, NotSerialized)  // _OSC: Operating System Capabilities

    ADVICE: (for Warning #3104, ASL_MSG_RESERVED_NO_RETURN_VAL): A reserved method
    returned a value however it is not expected to return anything, so this does not
    conform to the expected behaviour. The kernel will most probably ignore the
    return value, so this is not going to produce any run time errors.


    FAILED [MEDIUM] AMLAsmASL_MSG_RESERVED_NO_RETURN_VAL: Test 2, Assembler warning
    in line 341
    Line | AML source
    Code:
    00338|         {
    00339|             Store (\_PR.CPU0.CPDC (Arg0), Local0)
    00340|             GCAP (Local0)
    00341|             Return (Local0)
         |                         ^
         | Warning 3104: Reserved method should not return a value (_PDC)
    00342|         }
    00343|
    00344|         Method (_OSC, 4, NotSerialized)  // _OSC: Operating System Capabilities

    ADVICE: (for Warning #3104, ASL_MSG_RESERVED_NO_RETURN_VAL): A reserved method
    returned a value however it is not expected to return anything, so this does not
    conform to the expected behaviour. The kernel will most probably ignore the
    return value, so this is not going to produce any run time errors.


    FAILED [MEDIUM] AMLAsmASL_MSG_RESERVED_NO_RETURN_VAL: Test 2, Assembler warning
    in line 388
    Line | AML source
    Code:
    00385|         {
    00386|             Store (\_PR.CPU0.CPDC (Arg0), Local0)
    00387|             GCAP (Local0)
    00388|             Return (Local0)
         |                         ^
         | Warning 3104: Reserved method should not return a value (_PDC)
    00389|         }
    00390|
    00391|         Method (_OSC, 4, NotSerialized)  // _OSC: Operating System Capabilities

    ADVICE: (for Warning #3104, ASL_MSG_RESERVED_NO_RETURN_VAL): A reserved method
    returned a value however it is not expected to return anything, so this does not
    conform to the expected behaviour. The kernel will most probably ignore the
    return value, so this is not going to produce any run time errors.


    FAILED [MEDIUM] AMLAsmASL_MSG_RESERVED_NO_RETURN_VAL: Test 2, Assembler warning
    in line 435
    Line | AML source
    Code:
    00432|         {
    00433|             Store (\_PR.CPU0.CPDC (Arg0), Local0)
    00434|             GCAP (Local0)
    00435|             Return (Local0)
         |                         ^
         | Warning 3104: Reserved method should not return a value (_PDC)
    00436|         }
    00437|
    00438|         Method (_OSC, 4, NotSerialized)  // _OSC: Operating System Capabilities

    ADVICE: (for Warning #3104, ASL_MSG_RESERVED_NO_RETURN_VAL): A reserved method
    returned a value however it is not expected to return anything, so this does not
    conform to the expected behaviour. The kernel will most probably ignore the
    return value, so this is not going to produce any run time errors.


    FAILED [MEDIUM] AMLAsmASL_MSG_RESERVED_NO_RETURN_VAL: Test 2, Assembler warning
    in line 482
    Line | AML source
    Code:
    00479|         {
    00480|             Store (\_PR.CPU0.CPDC (Arg0), Local0)
    00481|             GCAP (Local0)
    00482|             Return (Local0)
         |                         ^
         | Warning 3104: Reserved method should not return a value (_PDC)
    00483|         }
    00484|
    00485|         Method (_OSC, 4, NotSerialized)  // _OSC: Operating System Capabilities

    ADVICE: (for Warning #3104, ASL_MSG_RESERVED_NO_RETURN_VAL): A reserved method
    returned a value however it is not expected to return anything, so this does not
    conform to the expected behaviour. The kernel will most probably ignore the
    return value, so this is not going to produce any run time errors.


    FAILED [MEDIUM] AMLAsmASL_MSG_RESERVED_NO_RETURN_VAL: Test 2, Assembler warning
    in line 529
    Line | AML source
    Code:
    00526|         {
    00527|             Store (\_PR.CPU0.CPDC (Arg0), Local0)
    00528|             GCAP (Local0)
    00529|             Return (Local0)
         |                         ^
         | Warning 3104: Reserved method should not return a value (_PDC)
    00530|         }
    00531|
    00532|         Method (_OSC, 4, NotSerialized)  // _OSC: Operating System Capabilities

    ADVICE: (for Warning #3104, ASL_MSG_RESERVED_NO_RETURN_VAL): A reserved method
    returned a value however it is not expected to return anything, so this does not
    conform to the expected behaviour. The kernel will most probably ignore the
    return value, so this is not going to produce any run time errors.


    Table SSDT (1) reassembly: Found 0 errors, 8 warnings, 6 remarks.




    Checking ACPI table SSDT (#2)


    FAILED [MEDIUM] AMLAsmASL_MSG_NO_REGION: Test 2, Assembler warning in line 61
    Line | AML source
    Code:
    00058|     Scope (\_SB.PCI0.SAT0)
    00059|     {
    00060|         Name (REGF, One)
    00061|         Method (_REG, 2, NotSerialized)  // _REG: Region Availability
         |                   ^
         | Warning 3079: _REG has no corresponding Operation Region
    00062|         {
    00063|             If (LEqual (Arg0, 0x02))
    00064|             {

    ADVICE: (for Warning #3079, ASL_MSG_NO_REGION): _REG requires a corresponding
    Operation Region, however one was not found.


    Table SSDT (2) reassembly: Found 0 errors, 1 warnings, 0 remarks.




    Checking ACPI table SSDT (#3)


    FAILED [HIGH] AMLAsmASL_MSG_SYNTAX: Test 2, Assembler error in line 203
    Line | AML source
    Code:
    00200|             Method (_PRW, 0, NotSerialized)  // _PRW: Power Resources for Wake
    00201|             {
    00202|                 Return (GPRW) /* External reference */
    00203|                 0x09
         |                   ^
         | Error 6126: syntax error, unexpected PARSEOP_INTEGER
    00204|                 0x04
    00205|             }
    00206|

    ADVICE: (for Error #6126, ASL_MSG_SYNTAX): The disassembled code cannot be
    reassembled using the strict IASL compiler as it contains syntax errors.


    FAILED [HIGH] AMLAsmASL_MSG_SYNTAX: Test 2, Assembler error in line 356
    Line | AML source
    Code:
    00353|                 Method (_PRW, 0, NotSerialized)  // _PRW: Power Resources for Wake
    00354|                 {
    00355|                     Return (GPRW) /* External reference */
    00356|                     0x09
         |                       ^
         | Error 6126: syntax error, unexpected PARSEOP_INTEGER
    00357|                     0x04
    00358|                 }
    00359|             }

    ADVICE: (for Error #6126, ASL_MSG_SYNTAX): The disassembled code cannot be
    reassembled using the strict IASL compiler as it contains syntax errors.


    FAILED [HIGH] AMLAsmASL_MSG_SYNTAX: Test 2, Assembler error in line 379
    Line | AML source
    Code:
    00376|             Method (_PRW, 0, NotSerialized)  // _PRW: Power Resources for Wake
    00377|             {
    00378|                 Return (GPRW) /* External reference */
    00379|                 0x09
         |                   ^
         | Error 6126: syntax error, unexpected PARSEOP_INTEGER
    00380|                 0x04
    00381|             }
    00382|

    ADVICE: (for Error #6126, ASL_MSG_SYNTAX): The disassembled code cannot be
    reassembled using the strict IASL compiler as it contains syntax errors.


    FAILED [HIGH] AMLAsmASL_MSG_SYNTAX: Test 2, Assembler error in line 544
    Line | AML source
    Code:
    00541|             Method (_PRW, 0, NotSerialized)  // _PRW: Power Resources for Wake
    00542|             {
    00543|                 Return (GPRW) /* External reference */
    00544|                 0x09
         |                   ^
         | Error 6126: syntax error, unexpected PARSEOP_INTEGER
    00545|                 0x04
    00546|             }
    00547|

    ADVICE: (for Error #6126, ASL_MSG_SYNTAX): The disassembled code cannot be
    reassembled using the strict IASL compiler as it contains syntax errors.


    FAILED [HIGH] SyntaxCheckIASLCompilerAborted: Test 2, Compilation aborted early
    due to a parser detected syntax error.


    ADVICE: Some subsequent errors may not be detected because the compiler had to
    terminate prematurely. If the compiler did not abort early then potentially
    correct code may parse incorrectly producing some or many false positive errors.


    Table SSDT (3) reassembly: Found 4 errors, 0 warnings, 0 remarks.






    3. osilinux: Disassemble DSDT to check for _OSI("Linux").

    Test 1 of 1: Disassemble DSDT to check for _OSI("Linux").
    This is not strictly a failure mode, it just alerts one that this has been
    defined in the DSDT and probably should be avoided since the Linux ACPI driver
    matches onto the Windows _OSI strings
    Code:
    {
                    If (_OSI ("Linux"))
                    {
                        Store (0x03E8, OSYS) /* \OSYS */
                    }
                    If (_OSI ("Windows 2001"))
                    {
                        Store (0x07D1, OSYS) /* \OSYS */
                    }
                    If (_OSI ("Windows 2001 SP1"))
                    {
                        Store (0x07D1, OSYS) /* \OSYS */
                    }
                    If (_OSI ("Windows 2001 SP2"))
                    {
                        Store (0x07D2, OSYS) /* \OSYS */
                    }
                    If (_OSI ("Windows 2001.1"))
                    {
                        Store (0x07D3, OSYS) /* \OSYS */
                    }
                    If (_OSI ("Windows 2006"))
                    {
                        Store (0x07D6, OSYS) /* \OSYS */
                    }
                    If (_OSI ("Windows 2009"))
                    {
                        Store (0x07D9, OSYS) /* \OSYS */
                    }
                    If (_OSI ("Windows 2012"))
                    {
                        Store (0x07DC, OSYS) /* \OSYS */
                    }
                }
    WARNING: Test 1, DSDT implements a deprecated _OSI("Linux") test.




    4. method: ACPI DSDT Method Semantic tests.
    Code:
    Test 11 of 155: Test _STR (String).
    FAILED [MEDIUM] MethodReturnBadType: Test 11, Method \_SB_.TPM_._STR did not
    return ACPI_TYPE_STRING.
    Test 73 of 155: Test _PCT (Performance Control).
    FAILED [MEDIUM] MethodReturnNullObj: Test 73, \_PR_.CPU0._PCT returned a NULL
    object, and did not return ACPI_TYPE_PACKAGE.
    Last edited by ProBackup-nl; 08-30-2014, 09:22 AM. Reason: code formatting applied

    Comment


    • #3
      Re: H81 Pro BTC P1.80: Firmware fix request and Ubuntu Firmware Test Suite (fwts) output

      Even with newest Asrock H81 Pro BTC firmware version 1.80B the issues are not solved:

      fwts 14.08 for ASRock H81 Pro BTC P1.80B, kernel 3.13 - Pastebin.com

      Comment


      • #4
        Re: H81 Pro BTC P1.80: Firmware fix request and Ubuntu Firmware Test Suite (fwts) output

        Please, THIS is the correct place to plead your issues.

        This forum is, for all intents and purposes, a User Supported form. The link I provided above is to ASRock Technical Support where you might possibly find resolve with this.
        #1 - Please, when seeking help, enter the make and model of ALL parts that your system is comprised of in your Signature, or at least the model #'s in your System Specs, then "Save' it.
        ____If you are overclocking, underclocking, or undervolting any parts, informing us of this and their values would prove beneficial in helping you.


        #2 - Consider your PSU to be the foundation from which all else is built upon. Anything built upon a weak foundation is poorly built.

        Comment

        Working...
        X