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:
Родитель
d9c390561d
Коммит
3bb076af2a
|
@ -175,14 +175,18 @@ nv_mo32(void *obj, u32 addr, u32 mask, u32 data)
|
|||
return temp;
|
||||
}
|
||||
|
||||
static inline bool
|
||||
nv_strncmp(void *obj, u32 addr, u32 len, const char *str)
|
||||
static inline int
|
||||
nv_memcmp(void *obj, u32 addr, const char *str, u32 len)
|
||||
{
|
||||
unsigned char c1, c2;
|
||||
|
||||
while (len--) {
|
||||
if (nv_ro08(obj, addr++) != *(str++))
|
||||
return false;
|
||||
c1 = nv_ro08(obj, addr++);
|
||||
c2 = *(str++);
|
||||
if (c1 != c2)
|
||||
return c1 - c2;
|
||||
}
|
||||
return true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -64,7 +64,7 @@ dcb_table(struct nouveau_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len)
|
|||
}
|
||||
} else
|
||||
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);
|
||||
*hdr = 4;
|
||||
*cnt = (i2c - dcb) / 10;
|
||||
|
|
Загрузка…
Ссылка в новой задаче