.gitignore                        |   84 
 Makefile.am                       |   12 
 README                            |   13 
 configure.ac                      |   93 
 man/Makefile.am                   |   41 
 man/radeon.man                    |   77 
 src/.gitignore                    |    3 
 src/AtomBios/CD_Operations.c      |    7 
 src/AtomBios/includes/Decoder.h   |    1 
 src/AtomBios/includes/ObjectID.h  |  127 
 src/AtomBios/includes/atombios.h  | 1289 +++++++-
 src/Makefile.am                   |   33 
 src/ati_pciids_gen.h              |   35 
 src/atombios_crtc.c               | 1378 +++++++--
 src/atombios_output.c             | 1417 ++++++++-
 src/drmmode_display.c             | 1356 +++++++++
 src/drmmode_display.h             |   86 
 src/legacy_crtc.c                 |   94 
 src/legacy_output.c               |   50 
 src/pcidb/ati_pciids.csv          |   35 
 src/pcidb/parse_pci_ids.pl        |    2 
 src/r600_exa.c                    | 1333 +++++---
 src/r600_reg_r6xx.h               |    6 
 src/r600_shader.c                 | 1112 ++++---
 src/r600_state.h                  |   61 
 src/r600_textured_videofuncs.c    |  342 +-
 src/r6xx_accel.c                  |  585 ++-
 src/radeon.h                      |  337 +-
 src/radeon_accel.c                |  168 -
 src/radeon_accelfuncs.c           |    5 
 src/radeon_atombios.c             |  391 ++
 src/radeon_atombios.h             |   18 
 src/radeon_bios.c                 |  119 
 src/radeon_chipinfo_gen.h         |   37 
 src/radeon_chipset_gen.h          |   35 
 src/radeon_commonfuncs.c          |  518 ++-
 src/radeon_crtc.c                 |  306 +-
 src/radeon_cursor.c               |   74 
 src/radeon_dga.c                  |  466 ---
 src/radeon_dri.c                  |   77 
 src/radeon_dri2.c                 |  375 ++
 src/radeon_dri2.h                 |   42 
 src/radeon_driver.c               |  712 +---
 src/radeon_drm.h                  |  153 +
 src/radeon_dummy_bufmgr.h         |   62 
 src/radeon_exa.c                  |  228 +
 src/radeon_exa_funcs.c            |  541 ++-
 src/radeon_exa_render.c           |  845 +++--
 src/radeon_kms.c                  | 1010 ++++++
 src/radeon_legacy_memory.c        |   22 
 src/radeon_macros.h               |   49 
 src/radeon_modes.c                |   16 
 src/radeon_output.c               |  283 +
 src/radeon_pci_chipset_gen.h      |   35 
 src/radeon_pci_device_match_gen.h |   35 
 src/radeon_pm.c                   |  886 +++++
 src/radeon_probe.c                |   79 
 src/radeon_probe.h                |   41 
 src/radeon_reg.h                  |  278 +
 src/radeon_textured_video.c       |  624 ++--
 src/radeon_textured_videofuncs.c  | 5705 ++++++++++++++++++++++++--------------
 src/radeon_vbo.c                  |  206 +
 src/radeon_vbo.h                  |   62 
 src/radeon_video.c                |  119 
 src/radeon_video.h                |   25 
 src/simple_list.h                 |  202 +
 66 files changed, 18743 insertions(+), 6115 deletions(-)

New commits:
commit a887818f491f6c7315c56c4e0d0b702c4c6aa4ac
Author: Alex Deucher <alexdeuc...@gmail.com>
Date:   Mon Feb 1 11:01:47 2010 -0500

    evergreen: add pci ids

diff --git a/src/ati_pciids_gen.h b/src/ati_pciids_gen.h
index 3f9691e..3dd36da 100644
--- a/src/ati_pciids_gen.h
+++ b/src/ati_pciids_gen.h
@@ -453,3 +453,38 @@
 #define PCI_CHIP_RS880_9712 0x9712
 #define PCI_CHIP_RS880_9713 0x9713
 #define PCI_CHIP_RS880_9714 0x9714
+#define PCI_CHIP_CYPRESS_6880 0x6880
+#define PCI_CHIP_CYPRESS_6888 0x6888
+#define PCI_CHIP_CYPRESS_6889 0x6889
+#define PCI_CHIP_CYPRESS_688A 0x688A
+#define PCI_CHIP_CYPRESS_6898 0x6898
+#define PCI_CHIP_CYPRESS_6899 0x6899
+#define PCI_CHIP_CYPRESS_689E 0x689E
+#define PCI_CHIP_HEMLOCK_689C 0x689C
+#define PCI_CHIP_HEMLOCK_689D 0x689D
+#define PCI_CHIP_JUNIPER_68A0 0x68A0
+#define PCI_CHIP_JUNIPER_68A1 0x68A1
+#define PCI_CHIP_JUNIPER_68A8 0x68A8
+#define PCI_CHIP_JUNIPER_68A9 0x68A9
+#define PCI_CHIP_JUNIPER_68B0 0x68B0
+#define PCI_CHIP_JUNIPER_68B8 0x68B8
+#define PCI_CHIP_JUNIPER_68B9 0x68B9
+#define PCI_CHIP_JUNIPER_68BE 0x68BE
+#define PCI_CHIP_REDWOOD_68C0 0x68C0
+#define PCI_CHIP_REDWOOD_68C1 0x68C1
+#define PCI_CHIP_REDWOOD_68C8 0x68C8
+#define PCI_CHIP_REDWOOD_68C9 0x68C9
+#define PCI_CHIP_REDWOOD_68D8 0x68D8
+#define PCI_CHIP_REDWOOD_68D9 0x68D9
+#define PCI_CHIP_REDWOOD_68DA 0x68DA
+#define PCI_CHIP_REDWOOD_68DE 0x68DE
+#define PCI_CHIP_CEDAR_68E0 0x68E0
+#define PCI_CHIP_CEDAR_68E1 0x68E1
+#define PCI_CHIP_CEDAR_68E4 0x68E4
+#define PCI_CHIP_CEDAR_68E5 0x68E5
+#define PCI_CHIP_CEDAR_68E8 0x68E8
+#define PCI_CHIP_CEDAR_68E9 0x68E9
+#define PCI_CHIP_CEDAR_68F1 0x68F1
+#define PCI_CHIP_CEDAR_68F8 0x68F8
+#define PCI_CHIP_CEDAR_68F9 0x68F9
+#define PCI_CHIP_CEDAR_68FE 0x68FE
diff --git a/src/pcidb/ati_pciids.csv b/src/pcidb/ati_pciids.csv
index 695d9a6..9c72c40 100644
--- a/src/pcidb/ati_pciids.csv
+++ b/src/pcidb/ati_pciids.csv
@@ -454,3 +454,38 @@
 "0x9712","RS880_9712","RS880",1,1,,,1,"ATI Mobility Radeon HD 4200"
 "0x9713","RS880_9713","RS880",1,1,,,1,"ATI Mobility Radeon 4100"
 "0x9714","RS880_9714","RS880",,1,,,1,"ATI RS880"
+"0x6880","CYPRESS_6880","CYPRESS",1,,,,,"CYPRESS"
+"0x6888","CYPRESS_6888","CYPRESS",,,,,,"ATI FirePro (FireGL) Graphics Adapter"
+"0x6889","CYPRESS_6889","CYPRESS",,,,,,"ATI FirePro (FireGL) Graphics Adapter"
+"0x688A","CYPRESS_688A","CYPRESS",,,,,,"ATI FirePro (FireGL) Graphics Adapter"
+"0x6898","CYPRESS_6898","CYPRESS",,,,,,"ATI Radeon HD 5800 Series"
+"0x6899","CYPRESS_6899","CYPRESS",,,,,,"ATI Radeon HD 5800 Series"
+"0x689E","CYPRESS_689E","CYPRESS",,,,,,"ATI Radeon HD 5800 Series"
+"0x689C","HEMLOCK_689C","HEMLOCK",,,,,,"ATI Radeon HD 5900 Series"
+"0x689D","HEMLOCK_689D","HEMLOCK",,,,,,"ATI Radeon HD 5900 Series"
+"0x68A0","JUNIPER_68A0","JUNIPER",1,,,,,"ATI Mobility Radeon HD 5800 Series"
+"0x68A1","JUNIPER_68A1","JUNIPER",1,,,,,"ATI Mobility Radeon HD 5800 Series"
+"0x68A8","JUNIPER_68A8","JUNIPER",,,,,,"ATI FirePro (FireGL) Graphics Adapter"
+"0x68A9","JUNIPER_68A9","JUNIPER",,,,,,"ATI FirePro (FireGL) Graphics Adapter"
+"0x68B0","JUNIPER_68B0","JUNIPER",1,,,,,"ATI Mobility Radeon HD 5800 Series"
+"0x68B8","JUNIPER_68B8","JUNIPER",,,,,,"ATI Radeon HD 5700 Series"
+"0x68B9","JUNIPER_68B9","JUNIPER",,,,,,"ATI Radeon HD 5700 Series"
+"0x68BE","JUNIPER_68BE","JUNIPER",,,,,,"ATI Radeon HD 5700 Series"
+"0x68C0","REDWOOD_68C0","REDWOOD",1,,,,,"ATI Mobility Radeon HD 5000 Series"
+"0x68C1","REDWOOD_68C1","REDWOOD",1,,,,,"ATI Mobility Radeon HD 5000 Series"
+"0x68C8","REDWOOD_68C8","REDWOOD",,,,,,"ATI FirePro (FireGL) Graphics Adapter"
+"0x68C9","REDWOOD_68C9","REDWOOD",,,,,,"ATI FirePro (FireGL) Graphics Adapter"
+"0x68D8","REDWOOD_68D8","REDWOOD",,,,,,"ATI Radeon HD 5670"
+"0x68D9","REDWOOD_68D9","REDWOOD",,,,,,"ATI Radeon HD 5570"
+"0x68DA","REDWOOD_68DA","REDWOOD",,,,,,"ATI Radeon HD 5500 Series"
+"0x68DE","REDWOOD_68DE","REDWOOD",,,,,,"REDWOOD"
+"0x68E0","CEDAR_68E0","CEDAR",1,,,,,"ATI Mobility Radeon HD 5000 Series"
+"0x68E1","CEDAR_68E1","CEDAR",1,,,,,"ATI Mobility Radeon HD 5000 Series"
+"0x68E4","CEDAR_68E4","CEDAR",1,,,,,"CEDAR"
+"0x68E5","CEDAR_68E5","CEDAR",1,,,,,"CEDAR"
+"0x68E8","CEDAR_68E8","CEDAR",,,,,,"CEDAR"
+"0x68E9","CEDAR_68E9","CEDAR",,,,,,"ATI FirePro (FireGL) Graphics Adapter"
+"0x68F1","CEDAR_68F1","CEDAR",,,,,,"ATI FirePro (FireGL) Graphics Adapter"
+"0x68F8","CEDAR_68F8","CEDAR",,,,,,"CEDAR"
+"0x68F9","CEDAR_68F9","CEDAR",,,,,,"ATI Radeon HD 5450"
+"0x68FE","CEDAR_68FE","CEDAR",,,,,,"CEDAR"
diff --git a/src/radeon_chipinfo_gen.h b/src/radeon_chipinfo_gen.h
index 41144c7..bdbd358 100644
--- a/src/radeon_chipinfo_gen.h
+++ b/src/radeon_chipinfo_gen.h
@@ -373,4 +373,39 @@ static RADEONCardInfo RADEONCards[] = {
  { 0x9712, CHIP_FAMILY_RS880, 1, 1, 0, 0, 1 },
  { 0x9713, CHIP_FAMILY_RS880, 1, 1, 0, 0, 1 },
  { 0x9714, CHIP_FAMILY_RS880, 0, 1, 0, 0, 1 },
+ { 0x6880, CHIP_FAMILY_CYPRESS, 1, 0, 0, 0, 0 },
+ { 0x6888, CHIP_FAMILY_CYPRESS, 0, 0, 0, 0, 0 },
+ { 0x6889, CHIP_FAMILY_CYPRESS, 0, 0, 0, 0, 0 },
+ { 0x688A, CHIP_FAMILY_CYPRESS, 0, 0, 0, 0, 0 },
+ { 0x6898, CHIP_FAMILY_CYPRESS, 0, 0, 0, 0, 0 },
+ { 0x6899, CHIP_FAMILY_CYPRESS, 0, 0, 0, 0, 0 },
+ { 0x689E, CHIP_FAMILY_CYPRESS, 0, 0, 0, 0, 0 },
+ { 0x689C, CHIP_FAMILY_HEMLOCK, 0, 0, 0, 0, 0 },
+ { 0x689D, CHIP_FAMILY_HEMLOCK, 0, 0, 0, 0, 0 },
+ { 0x68A0, CHIP_FAMILY_JUNIPER, 1, 0, 0, 0, 0 },
+ { 0x68A1, CHIP_FAMILY_JUNIPER, 1, 0, 0, 0, 0 },
+ { 0x68A8, CHIP_FAMILY_JUNIPER, 0, 0, 0, 0, 0 },
+ { 0x68A9, CHIP_FAMILY_JUNIPER, 0, 0, 0, 0, 0 },
+ { 0x68B0, CHIP_FAMILY_JUNIPER, 1, 0, 0, 0, 0 },
+ { 0x68B8, CHIP_FAMILY_JUNIPER, 0, 0, 0, 0, 0 },
+ { 0x68B9, CHIP_FAMILY_JUNIPER, 0, 0, 0, 0, 0 },
+ { 0x68BE, CHIP_FAMILY_JUNIPER, 0, 0, 0, 0, 0 },
+ { 0x68C0, CHIP_FAMILY_REDWOOD, 1, 0, 0, 0, 0 },
+ { 0x68C1, CHIP_FAMILY_REDWOOD, 1, 0, 0, 0, 0 },
+ { 0x68C8, CHIP_FAMILY_REDWOOD, 0, 0, 0, 0, 0 },
+ { 0x68C9, CHIP_FAMILY_REDWOOD, 0, 0, 0, 0, 0 },
+ { 0x68D8, CHIP_FAMILY_REDWOOD, 0, 0, 0, 0, 0 },
+ { 0x68D9, CHIP_FAMILY_REDWOOD, 0, 0, 0, 0, 0 },
+ { 0x68DA, CHIP_FAMILY_REDWOOD, 0, 0, 0, 0, 0 },
+ { 0x68DE, CHIP_FAMILY_REDWOOD, 0, 0, 0, 0, 0 },
+ { 0x68E0, CHIP_FAMILY_CEDAR, 1, 0, 0, 0, 0 },
+ { 0x68E1, CHIP_FAMILY_CEDAR, 1, 0, 0, 0, 0 },
+ { 0x68E4, CHIP_FAMILY_CEDAR, 1, 0, 0, 0, 0 },
+ { 0x68E5, CHIP_FAMILY_CEDAR, 1, 0, 0, 0, 0 },
+ { 0x68E8, CHIP_FAMILY_CEDAR, 0, 0, 0, 0, 0 },
+ { 0x68E9, CHIP_FAMILY_CEDAR, 0, 0, 0, 0, 0 },
+ { 0x68F1, CHIP_FAMILY_CEDAR, 0, 0, 0, 0, 0 },
+ { 0x68F8, CHIP_FAMILY_CEDAR, 0, 0, 0, 0, 0 },
+ { 0x68F9, CHIP_FAMILY_CEDAR, 0, 0, 0, 0, 0 },
+ { 0x68FE, CHIP_FAMILY_CEDAR, 0, 0, 0, 0, 0 },
 };
diff --git a/src/radeon_chipset_gen.h b/src/radeon_chipset_gen.h
index fc41c3d..da0d3b4 100644
--- a/src/radeon_chipset_gen.h
+++ b/src/radeon_chipset_gen.h
@@ -373,5 +373,40 @@ static SymTabRec RADEONChipsets[] = {
   { PCI_CHIP_RS880_9712, "ATI Mobility Radeon HD 4200" },
   { PCI_CHIP_RS880_9713, "ATI Mobility Radeon 4100" },
   { PCI_CHIP_RS880_9714, "ATI RS880" },
+  { PCI_CHIP_CYPRESS_6880, "CYPRESS" },
+  { PCI_CHIP_CYPRESS_6888, "ATI FirePro (FireGL) Graphics Adapter" },
+  { PCI_CHIP_CYPRESS_6889, "ATI FirePro (FireGL) Graphics Adapter" },
+  { PCI_CHIP_CYPRESS_688A, "ATI FirePro (FireGL) Graphics Adapter" },
+  { PCI_CHIP_CYPRESS_6898, "ATI Radeon HD 5800 Series" },
+  { PCI_CHIP_CYPRESS_6899, "ATI Radeon HD 5800 Series" },
+  { PCI_CHIP_CYPRESS_689E, "ATI Radeon HD 5800 Series" },
+  { PCI_CHIP_HEMLOCK_689C, "ATI Radeon HD 5900 Series" },
+  { PCI_CHIP_HEMLOCK_689D, "ATI Radeon HD 5900 Series" },
+  { PCI_CHIP_JUNIPER_68A0, "ATI Mobility Radeon HD 5800 Series" },
+  { PCI_CHIP_JUNIPER_68A1, "ATI Mobility Radeon HD 5800 Series" },
+  { PCI_CHIP_JUNIPER_68A8, "ATI FirePro (FireGL) Graphics Adapter" },
+  { PCI_CHIP_JUNIPER_68A9, "ATI FirePro (FireGL) Graphics Adapter" },
+  { PCI_CHIP_JUNIPER_68B0, "ATI Mobility Radeon HD 5800 Series" },
+  { PCI_CHIP_JUNIPER_68B8, "ATI Radeon HD 5700 Series" },
+  { PCI_CHIP_JUNIPER_68B9, "ATI Radeon HD 5700 Series" },
+  { PCI_CHIP_JUNIPER_68BE, "ATI Radeon HD 5700 Series" },
+  { PCI_CHIP_REDWOOD_68C0, "ATI Mobility Radeon HD 5000 Series" },
+  { PCI_CHIP_REDWOOD_68C1, "ATI Mobility Radeon HD 5000 Series" },
+  { PCI_CHIP_REDWOOD_68C8, "ATI FirePro (FireGL) Graphics Adapter" },
+  { PCI_CHIP_REDWOOD_68C9, "ATI FirePro (FireGL) Graphics Adapter" },
+  { PCI_CHIP_REDWOOD_68D8, "ATI Radeon HD 5670" },
+  { PCI_CHIP_REDWOOD_68D9, "ATI Radeon HD 5570" },
+  { PCI_CHIP_REDWOOD_68DA, "ATI Radeon HD 5500 Series" },
+  { PCI_CHIP_REDWOOD_68DE, "REDWOOD" },
+  { PCI_CHIP_CEDAR_68E0, "ATI Mobility Radeon HD 5000 Series" },
+  { PCI_CHIP_CEDAR_68E1, "ATI Mobility Radeon HD 5000 Series" },
+  { PCI_CHIP_CEDAR_68E4, "CEDAR" },
+  { PCI_CHIP_CEDAR_68E5, "CEDAR" },
+  { PCI_CHIP_CEDAR_68E8, "CEDAR" },
+  { PCI_CHIP_CEDAR_68E9, "ATI FirePro (FireGL) Graphics Adapter" },
+  { PCI_CHIP_CEDAR_68F1, "ATI FirePro (FireGL) Graphics Adapter" },
+  { PCI_CHIP_CEDAR_68F8, "CEDAR" },
+  { PCI_CHIP_CEDAR_68F9, "ATI Radeon HD 5450" },
+  { PCI_CHIP_CEDAR_68FE, "CEDAR" },
   { -1,                 NULL }
 };
diff --git a/src/radeon_pci_chipset_gen.h b/src/radeon_pci_chipset_gen.h
index 1b85dcc..1f1b97e 100644
--- a/src/radeon_pci_chipset_gen.h
+++ b/src/radeon_pci_chipset_gen.h
@@ -373,5 +373,40 @@ PciChipsets RADEONPciChipsets[] = {
  { PCI_CHIP_RS880_9712, PCI_CHIP_RS880_9712, RES_SHARED_VGA },
  { PCI_CHIP_RS880_9713, PCI_CHIP_RS880_9713, RES_SHARED_VGA },
  { PCI_CHIP_RS880_9714, PCI_CHIP_RS880_9714, RES_SHARED_VGA },
+ { PCI_CHIP_CYPRESS_6880, PCI_CHIP_CYPRESS_6880, RES_SHARED_VGA },
+ { PCI_CHIP_CYPRESS_6888, PCI_CHIP_CYPRESS_6888, RES_SHARED_VGA },
+ { PCI_CHIP_CYPRESS_6889, PCI_CHIP_CYPRESS_6889, RES_SHARED_VGA },
+ { PCI_CHIP_CYPRESS_688A, PCI_CHIP_CYPRESS_688A, RES_SHARED_VGA },
+ { PCI_CHIP_CYPRESS_6898, PCI_CHIP_CYPRESS_6898, RES_SHARED_VGA },
+ { PCI_CHIP_CYPRESS_6899, PCI_CHIP_CYPRESS_6899, RES_SHARED_VGA },
+ { PCI_CHIP_CYPRESS_689E, PCI_CHIP_CYPRESS_689E, RES_SHARED_VGA },
+ { PCI_CHIP_HEMLOCK_689C, PCI_CHIP_HEMLOCK_689C, RES_SHARED_VGA },
+ { PCI_CHIP_HEMLOCK_689D, PCI_CHIP_HEMLOCK_689D, RES_SHARED_VGA },
+ { PCI_CHIP_JUNIPER_68A0, PCI_CHIP_JUNIPER_68A0, RES_SHARED_VGA },
+ { PCI_CHIP_JUNIPER_68A1, PCI_CHIP_JUNIPER_68A1, RES_SHARED_VGA },
+ { PCI_CHIP_JUNIPER_68A8, PCI_CHIP_JUNIPER_68A8, RES_SHARED_VGA },
+ { PCI_CHIP_JUNIPER_68A9, PCI_CHIP_JUNIPER_68A9, RES_SHARED_VGA },
+ { PCI_CHIP_JUNIPER_68B0, PCI_CHIP_JUNIPER_68B0, RES_SHARED_VGA },
+ { PCI_CHIP_JUNIPER_68B8, PCI_CHIP_JUNIPER_68B8, RES_SHARED_VGA },
+ { PCI_CHIP_JUNIPER_68B9, PCI_CHIP_JUNIPER_68B9, RES_SHARED_VGA },
+ { PCI_CHIP_JUNIPER_68BE, PCI_CHIP_JUNIPER_68BE, RES_SHARED_VGA },
+ { PCI_CHIP_REDWOOD_68C0, PCI_CHIP_REDWOOD_68C0, RES_SHARED_VGA },
+ { PCI_CHIP_REDWOOD_68C1, PCI_CHIP_REDWOOD_68C1, RES_SHARED_VGA },
+ { PCI_CHIP_REDWOOD_68C8, PCI_CHIP_REDWOOD_68C8, RES_SHARED_VGA },
+ { PCI_CHIP_REDWOOD_68C9, PCI_CHIP_REDWOOD_68C9, RES_SHARED_VGA },
+ { PCI_CHIP_REDWOOD_68D8, PCI_CHIP_REDWOOD_68D8, RES_SHARED_VGA },
+ { PCI_CHIP_REDWOOD_68D9, PCI_CHIP_REDWOOD_68D9, RES_SHARED_VGA },
+ { PCI_CHIP_REDWOOD_68DA, PCI_CHIP_REDWOOD_68DA, RES_SHARED_VGA },
+ { PCI_CHIP_REDWOOD_68DE, PCI_CHIP_REDWOOD_68DE, RES_SHARED_VGA },
+ { PCI_CHIP_CEDAR_68E0, PCI_CHIP_CEDAR_68E0, RES_SHARED_VGA },
+ { PCI_CHIP_CEDAR_68E1, PCI_CHIP_CEDAR_68E1, RES_SHARED_VGA },
+ { PCI_CHIP_CEDAR_68E4, PCI_CHIP_CEDAR_68E4, RES_SHARED_VGA },
+ { PCI_CHIP_CEDAR_68E5, PCI_CHIP_CEDAR_68E5, RES_SHARED_VGA },
+ { PCI_CHIP_CEDAR_68E8, PCI_CHIP_CEDAR_68E8, RES_SHARED_VGA },
+ { PCI_CHIP_CEDAR_68E9, PCI_CHIP_CEDAR_68E9, RES_SHARED_VGA },
+ { PCI_CHIP_CEDAR_68F1, PCI_CHIP_CEDAR_68F1, RES_SHARED_VGA },
+ { PCI_CHIP_CEDAR_68F8, PCI_CHIP_CEDAR_68F8, RES_SHARED_VGA },
+ { PCI_CHIP_CEDAR_68F9, PCI_CHIP_CEDAR_68F9, RES_SHARED_VGA },
+ { PCI_CHIP_CEDAR_68FE, PCI_CHIP_CEDAR_68FE, RES_SHARED_VGA },
  { -1,                 -1,                 RES_UNDEFINED }
 };
diff --git a/src/radeon_pci_device_match_gen.h 
b/src/radeon_pci_device_match_gen.h
index 64127bd..fa44875 100644
--- a/src/radeon_pci_device_match_gen.h
+++ b/src/radeon_pci_device_match_gen.h
@@ -373,5 +373,40 @@ static const struct pci_id_match radeon_device_match[] = {
  ATI_DEVICE_MATCH( PCI_CHIP_RS880_9712, 0 ),
  ATI_DEVICE_MATCH( PCI_CHIP_RS880_9713, 0 ),
  ATI_DEVICE_MATCH( PCI_CHIP_RS880_9714, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_CYPRESS_6880, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_CYPRESS_6888, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_CYPRESS_6889, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_CYPRESS_688A, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_CYPRESS_6898, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_CYPRESS_6899, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_CYPRESS_689E, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_HEMLOCK_689C, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_HEMLOCK_689D, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_JUNIPER_68A0, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_JUNIPER_68A1, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_JUNIPER_68A8, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_JUNIPER_68A9, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_JUNIPER_68B0, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_JUNIPER_68B8, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_JUNIPER_68B9, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_JUNIPER_68BE, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_REDWOOD_68C0, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_REDWOOD_68C1, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_REDWOOD_68C8, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_REDWOOD_68C9, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_REDWOOD_68D8, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_REDWOOD_68D9, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_REDWOOD_68DA, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_REDWOOD_68DE, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_CEDAR_68E0, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_CEDAR_68E1, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_CEDAR_68E4, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_CEDAR_68E5, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_CEDAR_68E8, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_CEDAR_68E9, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_CEDAR_68F1, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_CEDAR_68F8, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_CEDAR_68F9, 0 ),
+ ATI_DEVICE_MATCH( PCI_CHIP_CEDAR_68FE, 0 ),
  { 0, 0, 0 }
 };

commit cb2772b69480268c059766c4f6b209ce590ede0e
Author: Alex Deucher <alexdeuc...@gmail.com>
Date:   Fri Jan 29 12:59:46 2010 -0500

    evergreen: add atombios crtc/pll functions

diff --git a/src/atombios_crtc.c b/src/atombios_crtc.c
index f832374..4044202 100644
--- a/src/atombios_crtc.c
+++ b/src/atombios_crtc.c
@@ -290,7 +290,146 @@ atombios_set_crtc_dtd_timing(xf86CrtcPtr crtc, 
DisplayModePtr mode)
     return ATOM_NOT_IMPLEMENTED;
 }
 
-void
+static void
+atombios_pick_pll(xf86CrtcPtr crtc)
+{
+    RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private;
+    RADEONInfoPtr info = RADEONPTR(crtc->scrn);
+    xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn);
+    xf86OutputPtr output;
+    RADEONOutputPrivatePtr radeon_output;
+    int o, c;
+    uint32_t pll_use_mask = 0;
+    Bool is_dp = FALSE;
+
+    if (IS_DCE4_VARIANT) {
+       for (o = 0; o < xf86_config->num_output; o++) {
+           output = xf86_config->output[o];
+           if (output->crtc == crtc) {
+               int mode = atombios_get_encoder_mode(output);
+               radeon_output = output->driver_private;
+
+               if (mode == ATOM_ENCODER_MODE_DP) {
+                   is_dp = TRUE;
+                   break;
+               } else {
+                   for (c = 0; c < xf86_config->num_crtc; c++) {
+                       xf86CrtcPtr test_crtc = xf86_config->crtc[c];
+                       RADEONCrtcPrivatePtr radeon_test_crtc = 
test_crtc->driver_private;
+
+                       if (crtc != test_crtc && (radeon_test_crtc->pll_id >= 
0))
+                           pll_use_mask |= (1 << radeon_test_crtc->pll_id);
+
+                   }
+               }
+           }
+       }
+       if (is_dp)
+           radeon_crtc->pll_id = 2;
+       else if (!(pll_use_mask & 1))
+           radeon_crtc->pll_id = 0;
+       else
+           radeon_crtc->pll_id = 1;
+    } else
+       radeon_crtc->pll_id = radeon_crtc->crtc_id;
+
+    ErrorF("Picked PLL %d\n", radeon_crtc->pll_id);
+
+    for (o = 0; o < xf86_config->num_output; o++) {
+       output = xf86_config->output[o];
+       if (output->crtc == crtc) {
+           radeon_output = output->driver_private;
+           radeon_output->pll_id = radeon_crtc->pll_id;
+       }
+    }
+}
+
+static void
+atombios_crtc_set_dcpll(xf86CrtcPtr crtc)
+{
+    RADEONInfoPtr  info = RADEONPTR(crtc->scrn);
+    xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn);
+    xf86OutputPtr output = NULL;
+    RADEONOutputPrivatePtr radeon_output = NULL;
+    radeon_encoder_ptr radeon_encoder = NULL;
+    int index;
+    int major, minor, i;
+    PIXEL_CLOCK_PARAMETERS_V5 args;
+    AtomBiosArgRec data;
+    unsigned char *space;
+
+    memset(&args, 0, sizeof(args));
+
+    for (i = 0; i < xf86_config->num_output; i++) {
+       output = xf86_config->output[i];
+       if (output->crtc == crtc) {
+           radeon_output = output->driver_private;
+           radeon_encoder = radeon_get_encoder(output);
+           break;
+       }
+    }
+
+    if (radeon_output == NULL) {
+       xf86DrvMsg(crtc->scrn->scrnIndex, X_ERROR, "No output assigned to 
crtc!\n");
+       return;
+    }
+
+    if (radeon_encoder == NULL) {
+       xf86DrvMsg(crtc->scrn->scrnIndex, X_ERROR, "No encoder assigned to 
output!\n");
+       return;
+    }
+
+    index = GetIndexIntoMasterTable(COMMAND, SetPixelClock);
+    atombios_get_command_table_version(info->atomBIOS, index, &major, &minor);
+
+    /*ErrorF("table is %d %d\n", major, minor);*/
+    switch(major) {
+    case 1:
+       switch(minor) {
+       case 5:
+           args.ucCRTC = ATOM_CRTC_INVALID;
+           args.usPixelClock = 60000; // 600 Mhz
+           args.ucPostDiv = info->pll.pll_out_max / 60000;
+           if (info->pll.reference_freq == 10000) {
+               // 100 Mhz ref clock
+               args.ucRefDiv = 7;
+               args.usFbDiv = cpu_to_le16(84);
+               args.ulFbDivDecFrac = cpu_to_le32(0);
+           } else {
+               // 27 Mhz ref clock
+               args.ucRefDiv = 2;
+               args.usFbDiv = cpu_to_le16(88);
+               args.ulFbDivDecFrac = cpu_to_le32(888889);
+           }
+           args.ucPpll = ATOM_DCPLL;
+           args.ucMiscInfo = 0; //HDMI depth
+           args.ucTransmitterID = radeon_encoder->encoder_id;
+           args.ucEncoderMode = atombios_get_encoder_mode(output);
+           break;
+       default:
+           ErrorF("Unknown table version\n");
+           exit(-1);
+       }
+       break;
+    default:
+       ErrorF("Unknown table version\n");
+       exit(-1);
+    }
+
+    data.exec.index = index;
+    data.exec.dataSpace = (void *)&space;
+    data.exec.pspace = &args;
+
+    if (RHDAtomBiosFunc(info->atomBIOS->scrnIndex, info->atomBIOS, 
ATOMBIOS_EXEC, &data) == ATOM_SUCCESS) {
+       ErrorF("Set DCPLL success\n");
+       return;
+    }
+
+    ErrorF("Set DCPLL failed\n");
+    return;
+}
+
+static void
 atombios_crtc_set_pll(xf86CrtcPtr crtc, DisplayModePtr mode)
 {
     RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private;
@@ -304,15 +443,18 @@ atombios_crtc_set_pll(xf86CrtcPtr crtc, DisplayModePtr 
mode)
     SET_PIXEL_CLOCK_PS_ALLOCATION spc_param;
     PIXEL_CLOCK_PARAMETERS_V2 *spc2_ptr;
     PIXEL_CLOCK_PARAMETERS_V3 *spc3_ptr;
+    PIXEL_CLOCK_PARAMETERS_V5 *spc5_ptr;
     xf86OutputPtr output = NULL;
     RADEONOutputPrivatePtr radeon_output = NULL;
     radeon_encoder_ptr radeon_encoder = NULL;
     int pll_flags = 0;
     uint32_t temp;
-    void *ptr;
     AtomBiosArgRec data;
     unsigned char *space;
 
+    if (IS_DCE4_VARIANT)
+       atombios_crtc_set_dcpll(crtc);
+
     memset(&spc_param, 0, sizeof(spc_param));
     if (IS_AVIVO_VARIANT) {
        if ((info->ChipFamily == CHIP_FAMILY_RS600) ||
@@ -338,12 +480,23 @@ atombios_crtc_set_pll(xf86CrtcPtr crtc, DisplayModePtr 
mode)
        }
 
        /* disable spread spectrum clocking for now -- thanks Hedy Lamarr */
-       if (radeon_crtc->crtc_id == 0) {
-           temp = INREG(AVIVO_P1PLL_INT_SS_CNTL);
-           OUTREG(AVIVO_P1PLL_INT_SS_CNTL, temp & ~1);
+       if (IS_DCE4_VARIANT) {
+           /* XXX 6 crtcs, but only 2 plls */
+           if (radeon_crtc->crtc_id == 0) {
+               temp = INREG(EVERGREEN_P1PLL_SS_CNTL);
+               OUTREG(EVERGREEN_P1PLL_SS_CNTL, temp & ~EVERGREEN_PxPLL_SS_EN);
+           } else {
+               temp = INREG(EVERGREEN_P2PLL_SS_CNTL);
+               OUTREG(EVERGREEN_P2PLL_SS_CNTL, temp & ~EVERGREEN_PxPLL_SS_EN);
+           }
        } else {
-           temp = INREG(AVIVO_P2PLL_INT_SS_CNTL);
-           OUTREG(AVIVO_P2PLL_INT_SS_CNTL, temp & ~1);
+           if (radeon_crtc->crtc_id == 0) {
+               temp = INREG(AVIVO_P1PLL_INT_SS_CNTL);
+               OUTREG(AVIVO_P1PLL_INT_SS_CNTL, temp & ~1);
+           } else {
+               temp = INREG(AVIVO_P2PLL_INT_SS_CNTL);
+               OUTREG(AVIVO_P2PLL_INT_SS_CNTL, temp & ~1);
+           }
        }
     } else {
        pll_flags |= RADEON_PLL_LEGACY;
@@ -369,7 +522,8 @@ atombios_crtc_set_pll(xf86CrtcPtr crtc, DisplayModePtr mode)
 
     if (IS_DCE3_VARIANT) {
        ADJUST_DISPLAY_PLL_PS_ALLOCATION adjust_pll_param;
-       index = GetIndexIntoMasterTable(COMMAND, AdjustDisplayPll);
+       ADJUST_DISPLAY_PLL_PS_ALLOCATION *adp_ptr;
+       ADJUST_DISPLAY_PLL_PS_ALLOCATION_V3 *adp3_ptr;
 
        /* Can't really do cloning easily on DCE3 cards */
        for (i = 0; i < xf86_config->num_output; i++) {
@@ -377,6 +531,11 @@ atombios_crtc_set_pll(xf86CrtcPtr crtc, DisplayModePtr 
mode)
            if (output->crtc == crtc) {
                radeon_output = output->driver_private;
                radeon_encoder = radeon_get_encoder(output);
+               /* no need to set pll for DP */
+               if (IS_DCE4_VARIANT) {
+                   if (atombios_get_encoder_mode(output) == 
ATOM_ENCODER_MODE_DP)
+                       return;
+               }
                break;
            }
        }
@@ -392,19 +551,67 @@ atombios_crtc_set_pll(xf86CrtcPtr crtc, DisplayModePtr 
mode)
        }
 
        memset(&adjust_pll_param, 0, sizeof(adjust_pll_param));
-       adjust_pll_param.usPixelClock = cpu_to_le16(sclock / 10);
-       adjust_pll_param.ucTransmitterID = radeon_encoder->encoder_id;
-       adjust_pll_param.ucEncodeMode = atombios_get_encoder_mode(output);
+
+       index = GetIndexIntoMasterTable(COMMAND, AdjustDisplayPll);
+       atombios_get_command_table_version(info->atomBIOS, index, &major, 
&minor);
 
        data.exec.index = index;
        data.exec.dataSpace = (void *)&space;
        data.exec.pspace = &adjust_pll_param;
 
-       ErrorF("before %d\n", adjust_pll_param.usPixelClock);
-       if (RHDAtomBiosFunc(info->atomBIOS->scrnIndex, info->atomBIOS, 
ATOMBIOS_EXEC, &data) == ATOM_SUCCESS) {
-           sclock = le16_to_cpu(adjust_pll_param.usPixelClock) * 10;
+       switch(major) {
+       case 1:
+           switch(minor) {
+           case 1:
+           case 2:
+               adp_ptr = 
(ADJUST_DISPLAY_PLL_PS_ALLOCATION*)&adjust_pll_param.usPixelClock;
+               adp_ptr->usPixelClock = cpu_to_le16(sclock / 10);
+               adp_ptr->ucTransmitterID = radeon_encoder->encoder_id;
+               adp_ptr->ucEncodeMode = atombios_get_encoder_mode(output);
+
+               ErrorF("before %d\n", adp_ptr->usPixelClock);
+               if (RHDAtomBiosFunc(info->atomBIOS->scrnIndex, info->atomBIOS, 
ATOMBIOS_EXEC, &data) == ATOM_SUCCESS) {
+                   sclock = le16_to_cpu(adp_ptr->usPixelClock) * 10;
+               }
+               ErrorF("after %d\n", adp_ptr->usPixelClock);
+               break;
+           case 3:
+               adp3_ptr = 
(ADJUST_DISPLAY_PLL_PS_ALLOCATION_V3*)&adjust_pll_param.usPixelClock;
+               adp3_ptr->sInput.usPixelClock = cpu_to_le16(sclock / 10);
+               adp3_ptr->sInput.ucTransmitterID = radeon_encoder->encoder_id;
+               adp3_ptr->sInput.ucEncodeMode = 
atombios_get_encoder_mode(output);
+               adp3_ptr->sInput.ucDispPllConfig = 0;
+               if (radeon_output->coherent_mode)
+                   adp3_ptr->sInput.ucDispPllConfig |= 
DISPPLL_CONFIG_COHERENT_MODE;
+               if (sclock > 165000)
+                   adp3_ptr->sInput.ucDispPllConfig |= 
DISPPLL_CONFIG_DUAL_LINK;
+               // if SS
+               //    adp3_ptr->sInput.ucDispPllConfig |= 
DISPPLL_CONFIG_SS_ENABLE;
+
+               ErrorF("before %d 0x%x\n", adp3_ptr->sInput.usPixelClock, 
adp3_ptr->sInput.ucDispPllConfig);
+               if (RHDAtomBiosFunc(info->atomBIOS->scrnIndex, info->atomBIOS, 
ATOMBIOS_EXEC, &data) == ATOM_SUCCESS) {
+                   sclock = adp3_ptr->sOutput.ulDispPllFreq * 10;
+                   if (adp3_ptr->sOutput.ucRefDiv) {
+                       pll_flags |= RADEON_PLL_USE_REF_DIV;
+                       info->pll.reference_div = adp3_ptr->sOutput.ucRefDiv;
+                   }
+                   if (adp3_ptr->sOutput.ucPostDiv) {
+                       pll_flags |= RADEON_PLL_USE_POST_DIV;
+                       info->pll.post_div = adp3_ptr->sOutput.ucPostDiv;
+                   }
+                   ErrorF("after %d %d %d\n", adp3_ptr->sOutput.ulDispPllFreq,
+                          adp3_ptr->sOutput.ucRefDiv, 
adp3_ptr->sOutput.ucPostDiv);
+               }
+               break;
+           default:
+               ErrorF("Unknown table version\n");
+               exit(-1);
+           }
+           break;
+       default:
+           ErrorF("Unknown table version\n");
+           exit(-1);
        }
-       ErrorF("after %d\n", adjust_pll_param.usPixelClock);
     }
 
     if (IS_AVIVO_VARIANT) {
@@ -439,10 +646,9 @@ atombios_crtc_set_pll(xf86CrtcPtr crtc, DisplayModePtr 
mode)
            spc2_ptr->usFbDiv = cpu_to_le16(fb_div);
            spc2_ptr->ucFracFbDiv = frac_fb_div;
            spc2_ptr->ucPostDiv = post_div;
-           spc2_ptr->ucPpll = radeon_crtc->crtc_id ? ATOM_PPLL2 : ATOM_PPLL1;
+           spc2_ptr->ucPpll = radeon_crtc->pll_id;
            spc2_ptr->ucCRTC = radeon_crtc->crtc_id;
            spc2_ptr->ucRefDivSrc = 1;
-           ptr = &spc_param;
            break;
        case 3:
            spc3_ptr = (PIXEL_CLOCK_PARAMETERS_V3*)&spc_param.sPCLKInput;
@@ -451,12 +657,23 @@ atombios_crtc_set_pll(xf86CrtcPtr crtc, DisplayModePtr 
mode)
            spc3_ptr->usFbDiv = cpu_to_le16(fb_div);
            spc3_ptr->ucFracFbDiv = frac_fb_div;
            spc3_ptr->ucPostDiv = post_div;
-           spc3_ptr->ucPpll = radeon_crtc->crtc_id ? ATOM_PPLL2 : ATOM_PPLL1;
+           spc3_ptr->ucPpll = radeon_crtc->pll_id;
            spc3_ptr->ucMiscInfo = (radeon_crtc->crtc_id << 2);
            spc3_ptr->ucTransmitterId = radeon_encoder->encoder_id;
            spc3_ptr->ucEncoderMode = atombios_get_encoder_mode(output);
-
-           ptr = &spc_param;
+           break;
+       case 5:
+           spc5_ptr = (PIXEL_CLOCK_PARAMETERS_V5*)&spc_param.sPCLKInput;
+           spc5_ptr->ucCRTC = radeon_crtc->crtc_id;
+           spc5_ptr->usPixelClock = cpu_to_le16(mode->Clock / 10);
+           spc5_ptr->ucRefDiv = ref_div;
+           spc5_ptr->usFbDiv = cpu_to_le16(fb_div);
+           spc5_ptr->ulFbDivDecFrac = cpu_to_le32(frac_fb_div);
+           spc5_ptr->ucPostDiv = post_div;
+           spc5_ptr->ucPpll = radeon_crtc->pll_id;
+           spc5_ptr->ucMiscInfo = 0; //HDMI depth
+           spc5_ptr->ucTransmitterID = radeon_encoder->encoder_id;
+           spc5_ptr->ucEncoderMode = atombios_get_encoder_mode(output);
            break;
        default:
            ErrorF("Unknown table version\n");
@@ -470,7 +687,7 @@ atombios_crtc_set_pll(xf86CrtcPtr crtc, DisplayModePtr mode)
 
     data.exec.index = index;
     data.exec.dataSpace = (void *)&space;
-    data.exec.pspace = ptr;
+    data.exec.pspace = &spc_param;
 
     if (RHDAtomBiosFunc(info->atomBIOS->scrnIndex, info->atomBIOS, 
ATOMBIOS_EXEC, &data) == ATOM_SUCCESS) {
        ErrorF("Set CRTC %d PLL success\n", radeon_crtc->crtc_id);
@@ -756,10 +973,15 @@ atombios_crtc_mode_set(xf86CrtcPtr crtc,
     RADEONInitMemMapRegisters(pScrn, info->ModeReg, info);
     RADEONRestoreMemMapRegisters(pScrn, info->ModeReg);
 
+    atombios_pick_pll(crtc);
     atombios_crtc_set_pll(crtc, adjusted_mode);
-    atombios_set_crtc_timing(crtc, adjusted_mode);
-    if (!IS_AVIVO_VARIANT && (radeon_crtc->crtc_id == 0))
+    if (IS_DCE4_VARIANT)
        atombios_set_crtc_dtd_timing(crtc, adjusted_mode);
+    else {
+       atombios_set_crtc_timing(crtc, adjusted_mode);
+       if (!IS_AVIVO_VARIANT && (radeon_crtc->crtc_id == 0))
+           atombios_set_crtc_dtd_timing(crtc, adjusted_mode);
+    }
 
     if (IS_DCE4_VARIANT)
        evergreen_set_base_format(crtc, mode, adjusted_mode, x, y);
diff --git a/src/atombios_output.c b/src/atombios_output.c
index b56d8a0..d7c396b 100644
--- a/src/atombios_output.c
+++ b/src/atombios_output.c
@@ -765,11 +765,8 @@ atombios_output_dig_transmitter_setup(xf86OutputPtr 
output, int action, uint8_t
        //if (radeon_output->dig_encoder)
        // disp_data.v2.acConfig.ucEncoderSel = 1;
 
-       // XXX select the PLL
-       if (radeon_output->dig_encoder)
-           disp_data.v3.acConfig.ucRefClkSource = 1; // PLL2
-       else
-           disp_data.v3.acConfig.ucRefClkSource = 0; // PLL1
+       // select the PLL
+       disp_data.v3.acConfig.ucRefClkSource = radeon_output->pll_id;
 
        switch (radeon_encoder->encoder_id) {
        case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
diff --git a/src/radeon_crtc.c b/src/radeon_crtc.c
index b5ce9f6..556b461 100644
--- a/src/radeon_crtc.c
+++ b/src/radeon_crtc.c
@@ -773,6 +773,7 @@ Bool RADEONAllocateControllers(ScrnInfoPtr pScrn, int mask)
            pRADEONEnt->Controller[0]->can_tile = 1;
        else
            pRADEONEnt->Controller[0]->can_tile = 0;
+       pRADEONEnt->Controller[0]->pll_id = -1;
     }
 
     if (mask & 2) {
@@ -801,6 +802,7 @@ Bool RADEONAllocateControllers(ScrnInfoPtr pScrn, int mask)
            pRADEONEnt->Controller[1]->can_tile = 1;
        else
            pRADEONEnt->Controller[1]->can_tile = 0;
+       pRADEONEnt->Controller[1]->pll_id = -1;
     }
 
     /* 6 crtcs on DCE4 chips */
@@ -844,6 +846,7 @@ Bool RADEONAllocateControllers(ScrnInfoPtr pScrn, int mask)
                pRADEONEnt->Controller[i]->can_tile = 1;
            else
                pRADEONEnt->Controller[i]->can_tile = 0;
+           pRADEONEnt->Controller[i]->pll_id = -1;
        }
     }
 
diff --git a/src/radeon_probe.h b/src/radeon_probe.h
index 7cdf2de..dc02bdf 100644
--- a/src/radeon_probe.h
+++ b/src/radeon_probe.h
@@ -163,6 +163,7 @@ typedef struct _RADEONCrtcPrivateRec {
     Bool scaler_enabled;
     float vsc;
     float hsc;
+    int pll_id;
 } RADEONCrtcPrivateRec, *RADEONCrtcPrivatePtr;
 
 typedef struct _radeon_encoder {
@@ -299,6 +300,7 @@ typedef struct _RADEONOutputPrivateRec {
     int dp_lane_count;
     int dp_clock;
     uint8_t hpd_id;
+    int pll_id;
 } RADEONOutputPrivateRec, *RADEONOutputPrivatePtr;
 
 struct avivo_pll_state {

commit bd8e04cb7b39f38b6958273582a9b324a9f0759a
Author: Alex Deucher <alexdeuc...@gmail.com>
Date:   Mon Feb 1 10:07:43 2010 -0500

    evergreen: add atom support for digital outputs
    
    analog is already supported by the existing code.

diff --git a/src/atombios_output.c b/src/atombios_output.c
index 6a769b0..b56d8a0 100644
--- a/src/atombios_output.c
+++ b/src/atombios_output.c
@@ -645,9 +645,58 @@ atombios_output_dig_encoder_setup(xf86OutputPtr output, 
int action)
 
 }
 
+static int
+atombios_dce4_output_dig_encoder_setup(xf86OutputPtr output, int action)
+{
+    RADEONOutputPrivatePtr radeon_output = output->driver_private;
+    RADEONInfoPtr info       = RADEONPTR(output->scrn);
+    radeon_encoder_ptr radeon_encoder = radeon_get_encoder(output);
+    DIG_ENCODER_CONTROL_PARAMETERS_V3 disp_data;
+    AtomBiosArgRec data;
+    unsigned char *space;
+    int index;
+    int clock = radeon_output->pixel_clock;
+
+    if (radeon_encoder == NULL)
+       return ATOM_NOT_IMPLEMENTED;
+
+    memset(&disp_data,0, sizeof(disp_data));
+
+    index = GetIndexIntoMasterTable(COMMAND, DIGxEncoderControl);
+
+    disp_data.ucAction = action;
+    disp_data.usPixelClock = cpu_to_le16(clock / 10);
+    disp_data.ucEncoderMode = atombios_get_encoder_mode(output);
+    disp_data.acConfig.ucDigSel = radeon_output->dig_encoder;
+
+    if (disp_data.ucEncoderMode == ATOM_ENCODER_MODE_DP) {
+       if (dp_link_clock_for_mode_clock(radeon_output, clock) == 27000)
+           disp_data.acConfig.ucDPLinkRate = 1;
+       disp_data.ucLaneNum = dp_lanes_for_mode_clock(radeon_output, clock);
+    } else if (clock > 165000)
+       disp_data.ucLaneNum = 8;
+    else
+       disp_data.ucLaneNum = 4;
+
+    disp_data.ucBitPerColor = PANEL_8BIT_PER_COLOR;
+
+    data.exec.index = index;
+    data.exec.dataSpace = (void *)&space;
+    data.exec.pspace = &disp_data;
+
+    if (RHDAtomBiosFunc(info->atomBIOS->scrnIndex, info->atomBIOS, 
ATOMBIOS_EXEC, &data) == ATOM_SUCCESS) {
+       ErrorF("Output DIG%d encoder setup success\n", 
radeon_output->dig_encoder);
+       return ATOM_SUCCESS;
+    }
+
+    ErrorF("Output DIG%d setup failed\n", radeon_output->dig_encoder);
+    return ATOM_NOT_IMPLEMENTED;
+}
+
 union dig_transmitter_control {
     DIG_TRANSMITTER_CONTROL_PS_ALLOCATION v1;
     DIG_TRANSMITTER_CONTROL_PARAMETERS_V2 v2;
+    DIG_TRANSMITTER_CONTROL_PARAMETERS_V3 v3;
 };
 
 static int
@@ -668,7 +717,7 @@ atombios_output_dig_transmitter_setup(xf86OutputPtr output, 
int action, uint8_t
 
     memset(&disp_data,0, sizeof(disp_data));
 
-    if (IS_DCE32_VARIANT)
+    if (IS_DCE32_VARIANT || IS_DCE4_VARIANT)
        index = GetIndexIntoMasterTable(COMMAND, UNIPHYTransmitterControl);
     else {
        switch (radeon_encoder->encoder_id) {
@@ -685,7 +734,65 @@ atombios_output_dig_transmitter_setup(xf86OutputPtr 
output, int action, uint8_t
 
     disp_data.v1.ucAction = action;
 
-    if (IS_DCE32_VARIANT) {
+    if (IS_DCE4_VARIANT) {
+       if (action == ATOM_TRANSMITTER_ACTION_INIT) {
+           disp_data.v3.usInitInfo = radeon_output->connector_object_id;
+       } else if (action == ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH) {
+           disp_data.v3.asMode.ucLaneSel = lane_num;
+           disp_data.v3.asMode.ucLaneSet = lane_set;
+       } else {
+           if (radeon_output->MonType == MT_DP) {
+               disp_data.v3.usPixelClock =
+                   cpu_to_le16(dp_link_clock_for_mode_clock(radeon_output, 
clock));
+           } else if (clock > 165000) {
+               disp_data.v3.usPixelClock = cpu_to_le16((clock / 2) / 10);
+               disp_data.v3.acConfig.fDualLinkConnector = 1;
+           } else {
+               disp_data.v3.usPixelClock = cpu_to_le16(clock / 10);
+           }
+       }
+
+       if (radeon_output->MonType == MT_DP)
+           disp_data.v3.ucLaneNum = dp_lanes_for_mode_clock(radeon_output, 
clock);
+       else if (clock > 165000)
+           disp_data.v3.ucLaneNum = 8;
+       else
+           disp_data.v3.ucLaneNum = 4;
+
+       if (radeon_output->linkb)
+           disp_data.v3.acConfig.ucLinkSel = 1;
+
+       //if (radeon_output->dig_encoder)
+       // disp_data.v2.acConfig.ucEncoderSel = 1;
+
+       // XXX select the PLL
+       if (radeon_output->dig_encoder)
+           disp_data.v3.acConfig.ucRefClkSource = 1; // PLL2
+       else
+           disp_data.v3.acConfig.ucRefClkSource = 0; // PLL1
+
+       switch (radeon_encoder->encoder_id) {
+       case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
+           disp_data.v3.acConfig.ucTransmitterSel = 0;
+           num = 0;
+           break;
+       case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
+           disp_data.v3.acConfig.ucTransmitterSel = 1;
+           num = 1;
+           break;
+       case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
+           disp_data.v3.acConfig.ucTransmitterSel = 2;
+           num = 2;
+           break;
+       }
+
+       if (radeon_output->MonType == MT_DP)
+           disp_data.v3.acConfig.fCoherentMode = 1; /* DP requires coherent */
+       else if (radeon_output->active_device & (ATOM_DEVICE_DFP_SUPPORT)) {
+           if (radeon_output->coherent_mode)
+               disp_data.v3.acConfig.fCoherentMode = 1;
+       }
+    } else if (IS_DCE32_VARIANT) {
        if (action == ATOM_TRANSMITTER_ACTION_INIT) {
            disp_data.v2.usInitInfo = radeon_output->connector_object_id;
        } else if (action == ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH) {
@@ -736,8 +843,8 @@ atombios_output_dig_transmitter_setup(xf86OutputPtr output, 
int action, uint8_t
        if (action == ATOM_TRANSMITTER_ACTION_INIT) {
            disp_data.v1.usInitInfo = radeon_output->connector_object_id;
        } else if (action == ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH) {
-           disp_data.v2.asMode.ucLaneSel = lane_num;
-           disp_data.v2.asMode.ucLaneSet = lane_set;
+           disp_data.v1.asMode.ucLaneSel = lane_num;
+           disp_data.v1.asMode.ucLaneSet = lane_set;
        } else {
            if (radeon_output->MonType == MT_DP)
                disp_data.v1.usPixelClock =
@@ -1443,10 +1550,26 @@ atombios_set_output_crtc_source(xf86OutputPtr output)
            case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
            case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
            case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
-               if (radeon_output->dig_encoder)
-                   crtc_src_param2.ucEncoderID = ASIC_INT_DIG2_ENCODER_ID;
-               else
-                   crtc_src_param2.ucEncoderID = ASIC_INT_DIG1_ENCODER_ID;
+               switch (radeon_output->dig_encoder) {
+               case 0:
+                   crtc_src_param2.ucEncoderID = ASIC_INT_DIG1_ENCODER_ID;
+                   break;
+               case 1:
+                   crtc_src_param2.ucEncoderID = ASIC_INT_DIG2_ENCODER_ID;
+                   break;
+               case 2:
+                   crtc_src_param2.ucEncoderID = ASIC_INT_DIG3_ENCODER_ID;
+                   break;
+               case 3:
+                   crtc_src_param2.ucEncoderID = ASIC_INT_DIG4_ENCODER_ID;
+                   break;
+               case 4:
+                   crtc_src_param2.ucEncoderID = ASIC_INT_DIG5_ENCODER_ID;
+                   break;
+               case 5:
+                   crtc_src_param2.ucEncoderID = ASIC_INT_DIG6_ENCODER_ID;
+                   break;
+               }
                break;
            case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
                if (radeon_output->active_device & (ATOM_DEVICE_TV_SUPPORT))
@@ -1517,7 +1640,9 @@ atombios_apply_output_quirks(xf86OutputPtr output, 
DisplayModePtr mode)
            OUTREG(AVIVO_D1MODE_DATA_FORMAT + radeon_crtc->crtc_offset, 
AVIVO_D1MODE_INTERLEAVE_EN);
     }
 
-    if (IS_DCE32_VARIANT && (radeon_output->active_device & 
(ATOM_DEVICE_DFP_SUPPORT))) {
+    if (IS_DCE32_VARIANT &&
+       (!IS_DCE4_VARIANT) &&
+       (radeon_output->active_device & (ATOM_DEVICE_DFP_SUPPORT))) {
        radeon_encoder_ptr radeon_encoder = radeon_get_encoder(output);
        if (radeon_encoder == NULL)
            return;
@@ -1536,6 +1661,7 @@ atombios_pick_dig_encoder(xf86OutputPtr output)
     xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(output->scrn);
     RADEONOutputPrivatePtr radeon_output = output->driver_private;
     RADEONInfoPtr info       = RADEONPTR(output->scrn);
+    radeon_encoder_ptr radeon_encoder = NULL;
     Bool is_lvtma = FALSE;
     int i, mode;
     uint32_t dig_enc_use_mask = 0;
@@ -1547,6 +1673,35 @@ atombios_pick_dig_encoder(xf86OutputPtr output)
         mode == ATOM_ENCODER_MODE_CV)
         return;
 
+    if (IS_DCE4_VARIANT) {
+        radeon_encoder = radeon_get_encoder(output);
+
+       switch (radeon_encoder->encoder_id) {
+       case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
+           if (radeon_output->linkb)
+               radeon_output->dig_encoder = 1;
+           else
+               radeon_output->dig_encoder = 0;
+           break;


-- 
To UNSUBSCRIBE, email to debian-x-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to