diff options
author | Leo Liu <leo.liu@amd.com> | 2019-04-15 09:39:06 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2019-07-18 15:18:04 -0400 |
commit | 22a8f442866bf539c7a659923155d9afa03d77bb (patch) | |
tree | d25466fb2304c4597d2b66ee809232a08b8d6672 | |
parent | eec28ef03c903f3e404c57ad0d204e0a9d7d9701 (diff) |
drm/amdgpu/VCN2: put IB internal registers offset to structure
So the ring functions can be shared with different VCN versions
with different internal registers offsets
Signed-off-by: Leo Liu <leo.liu@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c | 64 |
2 files changed, 47 insertions, 23 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h index 99f14fcc1460..bfd8c3cea13a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h | |||
@@ -145,6 +145,12 @@ struct amdgpu_vcn_reg{ | |||
145 | unsigned data1; | 145 | unsigned data1; |
146 | unsigned cmd; | 146 | unsigned cmd; |
147 | unsigned nop; | 147 | unsigned nop; |
148 | unsigned context_id; | ||
149 | unsigned ib_vmid; | ||
150 | unsigned ib_bar_low; | ||
151 | unsigned ib_bar_high; | ||
152 | unsigned ib_size; | ||
153 | unsigned gp_scratch8; | ||
148 | unsigned scratch9; | 154 | unsigned scratch9; |
149 | unsigned jpeg_pitch; | 155 | unsigned jpeg_pitch; |
150 | }; | 156 | }; |
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c index c701868dd57f..9bb29cd3aa50 100644 --- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c | |||
@@ -166,6 +166,13 @@ static int vcn_v2_0_sw_init(void *handle) | |||
166 | if (r) | 166 | if (r) |
167 | return r; | 167 | return r; |
168 | 168 | ||
169 | adev->vcn.internal.context_id = mmUVD_CONTEXT_ID_INTERNAL_OFFSET; | ||
170 | adev->vcn.internal.ib_vmid = mmUVD_LMI_RBC_IB_VMID_INTERNAL_OFFSET; | ||
171 | adev->vcn.internal.ib_bar_low = mmUVD_LMI_RBC_IB_64BIT_BAR_LOW_INTERNAL_OFFSET; | ||
172 | adev->vcn.internal.ib_bar_high = mmUVD_LMI_RBC_IB_64BIT_BAR_HIGH_INTERNAL_OFFSET; | ||
173 | adev->vcn.internal.ib_size = mmUVD_RBC_IB_SIZE_INTERNAL_OFFSET; | ||
174 | adev->vcn.internal.gp_scratch8 = mmUVD_GP_SCRATCH8_INTERNAL_OFFSET; | ||
175 | |||
169 | adev->vcn.internal.scratch9 = mmUVD_SCRATCH9_INTERNAL_OFFSET; | 176 | adev->vcn.internal.scratch9 = mmUVD_SCRATCH9_INTERNAL_OFFSET; |
170 | adev->vcn.external.scratch9 = SOC15_REG_OFFSET(UVD, 0, mmUVD_SCRATCH9); | 177 | adev->vcn.external.scratch9 = SOC15_REG_OFFSET(UVD, 0, mmUVD_SCRATCH9); |
171 | adev->vcn.internal.data0 = mmUVD_GPCOM_VCPU_DATA0_INTERNAL_OFFSET; | 178 | adev->vcn.internal.data0 = mmUVD_GPCOM_VCPU_DATA0_INTERNAL_OFFSET; |
@@ -1485,9 +1492,11 @@ static void vcn_v2_0_dec_ring_set_wptr(struct amdgpu_ring *ring) | |||
1485 | */ | 1492 | */ |
1486 | static void vcn_v2_0_dec_ring_insert_start(struct amdgpu_ring *ring) | 1493 | static void vcn_v2_0_dec_ring_insert_start(struct amdgpu_ring *ring) |
1487 | { | 1494 | { |
1488 | amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_DATA0_INTERNAL_OFFSET, 0)); | 1495 | struct amdgpu_device *adev = ring->adev; |
1496 | |||
1497 | amdgpu_ring_write(ring, PACKET0(adev->vcn.internal.data0, 0)); | ||
1489 | amdgpu_ring_write(ring, 0); | 1498 | amdgpu_ring_write(ring, 0); |
1490 | amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_CMD_INTERNAL_OFFSET, 0)); | 1499 | amdgpu_ring_write(ring, PACKET0(adev->vcn.internal.cmd, 0)); |
1491 | amdgpu_ring_write(ring, VCN_DEC_CMD_PACKET_START << 1); | 1500 | amdgpu_ring_write(ring, VCN_DEC_CMD_PACKET_START << 1); |
1492 | } | 1501 | } |
1493 | 1502 | ||
@@ -1500,7 +1509,9 @@ static void vcn_v2_0_dec_ring_insert_start(struct amdgpu_ring *ring) | |||
1500 | */ | 1509 | */ |
1501 | static void vcn_v2_0_dec_ring_insert_end(struct amdgpu_ring *ring) | 1510 | static void vcn_v2_0_dec_ring_insert_end(struct amdgpu_ring *ring) |
1502 | { | 1511 | { |
1503 | amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_CMD_INTERNAL_OFFSET, 0)); | 1512 | struct amdgpu_device *adev = ring->adev; |
1513 | |||
1514 | amdgpu_ring_write(ring, PACKET0(adev->vcn.internal.cmd, 0)); | ||
1504 | amdgpu_ring_write(ring, VCN_DEC_CMD_PACKET_END << 1); | 1515 | amdgpu_ring_write(ring, VCN_DEC_CMD_PACKET_END << 1); |
1505 | } | 1516 | } |
1506 | 1517 | ||
@@ -1513,12 +1524,13 @@ static void vcn_v2_0_dec_ring_insert_end(struct amdgpu_ring *ring) | |||
1513 | */ | 1524 | */ |
1514 | static void vcn_v2_0_dec_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count) | 1525 | static void vcn_v2_0_dec_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count) |
1515 | { | 1526 | { |
1527 | struct amdgpu_device *adev = ring->adev; | ||
1516 | int i; | 1528 | int i; |
1517 | 1529 | ||
1518 | WARN_ON(ring->wptr % 2 || count % 2); | 1530 | WARN_ON(ring->wptr % 2 || count % 2); |
1519 | 1531 | ||
1520 | for (i = 0; i < count / 2; i++) { | 1532 | for (i = 0; i < count / 2; i++) { |
1521 | amdgpu_ring_write(ring, PACKET0(mmUVD_NO_OP_INTERNAL_OFFSET, 0)); | 1533 | amdgpu_ring_write(ring, PACKET0(adev->vcn.internal.nop, 0)); |
1522 | amdgpu_ring_write(ring, 0); | 1534 | amdgpu_ring_write(ring, 0); |
1523 | } | 1535 | } |
1524 | } | 1536 | } |
@@ -1534,27 +1546,28 @@ static void vcn_v2_0_dec_ring_insert_nop(struct amdgpu_ring *ring, uint32_t coun | |||
1534 | static void vcn_v2_0_dec_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq, | 1546 | static void vcn_v2_0_dec_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq, |
1535 | unsigned flags) | 1547 | unsigned flags) |
1536 | { | 1548 | { |
1537 | WARN_ON(flags & AMDGPU_FENCE_FLAG_64BIT); | 1549 | struct amdgpu_device *adev = ring->adev; |
1538 | 1550 | ||
1539 | amdgpu_ring_write(ring, PACKET0(mmUVD_CONTEXT_ID_INTERNAL_OFFSET, 0)); | 1551 | WARN_ON(flags & AMDGPU_FENCE_FLAG_64BIT); |
1552 | amdgpu_ring_write(ring, PACKET0(adev->vcn.internal.context_id, 0)); | ||
1540 | amdgpu_ring_write(ring, seq); | 1553 | amdgpu_ring_write(ring, seq); |
1541 | 1554 | ||
1542 | amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_DATA0_INTERNAL_OFFSET, 0)); | 1555 | amdgpu_ring_write(ring, PACKET0(adev->vcn.internal.data0, 0)); |
1543 | amdgpu_ring_write(ring, addr & 0xffffffff); | 1556 | amdgpu_ring_write(ring, addr & 0xffffffff); |
1544 | 1557 | ||
1545 | amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_DATA1_INTERNAL_OFFSET, 0)); | 1558 | amdgpu_ring_write(ring, PACKET0(adev->vcn.internal.data1, 0)); |
1546 | amdgpu_ring_write(ring, upper_32_bits(addr) & 0xff); | 1559 | amdgpu_ring_write(ring, upper_32_bits(addr) & 0xff); |
1547 | 1560 | ||
1548 | amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_CMD_INTERNAL_OFFSET, 0)); | 1561 | amdgpu_ring_write(ring, PACKET0(adev->vcn.internal.cmd, 0)); |
1549 | amdgpu_ring_write(ring, VCN_DEC_CMD_FENCE << 1); | 1562 | amdgpu_ring_write(ring, VCN_DEC_CMD_FENCE << 1); |
1550 | 1563 | ||
1551 | amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_DATA0_INTERNAL_OFFSET, 0)); | 1564 | amdgpu_ring_write(ring, PACKET0(adev->vcn.internal.data0, 0)); |
1552 | amdgpu_ring_write(ring, 0); | 1565 | amdgpu_ring_write(ring, 0); |
1553 | 1566 | ||
1554 | amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_DATA1_INTERNAL_OFFSET, 0)); | 1567 | amdgpu_ring_write(ring, PACKET0(adev->vcn.internal.data1, 0)); |
1555 | amdgpu_ring_write(ring, 0); | 1568 | amdgpu_ring_write(ring, 0); |
1556 | 1569 | ||
1557 | amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_CMD_INTERNAL_OFFSET, 0)); | 1570 | amdgpu_ring_write(ring, PACKET0(adev->vcn.internal.cmd, 0)); |
1558 | 1571 | ||
1559 | amdgpu_ring_write(ring, VCN_DEC_CMD_TRAP << 1); | 1572 | amdgpu_ring_write(ring, VCN_DEC_CMD_TRAP << 1); |
1560 | } | 1573 | } |
@@ -1572,16 +1585,17 @@ static void vcn_v2_0_dec_ring_emit_ib(struct amdgpu_ring *ring, | |||
1572 | struct amdgpu_ib *ib, | 1585 | struct amdgpu_ib *ib, |
1573 | uint32_t flags) | 1586 | uint32_t flags) |
1574 | { | 1587 | { |
1588 | struct amdgpu_device *adev = ring->adev; | ||
1575 | unsigned vmid = AMDGPU_JOB_GET_VMID(job); | 1589 | unsigned vmid = AMDGPU_JOB_GET_VMID(job); |
1576 | 1590 | ||
1577 | amdgpu_ring_write(ring, PACKET0(mmUVD_LMI_RBC_IB_VMID_INTERNAL_OFFSET, 0)); | 1591 | amdgpu_ring_write(ring, PACKET0(adev->vcn.internal.ib_vmid, 0)); |
1578 | amdgpu_ring_write(ring, vmid); | 1592 | amdgpu_ring_write(ring, vmid); |
1579 | 1593 | ||
1580 | amdgpu_ring_write(ring, PACKET0(mmUVD_LMI_RBC_IB_64BIT_BAR_LOW_INTERNAL_OFFSET, 0)); | 1594 | amdgpu_ring_write(ring, PACKET0(adev->vcn.internal.ib_bar_low, 0)); |
1581 | amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr)); | 1595 | amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr)); |
1582 | amdgpu_ring_write(ring, PACKET0(mmUVD_LMI_RBC_IB_64BIT_BAR_HIGH_INTERNAL_OFFSET, 0)); | 1596 | amdgpu_ring_write(ring, PACKET0(adev->vcn.internal.ib_bar_high, 0)); |
1583 | amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr)); | 1597 | amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr)); |
1584 | amdgpu_ring_write(ring, PACKET0(mmUVD_RBC_IB_SIZE_INTERNAL_OFFSET, 0)); | 1598 | amdgpu_ring_write(ring, PACKET0(adev->vcn.internal.ib_size, 0)); |
1585 | amdgpu_ring_write(ring, ib->length_dw); | 1599 | amdgpu_ring_write(ring, ib->length_dw); |
1586 | } | 1600 | } |
1587 | 1601 | ||
@@ -1589,16 +1603,18 @@ static void vcn_v2_0_dec_ring_emit_reg_wait(struct amdgpu_ring *ring, | |||
1589 | uint32_t reg, uint32_t val, | 1603 | uint32_t reg, uint32_t val, |
1590 | uint32_t mask) | 1604 | uint32_t mask) |
1591 | { | 1605 | { |
1592 | amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_DATA0_INTERNAL_OFFSET, 0)); | 1606 | struct amdgpu_device *adev = ring->adev; |
1607 | |||
1608 | amdgpu_ring_write(ring, PACKET0(adev->vcn.internal.data0, 0)); | ||
1593 | amdgpu_ring_write(ring, reg << 2); | 1609 | amdgpu_ring_write(ring, reg << 2); |
1594 | 1610 | ||
1595 | amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_DATA1_INTERNAL_OFFSET, 0)); | 1611 | amdgpu_ring_write(ring, PACKET0(adev->vcn.internal.data1, 0)); |
1596 | amdgpu_ring_write(ring, val); | 1612 | amdgpu_ring_write(ring, val); |
1597 | 1613 | ||
1598 | amdgpu_ring_write(ring, PACKET0(mmUVD_GP_SCRATCH8_INTERNAL_OFFSET, 0)); | 1614 | amdgpu_ring_write(ring, PACKET0(adev->vcn.internal.gp_scratch8, 0)); |
1599 | amdgpu_ring_write(ring, mask); | 1615 | amdgpu_ring_write(ring, mask); |
1600 | 1616 | ||
1601 | amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_CMD_INTERNAL_OFFSET, 0)); | 1617 | amdgpu_ring_write(ring, PACKET0(adev->vcn.internal.cmd, 0)); |
1602 | 1618 | ||
1603 | amdgpu_ring_write(ring, VCN_DEC_CMD_REG_READ_COND_WAIT << 1); | 1619 | amdgpu_ring_write(ring, VCN_DEC_CMD_REG_READ_COND_WAIT << 1); |
1604 | } | 1620 | } |
@@ -1621,13 +1637,15 @@ static void vcn_v2_0_dec_ring_emit_vm_flush(struct amdgpu_ring *ring, | |||
1621 | static void vcn_v2_0_dec_ring_emit_wreg(struct amdgpu_ring *ring, | 1637 | static void vcn_v2_0_dec_ring_emit_wreg(struct amdgpu_ring *ring, |
1622 | uint32_t reg, uint32_t val) | 1638 | uint32_t reg, uint32_t val) |
1623 | { | 1639 | { |
1624 | amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_DATA0_INTERNAL_OFFSET, 0)); | 1640 | struct amdgpu_device *adev = ring->adev; |
1641 | |||
1642 | amdgpu_ring_write(ring, PACKET0(adev->vcn.internal.data0, 0)); | ||
1625 | amdgpu_ring_write(ring, reg << 2); | 1643 | amdgpu_ring_write(ring, reg << 2); |
1626 | 1644 | ||
1627 | amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_DATA1_INTERNAL_OFFSET, 0)); | 1645 | amdgpu_ring_write(ring, PACKET0(adev->vcn.internal.data1, 0)); |
1628 | amdgpu_ring_write(ring, val); | 1646 | amdgpu_ring_write(ring, val); |
1629 | 1647 | ||
1630 | amdgpu_ring_write(ring, PACKET0(mmUVD_GPCOM_VCPU_CMD_INTERNAL_OFFSET, 0)); | 1648 | amdgpu_ring_write(ring, PACKET0(adev->vcn.internal.cmd, 0)); |
1631 | 1649 | ||
1632 | amdgpu_ring_write(ring, VCN_DEC_CMD_WRITE_REG << 1); | 1650 | amdgpu_ring_write(ring, VCN_DEC_CMD_WRITE_REG << 1); |
1633 | } | 1651 | } |