diff --git a/src/freedreno/drm/virtio/virtio_bo.c b/src/freedreno/drm/virtio/virtio_bo.c index 2fc7cb079bc..b05964cc330 100644 --- a/src/freedreno/drm/virtio/virtio_bo.c +++ b/src/freedreno/drm/virtio/virtio_bo.c @@ -183,7 +183,7 @@ virtio_bo_set_name(struct fd_bo *bo, const char *fmt, va_list ap) } static void -virtio_bo_upload(struct fd_bo *bo, void *src, unsigned len) +bo_upload(struct fd_bo *bo, unsigned off, void *src, unsigned len) { unsigned req_len = sizeof(struct msm_ccmd_gem_upload_req) + align(len, 4); @@ -193,7 +193,7 @@ virtio_bo_upload(struct fd_bo *bo, void *src, unsigned len) req->hdr = MSM_CCMD(GEM_UPLOAD, req_len); req->res_id = to_virtio_bo(bo)->res_id; req->pad = 0; - req->off = 0; + req->off = off; req->len = len; memcpy(req->payload, src, len); @@ -201,6 +201,19 @@ virtio_bo_upload(struct fd_bo *bo, void *src, unsigned len) virtio_execbuf(bo->dev, &req->hdr, false); } +static void +virtio_bo_upload(struct fd_bo *bo, void *src, unsigned len) +{ + unsigned off = 0; + while (len > 0) { + unsigned sz = MIN2(len, 0x1000); + bo_upload(bo, off, src, sz); + off += sz; + src += sz; + len -= sz; + } +} + static void set_iova(struct fd_bo *bo, uint64_t iova) {