probe more cpu details and expose them to the world
[AROS.git] / arch / arm-raspi / processor / getcpuinfo.c
blobd1f60a644c6a1ff6618442b6ad8c2cc265557630
1 /*
2 Copyright © 2013, The AROS Development Team. All rights reserved.
3 $Id$
5 Desc: GetCPUInfo() - Provides information about installed CPUs
6 Lang: english
7 */
9 #define DEBUG 0
10 #include <aros/debug.h>
12 #include <aros/libcall.h>
13 #include <resources/processor.h>
14 #include <proto/utility.h>
16 #include "processor_intern.h"
17 #include "processor_arch_intern.h"
19 static void ProcessFeaturesTag(struct ARMProcessorInformation * info, struct TagItem * tag);
21 /*****************************************************************************
23 NAME */
24 #include <proto/processor.h>
26 AROS_LH1(void, GetCPUInfo,
28 /* SYNOPSIS */
29 AROS_LHA(struct TagItem *, tagList, A0),
31 /* LOCATION */
32 struct ProcessorBase *, ProcessorBase, 1, Processor)
34 /* FUNCTION
36 INPUTS
38 TAGS
40 RESULT
42 NOTES
44 EXAMPLE
46 BUGS
48 SEE ALSO
50 INTERNALS
52 ******************************************************************************/
54 AROS_LIBFUNC_INIT
56 struct TagItem * passedTag = NULL;
57 struct ARMProcessorInformation *processor = NULL;
58 struct ARMProcessorInformation **sysprocs = ProcessorBase->Private1;
59 ULONG selectedprocessor = 0;
61 D(bug("[processor.ARM] :%s()\n", __PRETTY_FUNCTION__));
63 /* If processor was not selected, fall back to legacy mode and report on
64 first available processor */
65 selectedprocessor = (ULONG)GetTagData(GCIT_SelectedProcessor, 0, tagList);
67 /* If selectedprocessor not in line with number of processors, report on
68 first available processor */
69 if (selectedprocessor >= ProcessorBase->cpucount)
70 selectedprocessor = 0;
72 processor = sysprocs[selectedprocessor];
74 /* Go over each passed tag and fill appropriate data */
75 while ((passedTag = NextTagItem(&tagList)) != NULL)
77 if ((passedTag->ti_Tag > GCIT_FeaturesBase) &&
78 (passedTag->ti_Tag <= GCIT_FeaturesLast))
80 ProcessFeaturesTag(processor, passedTag);
82 else
84 switch(passedTag->ti_Tag)
86 case(GCIT_NumberOfProcessors):
87 *((ULONG *)passedTag->ti_Data) = ProcessorBase->cpucount;
88 break;
89 case(GCIT_ModelString):
90 *((CONST_STRPTR *)passedTag->ti_Data) = processor->BrandString;
91 break;
92 case(GCIT_Family):
93 *((ULONG *)passedTag->ti_Data) = processor->Family;
94 break;
95 case(GCIT_VectorUnit):
96 *((ULONG *)passedTag->ti_Data) = processor->VectorUnit;
97 break;
98 case(GCIT_L1CacheSize):
99 *((ULONG *)passedTag->ti_Data) =
100 (processor->L1DataCacheSize + processor->L1InstructionCacheSize);
101 break;
102 case(GCIT_L1DataCacheSize):
103 *((ULONG *)passedTag->ti_Data) = processor->L1DataCacheSize;
104 break;
105 case(GCIT_L1InstructionCacheSize):
106 *((ULONG *)passedTag->ti_Data) = processor->L1InstructionCacheSize;
107 break;
108 case(GCIT_L2CacheSize):
109 *((ULONG *)passedTag->ti_Data) = processor->L2CacheSize;
110 break;
111 case(GCIT_CacheLineSize):
112 *((ULONG *)passedTag->ti_Data) = processor->CacheLineSize;
113 break;
114 case(GCIT_Architecture):
115 *((ULONG *)passedTag->ti_Data) = PROCESSORARCH_ARM;
116 break;
117 case(GCIT_Endianness):
118 if (processor->Features1 & FEATF_BIGEND)
119 *((ULONG *)passedTag->ti_Data) = ENDIANNESS_BE;
120 else
121 *((ULONG *)passedTag->ti_Data) = ENDIANNESS_LE;
122 break;
123 case(GCIT_ProcessorSpeed):
124 *((UQUAD *)passedTag->ti_Data) = GetCurrentProcessorFrequency(processor);
125 break;
126 case(GCIT_ProcessorLoad):
127 *((UBYTE *)passedTag->ti_Data) = 0; /* TODO: IMPLEMENT */
128 break;
129 case GCIT_Vendor:
130 *((ULONG *)passedTag->ti_Data) = processor->Vendor;
131 break;
136 AROS_LIBFUNC_EXIT
137 } /* GetCPUInfo() */
139 static void ProcessFeaturesTag(struct ARMProcessorInformation * info, struct TagItem * tag)
141 D(bug("[processor.ARM] :%s()\n", __PRETTY_FUNCTION__));
143 switch(tag->ti_Tag)
145 case(GCIT_SupportsVFP):
146 case(GCIT_SupportsFPU):
147 *((BOOL *)tag->ti_Data) = (BOOL)((info->Features1 & FEATF_FPU) >> FEATB_FPU); break;
148 case(GCIT_SupportsVFPv3):
149 *((BOOL *)tag->ti_Data) = (BOOL)((info->Features1 & FEATF_FPU_VFP3) >> FEATB_FPU_VFP3); break;
150 case(GCIT_SupportsVFPv3D16):
151 *((BOOL *)tag->ti_Data) = (BOOL)((info->Features1 & FEATF_FPU_VFP3_16) >> FEATB_FPU_VFP3_16); break;
152 case(GCIT_SupportsNeon):
153 *((BOOL *)tag->ti_Data) = (BOOL)((info->Features1 & FEATF_NEON) >> FEATB_NEON); break;
154 case(GCIT_SupportsVFPv4):
155 *((BOOL *)tag->ti_Data) = (BOOL)((info->Features1 & FEATF_FPU_VFP4) >> FEATB_FPU_VFP4); break;
156 case(GCIT_SupportsSecurityExt):
157 *((BOOL *)tag->ti_Data) = (BOOL)((info->Features1 & FEATF_SECURE) >> FEATB_SECURE); break;
158 case(GCIT_SupportsBranchPred):
159 *((BOOL *)tag->ti_Data) = (BOOL)((info->Features1 & FEATF_BRANCHP) >> FEATB_BRANCHP); break;
160 case(GCIT_SupportsThumbEE):
161 *((BOOL *)tag->ti_Data) = (BOOL)((info->Features1 & FEATF_THUMBEX) >> FEATB_THUMBEX); break;
162 default:
163 *((BOOL *)tag->ti_Data) = FALSE; break;