r100.c (38a5d6736e7f714cc56d58692001e66dcbb98799) r100.c (62f288cfe1c6257afe6ddfdff153c3803e8cdd72)
1/*
2 * Copyright 2008 Advanced Micro Devices, Inc.
3 * Copyright 2008 Red Hat Inc.
4 * Copyright 2009 Jerome Glisse.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation

--- 1413 unchanged lines hidden (view full) ---

1422 if (r) {
1423 DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1424 idx, reg);
1425 r100_cs_dump_packet(p, pkt);
1426 return r;
1427 }
1428 track->zb.robj = reloc->robj;
1429 track->zb.offset = idx_value;
1/*
2 * Copyright 2008 Advanced Micro Devices, Inc.
3 * Copyright 2008 Red Hat Inc.
4 * Copyright 2009 Jerome Glisse.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation

--- 1413 unchanged lines hidden (view full) ---

1422 if (r) {
1423 DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1424 idx, reg);
1425 r100_cs_dump_packet(p, pkt);
1426 return r;
1427 }
1428 track->zb.robj = reloc->robj;
1429 track->zb.offset = idx_value;
1430 track->zb_dirty = true;
1431 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
1432 break;
1433 case RADEON_RB3D_COLOROFFSET:
1434 r = r100_cs_packet_next_reloc(p, &reloc);
1435 if (r) {
1436 DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1437 idx, reg);
1438 r100_cs_dump_packet(p, pkt);
1439 return r;
1440 }
1441 track->cb[0].robj = reloc->robj;
1442 track->cb[0].offset = idx_value;
1430 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
1431 break;
1432 case RADEON_RB3D_COLOROFFSET:
1433 r = r100_cs_packet_next_reloc(p, &reloc);
1434 if (r) {
1435 DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1436 idx, reg);
1437 r100_cs_dump_packet(p, pkt);
1438 return r;
1439 }
1440 track->cb[0].robj = reloc->robj;
1441 track->cb[0].offset = idx_value;
1443 track->cb_dirty = true;
1444 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
1445 break;
1446 case RADEON_PP_TXOFFSET_0:
1447 case RADEON_PP_TXOFFSET_1:
1448 case RADEON_PP_TXOFFSET_2:
1449 i = (reg - RADEON_PP_TXOFFSET_0) / 24;
1450 r = r100_cs_packet_next_reloc(p, &reloc);
1451 if (r) {
1452 DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1453 idx, reg);
1454 r100_cs_dump_packet(p, pkt);
1455 return r;
1456 }
1457 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
1458 track->textures[i].robj = reloc->robj;
1442 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
1443 break;
1444 case RADEON_PP_TXOFFSET_0:
1445 case RADEON_PP_TXOFFSET_1:
1446 case RADEON_PP_TXOFFSET_2:
1447 i = (reg - RADEON_PP_TXOFFSET_0) / 24;
1448 r = r100_cs_packet_next_reloc(p, &reloc);
1449 if (r) {
1450 DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1451 idx, reg);
1452 r100_cs_dump_packet(p, pkt);
1453 return r;
1454 }
1455 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
1456 track->textures[i].robj = reloc->robj;
1459 track->tex_dirty = true;
1460 break;
1461 case RADEON_PP_CUBIC_OFFSET_T0_0:
1462 case RADEON_PP_CUBIC_OFFSET_T0_1:
1463 case RADEON_PP_CUBIC_OFFSET_T0_2:
1464 case RADEON_PP_CUBIC_OFFSET_T0_3:
1465 case RADEON_PP_CUBIC_OFFSET_T0_4:
1466 i = (reg - RADEON_PP_CUBIC_OFFSET_T0_0) / 4;
1467 r = r100_cs_packet_next_reloc(p, &reloc);
1468 if (r) {
1469 DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1470 idx, reg);
1471 r100_cs_dump_packet(p, pkt);
1472 return r;
1473 }
1474 track->textures[0].cube_info[i].offset = idx_value;
1475 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
1476 track->textures[0].cube_info[i].robj = reloc->robj;
1457 break;
1458 case RADEON_PP_CUBIC_OFFSET_T0_0:
1459 case RADEON_PP_CUBIC_OFFSET_T0_1:
1460 case RADEON_PP_CUBIC_OFFSET_T0_2:
1461 case RADEON_PP_CUBIC_OFFSET_T0_3:
1462 case RADEON_PP_CUBIC_OFFSET_T0_4:
1463 i = (reg - RADEON_PP_CUBIC_OFFSET_T0_0) / 4;
1464 r = r100_cs_packet_next_reloc(p, &reloc);
1465 if (r) {
1466 DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1467 idx, reg);
1468 r100_cs_dump_packet(p, pkt);
1469 return r;
1470 }
1471 track->textures[0].cube_info[i].offset = idx_value;
1472 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
1473 track->textures[0].cube_info[i].robj = reloc->robj;
1477 track->tex_dirty = true;
1478 break;
1479 case RADEON_PP_CUBIC_OFFSET_T1_0:
1480 case RADEON_PP_CUBIC_OFFSET_T1_1:
1481 case RADEON_PP_CUBIC_OFFSET_T1_2:
1482 case RADEON_PP_CUBIC_OFFSET_T1_3:
1483 case RADEON_PP_CUBIC_OFFSET_T1_4:
1484 i = (reg - RADEON_PP_CUBIC_OFFSET_T1_0) / 4;
1485 r = r100_cs_packet_next_reloc(p, &reloc);
1486 if (r) {
1487 DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1488 idx, reg);
1489 r100_cs_dump_packet(p, pkt);
1490 return r;
1491 }
1492 track->textures[1].cube_info[i].offset = idx_value;
1493 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
1494 track->textures[1].cube_info[i].robj = reloc->robj;
1474 break;
1475 case RADEON_PP_CUBIC_OFFSET_T1_0:
1476 case RADEON_PP_CUBIC_OFFSET_T1_1:
1477 case RADEON_PP_CUBIC_OFFSET_T1_2:
1478 case RADEON_PP_CUBIC_OFFSET_T1_3:
1479 case RADEON_PP_CUBIC_OFFSET_T1_4:
1480 i = (reg - RADEON_PP_CUBIC_OFFSET_T1_0) / 4;
1481 r = r100_cs_packet_next_reloc(p, &reloc);
1482 if (r) {
1483 DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1484 idx, reg);
1485 r100_cs_dump_packet(p, pkt);
1486 return r;
1487 }
1488 track->textures[1].cube_info[i].offset = idx_value;
1489 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
1490 track->textures[1].cube_info[i].robj = reloc->robj;
1495 track->tex_dirty = true;
1496 break;
1497 case RADEON_PP_CUBIC_OFFSET_T2_0:
1498 case RADEON_PP_CUBIC_OFFSET_T2_1:
1499 case RADEON_PP_CUBIC_OFFSET_T2_2:
1500 case RADEON_PP_CUBIC_OFFSET_T2_3:
1501 case RADEON_PP_CUBIC_OFFSET_T2_4:
1502 i = (reg - RADEON_PP_CUBIC_OFFSET_T2_0) / 4;
1503 r = r100_cs_packet_next_reloc(p, &reloc);
1504 if (r) {
1505 DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1506 idx, reg);
1507 r100_cs_dump_packet(p, pkt);
1508 return r;
1509 }
1510 track->textures[2].cube_info[i].offset = idx_value;
1511 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
1512 track->textures[2].cube_info[i].robj = reloc->robj;
1491 break;
1492 case RADEON_PP_CUBIC_OFFSET_T2_0:
1493 case RADEON_PP_CUBIC_OFFSET_T2_1:
1494 case RADEON_PP_CUBIC_OFFSET_T2_2:
1495 case RADEON_PP_CUBIC_OFFSET_T2_3:
1496 case RADEON_PP_CUBIC_OFFSET_T2_4:
1497 i = (reg - RADEON_PP_CUBIC_OFFSET_T2_0) / 4;
1498 r = r100_cs_packet_next_reloc(p, &reloc);
1499 if (r) {
1500 DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1501 idx, reg);
1502 r100_cs_dump_packet(p, pkt);
1503 return r;
1504 }
1505 track->textures[2].cube_info[i].offset = idx_value;
1506 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
1507 track->textures[2].cube_info[i].robj = reloc->robj;
1513 track->tex_dirty = true;
1514 break;
1515 case RADEON_RE_WIDTH_HEIGHT:
1516 track->maxy = ((idx_value >> 16) & 0x7FF);
1508 break;
1509 case RADEON_RE_WIDTH_HEIGHT:
1510 track->maxy = ((idx_value >> 16) & 0x7FF);
1517 track->cb_dirty = true;
1518 track->zb_dirty = true;
1519 break;
1520 case RADEON_RB3D_COLORPITCH:
1521 r = r100_cs_packet_next_reloc(p, &reloc);
1522 if (r) {
1523 DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1524 idx, reg);
1525 r100_cs_dump_packet(p, pkt);
1526 return r;

--- 4 unchanged lines hidden (view full) ---

1531 if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
1532 tile_flags |= RADEON_COLOR_MICROTILE_ENABLE;
1533
1534 tmp = idx_value & ~(0x7 << 16);
1535 tmp |= tile_flags;
1536 ib[idx] = tmp;
1537
1538 track->cb[0].pitch = idx_value & RADEON_COLORPITCH_MASK;
1511 break;
1512 case RADEON_RB3D_COLORPITCH:
1513 r = r100_cs_packet_next_reloc(p, &reloc);
1514 if (r) {
1515 DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1516 idx, reg);
1517 r100_cs_dump_packet(p, pkt);
1518 return r;

--- 4 unchanged lines hidden (view full) ---

1523 if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
1524 tile_flags |= RADEON_COLOR_MICROTILE_ENABLE;
1525
1526 tmp = idx_value & ~(0x7 << 16);
1527 tmp |= tile_flags;
1528 ib[idx] = tmp;
1529
1530 track->cb[0].pitch = idx_value & RADEON_COLORPITCH_MASK;
1539 track->cb_dirty = true;
1540 break;
1541 case RADEON_RB3D_DEPTHPITCH:
1542 track->zb.pitch = idx_value & RADEON_DEPTHPITCH_MASK;
1531 break;
1532 case RADEON_RB3D_DEPTHPITCH:
1533 track->zb.pitch = idx_value & RADEON_DEPTHPITCH_MASK;
1543 track->zb_dirty = true;
1544 break;
1545 case RADEON_RB3D_CNTL:
1546 switch ((idx_value >> RADEON_RB3D_COLOR_FORMAT_SHIFT) & 0x1f) {
1547 case 7:
1548 case 8:
1549 case 9:
1550 case 11:
1551 case 12:

--- 8 unchanged lines hidden (view full) ---

1560 track->cb[0].cpp = 4;
1561 break;
1562 default:
1563 DRM_ERROR("Invalid color buffer format (%d) !\n",
1564 ((idx_value >> RADEON_RB3D_COLOR_FORMAT_SHIFT) & 0x1f));
1565 return -EINVAL;
1566 }
1567 track->z_enabled = !!(idx_value & RADEON_Z_ENABLE);
1534 break;
1535 case RADEON_RB3D_CNTL:
1536 switch ((idx_value >> RADEON_RB3D_COLOR_FORMAT_SHIFT) & 0x1f) {
1537 case 7:
1538 case 8:
1539 case 9:
1540 case 11:
1541 case 12:

--- 8 unchanged lines hidden (view full) ---

1550 track->cb[0].cpp = 4;
1551 break;
1552 default:
1553 DRM_ERROR("Invalid color buffer format (%d) !\n",
1554 ((idx_value >> RADEON_RB3D_COLOR_FORMAT_SHIFT) & 0x1f));
1555 return -EINVAL;
1556 }
1557 track->z_enabled = !!(idx_value & RADEON_Z_ENABLE);
1568 track->cb_dirty = true;
1569 track->zb_dirty = true;
1570 break;
1571 case RADEON_RB3D_ZSTENCILCNTL:
1572 switch (idx_value & 0xf) {
1573 case 0:
1574 track->zb.cpp = 2;
1575 break;
1576 case 2:
1577 case 3:
1578 case 4:
1579 case 5:
1580 case 9:
1581 case 11:
1582 track->zb.cpp = 4;
1583 break;
1584 default:
1585 break;
1586 }
1558 break;
1559 case RADEON_RB3D_ZSTENCILCNTL:
1560 switch (idx_value & 0xf) {
1561 case 0:
1562 track->zb.cpp = 2;
1563 break;
1564 case 2:
1565 case 3:
1566 case 4:
1567 case 5:
1568 case 9:
1569 case 11:
1570 track->zb.cpp = 4;
1571 break;
1572 default:
1573 break;
1574 }
1587 track->zb_dirty = true;
1588 break;
1589 case RADEON_RB3D_ZPASS_ADDR:
1590 r = r100_cs_packet_next_reloc(p, &reloc);
1591 if (r) {
1592 DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1593 idx, reg);
1594 r100_cs_dump_packet(p, pkt);
1595 return r;
1596 }
1597 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
1598 break;
1599 case RADEON_PP_CNTL:
1600 {
1601 uint32_t temp = idx_value >> 4;
1602 for (i = 0; i < track->num_texture; i++)
1603 track->textures[i].enabled = !!(temp & (1 << i));
1575 break;
1576 case RADEON_RB3D_ZPASS_ADDR:
1577 r = r100_cs_packet_next_reloc(p, &reloc);
1578 if (r) {
1579 DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1580 idx, reg);
1581 r100_cs_dump_packet(p, pkt);
1582 return r;
1583 }
1584 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
1585 break;
1586 case RADEON_PP_CNTL:
1587 {
1588 uint32_t temp = idx_value >> 4;
1589 for (i = 0; i < track->num_texture; i++)
1590 track->textures[i].enabled = !!(temp & (1 << i));
1604 track->tex_dirty = true;
1605 }
1606 break;
1607 case RADEON_SE_VF_CNTL:
1608 track->vap_vf_cntl = idx_value;
1609 break;
1610 case RADEON_SE_VTX_FMT:
1611 track->vtx_size = r100_get_vtx_size(idx_value);
1612 break;
1613 case RADEON_PP_TEX_SIZE_0:
1614 case RADEON_PP_TEX_SIZE_1:
1615 case RADEON_PP_TEX_SIZE_2:
1616 i = (reg - RADEON_PP_TEX_SIZE_0) / 8;
1617 track->textures[i].width = (idx_value & RADEON_TEX_USIZE_MASK) + 1;
1618 track->textures[i].height = ((idx_value & RADEON_TEX_VSIZE_MASK) >> RADEON_TEX_VSIZE_SHIFT) + 1;
1591 }
1592 break;
1593 case RADEON_SE_VF_CNTL:
1594 track->vap_vf_cntl = idx_value;
1595 break;
1596 case RADEON_SE_VTX_FMT:
1597 track->vtx_size = r100_get_vtx_size(idx_value);
1598 break;
1599 case RADEON_PP_TEX_SIZE_0:
1600 case RADEON_PP_TEX_SIZE_1:
1601 case RADEON_PP_TEX_SIZE_2:
1602 i = (reg - RADEON_PP_TEX_SIZE_0) / 8;
1603 track->textures[i].width = (idx_value & RADEON_TEX_USIZE_MASK) + 1;
1604 track->textures[i].height = ((idx_value & RADEON_TEX_VSIZE_MASK) >> RADEON_TEX_VSIZE_SHIFT) + 1;
1619 track->tex_dirty = true;
1620 break;
1621 case RADEON_PP_TEX_PITCH_0:
1622 case RADEON_PP_TEX_PITCH_1:
1623 case RADEON_PP_TEX_PITCH_2:
1624 i = (reg - RADEON_PP_TEX_PITCH_0) / 8;
1625 track->textures[i].pitch = idx_value + 32;
1605 break;
1606 case RADEON_PP_TEX_PITCH_0:
1607 case RADEON_PP_TEX_PITCH_1:
1608 case RADEON_PP_TEX_PITCH_2:
1609 i = (reg - RADEON_PP_TEX_PITCH_0) / 8;
1610 track->textures[i].pitch = idx_value + 32;
1626 track->tex_dirty = true;
1627 break;
1628 case RADEON_PP_TXFILTER_0:
1629 case RADEON_PP_TXFILTER_1:
1630 case RADEON_PP_TXFILTER_2:
1631 i = (reg - RADEON_PP_TXFILTER_0) / 24;
1632 track->textures[i].num_levels = ((idx_value & RADEON_MAX_MIP_LEVEL_MASK)
1633 >> RADEON_MAX_MIP_LEVEL_SHIFT);
1634 tmp = (idx_value >> 23) & 0x7;
1635 if (tmp == 2 || tmp == 6)
1636 track->textures[i].roundup_w = false;
1637 tmp = (idx_value >> 27) & 0x7;
1638 if (tmp == 2 || tmp == 6)
1639 track->textures[i].roundup_h = false;
1611 break;
1612 case RADEON_PP_TXFILTER_0:
1613 case RADEON_PP_TXFILTER_1:
1614 case RADEON_PP_TXFILTER_2:
1615 i = (reg - RADEON_PP_TXFILTER_0) / 24;
1616 track->textures[i].num_levels = ((idx_value & RADEON_MAX_MIP_LEVEL_MASK)
1617 >> RADEON_MAX_MIP_LEVEL_SHIFT);
1618 tmp = (idx_value >> 23) & 0x7;
1619 if (tmp == 2 || tmp == 6)
1620 track->textures[i].roundup_w = false;
1621 tmp = (idx_value >> 27) & 0x7;
1622 if (tmp == 2 || tmp == 6)
1623 track->textures[i].roundup_h = false;
1640 track->tex_dirty = true;
1641 break;
1642 case RADEON_PP_TXFORMAT_0:
1643 case RADEON_PP_TXFORMAT_1:
1644 case RADEON_PP_TXFORMAT_2:
1645 i = (reg - RADEON_PP_TXFORMAT_0) / 24;
1646 if (idx_value & RADEON_TXFORMAT_NON_POWER2) {
1647 track->textures[i].use_pitch = 1;
1648 } else {

--- 36 unchanged lines hidden (view full) ---

1685 case RADEON_TXFORMAT_DXT23:
1686 case RADEON_TXFORMAT_DXT45:
1687 track->textures[i].cpp = 1;
1688 track->textures[i].compress_format = R100_TRACK_COMP_DXT35;
1689 break;
1690 }
1691 track->textures[i].cube_info[4].width = 1 << ((idx_value >> 16) & 0xf);
1692 track->textures[i].cube_info[4].height = 1 << ((idx_value >> 20) & 0xf);
1624 break;
1625 case RADEON_PP_TXFORMAT_0:
1626 case RADEON_PP_TXFORMAT_1:
1627 case RADEON_PP_TXFORMAT_2:
1628 i = (reg - RADEON_PP_TXFORMAT_0) / 24;
1629 if (idx_value & RADEON_TXFORMAT_NON_POWER2) {
1630 track->textures[i].use_pitch = 1;
1631 } else {

--- 36 unchanged lines hidden (view full) ---

1668 case RADEON_TXFORMAT_DXT23:
1669 case RADEON_TXFORMAT_DXT45:
1670 track->textures[i].cpp = 1;
1671 track->textures[i].compress_format = R100_TRACK_COMP_DXT35;
1672 break;
1673 }
1674 track->textures[i].cube_info[4].width = 1 << ((idx_value >> 16) & 0xf);
1675 track->textures[i].cube_info[4].height = 1 << ((idx_value >> 20) & 0xf);
1693 track->tex_dirty = true;
1694 break;
1695 case RADEON_PP_CUBIC_FACES_0:
1696 case RADEON_PP_CUBIC_FACES_1:
1697 case RADEON_PP_CUBIC_FACES_2:
1698 tmp = idx_value;
1699 i = (reg - RADEON_PP_CUBIC_FACES_0) / 4;
1700 for (face = 0; face < 4; face++) {
1701 track->textures[i].cube_info[face].width = 1 << ((tmp >> (face * 8)) & 0xf);
1702 track->textures[i].cube_info[face].height = 1 << ((tmp >> ((face * 8) + 4)) & 0xf);
1703 }
1676 break;
1677 case RADEON_PP_CUBIC_FACES_0:
1678 case RADEON_PP_CUBIC_FACES_1:
1679 case RADEON_PP_CUBIC_FACES_2:
1680 tmp = idx_value;
1681 i = (reg - RADEON_PP_CUBIC_FACES_0) / 4;
1682 for (face = 0; face < 4; face++) {
1683 track->textures[i].cube_info[face].width = 1 << ((tmp >> (face * 8)) & 0xf);
1684 track->textures[i].cube_info[face].height = 1 << ((tmp >> ((face * 8) + 4)) & 0xf);
1685 }
1704 track->tex_dirty = true;
1705 break;
1706 default:
1707 printk(KERN_ERR "Forbidden register 0x%04X in cs at %d\n",
1708 reg, idx);
1709 return -EINVAL;
1710 }
1711 return 0;
1712}

--- 1619 unchanged lines hidden (view full) ---

3332}
3333
3334int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track)
3335{
3336 unsigned i;
3337 unsigned long size;
3338 unsigned prim_walk;
3339 unsigned nverts;
1686 break;
1687 default:
1688 printk(KERN_ERR "Forbidden register 0x%04X in cs at %d\n",
1689 reg, idx);
1690 return -EINVAL;
1691 }
1692 return 0;
1693}

--- 1619 unchanged lines hidden (view full) ---

3313}
3314
3315int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track)
3316{
3317 unsigned i;
3318 unsigned long size;
3319 unsigned prim_walk;
3320 unsigned nverts;
3340 unsigned num_cb = track->cb_dirty ? track->num_cb : 0;
3321 unsigned num_cb = track->num_cb;
3341
3322
3342 if (num_cb && !track->zb_cb_clear && !track->color_channel_mask &&
3323 if (!track->zb_cb_clear && !track->color_channel_mask &&
3343 !track->blend_read_enable)
3344 num_cb = 0;
3345
3346 for (i = 0; i < num_cb; i++) {
3347 if (track->cb[i].robj == NULL) {
3348 DRM_ERROR("[drm] No buffer for color buffer %d !\n", i);
3349 return -EINVAL;
3350 }

--- 4 unchanged lines hidden (view full) ---

3355 "(need %lu have %lu) !\n", i, size,
3356 radeon_bo_size(track->cb[i].robj));
3357 DRM_ERROR("[drm] color buffer %d (%u %u %u %u)\n",
3358 i, track->cb[i].pitch, track->cb[i].cpp,
3359 track->cb[i].offset, track->maxy);
3360 return -EINVAL;
3361 }
3362 }
3324 !track->blend_read_enable)
3325 num_cb = 0;
3326
3327 for (i = 0; i < num_cb; i++) {
3328 if (track->cb[i].robj == NULL) {
3329 DRM_ERROR("[drm] No buffer for color buffer %d !\n", i);
3330 return -EINVAL;
3331 }

--- 4 unchanged lines hidden (view full) ---

3336 "(need %lu have %lu) !\n", i, size,
3337 radeon_bo_size(track->cb[i].robj));
3338 DRM_ERROR("[drm] color buffer %d (%u %u %u %u)\n",
3339 i, track->cb[i].pitch, track->cb[i].cpp,
3340 track->cb[i].offset, track->maxy);
3341 return -EINVAL;
3342 }
3343 }
3363 track->cb_dirty = false;
3364
3365 if (track->zb_dirty && track->z_enabled) {
3344 if (track->z_enabled) {
3366 if (track->zb.robj == NULL) {
3367 DRM_ERROR("[drm] No buffer for z buffer !\n");
3368 return -EINVAL;
3369 }
3370 size = track->zb.pitch * track->zb.cpp * track->maxy;
3371 size += track->zb.offset;
3372 if (size > radeon_bo_size(track->zb.robj)) {
3373 DRM_ERROR("[drm] Buffer too small for z buffer "
3374 "(need %lu have %lu) !\n", size,
3375 radeon_bo_size(track->zb.robj));
3376 DRM_ERROR("[drm] zbuffer (%u %u %u %u)\n",
3377 track->zb.pitch, track->zb.cpp,
3378 track->zb.offset, track->maxy);
3379 return -EINVAL;
3380 }
3381 }
3345 if (track->zb.robj == NULL) {
3346 DRM_ERROR("[drm] No buffer for z buffer !\n");
3347 return -EINVAL;
3348 }
3349 size = track->zb.pitch * track->zb.cpp * track->maxy;
3350 size += track->zb.offset;
3351 if (size > radeon_bo_size(track->zb.robj)) {
3352 DRM_ERROR("[drm] Buffer too small for z buffer "
3353 "(need %lu have %lu) !\n", size,
3354 radeon_bo_size(track->zb.robj));
3355 DRM_ERROR("[drm] zbuffer (%u %u %u %u)\n",
3356 track->zb.pitch, track->zb.cpp,
3357 track->zb.offset, track->maxy);
3358 return -EINVAL;
3359 }
3360 }
3382 track->zb_dirty = false;
3383
3384 if (track->aa_dirty && track->aaresolve) {
3385 if (track->aa.robj == NULL) {
3386 DRM_ERROR("[drm] No buffer for AA resolve buffer %d !\n", i);
3387 return -EINVAL;
3388 }
3389 /* I believe the format comes from colorbuffer0. */
3390 size = track->aa.pitch * track->cb[0].cpp * track->maxy;
3391 size += track->aa.offset;
3392 if (size > radeon_bo_size(track->aa.robj)) {
3393 DRM_ERROR("[drm] Buffer too small for AA resolve buffer %d "
3394 "(need %lu have %lu) !\n", i, size,
3395 radeon_bo_size(track->aa.robj));
3396 DRM_ERROR("[drm] AA resolve buffer %d (%u %u %u %u)\n",
3397 i, track->aa.pitch, track->cb[0].cpp,
3398 track->aa.offset, track->maxy);
3399 return -EINVAL;
3400 }
3401 }
3402 track->aa_dirty = false;
3403
3404 prim_walk = (track->vap_vf_cntl >> 4) & 0x3;
3405 if (track->vap_vf_cntl & (1 << 14)) {
3406 nverts = track->vap_alt_nverts;
3407 } else {
3408 nverts = (track->vap_vf_cntl >> 16) & 0xFFFF;
3409 }
3410 switch (prim_walk) {
3411 case 1:

--- 43 unchanged lines hidden (view full) ---

3455 return -EINVAL;
3456 }
3457 break;
3458 default:
3459 DRM_ERROR("[drm] Invalid primitive walk %d for VAP_VF_CNTL\n",
3460 prim_walk);
3461 return -EINVAL;
3462 }
3361 prim_walk = (track->vap_vf_cntl >> 4) & 0x3;
3362 if (track->vap_vf_cntl & (1 << 14)) {
3363 nverts = track->vap_alt_nverts;
3364 } else {
3365 nverts = (track->vap_vf_cntl >> 16) & 0xFFFF;
3366 }
3367 switch (prim_walk) {
3368 case 1:

--- 43 unchanged lines hidden (view full) ---

3412 return -EINVAL;
3413 }
3414 break;
3415 default:
3416 DRM_ERROR("[drm] Invalid primitive walk %d for VAP_VF_CNTL\n",
3417 prim_walk);
3418 return -EINVAL;
3419 }
3463
3464 if (track->tex_dirty) {
3465 track->tex_dirty = false;
3466 return r100_cs_track_texture_check(rdev, track);
3467 }
3468 return 0;
3420 return r100_cs_track_texture_check(rdev, track);
3469}
3470
3471void r100_cs_track_clear(struct radeon_device *rdev, struct r100_cs_track *track)
3472{
3473 unsigned i, face;
3474
3421}
3422
3423void r100_cs_track_clear(struct radeon_device *rdev, struct r100_cs_track *track)
3424{
3425 unsigned i, face;
3426
3475 track->cb_dirty = true;
3476 track->zb_dirty = true;
3477 track->tex_dirty = true;
3478 track->aa_dirty = true;
3479
3480 if (rdev->family < CHIP_R300) {
3481 track->num_cb = 1;
3482 if (rdev->family <= CHIP_RS200)
3483 track->num_texture = 3;
3484 else
3485 track->num_texture = 6;
3486 track->maxy = 2048;
3487 track->separate_cube = 1;
3488 } else {
3489 track->num_cb = 4;
3490 track->num_texture = 16;
3491 track->maxy = 4096;
3492 track->separate_cube = 0;
3427 if (rdev->family < CHIP_R300) {
3428 track->num_cb = 1;
3429 if (rdev->family <= CHIP_RS200)
3430 track->num_texture = 3;
3431 else
3432 track->num_texture = 6;
3433 track->maxy = 2048;
3434 track->separate_cube = 1;
3435 } else {
3436 track->num_cb = 4;
3437 track->num_texture = 16;
3438 track->maxy = 4096;
3439 track->separate_cube = 0;
3493 track->aaresolve = true;
3494 track->aa.robj = NULL;
3495 }
3496
3497 for (i = 0; i < track->num_cb; i++) {
3498 track->cb[i].robj = NULL;
3499 track->cb[i].pitch = 8192;
3500 track->cb[i].cpp = 16;
3501 track->cb[i].offset = 0;
3502 }

--- 131 unchanged lines hidden (view full) ---

3634 if (tmp == 0xDEADBEEF) {
3635 break;
3636 }
3637 DRM_UDELAY(1);
3638 }
3639 if (i < rdev->usec_timeout) {
3640 DRM_INFO("ib test succeeded in %u usecs\n", i);
3641 } else {
3440 }
3441
3442 for (i = 0; i < track->num_cb; i++) {
3443 track->cb[i].robj = NULL;
3444 track->cb[i].pitch = 8192;
3445 track->cb[i].cpp = 16;
3446 track->cb[i].offset = 0;
3447 }

--- 131 unchanged lines hidden (view full) ---

3579 if (tmp == 0xDEADBEEF) {
3580 break;
3581 }
3582 DRM_UDELAY(1);
3583 }
3584 if (i < rdev->usec_timeout) {
3585 DRM_INFO("ib test succeeded in %u usecs\n", i);
3586 } else {
3642 DRM_ERROR("radeon: ib test failed (sracth(0x%04X)=0x%08X)\n",
3587 DRM_ERROR("radeon: ib test failed (scratch(0x%04X)=0x%08X)\n",
3643 scratch, tmp);
3644 r = -EINVAL;
3645 }
3646 radeon_scratch_free(rdev, scratch);
3647 radeon_ib_free(rdev, &ib);
3648 return r;
3649}
3650
3651void r100_ib_fini(struct radeon_device *rdev)
3652{
3653 radeon_ib_pool_fini(rdev);
3654}
3655
3656int r100_ib_init(struct radeon_device *rdev)
3657{
3658 int r;
3659
3660 r = radeon_ib_pool_init(rdev);
3661 if (r) {
3588 scratch, tmp);
3589 r = -EINVAL;
3590 }
3591 radeon_scratch_free(rdev, scratch);
3592 radeon_ib_free(rdev, &ib);
3593 return r;
3594}
3595
3596void r100_ib_fini(struct radeon_device *rdev)
3597{
3598 radeon_ib_pool_fini(rdev);
3599}
3600
3601int r100_ib_init(struct radeon_device *rdev)
3602{
3603 int r;
3604
3605 r = radeon_ib_pool_init(rdev);
3606 if (r) {
3662 dev_err(rdev->dev, "failled initializing IB pool (%d).\n", r);
3607 dev_err(rdev->dev, "failed initializing IB pool (%d).\n", r);
3663 r100_ib_fini(rdev);
3664 return r;
3665 }
3666 r = r100_ib_test(rdev);
3667 if (r) {
3608 r100_ib_fini(rdev);
3609 return r;
3610 }
3611 r = r100_ib_test(rdev);
3612 if (r) {
3668 dev_err(rdev->dev, "failled testing IB (%d).\n", r);
3613 dev_err(rdev->dev, "failed testing IB (%d).\n", r);
3669 r100_ib_fini(rdev);
3670 return r;
3671 }
3672 return 0;
3673}
3674
3675void r100_mc_stop(struct radeon_device *rdev, struct r100_mc_save *save)
3676{

--- 141 unchanged lines hidden (view full) ---

3818 return r;
3819
3820 /* Enable IRQ */
3821 r100_irq_set(rdev);
3822 rdev->config.r100.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
3823 /* 1M ring buffer */
3824 r = r100_cp_init(rdev, 1024 * 1024);
3825 if (r) {
3614 r100_ib_fini(rdev);
3615 return r;
3616 }
3617 return 0;
3618}
3619
3620void r100_mc_stop(struct radeon_device *rdev, struct r100_mc_save *save)
3621{

--- 141 unchanged lines hidden (view full) ---

3763 return r;
3764
3765 /* Enable IRQ */
3766 r100_irq_set(rdev);
3767 rdev->config.r100.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
3768 /* 1M ring buffer */
3769 r = r100_cp_init(rdev, 1024 * 1024);
3770 if (r) {
3826 dev_err(rdev->dev, "failled initializing CP (%d).\n", r);
3771 dev_err(rdev->dev, "failed initializing CP (%d).\n", r);
3827 return r;
3828 }
3829 r = r100_ib_init(rdev);
3830 if (r) {
3772 return r;
3773 }
3774 r = r100_ib_init(rdev);
3775 if (r) {
3831 dev_err(rdev->dev, "failled initializing IB (%d).\n", r);
3776 dev_err(rdev->dev, "failed initializing IB (%d).\n", r);
3832 return r;
3833 }
3834 return 0;
3835}
3836
3837int r100_resume(struct radeon_device *rdev)
3838{
3839 /* Make sur GART are not working */

--- 154 unchanged lines hidden ---
3777 return r;
3778 }
3779 return 0;
3780}
3781
3782int r100_resume(struct radeon_device *rdev)
3783{
3784 /* Make sur GART are not working */

--- 154 unchanged lines hidden ---