typo in comment
[AROS.git] / arch / arm-raspi / processor / getcpuinfo.c
blobefad8fcb1e668c5be551f489e6cc353341ec30e6
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 *((ULONG *)passedTag->ti_Data) = ENDIANNESS_LE;
119 break;
120 case(GCIT_ProcessorSpeed):
121 *((UQUAD *)passedTag->ti_Data) = GetCurrentProcessorFrequency(processor);
122 break;
123 case(GCIT_ProcessorLoad):
124 *((UBYTE *)passedTag->ti_Data) = 0; /* TODO: IMPLEMENT */
125 break;
126 case GCIT_Vendor:
127 *((ULONG *)passedTag->ti_Data) = processor->Vendor;
128 break;
133 AROS_LIBFUNC_EXIT
134 } /* GetCPUInfo() */
136 static void ProcessFeaturesTag(struct ARMProcessorInformation * info, struct TagItem * tag)
138 D(bug("[processor.ARM] :%s()\n", __PRETTY_FUNCTION__));
140 switch(tag->ti_Tag)
142 case(GCIT_SupportsFPU):
143 *((BOOL *)tag->ti_Data) = (BOOL)((info->Features1 & FEATF_FPU) >> FEATB_FPU); break;
144 default:
145 *((BOOL *)tag->ti_Data) = FALSE; break;