1*0d6140beSAndroid Build Coastguard Worker /*
2*0d6140beSAndroid Build Coastguard Worker * This file is part of the flashrom project.
3*0d6140beSAndroid Build Coastguard Worker *
4*0d6140beSAndroid Build Coastguard Worker * Copyright (C) 2010 Carl-Daniel Hailfinger
5*0d6140beSAndroid Build Coastguard Worker *
6*0d6140beSAndroid Build Coastguard Worker * This program is free software; you can redistribute it and/or modify
7*0d6140beSAndroid Build Coastguard Worker * it under the terms of the GNU General Public License as published by
8*0d6140beSAndroid Build Coastguard Worker * the Free Software Foundation; version 2 of the License.
9*0d6140beSAndroid Build Coastguard Worker *
10*0d6140beSAndroid Build Coastguard Worker * This program is distributed in the hope that it will be useful,
11*0d6140beSAndroid Build Coastguard Worker * but WITHOUT ANY WARRANTY; without even the implied warranty of
12*0d6140beSAndroid Build Coastguard Worker * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13*0d6140beSAndroid Build Coastguard Worker * GNU General Public License for more details.
14*0d6140beSAndroid Build Coastguard Worker */
15*0d6140beSAndroid Build Coastguard Worker
16*0d6140beSAndroid Build Coastguard Worker /*
17*0d6140beSAndroid Build Coastguard Worker * Contains the processor specific flash enables and system settings.
18*0d6140beSAndroid Build Coastguard Worker */
19*0d6140beSAndroid Build Coastguard Worker
20*0d6140beSAndroid Build Coastguard Worker #include "flash.h"
21*0d6140beSAndroid Build Coastguard Worker #include "programmer.h"
22*0d6140beSAndroid Build Coastguard Worker
23*0d6140beSAndroid Build Coastguard Worker #if defined (__MIPSEL__) && defined (__linux)
24*0d6140beSAndroid Build Coastguard Worker #include <stdio.h>
25*0d6140beSAndroid Build Coastguard Worker #include <string.h>
26*0d6140beSAndroid Build Coastguard Worker #include <ctype.h>
27*0d6140beSAndroid Build Coastguard Worker
is_loongson(void)28*0d6140beSAndroid Build Coastguard Worker static int is_loongson(void)
29*0d6140beSAndroid Build Coastguard Worker {
30*0d6140beSAndroid Build Coastguard Worker FILE *cpuinfo;
31*0d6140beSAndroid Build Coastguard Worker cpuinfo = fopen("/proc/cpuinfo", "rb");
32*0d6140beSAndroid Build Coastguard Worker if (!cpuinfo)
33*0d6140beSAndroid Build Coastguard Worker return 0;
34*0d6140beSAndroid Build Coastguard Worker while (!feof(cpuinfo)) {
35*0d6140beSAndroid Build Coastguard Worker char line[512], *ptr;
36*0d6140beSAndroid Build Coastguard Worker if (fgets(line, sizeof(line), cpuinfo) == NULL)
37*0d6140beSAndroid Build Coastguard Worker break;
38*0d6140beSAndroid Build Coastguard Worker ptr = line;
39*0d6140beSAndroid Build Coastguard Worker while (*ptr && isspace((unsigned char)*ptr))
40*0d6140beSAndroid Build Coastguard Worker ptr++;
41*0d6140beSAndroid Build Coastguard Worker /* "cpu" part appears only with some Linux versions. */
42*0d6140beSAndroid Build Coastguard Worker if (strncmp(ptr, "cpu", strlen("cpu")) == 0)
43*0d6140beSAndroid Build Coastguard Worker ptr += strlen("cpu");
44*0d6140beSAndroid Build Coastguard Worker while (*ptr && isspace((unsigned char)*ptr))
45*0d6140beSAndroid Build Coastguard Worker ptr++;
46*0d6140beSAndroid Build Coastguard Worker if (strncmp(ptr, "model", strlen("model")) != 0)
47*0d6140beSAndroid Build Coastguard Worker continue;
48*0d6140beSAndroid Build Coastguard Worker ptr += strlen("model");
49*0d6140beSAndroid Build Coastguard Worker while (*ptr && isspace((unsigned char)*ptr))
50*0d6140beSAndroid Build Coastguard Worker ptr++;
51*0d6140beSAndroid Build Coastguard Worker if (*ptr != ':')
52*0d6140beSAndroid Build Coastguard Worker continue;
53*0d6140beSAndroid Build Coastguard Worker ptr++;
54*0d6140beSAndroid Build Coastguard Worker while (*ptr && isspace((unsigned char)*ptr))
55*0d6140beSAndroid Build Coastguard Worker ptr++;
56*0d6140beSAndroid Build Coastguard Worker (void)fclose(cpuinfo);
57*0d6140beSAndroid Build Coastguard Worker return (strncmp(ptr, "ICT Loongson-2 V0.3", strlen("ICT Loongson-2 V0.3")) == 0) ||
58*0d6140beSAndroid Build Coastguard Worker (strncmp(ptr, "Godson2 V0.3 FPU V0.1", strlen("Godson2 V0.3 FPU V0.1")) == 0);
59*0d6140beSAndroid Build Coastguard Worker }
60*0d6140beSAndroid Build Coastguard Worker (void)fclose(cpuinfo);
61*0d6140beSAndroid Build Coastguard Worker return 0;
62*0d6140beSAndroid Build Coastguard Worker }
63*0d6140beSAndroid Build Coastguard Worker #endif
64*0d6140beSAndroid Build Coastguard Worker
processor_flash_enable(void)65*0d6140beSAndroid Build Coastguard Worker int processor_flash_enable(void)
66*0d6140beSAndroid Build Coastguard Worker {
67*0d6140beSAndroid Build Coastguard Worker /* Default to 1 to catch not implemented architectures. */
68*0d6140beSAndroid Build Coastguard Worker int ret = 1;
69*0d6140beSAndroid Build Coastguard Worker
70*0d6140beSAndroid Build Coastguard Worker /* FIXME: detect loongson on FreeBSD and OpenBSD as well. */
71*0d6140beSAndroid Build Coastguard Worker #if defined (__MIPSEL__) && defined (__linux)
72*0d6140beSAndroid Build Coastguard Worker if (is_loongson()) {
73*0d6140beSAndroid Build Coastguard Worker flashbase = 0x1fc00000;
74*0d6140beSAndroid Build Coastguard Worker ret = 0;
75*0d6140beSAndroid Build Coastguard Worker }
76*0d6140beSAndroid Build Coastguard Worker #elif defined(__i386__) || defined(__x86_64__)
77*0d6140beSAndroid Build Coastguard Worker /* On x86, flash access is not processor specific except on
78*0d6140beSAndroid Build Coastguard Worker * AMD Elan SC520, AMD Geode and maybe other SoC-style CPUs.
79*0d6140beSAndroid Build Coastguard Worker * FIXME: Move enable_flash_cs5536 and get_flashbase_sc520 here.
80*0d6140beSAndroid Build Coastguard Worker */
81*0d6140beSAndroid Build Coastguard Worker ret = 0;
82*0d6140beSAndroid Build Coastguard Worker #endif
83*0d6140beSAndroid Build Coastguard Worker return ret;
84*0d6140beSAndroid Build Coastguard Worker }
85