int buffer_icap_get_configuration(struct hwicap_drvdata *drvdata, u32 *data, u32 size) { int status; s32 buffer_count = 0; s32 read_count = 0; u32 i; void __iomem *base_address = drvdata->base_address; for (i = 0, buffer_count = XHI_MAX_BUFFER_INTS; i < size; i++) { if (buffer_count == XHI_MAX_BUFFER_INTS) { u32 words_remaining = size - i; u32 words_to_read = words_remaining < XHI_MAX_BUFFER_INTS ? words_remaining : XHI_MAX_BUFFER_INTS; status = buffer_icap_device_read( drvdata, XHI_BUFFER_START, words_to_read); if (status != 0) { buffer_icap_reset(drvdata); return status; } buffer_count = 0; read_count++; } data[i] = buffer_icap_get_bram(base_address, buffer_count); buffer_count++; } return 0; };
/** * buffer_icap_get_configuration - Read configuration data from the device. * @drvdata: a pointer to the drvdata. * @data: Address of the data representing the partial bitstream * @size: the size of the partial bitstream in 32 bit words. **/ int buffer_icap_get_configuration(struct hwicap_drvdata *drvdata, u32 *data, u32 size) { int status; s32 buffer_count = 0; u32 i; void __iomem *base_address = drvdata->base_address; /* Loop through all the data */ for (i = 0, buffer_count = XHI_MAX_BUFFER_INTS; i < size; i++) { if (buffer_count == XHI_MAX_BUFFER_INTS) { u32 words_remaining = size - i; u32 words_to_read = words_remaining < XHI_MAX_BUFFER_INTS ? words_remaining : XHI_MAX_BUFFER_INTS; /* Read data from ICAP */ status = buffer_icap_device_read( drvdata, XHI_BUFFER_START, words_to_read); if (status != 0) { /* abort. */ buffer_icap_reset(drvdata); return status; } buffer_count = 0; } /* Copy data from bram */ data[i] = buffer_icap_get_bram(base_address, buffer_count); buffer_count++; } return 0; };