Home | History | Annotate | Download | only in acpi
      1 /* SPDX-License-Identifier: GPL-2.0+ */
      2 /*
      3  * Copyright (C) 2008 Advanced Micro Devices, Inc.
      4  * Copyright (C) 2016 Bin Meng <bmeng.cn (at) gmail.com>
      5  *
      6  * Modified from coreboot src/arch/x86/acpi/globutil.asl
      7  */
      8 
      9 Method(MIN, 2)
     10 {
     11 	If (LLess(Arg0, Arg1)) {
     12 		Return (Arg0)
     13 	} Else {
     14 		Return (Arg1)
     15 	}
     16 }
     17 
     18 Method(SLEN, 1)
     19 {
     20 	Store(Arg0, Local0)
     21 	Return (Sizeof(Local0))
     22 }
     23 
     24 Method(S2BF, 1, Serialized)
     25 {
     26 	Add(SLEN(Arg0), One, Local0)
     27 	Name(BUFF, Buffer(Local0) {})
     28 	Store(Arg0, BUFF)
     29 	Return (BUFF)
     30 }
     31 
     32 /*
     33  * SCMP - Strong string compare
     34  *
     35  * Checks both length and content
     36  */
     37 Method(SCMP, 2)
     38 {
     39 	Store(S2BF(Arg0), Local0)
     40 	Store(S2BF(Arg1), Local1)
     41 	Store(Zero, Local4)
     42 	Store(SLEN(Arg0), Local5)
     43 	Store(SLEN(Arg1), Local6)
     44 	Store(MIN(Local5, Local6), Local7)
     45 
     46 	While (LLess(Local4, Local7)) {
     47 		Store(Derefof(Index(Local0, Local4)), Local2)
     48 		Store(Derefof(Index(Local1, Local4)), Local3)
     49 		If (LGreater(Local2, Local3)) {
     50 			Return (One)
     51 		} Else {
     52 			If (LLess(Local2, Local3)) {
     53 				Return (Ones)
     54 			}
     55 		}
     56 		Increment(Local4)
     57 	}
     58 
     59 	If (LLess(Local4, Local5)) {
     60 		Return (One)
     61 	} Else {
     62 		If (LLess(Local4, Local6)) {
     63 			Return (Ones)
     64 		} Else {
     65 			Return (Zero)
     66 		}
     67 	}
     68 }
     69 
     70 /*
     71  * WCMP - Weak string compare
     72  *
     73  * Checks to find Arg1 at beginning of Arg0.
     74  * Fails if length(Arg0) < length(Arg1).
     75  * Returns 0 on fail, 1 on pass.
     76  */
     77 Method(WCMP, 2)
     78 {
     79 	Store(S2BF(Arg0), Local0)
     80 	Store(S2BF(Arg1), Local1)
     81 	If (LLess(SLEN(Arg0), SLEN(Arg1))) {
     82 		Return (Zero)
     83 	}
     84 	Store(Zero, Local2)
     85 	Store(SLEN(Arg1), Local3)
     86 
     87 	While (LLess(Local2, Local3)) {
     88 		If (LNotEqual(Derefof(Index(Local0, Local2)),
     89 			Derefof(Index(Local1, Local2)))) {
     90 			Return (Zero)
     91 		}
     92 		Increment(Local2)
     93 	}
     94 
     95 	Return (One)
     96 }
     97 
     98 /*
     99  * I2BM - Returns Bit Map
    100  *
    101  * Arg0 = IRQ Number (0-15)
    102  */
    103 Method(I2BM, 1)
    104 {
    105 	Store(0, Local0)
    106 	If (LNotEqual(Arg0, 0)) {
    107 		Store(1, Local1)
    108 		ShiftLeft(Local1, Arg0, Local0)
    109 	}
    110 
    111 	Return (Local0)
    112 }
    113