1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include <errno.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include "comm-host.h"
#include "ec_commands.h"
int (*ec_command)(int command, int version,
const void *outdata, int outsize,
void *indata, int insize);
int (*ec_readmem)(int offset, int bytes, void *dest);
int ec_max_outsize, ec_max_insize;
void *ec_outbuf;
void *ec_inbuf;
int comm_init_dev(void) __attribute__((weak));
int comm_init_lpc(void) __attribute__((weak));
int comm_init_i2c(void) __attribute__((weak));
static int fake_readmem(int offset, int bytes, void *dest)
{
struct ec_params_read_memmap p;
int c;
char *buf;
p.offset = offset;
if (bytes) {
p.size = bytes;
c = ec_command(EC_CMD_READ_MEMMAP, 0, &p, sizeof(p),
dest, p.size);
if (c < 0)
return c;
return p.size;
}
p.size = EC_MEMMAP_TEXT_MAX;
c = ec_command(EC_CMD_READ_MEMMAP, 0, &p, sizeof(p), dest, p.size);
if (c < 0)
return c;
buf = dest;
for (c = 0; c < EC_MEMMAP_TEXT_MAX; c++) {
if (buf[c] == 0)
return c;
}
buf[EC_MEMMAP_TEXT_MAX - 1] = 0;
return EC_MEMMAP_TEXT_MAX - 1;
}
int comm_init(void)
{
/* Default memmap access */
ec_readmem = fake_readmem;
/* Prefer new /dev method */
if (comm_init_dev && !comm_init_dev())
goto init_ok;
/* Fallback to direct LPC on x86 */
if (comm_init_lpc && !comm_init_lpc())
goto init_ok;
/* Fallback to direct i2c on ARM */
if (comm_init_i2c && !comm_init_i2c())
goto init_ok;
/* Give up */
fprintf(stderr, "Unable to establish host communication\n");
return 1;
init_ok:
/* Allocate shared I/O buffers */
ec_outbuf = malloc(ec_max_outsize);
ec_inbuf = malloc(ec_max_insize);
if (!ec_outbuf || !ec_inbuf) {
fprintf(stderr, "Unable to allocate buffers\n");
return 1;
}
return 0;
}
|