Messages in this thread | | | Subject | Re: [PATCH 1/2] nvmem: add driver for JZ4780 efuse | From | Marcin Nowakowski <> | Date | Thu, 28 Dec 2017 08:13:33 +0100 |
| |
Hi Mathieu, PrasannaKumar,
On 27.12.2017 13:27, Mathieu Malaterre wrote: > From: PrasannaKumar Muralidharan <prasannatsmkumar@gmail.com> > > This patch brings support for the JZ4780 efuse. Currently it only expose > a read only access to the entire 8K bits efuse memory. > > Tested-by: Mathieu Malaterre <malat@debian.org> > Signed-off-by: PrasannaKumar Muralidharan <prasannatsmkumar@gmail.com> > ---
> + > +/* main entry point */ > +static int jz4780_efuse_read(void *context, unsigned int offset, > + void *val, size_t bytes) > +{ > + static const int nsegments = sizeof(segments) / sizeof(*segments); > + struct jz4780_efuse *efuse = context; > + char buf[32]; > + char *cur = val; > + int i; > + /* PM recommends read/write each segment separately */ > + for (i = 0; i < nsegments; ++i) { > + unsigned int *segment = segments[i]; > + unsigned int lpos = segment[0]; > + unsigned int buflen = segment[1] / 8; > + unsigned int ncount = buflen / 32; > + unsigned int remain = buflen % 32; > + int j;
This doesn't look right, as offset & bytes are completely ignored. This means it will return data from an offset other than requested and may also overrun the provided output buffer?
> + /* EFUSE can read or write maximum 256bit in each time */ > + for (j = 0; j < ncount ; ++j) { > + jz4780_efuse_read_32bytes(efuse, buf, lpos); > + memcpy(cur, buf, sizeof(buf)); > + cur += sizeof(buf); > + lpos += sizeof(buf); > + } > + if (remain) { > + jz4780_efuse_read_32bytes(efuse, buf, lpos); > + memcpy(cur, buf, remain); > + cur += remain; > + } > + } > + > + return 0; > +}
Marcin
| |