[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [MiNT] [PATCH][MiNTlib] Add ColdFire information to sysinfo
Attached version 3 of this patch.
Commit message:
Add ColdFIre systems information to sysinfo function
Contributed by David Galvez
2016-01-27 14:01 GMT+01:00 David Gálvez <dgalvez75@gmail.com>:
> Attached is the new version of the patch with some corrections to
> comments describing the _MCF cookie.
>
> Please commit this patch instead.
>
> Sorry
>
> 2016-01-26 17:41 GMT+01:00 David Gálvez <dgalvez75@gmail.com>:
>> Please apply this patch to mintlib. Thanks!
>>
>>
>> Commit message:
>>
>> Add ColdFIre systems information to sysinfo function
>>
>> Contributed by David Galvez
Index: include/mint/cookie.h
===================================================================
RCS file: /mint/mintlib/include/mint/cookie.h,v
retrieving revision 1.8
diff -u -8 -r1.8 cookie.h
--- include/mint/cookie.h 28 Dec 2015 18:51:27 -0000 1.8
+++ include/mint/cookie.h 4 Feb 2016 09:33:24 -0000
@@ -525,27 +525,29 @@
#define C_XSSI 0x58535349L /* Extended Screen Saver Information */
#define C_XTOS 0x58544F53L /* Extend TOS */
#define C_xUFC 0x78554643L /* Extended Universal Font Selector Configuration Program */
#define C_XWin 0x5857696EL /* Extended Windows moudle */
#define C_zCAC 0x7A434143L /* 680x0 Cache Control CPX */
#define C_zDCF 0x7A444346L /* DCF-Time receiver */
#define C__AFM 0x5F41464DL /* Audio Fun Machine */
#define C__AKP 0x5F414B50L /* Keyboard/Language Configuration */
+#define C__CF_ 0x5F43465FL /* ColdFire CPU */
#define C__CPU 0x5F435055L /* Central Processor Unit Type */
#define C__DOS 0x5F444F53L /* GEMDOS-Einsprung (im GEMDOS 0.30) */
#define C__FDC 0x5F464443L /* Disk Drive Type */
#define C__FLK 0x5F464C4BL /* File Locking Extension */
#define C__FPU 0x5F465055L /* Floating Point Unit Type */
#define C__FRB 0x5F465242L /* Fast Ram Buffer */
#define C__FSR 0x5F465352L /* Patch program for serial (TOS 4.00->4.04) */
#define C__IDT 0x5F494454L /* International Date/Time Format */
#define C__INF 0x5F494E46L /* STEFIX Program */
#define C__ISO 0x5F49534FL /* specifies the real keyboard/font nationality */
#define C__JPD 0x5F4A5044L /* Falcon030 JPEG Decoder by Brainstorm */
+#define C__MCF 0x5F4D4346 /* ColdFire feataures */
#define C__MCH 0x5F4D4348L /* Machine Type */
#define C__MET 0x5F4D4554L /* MetaDOS */
#define C__MIL 0x5F4D494CL /* Milan computer */
#define C__NET 0x5F4E4554L /* GEMDOS Network Support */
#define C__OOL 0x5F4F4F4CL /* Pool Fix */
#define C__PCI 0x5F504349L /* PCIbios */
#define C__PKT 0x5F504B54L /* Paket Driver Cookie */
#define C__PWR 0x5F505752L /* Power Management unit */
@@ -556,15 +558,79 @@
#define C__T30 0x5F543330L /* KAOS TOS */
#define C__VDI 0x5F564449L /* Milan VDI */
#define C__VDO 0x5F56444FL /* Video Type */
#define C___NF 0x5F5F4E46L /* Native features proposal */
#define C__FSC 0x5F465343L /* Falcon Screen */
#define C_MACCEL 0x00AA006EL /* MACCELL */
+/* Structures pointed by some cookie's value */
+
+/*
+ * Structure pointed by the '_MCF' cookie's value
+ *
+ * Values defined below taken from ColdFire Family Programmer's Reference
+ * Manual (CFPRM). Section 1.10 Hardware Configuration Information.
+ *
+ * The struct's member "device_name" is the "device identification number" as
+ * specified in the different families reference manuals, in sections describing
+ * the registers SDID, CIR, DEVICEID or JTAGID (depending on the CF family).
+ * For example: MCF5474, MCF5485, MCF54455, etc ...
+ */
+
+/* ColdFire core version */
+#define MCF_V1 1
+#define MCF_V2 2
+#define MCF_V3 3
+#define MCF_V4 4
+#define MCF_V5 5
+
+/* Instruction-Set Architecture (ISA) revision level */
+#define MCF_ISA_A 0
+#define MCF_ISA_B 1
+#define MCF_ISA_C 2
+#define MCF_ISA_A_PLUS 8
+
+/* Debug module revision number */
+#define MCF_DEBUG_A 0
+#define MCF_DEBUG_B 1
+#define MCF_DEBUG_C 2
+#define MCF_DEBUG_D 3
+#define MCF_DEBUG_E 4
+#define MCF_DEBUG_B_PLUS 9
+#define MCF_DEBUG_D_PLUS 11
+#define MCF_DEBUG_D_PLUS_PST 15
+
+/* Bit mask for units, set when present */
+#define MCF_UNITS_MAC 1
+#define MCF_UNITS_DIV 2
+#define MCF_UNITS_EMAC 4
+#define MCF_UNITS_FPU 8
+#define MCF_UNITS_MMU 16
+
+/*
+ * To use with the struct members: version, core,
+ * revision, isa, debug and sysbus_frequency
+ * In the bitmask set to 0 when unknown.
+ */
+#define MCF_VALUE_UNKNOWN -1
+
+typedef struct {
+ char magic[3]; /* Magic number 0x4d4346 (MCF), identifies this struct */
+#define COOKIE_MCF_VERSION 1
+ unsigned char version; /* This struct version */
+ char device_name[16]; /* Device identification number, null terminated */
+ char core; /* ColdFire core version number */
+ char revision; /* Processor revision number */
+ unsigned long units; /* Bit mask. b0: MAC, b1: DIV, b2: EMAC, b3: FPU, b4: MMU */
+ char isa; /* Instruction-Set Architecture (ISA) revision level */
+ char debug; /* Debug module revision */
+ short sysbus_frequency; /* System bus frequency in Mhz */
+} MCF_COOKIE;
+
/* Return values of Getcookie() */
#define C_FOUND 0
#define C_NOTFOUND -1 /* EERROR */
extern int Getcookie(long cookie, long *val);
#endif
Index: unix/sysinfo.c
===================================================================
RCS file: /mint/mintlib/unix/sysinfo.c,v
retrieving revision 1.11
diff -u -8 -r1.11 sysinfo.c
--- unix/sysinfo.c 22 Feb 2011 23:32:58 -0000 1.11
+++ unix/sysinfo.c 4 Feb 2016 09:33:24 -0000
@@ -335,56 +335,116 @@
static char* architecture = NULL;
static long architecture_len;
#define _CPU_60 0
#define _CPU_40 1
#define _CPU_30 2
#define _CPU_20 3
#define _CPU_10 4
#define _CPU_00 5
+#define _MCF_V5 6
+#define _MCF_V4 7
+#define _MCF_V3 8
+#define _MCF_V2 9
+#define _MCF_V1 10
static char* architectures[] = {
"mc68060",
"mc68040",
"mc68030",
"mc68020",
"mc68010",
"mc68000",
+ "cfv5",
+ "cfv4",
+ "cfv3",
+ "cfv2",
+ "cfv1",
NULL
};
static char* isalist = NULL;
-static char isalist_buf[] =
- "mc68060 mc68040 mc68030 mc68020 mc68010 mc68000";
long isalist_len;
+#define _ISA_C 6
+#define _ISA_B 7
+#define _ISA_A_PLUS 8
+#define _ISA_A 9
+
+static char* isalists[] = {
+ "mc68060", "mc68040", "mc68030", "mc68020", "mc68010", "mc68000",
+ "isac", "isab", "isaaplus", "isaa"};
static int
si_architecture (buf, bufsize)
char* buf;
long bufsize;
{
if (architecture == NULL) {
long int value = 0;
int cpu = _CPU_00;
+ MCF_COOKIE *mcf_cookie;
+ long version;
- (void) Getcookie (C__CPU, &value);
- if (value >= 60)
- cpu = _CPU_60;
- else if (value >= 40)
- cpu = _CPU_40;
- else if (value >= 30)
- cpu = _CPU_30;
- else if (value >= 20)
- cpu = _CPU_20;
- else if (value >= 10)
- cpu = _CPU_10;
+ /* m68k */
+ if (!Getcookie (C__CPU, &value)) {
+ if (value >= 60)
+ cpu = _CPU_60;
+ else if (value >= 40)
+ cpu = _CPU_40;
+ else if (value >= 30)
+ cpu = _CPU_30;
+ else if (value >= 20)
+ cpu = _CPU_20;
+ else if (value >= 10)
+ cpu = _CPU_10;
+ architecture_len = sizeof ("mc68xxx");
+ isalist = isalists[cpu];
+ }
+ /* ColdFire */
+ else if (!Getcookie (C__MCF, &value)) {
+ mcf_cookie = (MCF_COOKIE *)value;
+ version = (long)(*(long *)mcf_cookie->magic);
+ if (version == 0x4d434601) /* 'MCF01' */
+ {
+ switch (mcf_cookie->core) {
+ case 1:
+ cpu = _MCF_V1;
+ break;
+ case 2:
+ cpu = _MCF_V2;
+ break;
+ case 3:
+ cpu = _MCF_V3;
+ break;
+ case 4:
+ cpu = _MCF_V4;
+ break;
+ case 5:
+ cpu = _MCF_V5;
+ break;
+ }
+ switch (mcf_cookie->isa) {
+ case MCF_ISA_A:
+ isalist = isalists[_ISA_A];
+ break;
+ case MCF_ISA_B:
+ isalist = isalists[_ISA_B];
+ break;
+ case MCF_ISA_C:
+ isalist = isalists[_ISA_C];
+ break;
+ case MCF_ISA_A_PLUS:
+ isalist = isalists[_ISA_A_PLUS];
+ break;
+ }
+ architecture_len = sizeof ("cfvx");
+ }
+ }
architecture = architectures[cpu];
- architecture_len = sizeof ("mc68xxx");
- isalist = &isalist_buf[cpu * sizeof ("mc68xxx")];
isalist_len = strlen (isalist) + 1;
}
fast_strncpy (buf, architecture, bufsize);
return architecture_len;
}
/* SI_ISALIST */
@@ -407,39 +467,45 @@
#define _PLATFORM_ST 0
#define _PLATFORM_STE 1
#define _PLATFORM_TT 2
#define _PLATFORM_FALCON 3
#define _PLATFORM_MILAN 4
#define _PLATFORM_HADES 5
#define _PLATFORM_ARANYM 6
-#define _PLATFORM_CLONE 7
+#define _PLATFORM_FIREBEE 7
+#define _PLATFORM_CFEVB 8
+#define _PLATFORM_CLONE 9
static char* platforms[] = {
"atarist",
"atariste",
"ataritt",
"falcon",
"milan",
"hades",
"aranym",
+ "firebee",
+ "cfevb"
"atariclone",
};
#define _HW_PROVIDER_ATARI 0
#define _HW_PROVIDER_MILAN 1
#define _HW_PROVIDER_HADES 2
#define _HW_PROVIDER_ARANYM 3
-#define _HW_PROVIDER_UNKNOWN 4
+#define _HW_PROVIDER_FREESCALE 4
+#define _HW_PROVIDER_UNKNOWN 5
static char* hw_providers[] = {
"atari",
"milan",
- "hades",
+ "hades", /* This should have been "medusa" */
"aranym",
+ "freescale",
"unknown"
};
/* Cached results. */
static char* platform = NULL;
static char* hw_provider = NULL;
static long platform_len;
static long hw_provider_len;
@@ -447,42 +513,59 @@
static int
si_platform (buf, bufsize)
char* buf;
long bufsize;
{
if (platform == NULL) {
long _mch = 0; /* = AtariST */
long hi, lo;
+ int coldfire = 0;
+ long dummy;
/* If we find the Hades cookie ignore the rest. */
if (Getcookie (C_hade, &_mch) == 0) {
platform = platforms[_PLATFORM_HADES];
hw_provider = hw_providers[_HW_PROVIDER_HADES];
} else {
+ /* Check for ColdFire CPU */
+ if (!Getcookie (C__CF_, &dummy))
+ coldfire = 1;
+
(void) Getcookie (C__MCH, &_mch);
hi = (_mch & 0xffff0000) >> 16;
lo = (_mch & 0xffff);
switch (hi) {
+ case -1:
+ if(coldfire) {
+ platform = platforms[_PLATFORM_CFEVB];
+ hw_provider = hw_providers[_HW_PROVIDER_FREESCALE];
+ }
+ break;
case 0:
platform = platforms[_PLATFORM_ST];
hw_provider = hw_providers[_HW_PROVIDER_ATARI];
break;
case 1:
platform = platforms[_PLATFORM_STE];
hw_provider = hw_providers[_HW_PROVIDER_ATARI];
break;
case 2:
platform = platforms[_PLATFORM_TT];
hw_provider = hw_providers[_HW_PROVIDER_ATARI];
break;
case 3:
- platform = platforms[_PLATFORM_FALCON];
- hw_provider = hw_providers[_HW_PROVIDER_ATARI];
+ if(coldfire) {
+ platform = platforms[_PLATFORM_FIREBEE];
+ hw_provider = hw_providers[_HW_PROVIDER_HADES];
+ } else {
+ platform = platforms[_PLATFORM_FALCON];
+ hw_provider = hw_providers[_HW_PROVIDER_ATARI];
+ }
break;
case 4:
platform = platforms[_PLATFORM_MILAN];
hw_provider = hw_providers[_HW_PROVIDER_MILAN];
break;
case 5:
platform = platforms[_PLATFORM_ARANYM];
hw_provider = hw_providers[_HW_PROVIDER_ARANYM];