Page MenuHomeFreeBSD

D6383.id16367.diff
No OneTemporary

D6383.id16367.diff

Index: sys/arm/allwinner/aw_sid.h
===================================================================
--- sys/arm/allwinner/aw_sid.h
+++ sys/arm/allwinner/aw_sid.h
@@ -30,5 +30,6 @@
#define __AW_SID_H__
int aw_sid_read_tscalib(uint32_t *, uint32_t *);
+int aw_sid_get_rootkey(u_char *out);
#endif /* !__AW_SID_H__ */
Index: sys/arm/allwinner/aw_sid.c
===================================================================
--- sys/arm/allwinner/aw_sid.c
+++ sys/arm/allwinner/aw_sid.c
@@ -39,11 +39,13 @@
#include <sys/rman.h>
#include <sys/kernel.h>
#include <sys/module.h>
+#include <sys/sysctl.h>
#include <machine/bus.h>
#include <dev/ofw/ofw_bus.h>
#include <dev/ofw/ofw_bus_subr.h>
+#include <arm/allwinner/allwinner_machdep.h>
#include <arm/allwinner/aw_sid.h>
#define SID_SRAM 0x200
@@ -51,6 +53,8 @@
#define SID_THERMAL_CALIB1 (SID_SRAM + 0x38)
static struct ofw_compat_data compat_data[] = {
+ { "allwinner,sun4i-a10-sid", 1},
+ { "allwinner,sun7i-a20-sid", 1},
{ "allwinner,sun8i-a83t-sid", 1 },
{ NULL, 0 }
};
@@ -66,9 +70,18 @@
{ -1, 0 }
};
+enum sid_keys {
+ AW_SID_ROOT_KEY,
+};
+
+#define ROOT_KEY_OFF 0x0
+#define ROOT_KEY_SIZE 4
+
#define RD4(sc, reg) bus_read_4((sc)->res, (reg))
#define WR4(sc, reg, val) bus_write_4((sc)->res, (reg), (val))
+static int aw_sid_sysctl(SYSCTL_HANDLER_ARGS);
+
static int
aw_sid_probe(device_t dev)
{
@@ -96,6 +109,18 @@
aw_sid_sc = sc;
+ switch (allwinner_soc_family()) {
+ case ALLWINNERSOC_SUN4I:
+ case ALLWINNERSOC_SUN7I:
+ SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
+ SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
+ OID_AUTO, "rootkey",
+ CTLTYPE_STRING | CTLFLAG_RD,
+ dev, AW_SID_ROOT_KEY, aw_sid_sysctl, "A", "Root Key");
+ break;
+ default:
+ break;
+ }
return (0);
}
@@ -114,6 +139,50 @@
return (0);
}
+int
+aw_sid_get_rootkey(u_char *out)
+{
+ struct aw_sid_softc *sc;
+ int i;
+ u_int tmp;
+
+ sc = aw_sid_sc;
+ if (sc == NULL)
+ return (ENXIO);
+
+ for (i = 0; i < ROOT_KEY_SIZE ; i++) {
+ tmp = RD4(aw_sid_sc, ROOT_KEY_OFF + (i * 4));
+ out[i * 4] = (tmp & 0xFF000000) >> 24;
+ out[i * 4 + 1] = (tmp & 0x00FF0000) >> 16;
+ out[i * 4 + 2] = (tmp & 0x0000FF00) >> 8;
+ out[i * 4 + 3] = tmp & 0x000000FF;
+ }
+
+ return (0);
+}
+
+static int
+aw_sid_sysctl(SYSCTL_HANDLER_ARGS)
+{
+ enum sid_keys key = arg2;
+ u_char rootkey[16];
+ char out[33];
+
+ if (key != AW_SID_ROOT_KEY)
+ return (ENOENT);
+
+ if (aw_sid_get_rootkey(rootkey) == ENXIO)
+ return (ENOENT);
+ snprintf(out, sizeof(out),
+ "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
+ rootkey[0], rootkey[1], rootkey[2], rootkey[3],
+ rootkey[4], rootkey[5], rootkey[6], rootkey[7],
+ rootkey[8], rootkey[9], rootkey[10], rootkey[11],
+ rootkey[12], rootkey[13], rootkey[14], rootkey[15]);
+
+ return sysctl_handle_string(oidp, out, sizeof(out), req);
+}
+
static device_method_t aw_sid_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, aw_sid_probe),

File Metadata

Mime Type
text/plain
Expires
Mon, Mar 16, 3:38 AM (11 h, 16 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29751473
Default Alt Text
D6383.id16367.diff (2 KB)

Event Timeline