mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-26 08:31:13 +00:00
[POWERPC] bootwrapper: Add dt_is_compatible()
This can be used rather than doing a simple strcmp, which will fail to handle multiple compatible entries. Signed-off-by: Scott Wood <scottwood@freescale.com> Acked-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
parent
0602801c22
commit
a73ac50c47
2 changed files with 34 additions and 15 deletions
|
@ -113,7 +113,6 @@ void __dt_fixup_mac_addresses(u32 startindex, ...)
|
||||||
}
|
}
|
||||||
|
|
||||||
#define MAX_ADDR_CELLS 4
|
#define MAX_ADDR_CELLS 4
|
||||||
#define MAX_RANGES 8
|
|
||||||
|
|
||||||
static void get_reg_format(void *node, u32 *naddr, u32 *nsize)
|
static void get_reg_format(void *node, u32 *naddr, u32 *nsize)
|
||||||
{
|
{
|
||||||
|
@ -209,7 +208,7 @@ static int find_range(u32 *reg, u32 *ranges, int nregaddr,
|
||||||
* In particular, PCI is not supported. Also, only the beginning of the
|
* In particular, PCI is not supported. Also, only the beginning of the
|
||||||
* reg block is tracked; size is ignored except in ranges.
|
* reg block is tracked; size is ignored except in ranges.
|
||||||
*/
|
*/
|
||||||
static u32 dt_xlate_buf[MAX_ADDR_CELLS * MAX_RANGES * 3];
|
static u32 prop_buf[MAX_PROP_LEN / 4];
|
||||||
|
|
||||||
static int dt_xlate(void *node, int res, int reglen, unsigned long *addr,
|
static int dt_xlate(void *node, int res, int reglen, unsigned long *addr,
|
||||||
unsigned long *size)
|
unsigned long *size)
|
||||||
|
@ -233,15 +232,15 @@ static int dt_xlate(void *node, int res, int reglen, unsigned long *addr,
|
||||||
offset = (naddr + nsize) * res;
|
offset = (naddr + nsize) * res;
|
||||||
|
|
||||||
if (reglen < offset + naddr + nsize ||
|
if (reglen < offset + naddr + nsize ||
|
||||||
sizeof(dt_xlate_buf) < (offset + naddr + nsize) * 4)
|
MAX_PROP_LEN < (offset + naddr + nsize) * 4)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
copy_val(last_addr, dt_xlate_buf + offset, naddr);
|
copy_val(last_addr, prop_buf + offset, naddr);
|
||||||
|
|
||||||
ret_size = dt_xlate_buf[offset + naddr];
|
ret_size = prop_buf[offset + naddr];
|
||||||
if (nsize == 2) {
|
if (nsize == 2) {
|
||||||
ret_size <<= 32;
|
ret_size <<= 32;
|
||||||
ret_size |= dt_xlate_buf[offset + naddr + 1];
|
ret_size |= prop_buf[offset + naddr + 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
@ -255,25 +254,25 @@ static int dt_xlate(void *node, int res, int reglen, unsigned long *addr,
|
||||||
|
|
||||||
get_reg_format(parent, &naddr, &nsize);
|
get_reg_format(parent, &naddr, &nsize);
|
||||||
|
|
||||||
buflen = getprop(node, "ranges", dt_xlate_buf,
|
buflen = getprop(node, "ranges", prop_buf,
|
||||||
sizeof(dt_xlate_buf));
|
sizeof(prop_buf));
|
||||||
if (buflen == 0)
|
if (buflen == 0)
|
||||||
continue;
|
continue;
|
||||||
if (buflen < 0 || buflen > sizeof(dt_xlate_buf))
|
if (buflen < 0 || buflen > sizeof(prop_buf))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
offset = find_range(last_addr, dt_xlate_buf, prev_naddr,
|
offset = find_range(last_addr, prop_buf, prev_naddr,
|
||||||
naddr, prev_nsize, buflen / 4);
|
naddr, prev_nsize, buflen / 4);
|
||||||
|
|
||||||
if (offset < 0)
|
if (offset < 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
copy_val(this_addr, dt_xlate_buf + offset, prev_naddr);
|
copy_val(this_addr, prop_buf + offset, prev_naddr);
|
||||||
|
|
||||||
if (!sub_reg(last_addr, this_addr))
|
if (!sub_reg(last_addr, this_addr))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
copy_val(this_addr, dt_xlate_buf + offset + prev_naddr, naddr);
|
copy_val(this_addr, prop_buf + offset + prev_naddr, naddr);
|
||||||
|
|
||||||
if (!add_reg(last_addr, this_addr, naddr))
|
if (!add_reg(last_addr, this_addr, naddr))
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -300,16 +299,35 @@ int dt_xlate_reg(void *node, int res, unsigned long *addr, unsigned long *size)
|
||||||
{
|
{
|
||||||
int reglen;
|
int reglen;
|
||||||
|
|
||||||
reglen = getprop(node, "reg", dt_xlate_buf, sizeof(dt_xlate_buf)) / 4;
|
reglen = getprop(node, "reg", prop_buf, sizeof(prop_buf)) / 4;
|
||||||
return dt_xlate(node, res, reglen, addr, size);
|
return dt_xlate(node, res, reglen, addr, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
int dt_xlate_addr(void *node, u32 *buf, int buflen, unsigned long *xlated_addr)
|
int dt_xlate_addr(void *node, u32 *buf, int buflen, unsigned long *xlated_addr)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (buflen > sizeof(dt_xlate_buf))
|
if (buflen > sizeof(prop_buf))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
memcpy(dt_xlate_buf, buf, buflen);
|
memcpy(prop_buf, buf, buflen);
|
||||||
return dt_xlate(node, 0, buflen / 4, xlated_addr, NULL);
|
return dt_xlate(node, 0, buflen / 4, xlated_addr, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int dt_is_compatible(void *node, const char *compat)
|
||||||
|
{
|
||||||
|
char *buf = (char *)prop_buf;
|
||||||
|
int len, pos;
|
||||||
|
|
||||||
|
len = getprop(node, "compatible", buf, MAX_PROP_LEN);
|
||||||
|
if (len < 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
for (pos = 0; pos < len; pos++) {
|
||||||
|
if (!strcmp(buf + pos, compat))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
pos += strnlen(&buf[pos], len - pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
|
@ -87,6 +87,7 @@ void *simple_alloc_init(char *base, unsigned long heap_size,
|
||||||
extern void flush_cache(void *, unsigned long);
|
extern void flush_cache(void *, unsigned long);
|
||||||
int dt_xlate_reg(void *node, int res, unsigned long *addr, unsigned long *size);
|
int dt_xlate_reg(void *node, int res, unsigned long *addr, unsigned long *size);
|
||||||
int dt_xlate_addr(void *node, u32 *buf, int buflen, unsigned long *xlated_addr);
|
int dt_xlate_addr(void *node, u32 *buf, int buflen, unsigned long *xlated_addr);
|
||||||
|
int dt_is_compatible(void *node, const char *compat);
|
||||||
|
|
||||||
static inline void *finddevice(const char *name)
|
static inline void *finddevice(const char *name)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue