@@ -33,30 +33,53 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3333
3434#include <stdint.h>
3535
36- #define CPU_UNKNOWN 0
37- #define CPU_LOONGSON3R5 1
36+ /* If LASX extension instructions supported,
37+ * using core LOONGSON3R5
38+ * If only LSX extension instructions supported,
39+ * using core LOONGSON2K1000
40+ * If neither LASX nor LSX extension instructions supported,
41+ * using core LOONGSONGENERIC (As far as I know, there is no such
42+ * CPU yet)
43+ */
44+
45+ #define CPU_GENERIC 0
46+ #define CPU_LOONGSON3R5 1
47+ #define CPU_LOONGSON2K1000 2
3848
3949#define LOONGARCH_CFG2 0x02
4050#define LOONGARCH_LASX 1<<7
51+ #define LOONGARCH_LSX 1<<6
4152
4253static char * cpuname [] = {
43- "UNKNOWN" ,
44- "LOONGSON3R5"
54+ "LOONGSONGENERIC" ,
55+ "LOONGSON3R5" ,
56+ "LOONGSON2K1000"
57+ };
58+
59+ static char * cpuname_lower [] = {
60+ "loongsongeneric" ,
61+ "loongson3r5" ,
62+ "loongson2k1000"
4563};
4664
4765int detect (void ) {
48- uint32_t reg = 0 ;
49-
50- __asm__ volatile (
51- "cpucfg %0, %1 \n\t"
52- : "+&r" (reg )
53- : "r" (LOONGARCH_CFG2 )
54- );
55-
56- if (reg & LOONGARCH_LASX )
57- return CPU_LOONGSON3R5 ;
58- else
59- return CPU_UNKNOWN ;
66+ #ifdef __linux
67+ uint32_t reg = 0 ;
68+
69+ __asm__ volatile (
70+ "cpucfg %0, %1 \n\t"
71+ : "+&r" (reg )
72+ : "r" (LOONGARCH_CFG2 )
73+ );
74+
75+ if (reg & LOONGARCH_LASX )
76+ return CPU_LOONGSON3R5 ;
77+ else if (reg & LOONGARCH_LSX )
78+ return CPU_LOONGSON2K1000 ;
79+ else
80+ return CPU_GENERIC ;
81+ #endif
82+ return CPU_GENERIC ;
6083}
6184
6285char * get_corename (void ) {
@@ -68,43 +91,53 @@ void get_architecture(void) {
6891}
6992
7093void get_subarchitecture (void ) {
71- if (detect () == CPU_LOONGSON3R5 ) {
72- printf ("LOONGSON3R5" );
73- } else {
74- printf ("UNKNOWN" );
75- }
94+ int d = detect ();
95+ printf ("%s" , cpuname [d ]);
7696}
7797
7898void get_subdirname (void ) {
7999 printf ("loongarch64" );
80100}
81101
82102void get_cpuconfig (void ) {
83- if (detect () == CPU_LOONGSON3R5 ) {
84- printf ("#define LOONGSON3R5\n" );
85- printf ("#define L1_DATA_SIZE 65536\n" );
86- printf ("#define L1_DATA_LINESIZE 64\n" );
87- printf ("#define L2_SIZE 1048576\n" );
88- printf ("#define L2_LINESIZE 64\n" );
89- printf ("#define DTB_DEFAULT_ENTRIES 64\n" );
90- printf ("#define DTB_SIZE 4096\n" );
91- printf ("#define L2_ASSOCIATIVE 16\n" );
92- } else {
93- printf ("#define LOONGSON3R5\n" );
94- printf ("#define L1_DATA_SIZE 65536\n" );
95- printf ("#define L1_DATA_LINESIZE 64\n" );
96- printf ("#define L2_SIZE 1048576\n" );
97- printf ("#define L2_LINESIZE 64\n" );
98- printf ("#define DTB_DEFAULT_ENTRIES 64\n" );
99- printf ("#define DTB_SIZE 4096\n" );
100- printf ("#define L2_ASSOCIATIVE 16\n" );
103+ int d = detect ();
104+ switch (d ) {
105+ case CPU_LOONGSON3R5 :
106+ printf ("#define LOONGSON3R5\n" );
107+ printf ("#define L1_DATA_SIZE 65536\n" );
108+ printf ("#define L1_DATA_LINESIZE 64\n" );
109+ printf ("#define L2_SIZE 1048576\n" );
110+ printf ("#define L2_LINESIZE 64\n" );
111+ printf ("#define DTB_DEFAULT_ENTRIES 64\n" );
112+ printf ("#define DTB_SIZE 4096\n" );
113+ printf ("#define L2_ASSOCIATIVE 16\n" );
114+ break ;
115+
116+ case CPU_LOONGSON2K1000 :
117+ printf ("#define LOONGSON2K1000\n" );
118+ printf ("#define L1_DATA_SIZE 65536\n" );
119+ printf ("#define L1_DATA_LINESIZE 64\n" );
120+ printf ("#define L2_SIZE 262144\n" );
121+ printf ("#define L2_LINESIZE 64\n" );
122+ printf ("#define DTB_DEFAULT_ENTRIES 64\n" );
123+ printf ("#define DTB_SIZE 4096\n" );
124+ printf ("#define L2_ASSOCIATIVE 16\n" );
125+ break ;
126+
127+ default :
128+ printf ("#define LOONGSONGENERIC\n" );
129+ printf ("#define L1_DATA_SIZE 65536\n" );
130+ printf ("#define L1_DATA_LINESIZE 64\n" );
131+ printf ("#define L2_SIZE 262144\n" );
132+ printf ("#define L2_LINESIZE 64\n" );
133+ printf ("#define DTB_DEFAULT_ENTRIES 64\n" );
134+ printf ("#define DTB_SIZE 4096\n" );
135+ printf ("#define L2_ASSOCIATIVE 16\n" );
136+ break ;
101137 }
102138}
103139
104140void get_libname (void ){
105- if (detect () == CPU_LOONGSON3R5 ) {
106- printf ("loongson3r5\n" );
107- } else {
108- printf ("loongarch64\n" );
109- }
141+ int d = detect ();
142+ printf ("%s" , cpuname_lower [d ]);
110143}
0 commit comments