diff options
author | Justin Waters <justin.waters@timesys.com> | 2013-04-24 17:38:39 -0400 |
---|---|---|
committer | Justin Waters <justin.waters@timesys.com> | 2013-04-24 17:38:39 -0400 |
commit | 75c641ece39c136001340df61f0ad57028ce4ffc (patch) | |
tree | e5f2c5f5764770a34d0e39b5eace575fd4751527 /board/ti/logic/prod-id | |
parent | 1341f103ac87882633b019a5a137056818234248 (diff) |
LogicPD Support for OMAP3/DM3/AM3 boards 2.1 Update
Diffstat (limited to 'board/ti/logic/prod-id')
-rw-r--r-- | board/ti/logic/prod-id/Makefile | 50 | ||||
-rw-r--r-- | board/ti/logic/prod-id/interface.h | 15 | ||||
-rw-r--r-- | board/ti/logic/prod-id/startup.c | 124 |
3 files changed, 153 insertions, 36 deletions
diff --git a/board/ti/logic/prod-id/Makefile b/board/ti/logic/prod-id/Makefile new file mode 100644 index 0000000000..f6dea58eba --- /dev/null +++ b/board/ti/logic/prod-id/Makefile @@ -0,0 +1,50 @@ +# +# (C) Copyright 2000, 2001, 2002 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de. +# +# See file CREDITS for list of people who contributed to this +# project. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# + +include $(TOPDIR)/config.mk + +LIB = $(obj)libprod-id.o + +PROD_ID_OBJS := query.o startup.o crc-15.o \ + extract.o type.o size.o + +COBJS := $(PROD_ID_OBJS) + +SRCS := $(COBJS:.o=.c) +OBJS := $(addprefix $(obj),$(COBJS)) + +$(LIB): $(obj).depend $(OBJS) + $(call cmd_link_o_target, $(OBJS)) + +clean: + rm -f $(OBJS) + +distclean: clean + rm -f $(LIB) core *.bak $(obj).depend + +######################################################################### + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk + +sinclude $(obj).depend diff --git a/board/ti/logic/prod-id/interface.h b/board/ti/logic/prod-id/interface.h index 2646df24ed..8333146a88 100644 --- a/board/ti/logic/prod-id/interface.h +++ b/board/ti/logic/prod-id/interface.h @@ -47,6 +47,7 @@ struct id_key { * set *oor to non-zero. If mem_ptr is non-NULL use it as a pointer to * a cached copy of the ID data */ extern unsigned char id_fetch_byte(unsigned char *mem_ptr, int offset, int *oor); +extern void id_fetch_bytes(unsigned char *mem_ptr, int offset, int size, int *oor); struct id_data { /* mem_ptr is a pointer to read the initial ID data into, then if not @@ -58,7 +59,10 @@ struct id_data { /* Function to do the intial startup (i.e. figure out how much data, offset of * key table, etc */ -extern int id_startup(struct id_data *data); +extern int id_startup(struct id_data *data, + int (*setup_id_chip)(void), + int (*shutdown_id_chip)(void)); + /* * Functions provided back to callers for use in accessing data */ @@ -82,6 +86,8 @@ extern int id_whatis(struct id_cookie *cookie, idenum_t *type); /* Given a string, return the key code (or -1 if not found) */ extern int id_data_get_key(char *key_name); +/* Define to get id_dbg_printf() output... */ +#undef DEBUG_NEW_ID_CODE /* ID error routine to handle malformed data */ extern void id_error(const char *fmt, ...); @@ -89,6 +95,13 @@ extern void id_error(const char *fmt, ...); /* Ouptut routine */ extern int id_printf(const char *format, ...); +/* Ouptut debug routine; define DEBUG_NEW_ID_CODE to enable it */ +#ifdef DEBUG_NEW_ID_CODE +extern int id_dbg_printf(const char *format, ...); +#else +#define id_dbg_printf(fmt, ...) +#endif + /* User interface functions */ extern int id_dict_size(struct id_data *data, struct id_cookie *cookie); diff --git a/board/ti/logic/prod-id/startup.c b/board/ti/logic/prod-id/startup.c index 73dd74069d..d87836ccd1 100644 --- a/board/ti/logic/prod-id/startup.c +++ b/board/ti/logic/prod-id/startup.c @@ -19,7 +19,7 @@ struct __attribute__ ((packed)) id_checksums { unsigned short data; } ; -int id_startup(struct id_data *data) +static int _id_startup(struct id_data *data, int first_run) { int i, err; struct id_cookie cookie; @@ -28,68 +28,74 @@ int id_startup(struct id_data *data) unsigned short xsum; struct id_header hdr; struct id_checksums xsums; - unsigned char *mem_ptr = data->mem_ptr; - - /* Clear out data->mem_ptr since we want all the fetches to come - * from the AT24 chip. Once we've validated the CRCs, restore - * data->mem_ptr to allow id_fetch_byte to read from data->mem_ptr - * instead of the AT24 chip. Should speed up accesses dramatically */ - data->mem_ptr = NULL; + unsigned char *mem_ptr; + unsigned char *cache_ptr; + + if (first_run) { + cache_ptr = data->mem_ptr; + data->mem_ptr = NULL; + mem_ptr = NULL; + } else { + cache_ptr = NULL; + mem_ptr = data->mem_ptr; + } + + id_dbg_printf("%s: first_run %d cach_ptr %p mem_ptr %p\n", __FUNCTION__, first_run, cache_ptr, mem_ptr); memset(&cookie, 0, sizeof(cookie)); /* Data starts with the header, should be 'LpId' */ for (i=0; i<4; ++i) { - byte = id_fetch_byte(NULL, cookie.offset, &err); + byte = id_fetch_byte(cache_ptr, cookie.offset, &err); if (mem_ptr) mem_ptr[cookie.offset] = byte; hdr.signature[i] = byte; cookie.offset++; if (err != ID_EOK) { - id_printf("%s[%u]\n", __FILE__, __LINE__); + id_dbg_printf("%s[%u]\n", __FILE__, __LINE__); goto err_ret; } if (hdr.signature[i] != header_tag[i]) { - id_printf("%s[%u]\n", __FILE__, __LINE__); + id_dbg_printf("%s[%u]\n", __FILE__, __LINE__); err = ID_ENODEV; goto err_ret; } } /* First LE 8-bit value is ID format version */ - byte = id_fetch_byte(NULL, cookie.offset, &err); + byte = id_fetch_byte(cache_ptr, cookie.offset, &err); if (mem_ptr) mem_ptr[cookie.offset] = byte; hdr.id_fmt_ver = byte; cookie.offset++; /* Second LE 8-bit value is currently not used */ - byte = id_fetch_byte(NULL, cookie.offset, &err); + byte = id_fetch_byte(cache_ptr, cookie.offset, &err); if (mem_ptr) mem_ptr[cookie.offset] = byte; hdr.unused0 = byte; cookie.offset++; /* Next LE 16-bit value is length of data */ - byte = id_fetch_byte(NULL, cookie.offset, &err); + byte = id_fetch_byte(cache_ptr, cookie.offset, &err); if (mem_ptr) mem_ptr[cookie.offset] = byte; hdr.data_length = byte; cookie.offset++; - byte = id_fetch_byte(NULL, cookie.offset, &err); + byte = id_fetch_byte(cache_ptr, cookie.offset, &err); if (mem_ptr) mem_ptr[cookie.offset] = byte; hdr.data_length |= byte << 8; cookie.offset++; /* Next LE 16-bit value is xsum of header */ - byte = id_fetch_byte(NULL, cookie.offset, &err); + byte = id_fetch_byte(cache_ptr, cookie.offset, &err); if (mem_ptr) mem_ptr[cookie.offset] = byte; xsums.header = byte; cookie.offset++; - byte = id_fetch_byte(NULL, cookie.offset, &err); + byte = id_fetch_byte(cache_ptr, cookie.offset, &err); if (mem_ptr) mem_ptr[cookie.offset] = byte; xsums.header |= byte << 8; @@ -102,20 +108,20 @@ int id_startup(struct id_data *data) crc_15_step(&xsum, p[i]); if (xsum != xsums.header) { - id_printf("%s[%u] xsum: 0x%04x, xsums.header: 0x%04x\n", + id_dbg_printf("%s[%u] xsum: 0x%04x, xsums.header: 0x%04x\n", __FILE__, __LINE__, xsum, xsums.header); err = -ID_EL2NSYNC; goto err_ret; } /* Next LE 16-bit value is xsum of data */ - byte = id_fetch_byte(NULL, cookie.offset, &err); + byte = id_fetch_byte(cache_ptr, cookie.offset, &err); if (mem_ptr) mem_ptr[cookie.offset] = byte; xsums.data = byte; cookie.offset++; - byte = id_fetch_byte(NULL, cookie.offset, &err); + byte = id_fetch_byte(cache_ptr, cookie.offset, &err); if (mem_ptr) mem_ptr[cookie.offset] = byte; xsums.data |= byte << 8; @@ -123,42 +129,57 @@ int id_startup(struct id_data *data) /* Checksum the data (next id_len bytes), must match xsums.data */ xsum = 0; - for (i = 0; i < hdr.data_length; ++i) { - byte = id_fetch_byte(NULL, cookie.offset + i, &err); - if (mem_ptr) - mem_ptr[cookie.offset + i] = byte; + id_dbg_printf("%s: mem_ptr %p\n", __FUNCTION__, mem_ptr); + if (mem_ptr) { + id_fetch_bytes(mem_ptr+cookie.offset, cookie.offset, hdr.data_length, &err); if (err != ID_EOK) { - id_printf("%s[%u]\n", __FILE__, __LINE__); - goto err_ret; + id_error("%s:%d err %d", __FUNCTION__, __LINE__, err); + goto hard_way; + } + for (i = 0; i < hdr.data_length; ++i) { + crc_15_step(&xsum, mem_ptr[cookie.offset + i]); + } + } else { + hard_way: + for (i = 0; i < hdr.data_length; ++i) { + byte = id_fetch_byte(cache_ptr, cookie.offset + i, &err); + if (mem_ptr) + mem_ptr[cookie.offset + i] = byte; + if (err != ID_EOK) { + id_dbg_printf("%s[%u]\n", __FILE__, __LINE__); + goto err_ret; + } + crc_15_step(&xsum, byte); } - crc_15_step(&xsum, byte); } if (xsum != xsums.data) { - id_printf("%s[%u] xsum: 0x%04x, xsums.data: 0x%04x\n", + id_dbg_printf("%s[%u] xsum: 0x%04x, xsums.data: 0x%04x\n", __FILE__, __LINE__, xsum, xsums.data); err = -ID_EL2NSYNC; goto err_ret; } + /* offset is now at the first byte of the root dictionary which contains its span */ data->root_offset = cookie.offset; + cookie.mem_ptr = cache_ptr; data->root_size = extract_unsigned_pnum(&cookie, 5, &err); if (err != ID_EOK) { - id_printf("%s[%u]\n", __FILE__, __LINE__); + id_dbg_printf("%s[%u]\n", __FILE__, __LINE__); goto err_ret; } - data->root_size += cookie.offset - data->root_offset; - -#if 0 - id_printf("Data format version: %u\n", hdr.id_fmt_ver); -#endif - /* Restore data->mem_ptr to allow id_fetch_byte to read * from the cached data instead of the AT24 chip */ data->mem_ptr = mem_ptr; + id_dbg_printf("%s:%d root_size (old %u) now %u + %u\n", __FUNCTION__, __LINE__, + data->root_size, cookie.offset, data->root_offset); + data->root_size += cookie.offset - data->root_offset; + + id_dbg_printf("Data format version: %u\n", hdr.id_fmt_ver); + return ID_EOK; err_ret: @@ -170,6 +191,39 @@ err_ret: return err; } +int id_startup(struct id_data *data, int (*setup_id_chip)(void), int (*shutdown_id_chip)(void)) +{ + int ret, ret2; + void *mem_ptr = data->mem_ptr; + + /* See if product ID already exists in SRAM (i.e. from x-loader) */ + if (data->mem_ptr) { + ret = _id_startup(data, 1); + data->mem_ptr = mem_ptr; + if (!ret) { + id_printf("Found new Product ID data at %p\n", mem_ptr); + return ret; + } + } + + /* No ID data in SRAM, setup the ID chip and read for real */ + ret = (*setup_id_chip)(); + if (ret) { + id_error("%s: setup_id_chip failed!", __FUNCTION__); + return ret; + } + ret = _id_startup(data, 0); + if (!ret) + id_printf("Cache new Product ID data from AT24 to %p\n", mem_ptr); + ret2 = (*shutdown_id_chip)(); + if (ret2) + id_error("%s: shutdown_id_chip failed!", __FUNCTION__); + + if (!ret && ret2) + ret = ret2; + + return ret; +} /* * Reset the cookie to cover the whole root dictionary */ |