163a3a3762c8e1a67666d36b35fdb0ada8e4b7d08Ben Skeggs 2b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol#include "util/u_format.h" 363a3a3762c8e1a67666d36b35fdb0ada8e4b7d08Ben Skeggs 463a3a3762c8e1a67666d36b35fdb0ada8e4b7d08Ben Skeggs#include "nv50_context.h" 5f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 6f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller#include "nv50_defs.xml.h" 763a3a3762c8e1a67666d36b35fdb0ada8e4b7d08Ben Skeggs 863a3a3762c8e1a67666d36b35fdb0ada8e4b7d08Ben Skeggsstruct nv50_transfer { 9f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_transfer base; 10f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_m2mf_rect rect[2]; 11f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t nblocksx; 12f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t nblocksy; 1363a3a3762c8e1a67666d36b35fdb0ada8e4b7d08Ben Skeggs}; 1463a3a3762c8e1a67666d36b35fdb0ada8e4b7d08Ben Skeggs 15b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumillervoid 16b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumillernv50_m2mf_rect_setup(struct nv50_m2mf_rect *rect, 17b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller struct pipe_resource *restrict res, unsigned l, 18b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller unsigned x, unsigned y, unsigned z) 19b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller{ 20b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller struct nv50_miptree *mt = nv50_miptree(res); 21b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller const unsigned w = u_minify(res->width0, l); 22b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller const unsigned h = u_minify(res->height0, l); 23b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller 24b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller rect->bo = mt->base.bo; 25b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller rect->domain = mt->base.domain; 26b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller rect->base = mt->level[l].offset; 27b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller rect->pitch = mt->level[l].pitch; 28b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller if (util_format_is_plain(res->format)) { 29b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller rect->width = w << mt->ms_x; 30b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller rect->height = h << mt->ms_y; 31b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller rect->x = x << mt->ms_x; 32b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller rect->y = y << mt->ms_y; 33b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller } else { 34b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller rect->width = util_format_get_nblocksx(res->format, w); 35b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller rect->height = util_format_get_nblocksy(res->format, h); 36b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller rect->x = util_format_get_nblocksx(res->format, x); 37b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller rect->y = util_format_get_nblocksy(res->format, y); 38b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller } 39b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller rect->tile_mode = mt->level[l].tile_mode; 40b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller rect->cpp = util_format_get_blocksize(res->format); 41b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller 42b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller if (mt->layout_3d) { 43b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller rect->z = z; 44b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller rect->depth = u_minify(res->depth0, l); 45b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller } else { 46b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller rect->base += z * mt->layer_stride; 47b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller rect->z = 0; 48b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller rect->depth = 1; 49b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller } 50b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller} 51b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller 52b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumillervoid 536d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumillernv50_m2mf_transfer_rect(struct nv50_context *nv50, 54f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct nv50_m2mf_rect *dst, 55f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct nv50_m2mf_rect *src, 56f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t nblocksx, uint32_t nblocksy) 5763a3a3762c8e1a67666d36b35fdb0ada8e4b7d08Ben Skeggs{ 586d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller struct nouveau_pushbuf *push = nv50->base.pushbuf; 596d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller struct nouveau_bufctx *bctx = nv50->bufctx; 60f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const int cpp = dst->cpp; 61f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t src_ofst = src->base; 62f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t dst_ofst = dst->base; 63f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t height = nblocksy; 64f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t sy = src->y; 65f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t dy = dst->y; 66f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 67f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller assert(dst->cpp == src->cpp); 68f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 696d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller nouveau_bufctx_refn(bctx, 0, src->bo, src->domain | NOUVEAU_BO_RD); 706d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller nouveau_bufctx_refn(bctx, 0, dst->bo, dst->domain | NOUVEAU_BO_WR); 716d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller nouveau_pushbuf_bufctx(push, bctx); 726d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller nouveau_pushbuf_validate(push); 736d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller 746d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller if (nouveau_bo_memtype(src->bo)) { 756d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(push, NV50_M2MF(LINEAR_IN), 6); 766d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 0); 776d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, src->tile_mode); 786d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, src->width * cpp); 796d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, src->height); 806d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, src->depth); 816d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, src->z); 82f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 83f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller src_ofst += src->y * src->pitch + src->x * cpp; 84f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 856d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(push, NV50_M2MF(LINEAR_IN), 1); 866d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 1); 876d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(push, SUBC_M2MF(NV03_M2MF_PITCH_IN), 1); 886d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, src->pitch); 89f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 90f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 916d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller if (nouveau_bo_memtype(dst->bo)) { 926d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(push, NV50_M2MF(LINEAR_OUT), 6); 936d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 0); 946d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, dst->tile_mode); 956d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, dst->width * cpp); 966d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, dst->height); 976d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, dst->depth); 986d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, dst->z); 99f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 100f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller dst_ofst += dst->y * dst->pitch + dst->x * cpp; 101f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 1026d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(push, NV50_M2MF(LINEAR_OUT), 1); 1036d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 1); 1046d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(push, SUBC_M2MF(NV03_M2MF_PITCH_OUT), 1); 1056d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, dst->pitch); 106f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 107f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 108f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller while (height) { 109f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller int line_count = height > 2047 ? 2047 : height; 110f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 1116d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(push, NV50_M2MF(OFFSET_IN_HIGH), 2); 1126d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATAh(push, src->bo->offset + src_ofst); 1136d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATAh(push, dst->bo->offset + dst_ofst); 114f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 1156d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(push, SUBC_M2MF(NV03_M2MF_OFFSET_IN), 2); 1166d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, src->bo->offset + src_ofst); 1176d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, dst->bo->offset + dst_ofst); 118f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 1196d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller if (nouveau_bo_memtype(src->bo)) { 1206d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(push, NV50_M2MF(TILING_POSITION_IN), 1); 1216d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, (sy << 16) | (src->x * cpp)); 122f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 123f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller src_ofst += line_count * src->pitch; 124f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 1256d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller if (nouveau_bo_memtype(dst->bo)) { 1266d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(push, NV50_M2MF(TILING_POSITION_OUT), 1); 1276d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, (dy << 16) | (dst->x * cpp)); 128f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 129f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller dst_ofst += line_count * dst->pitch; 130f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 131f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 1326d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(push, SUBC_M2MF(NV03_M2MF_LINE_LENGTH_IN), 4); 1336d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, nblocksx * cpp); 1346d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, line_count); 1356d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, (1 << 8) | (1 << 0)); 1366d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 0); 137f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 138f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller height -= line_count; 139f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller sy += line_count; 140f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller dy += line_count; 141f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 1426d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller 1436d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller nouveau_bufctx_reset(bctx, 0); 14463a3a3762c8e1a67666d36b35fdb0ada8e4b7d08Ben Skeggs} 14563a3a3762c8e1a67666d36b35fdb0ada8e4b7d08Ben Skeggs 146f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillervoid 1471ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggsnv50_sifc_linear_u8(struct nouveau_context *nv, 14879079141fa7cbf395d1ffc77364ac301d9824211Ben Skeggs struct nouveau_bo *dst, unsigned offset, unsigned domain, 149150bb0fb34b74055c7dd6d2925ce9c5a1d7decf5Christoph Bumiller unsigned size, const void *data) 15063a3a3762c8e1a67666d36b35fdb0ada8e4b7d08Ben Skeggs{ 1516d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller struct nv50_context *nv50 = nv50_context(&nv->pipe); 1526d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller struct nouveau_pushbuf *push = nv50->base.pushbuf; 153f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t *src = (uint32_t *)data; 154f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned count = (size + 3) / 4; 155f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned xcoord = offset & 0xff; 156f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 1576d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller nouveau_bufctx_refn(nv50->bufctx, 0, dst, domain | NOUVEAU_BO_WR); 1586d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller nouveau_pushbuf_bufctx(push, nv50->bufctx); 1596d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller nouveau_pushbuf_validate(push); 1606d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller 161f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller offset &= ~0xff; 162f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 1636d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(push, NV50_2D(DST_FORMAT), 2); 1646d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, NV50_SURFACE_FORMAT_R8_UNORM); 1656d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 1); 1666d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(push, NV50_2D(DST_PITCH), 5); 1676d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 262144); 1686d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 65536); 1696d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 1); 1706d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATAh(push, dst->offset + offset); 1716d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, dst->offset + offset); 1726d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(push, NV50_2D(SIFC_BITMAP_ENABLE), 2); 1736d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 0); 1746d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, NV50_SURFACE_FORMAT_R8_UNORM); 1756d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(push, NV50_2D(SIFC_WIDTH), 10); 1766d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, size); 1776d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 1); 1786d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 0); 1796d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 1); 1806d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 0); 1816d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 1); 1826d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 0); 1836d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, xcoord); 1846d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 0); 1856d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 0); 186f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 187f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller while (count) { 1886d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller unsigned nr; 189f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 1906d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller if (!PUSH_SPACE(push, 16)) 1916d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller break; 1926d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller nr = PUSH_AVAIL(push); 1936d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller assert(nr >= 16); 194f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nr = MIN2(count, nr - 1); 195f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nr = MIN2(nr, NV04_PFIFO_MAX_PACKET_LEN); 196f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 1976d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NI04(push, NV50_2D(SIFC_DATA), nr); 1986d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATAp(push, src, nr); 199f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 200f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller src += nr; 201f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller count -= nr; 202f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 2036d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller 2046d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller nouveau_bufctx_reset(nv50->bufctx, 0); 20563a3a3762c8e1a67666d36b35fdb0ada8e4b7d08Ben Skeggs} 20663a3a3762c8e1a67666d36b35fdb0ada8e4b7d08Ben Skeggs 207287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellvoid 2081ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggsnv50_m2mf_copy_linear(struct nouveau_context *nv, 209f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nouveau_bo *dst, unsigned dstoff, unsigned dstdom, 210f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nouveau_bo *src, unsigned srcoff, unsigned srcdom, 211f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned size) 21263a3a3762c8e1a67666d36b35fdb0ada8e4b7d08Ben Skeggs{ 2136d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller struct nouveau_pushbuf *push = nv->pushbuf; 2146d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller struct nouveau_bufctx *bctx = nv50_context(&nv->pipe)->bufctx; 2156d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller 2166d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller nouveau_bufctx_refn(bctx, 0, src, srcdom | NOUVEAU_BO_RD); 2176d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller nouveau_bufctx_refn(bctx, 0, dst, dstdom | NOUVEAU_BO_WR); 2186d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller nouveau_pushbuf_bufctx(push, bctx); 2196d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller nouveau_pushbuf_validate(push); 220f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 2216d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(push, NV50_M2MF(LINEAR_IN), 1); 2226d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 1); 2236d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(push, NV50_M2MF(LINEAR_OUT), 1); 2246d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 1); 225f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 226f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller while (size) { 227f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned bytes = MIN2(size, 1 << 17); 228f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 2296d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(push, NV50_M2MF(OFFSET_IN_HIGH), 2); 2306d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATAh(push, src->offset + srcoff); 2316d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATAh(push, dst->offset + dstoff); 2326d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(push, SUBC_M2MF(NV03_M2MF_OFFSET_IN), 2); 2336d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, src->offset + srcoff); 2346d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, dst->offset + dstoff); 2356d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(push, SUBC_M2MF(NV03_M2MF_LINE_LENGTH_IN), 4); 2366d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, bytes); 2376d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 1); 2386d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, (1 << 8) | (1 << 0)); 2396d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, 0); 240f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 241f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller srcoff += bytes; 242f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller dstoff += bytes; 243f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller size -= bytes; 244f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 2456d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller 2466d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller nouveau_bufctx_reset(bctx, 0); 24763a3a3762c8e1a67666d36b35fdb0ada8e4b7d08Ben Skeggs} 24863a3a3762c8e1a67666d36b35fdb0ada8e4b7d08Ben Skeggs 249f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstruct pipe_transfer * 250f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_miptree_transfer_new(struct pipe_context *pctx, 251f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_resource *res, 252f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned level, 253f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned usage, 254f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_box *box) 25563a3a3762c8e1a67666d36b35fdb0ada8e4b7d08Ben Skeggs{ 256f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pctx); 257f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nouveau_device *dev = nv50->screen->base.device; 258b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller const struct nv50_miptree *mt = nv50_miptree(res); 259f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_transfer *tx; 260f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t size; 261f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller int ret; 262f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 26362f44f670bb0162e89fd4786af877f8da9ff607cMarek Olšák if (usage & PIPE_TRANSFER_MAP_DIRECTLY) 2644e1b1cbd0dd5c436d3c9360870df14e2b5e548f3Marcin Slusarz return NULL; 2654e1b1cbd0dd5c436d3c9360870df14e2b5e548f3Marcin Slusarz 266f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tx = CALLOC_STRUCT(nv50_transfer); 267f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!tx) 268f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return NULL; 269f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 270f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller pipe_resource_reference(&tx->base.resource, res); 271f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 272f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tx->base.level = level; 273f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tx->base.usage = usage; 274f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tx->base.box = *box; 275f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 276b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller if (util_format_is_plain(res->format)) { 277b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller tx->nblocksx = box->width << mt->ms_x; 278b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller tx->nblocksy = box->height << mt->ms_x; 279b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller } else { 280b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller tx->nblocksx = util_format_get_nblocksx(res->format, box->width); 281b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller tx->nblocksy = util_format_get_nblocksy(res->format, box->height); 282b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller } 283f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 284f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tx->base.stride = tx->nblocksx * util_format_get_blocksize(res->format); 285f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tx->base.layer_stride = tx->nblocksy * tx->base.stride; 286f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 287b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller nv50_m2mf_rect_setup(&tx->rect[0], res, level, box->x, box->y, box->z); 288f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 289f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller size = tx->base.layer_stride; 290f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 291f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller ret = nouveau_bo_new(dev, NOUVEAU_BO_GART | NOUVEAU_BO_MAP, 0, 2926d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller size * tx->base.box.depth, NULL, &tx->rect[1].bo); 293f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (ret) { 294f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller FREE(tx); 295f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return NULL; 296f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 297f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 298b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller tx->rect[1].cpp = tx->rect[0].cpp; 299f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tx->rect[1].width = tx->nblocksx; 300f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tx->rect[1].height = tx->nblocksy; 301f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tx->rect[1].depth = 1; 302f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tx->rect[1].pitch = tx->base.stride; 303f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tx->rect[1].domain = NOUVEAU_BO_GART; 304f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 305f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (usage & PIPE_TRANSFER_READ) { 306f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned base = tx->rect[0].base; 307b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller unsigned z = tx->rect[0].z; 308f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned i; 309f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < box->depth; ++i) { 3106d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller nv50_m2mf_transfer_rect(nv50, &tx->rect[1], &tx->rect[0], 311f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tx->nblocksx, tx->nblocksy); 312f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (mt->layout_3d) 313f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tx->rect[0].z++; 314f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller else 315f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tx->rect[0].base += mt->layer_stride; 316f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tx->rect[1].base += size; 317f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 318f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tx->rect[0].z = z; 319f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tx->rect[0].base = base; 320f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tx->rect[1].base = 0; 321f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 322f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 323f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return &tx->base; 32463a3a3762c8e1a67666d36b35fdb0ada8e4b7d08Ben Skeggs} 32563a3a3762c8e1a67666d36b35fdb0ada8e4b7d08Ben Skeggs 326287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellvoid 327f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_miptree_transfer_del(struct pipe_context *pctx, 328f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_transfer *transfer) 32963a3a3762c8e1a67666d36b35fdb0ada8e4b7d08Ben Skeggs{ 3306d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller struct nv50_context *nv50 = nv50_context(pctx); 331f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_transfer *tx = (struct nv50_transfer *)transfer; 332f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_miptree *mt = nv50_miptree(tx->base.resource); 333f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned i; 334f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 335f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (tx->base.usage & PIPE_TRANSFER_WRITE) { 336f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 0; i < tx->base.box.depth; ++i) { 3376d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller nv50_m2mf_transfer_rect(nv50, &tx->rect[0], &tx->rect[1], 338f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tx->nblocksx, tx->nblocksy); 339f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (mt->layout_3d) 340f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tx->rect[0].z++; 341f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller else 342f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tx->rect[0].base += mt->layer_stride; 343f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller tx->rect[1].base += tx->nblocksy * tx->base.stride; 344f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 345f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 346f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 347f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nouveau_bo_ref(NULL, &tx->rect[1].bo); 348f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller pipe_resource_reference(&transfer->resource, NULL); 349f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 350f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller FREE(tx); 35163a3a3762c8e1a67666d36b35fdb0ada8e4b7d08Ben Skeggs} 35263a3a3762c8e1a67666d36b35fdb0ada8e4b7d08Ben Skeggs 353f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillervoid * 354f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_miptree_transfer_map(struct pipe_context *pctx, 355f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_transfer *transfer) 356f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 3576d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller struct nv50_screen *screen = nv50_screen(pctx->screen); 358f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_transfer *tx = (struct nv50_transfer *)transfer; 359f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller int ret; 360f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned flags = 0; 361f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 362f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (tx->rect[1].bo->map) 363f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return tx->rect[1].bo->map; 364f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 365f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (transfer->usage & PIPE_TRANSFER_READ) 366f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller flags = NOUVEAU_BO_RD; 367f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (transfer->usage & PIPE_TRANSFER_WRITE) 368f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller flags |= NOUVEAU_BO_WR; 369f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 3706d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller ret = nouveau_bo_map(tx->rect[1].bo, flags, screen->base.client); 371f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (ret) 372f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return NULL; 373f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return tx->rect[1].bo->map; 374f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller} 3759831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller 3769831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumillervoid 377f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_miptree_transfer_unmap(struct pipe_context *pctx, 378f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_transfer *transfer) 3799831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller{ 3806d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller /* nothing to do */ 3819831e1f76cd020e1cde2b13e03149415319a8135Christoph Bumiller} 382f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 383d988361ead27ce61615669bd428b04d2aac7af4fChristoph Bumillervoid 384d988361ead27ce61615669bd428b04d2aac7af4fChristoph Bumillernv50_cb_push(struct nouveau_context *nv, 385d988361ead27ce61615669bd428b04d2aac7af4fChristoph Bumiller struct nouveau_bo *bo, unsigned domain, 386d988361ead27ce61615669bd428b04d2aac7af4fChristoph Bumiller unsigned base, unsigned size, 387d988361ead27ce61615669bd428b04d2aac7af4fChristoph Bumiller unsigned offset, unsigned words, const uint32_t *data) 388d988361ead27ce61615669bd428b04d2aac7af4fChristoph Bumiller{ 3896d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller struct nouveau_pushbuf *push = nv->pushbuf; 3906d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller struct nouveau_bufctx *bctx = nv50_context(&nv->pipe)->bufctx; 391d988361ead27ce61615669bd428b04d2aac7af4fChristoph Bumiller 392d988361ead27ce61615669bd428b04d2aac7af4fChristoph Bumiller assert(!(offset & 3)); 393d988361ead27ce61615669bd428b04d2aac7af4fChristoph Bumiller size = align(size, 0x100); 394d988361ead27ce61615669bd428b04d2aac7af4fChristoph Bumiller 3956d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller nouveau_bufctx_refn(bctx, 0, bo, NOUVEAU_BO_WR | domain); 3966d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller nouveau_pushbuf_bufctx(push, bctx); 3976d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller nouveau_pushbuf_validate(push); 3986d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller 399d988361ead27ce61615669bd428b04d2aac7af4fChristoph Bumiller while (words) { 400d988361ead27ce61615669bd428b04d2aac7af4fChristoph Bumiller unsigned nr; 401d988361ead27ce61615669bd428b04d2aac7af4fChristoph Bumiller 4026d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller nr = PUSH_AVAIL(push); 403d988361ead27ce61615669bd428b04d2aac7af4fChristoph Bumiller nr = MIN2(nr - 7, words); 404d988361ead27ce61615669bd428b04d2aac7af4fChristoph Bumiller nr = MIN2(nr, NV04_PFIFO_MAX_PACKET_LEN - 1); 405d988361ead27ce61615669bd428b04d2aac7af4fChristoph Bumiller 4066d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(push, NV50_3D(CB_DEF_ADDRESS_HIGH), 3); 4076d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATAh(push, bo->offset + base); 4086d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, bo->offset + base); 4096d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, (NV50_CB_TMP << 16) | (size & 0xffff)); 4106d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NV04(push, NV50_3D(CB_ADDR), 1); 4116d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATA (push, (offset << 6) | NV50_CB_TMP); 4126d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller BEGIN_NI04(push, NV50_3D(CB_DATA(0)), nr); 4136d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller PUSH_DATAp(push, data, nr); 414d988361ead27ce61615669bd428b04d2aac7af4fChristoph Bumiller 415d988361ead27ce61615669bd428b04d2aac7af4fChristoph Bumiller words -= nr; 416d988361ead27ce61615669bd428b04d2aac7af4fChristoph Bumiller data += nr; 417d988361ead27ce61615669bd428b04d2aac7af4fChristoph Bumiller offset += nr * 4; 418d988361ead27ce61615669bd428b04d2aac7af4fChristoph Bumiller } 4196d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller 4206d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller nouveau_bufctx_reset(bctx, 0); 421d988361ead27ce61615669bd428b04d2aac7af4fChristoph Bumiller} 422