drm/nouveau/bios: fix DCB v1.5 parsing
memcmp->nv_strncmp conversion, in addition to name change, should have inverted the return value. But nv_strncmp does not act like strncmp - it does not check for string terminator, returns true/false instead of -1/0/1 and has different parameters order. Let's rename it to nv_memcmp and let it act like memcmp. Signed-off-by: Marcin Slusarz <marcin.slusarz@gmail.com> Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
committed by
Ben Skeggs
parent
d9c390561d
commit
3bb076af2a
@@ -175,14 +175,18 @@ nv_mo32(void *obj, u32 addr, u32 mask, u32 data)
|
|||||||
return temp;
|
return temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool
|
static inline int
|
||||||
nv_strncmp(void *obj, u32 addr, u32 len, const char *str)
|
nv_memcmp(void *obj, u32 addr, const char *str, u32 len)
|
||||||
{
|
{
|
||||||
|
unsigned char c1, c2;
|
||||||
|
|
||||||
while (len--) {
|
while (len--) {
|
||||||
if (nv_ro08(obj, addr++) != *(str++))
|
c1 = nv_ro08(obj, addr++);
|
||||||
return false;
|
c2 = *(str++);
|
||||||
|
if (c1 != c2)
|
||||||
|
return c1 - c2;
|
||||||
}
|
}
|
||||||
return true;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -64,7 +64,7 @@ dcb_table(struct nouveau_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len)
|
|||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
if (*ver >= 0x15) {
|
if (*ver >= 0x15) {
|
||||||
if (!nv_strncmp(bios, dcb - 7, 7, "DEV_REC")) {
|
if (!nv_memcmp(bios, dcb - 7, "DEV_REC", 7)) {
|
||||||
u16 i2c = nv_ro16(bios, dcb + 2);
|
u16 i2c = nv_ro16(bios, dcb + 2);
|
||||||
*hdr = 4;
|
*hdr = 4;
|
||||||
*cnt = (i2c - dcb) / 10;
|
*cnt = (i2c - dcb) / 10;
|
||||||
|
Reference in New Issue
Block a user