// Copyright 2022 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. //go:build loong64 package cpu const cacheLineSize = 64 // Bit fields for CPUCFG registers, Related reference documents: // https://loongson.github.io/LoongArch-Documentation/LoongArch-Vol1-EN.html#_cpucfg const ( // CPUCFG1 bits cpucfg1_CRC32 = 1 << 25 // CPUCFG2 bits cpucfg2_LAM_BH = 1 << 27 cpucfg2_LAMCAS = 1 << 28 cpucfg2_LLACQ_SCREL = 1 << 29 cpucfg2_SCQ = 1 << 30 // CPUCFG3 bits cpucfg3_DBAR_HINTS = 1 << 17 ) func initOptions() { options = []option{ {Name: "lsx", Feature: &Loong64.HasLSX}, {Name: "lasx", Feature: &Loong64.HasLASX}, {Name: "crc32", Feature: &Loong64.HasCRC32}, {Name: "lam_bh", Feature: &Loong64.HasLAM_BH}, {Name: "lamcas", Feature: &Loong64.HasLAMCAS}, {Name: "llacq_screl", Feature: &Loong64.HasLLACQ_SCREL}, {Name: "scq", Feature: &Loong64.HasSCQ}, {Name: "dbar_hints", Feature: &Loong64.HasDBAR_HINTS}, } // The CPUCFG data on Loong64 only reflects the hardware capabilities, // not the kernel support status, so features such as LSX and LASX that // require kernel support cannot be obtained from the CPUCFG data. // // These features only require hardware capability support and do not // require kernel specific support, so they can be obtained directly // through CPUCFG cfg1 := get_cpucfg(1) cfg2 := get_cpucfg(2) cfg3 := get_cpucfg(3) Loong64.HasCRC32 = cfgIsSet(cfg1, cpucfg1_CRC32) Loong64.HasLAMCAS = cfgIsSet(cfg2, cpucfg2_LAMCAS) Loong64.HasLAM_BH = cfgIsSet(cfg2, cpucfg2_LAM_BH) Loong64.HasLLACQ_SCREL = cfgIsSet(cfg2, cpucfg2_LLACQ_SCREL) Loong64.HasSCQ = cfgIsSet(cfg2, cpucfg2_SCQ) Loong64.HasDBAR_HINTS = cfgIsSet(cfg3, cpucfg3_DBAR_HINTS) } func get_cpucfg(reg uint32) uint32 func cfgIsSet(cfg uint32, val uint32) bool { return cfg&val != 0 }