aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLeo Liu <leo.liu@amd.com>2019-04-15 09:39:06 -0400
committerAlex Deucher <alexander.deucher@amd.com>2019-07-18 15:18:04 -0400
commit22a8f442866bf539c7a659923155d9afa03d77bb (patch)
treed25466fb2304c4597d2b66ee809232a08b8d6672
parenteec28ef03c903f3e404c57ad0d204e0a9d7d9701 (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.h6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c64
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 */
1486static void vcn_v2_0_dec_ring_insert_start(struct amdgpu_ring *ring) 1493static 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 */
1501static void vcn_v2_0_dec_ring_insert_end(struct amdgpu_ring *ring) 1510static 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 */
1514static void vcn_v2_0_dec_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count) 1525static 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
1534static void vcn_v2_0_dec_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq, 1546static 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,
1621static void vcn_v2_0_dec_ring_emit_wreg(struct amdgpu_ring *ring, 1637static 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}