Author: kallisti5 Date: 2011-08-07 22:16:32 +0200 (Sun, 07 Aug 2011) New Revision: 42596 Changeset: https://dev.haiku-os.org/changeset/42596 Modified: haiku/trunk/headers/private/graphics/radeon_hd/radeon_hd.h haiku/trunk/src/add-ons/accelerants/radeon_hd/display.cpp haiku/trunk/src/add-ons/kernel/drivers/graphics/radeon_hd/driver.cpp haiku/trunk/src/add-ons/kernel/drivers/graphics/radeon_hd/radeon_hd.cpp Log: * add initial set of Northern Island cards * add igp property to pciid map * add disabled bios pull for r700 and ni cards * refactor model numbering as >R700 AMD switched to named card families Modified: haiku/trunk/headers/private/graphics/radeon_hd/radeon_hd.h =================================================================== --- haiku/trunk/headers/private/graphics/radeon_hd/radeon_hd.h 2011-08-07 15:42:21 UTC (rev 42595) +++ haiku/trunk/headers/private/graphics/radeon_hd/radeon_hd.h 2011-08-07 20:16:32 UTC (rev 42596) @@ -25,11 +25,16 @@ #include <PCI.h> -#define VENDOR_ID_ATI 0x1002 +#define VENDOR_ID_ATI 0x1002 -#define RADEON_R600 0x0600 -#define RADEON_R700 0x0700 -#define RADEON_R800 0x0800 +#define RADEON_R520 0x0520 // Fudo +#define RADEON_R580 0x0580 // Rodin +#define RADEON_R600 0x0600 // Pele +#define RADEON_R700 0x0700 // Wekiva +#define RADEON_R1000 0x1000 // Evergreen +#define RADEON_R2000 0x2000 // Northern Islands +#define RADEON_R3000 0x3000 // Southern Islands +#define RADEON_R4000 0x4000 // Not yet known / used #define RADEON_VBIOS_SIZE 0x10000 Modified: haiku/trunk/src/add-ons/accelerants/radeon_hd/display.cpp =================================================================== --- haiku/trunk/src/add-ons/accelerants/radeon_hd/display.cpp 2011-08-07 15:42:21 UTC (rev 42595) +++ haiku/trunk/src/add-ons/accelerants/radeon_hd/display.cpp 2011-08-07 20:16:32 UTC (rev 42596) @@ -33,7 +33,7 @@ radeon_shared_info &info = *gInfo->shared_info; - if (info.device_chipset >= RADEON_R800) { + if (info.device_chipset >= RADEON_R1000) { uint32 offset = 0; // AMD Eyefinity on Evergreen GPUs @@ -89,7 +89,7 @@ regs->viewportSize = offset + EVERGREEN_VIEWPORT_SIZE; } else if (info.device_chipset >= RADEON_R600 - && info.device_chipset < RADEON_R800) { + && info.device_chipset < RADEON_R1000) { // r600 - r700 are D1 or D2 based on primary / secondary crt regs->vgaControl Modified: haiku/trunk/src/add-ons/kernel/drivers/graphics/radeon_hd/driver.cpp =================================================================== --- haiku/trunk/src/add-ons/kernel/drivers/graphics/radeon_hd/driver.cpp 2011-08-07 15:42:21 UTC (rev 42595) +++ haiku/trunk/src/add-ons/kernel/drivers/graphics/radeon_hd/driver.cpp 2011-08-07 20:16:32 UTC (rev 42596) @@ -39,87 +39,123 @@ const struct supported_device { uint32 device_id; uint16 chipset; + bool igp; const char* name; } kSupportedDevices[] = { // R600 series (HD24xx - HD42xx) // Codename: Pele - {0x94c7, RADEON_R600 | 0x10, "Radeon HD 2350"}, /*RV610*/ - {0x94c1, RADEON_R600 | 0x10, "Radeon HD 2400"}, /*RV610, IGP*/ - {0x94c3, RADEON_R600 | 0x10, "Radeon HD 2400"}, /*RV610*/ - {0x94cc, RADEON_R600 | 0x10, "Radeon HD 2400"}, /*RV610*/ - {0x9586, RADEON_R600 | 0x30, "Radeon HD 2600"}, /*RV630*/ - {0x9588, RADEON_R600 | 0x30, "Radeon HD 2600"}, /*RV630*/ - {0x958a, RADEON_R600 | 0x30, "Radeon HD 2600 X2"},/*RV630*/ + {0x94c7, RADEON_R600 | 0x10, false, "Radeon HD 2350"}, + {0x94c1, RADEON_R600 | 0x10, true, "Radeon HD 2400"}, + {0x94c3, RADEON_R600 | 0x10, false, "Radeon HD 2400"}, + {0x94cc, RADEON_R600 | 0x10, false, "Radeon HD 2400"}, + {0x9586, RADEON_R600 | 0x30, false, "Radeon HD 2600"}, + {0x9588, RADEON_R600 | 0x30, false, "Radeon HD 2600"}, + {0x958a, RADEON_R600 | 0x30, false, "Radeon HD 2600 X2"}, // Radeon 2700 - RV630 - {0x9400, RADEON_R600 | 0x0, "Radeon HD 2900"}, /*RV600*/ - {0x9405, RADEON_R600 | 0x0, "Radeon HD 2900"}, /*RV600*/ - {0x9611, RADEON_R600 | 0x20, "Radeon HD 3100"}, /*RV620, IGP*/ - {0x9613, RADEON_R600 | 0x20, "Radeon HD 3100"}, /*RV620, IGP*/ - {0x9610, RADEON_R600 | 0x10, "Radeon HD 3200"}, /*RV610, IGP*/ - {0x9612, RADEON_R600 | 0x10, "Radeon HD 3200"}, /*RV610, IGP*/ - {0x9615, RADEON_R600 | 0x10, "Radeon HD 3200"}, /*RV610, IGP*/ - {0x9614, RADEON_R600 | 0x10, "Radeon HD 3300"}, /*RV610, IGP*/ + {0x9400, RADEON_R600 | 0x00, false, "Radeon HD 2900"}, + {0x9405, RADEON_R600 | 0x00, false, "Radeon HD 2900"}, + {0x9611, RADEON_R600 | 0x20, true, "Radeon HD 3100"}, + {0x9613, RADEON_R600 | 0x20, true, "Radeon HD 3100"}, + {0x9610, RADEON_R600 | 0x10, true, "Radeon HD 3200"}, + {0x9612, RADEON_R600 | 0x10, true, "Radeon HD 3200"}, + {0x9615, RADEON_R600 | 0x10, true, "Radeon HD 3200"}, + {0x9614, RADEON_R600 | 0x10, true, "Radeon HD 3300"}, // Radeon 3430 - RV620 - {0x95c5, RADEON_R600 | 0x20, "Radeon HD 3450"}, /*RV620*/ - {0x95c6, RADEON_R600 | 0x20, "Radeon HD 3450"}, /*RV620*/ - {0x95c7, RADEON_R600 | 0x20, "Radeon HD 3450"}, /*RV620*/ - {0x95c9, RADEON_R600 | 0x20, "Radeon HD 3450"}, /*RV620*/ - {0x95c4, RADEON_R600 | 0x20, "Radeon HD 3470"}, /*RV620*/ - {0x95c0, RADEON_R600 | 0x20, "Radeon HD 3550"}, /*RV620*/ - {0x9581, RADEON_R600 | 0x30, "Radeon HD 3600"}, /*RV630*/ - {0x9583, RADEON_R600 | 0x30, "Radeon HD 3600"}, /*RV630*/ - {0x9598, RADEON_R600 | 0x30, "Radeon HD 3600"}, /*RV630*/ - {0x9591, RADEON_R600 | 0x35, "Radeon HD 3600"}, /*RV635*/ - {0x9589, RADEON_R600 | 0x30, "Radeon HD 3610"}, /*RV630*/ + {0x95c5, RADEON_R600 | 0x20, false, "Radeon HD 3450"}, + {0x95c6, RADEON_R600 | 0x20, false, "Radeon HD 3450"}, + {0x95c7, RADEON_R600 | 0x20, false, "Radeon HD 3450"}, + {0x95c9, RADEON_R600 | 0x20, false, "Radeon HD 3450"}, + {0x95c4, RADEON_R600 | 0x20, false, "Radeon HD 3470"}, + {0x95c0, RADEON_R600 | 0x20, false, "Radeon HD 3550"}, + {0x9581, RADEON_R600 | 0x30, false, "Radeon HD 3600"}, + {0x9583, RADEON_R600 | 0x30, false, "Radeon HD 3600"}, + {0x9598, RADEON_R600 | 0x30, false, "Radeon HD 3600"}, + {0x9591, RADEON_R600 | 0x35, false, "Radeon HD 3600"}, + {0x9589, RADEON_R600 | 0x30, false, "Radeon HD 3610"}, // Radeon 3650 - RV635 // Radeon 3670 - RV635 - {0x9507, RADEON_R600 | 0x70, "Radeon HD 3830"}, /*RV670*/ - {0x9505, RADEON_R600 | 0x70, "Radeon HD 3850"}, /*RV670, IGP*/ - {0x9513, RADEON_R600 | 0x80, "Radeon HD 3850 X2"},/*RV670*/ - {0x9501, RADEON_R600 | 0x70, "Radeon HD 3870"}, /*RV670*/ - {0x950F, RADEON_R600 | 0x80, "Radeon HD 3870 X2"},/*R680*/ - {0x9710, RADEON_R600 | 0x20, "Radeon HD 4200"}, /*RV620, IGP*/ - {0x9715, RADEON_R600 | 0x20, "Radeon HD 4250"}, /*RV620, IGP*/ - {0x9712, RADEON_R600 | 0x20, "Radeon HD 4270"}, /*RV620, IGP*/ - {0x9714, RADEON_R600 | 0x20, "Radeon HD 4290"}, /*RV620, IGP*/ + {0x9507, RADEON_R600 | 0x70, false, "Radeon HD 3830"}, + {0x9505, RADEON_R600 | 0x70, false, "Radeon HD 3850"}, + {0x9513, RADEON_R600 | 0x80, false, "Radeon HD 3850 X2"}, + {0x9501, RADEON_R600 | 0x70, false, "Radeon HD 3870"}, + {0x950F, RADEON_R600 | 0x80, false, "Radeon HD 3870 X2"}, + {0x9710, RADEON_R600 | 0x20, true, "Radeon HD 4200"}, + {0x9715, RADEON_R600 | 0x20, true, "Radeon HD 4250"}, + {0x9712, RADEON_R600 | 0x20, true, "Radeon HD 4270"}, + {0x9714, RADEON_R600 | 0x20, true, "Radeon HD 4290"}, // R700 series (HD4330 - HD4890, HD51xx, HD5xxV) // Codename: Wekiva // Radeon 4330 - RV710 - {0x954f, RADEON_R700 | 0x10, "Radeon HD 4300"}, /*RV710*/ - {0x9552, RADEON_R700 | 0x10, "Radeon HD 4300"}, /*RV710*/ - {0x9555, RADEON_R700 | 0x10, "Radeon HD 4350"}, /*RV710*/ - {0x9540, RADEON_R700 | 0x10, "Radeon HD 4550"}, /*RV710*/ - {0x9498, RADEON_R700 | 0x30, "Radeon HD 4650"}, /*RV740*/ - {0x94b4, RADEON_R700 | 0x40, "Radeon HD 4700"}, /*RV740*/ - {0x9490, RADEON_R700 | 0x30, "Radeon HD 4710"}, /*RV740*/ - {0x94b3, RADEON_R700 | 0x40, "Radeon HD 4770"}, /*RV740*/ - {0x94b5, RADEON_R700 | 0x40, "Radeon HD 4770"}, /*RV740*/ - {0x944a, RADEON_R700 | 0x70, "Radeon HD 4800"}, /*RV740*/ - {0x944e, RADEON_R700 | 0x70, "Radeon HD 4810"}, /*RV740*/ - {0x944c, RADEON_R700 | 0x70, "Radeon HD 4830"}, /*RV740*/ - {0x9442, RADEON_R700 | 0x70, "Radeon HD 4850"}, /*RV770*/ - {0x9443, RADEON_R700 | 0x70, "Radeon HD 4850 X2"},/*RV770*/ - {0x94a1, RADEON_R700 | 0x90, "Radeon HD 4860"}, /*RV780, IGP*/ - {0x9440, RADEON_R700 | 0x70, "Radeon HD 4870"}, /*RV770*/ - {0x9441, RADEON_R700 | 0x70, "Radeon HD 4870 X2"},/*RV770*/ + {0x954f, RADEON_R700 | 0x10, true, "Radeon HD 4300"}, + {0x9552, RADEON_R700 | 0x10, true, "Radeon HD 4300"}, + {0x9555, RADEON_R700 | 0x10, false, "Radeon HD 4350"}, + {0x9540, RADEON_R700 | 0x10, false, "Radeon HD 4550"}, + {0x9498, RADEON_R700 | 0x30, false, "Radeon HD 4650"}, + {0x94b4, RADEON_R700 | 0x40, false, "Radeon HD 4700"}, + {0x9490, RADEON_R700 | 0x30, false, "Radeon HD 4710"}, + {0x94b3, RADEON_R700 | 0x40, false, "Radeon HD 4770"}, + {0x94b5, RADEON_R700 | 0x40, false, "Radeon HD 4770"}, + {0x944a, RADEON_R700 | 0x70, false, "Radeon HD 4800"}, + {0x944e, RADEON_R700 | 0x70, false, "Radeon HD 4810"}, + {0x944c, RADEON_R700 | 0x70, false, "Radeon HD 4830"}, + {0x9442, RADEON_R700 | 0x70, false, "Radeon HD 4850"}, + {0x9443, RADEON_R700 | 0x70, false, "Radeon HD 4850 X2"}, + {0x94a1, RADEON_R700 | 0x90, true, "Radeon HD 4860"}, + {0x9440, RADEON_R700 | 0x70, false, "Radeon HD 4870"}, + {0x9441, RADEON_R700 | 0x70, false, "Radeon HD 4870 X2"}, - // R800 series (HD54xx - HD59xx) + // From here on AMD no longer used numeric identifiers + + // R1000 series (HD54xx - HD59xx) // Codename: Evergreen - {0x68e1, RADEON_R800 | 0x0, "Radeon HD 5430"}, /*RV8XX*/ - {0x68f9, RADEON_R800 | 0x0, "Radeon HD 5450"}, /*RV8XX*/ - {0x68e0, RADEON_R800 | 0x0, "Radeon HD 5470"}, /*RV8XX*/ - {0x68da, RADEON_R800 | 0x0, "Radeon HD 5500"}, /*RV8XX*/ - {0x68d9, RADEON_R800 | 0x0, "Radeon HD 5570"}, /*RV8XX*/ - {0x68b9, RADEON_R800 | 0x0, "Radeon HD 5600"}, /*RV8XX*/ - {0x68c1, RADEON_R800 | 0x0, "Radeon HD 5650"}, /*RV8XX*/ - {0x68d8, RADEON_R800 | 0x0, "Radeon HD 5670"}, /*RV8XX*/ - {0x68be, RADEON_R800 | 0x0, "Radeon HD 5700"}, /*RV8XX*/ - {0x68b8, RADEON_R800 | 0x0, "Radeon HD 5770"}, /*RV8XX*/ - {0x689e, RADEON_R800 | 0x0, "Radeon HD 5800"}, /*RV8XX*/ - {0x6899, RADEON_R800 | 0x0, "Radeon HD 5850"}, /*RV8XX*/ - {0x6898, RADEON_R800 | 0x0, "Radeon HD 5870"}, /*RV8XX*/ - {0x689c, RADEON_R800 | 0x0, "Radeon HD 5900"} /*RV8XX*/ + // Cedar + {0x68e1, RADEON_R1000 | 0x00, false, "Radeon HD 5430"}, + {0x68f9, RADEON_R1000 | 0x00, false, "Radeon HD 5450"}, + {0x68e0, RADEON_R1000 | 0x00, true, "Radeon HD 5470"}, + // Redwood + {0x68da, RADEON_R1000 | 0x10, false, "Radeon HD 5500"}, + {0x68d9, RADEON_R1000 | 0x10, false, "Radeon HD 5570"}, + {0x68b9, RADEON_R1000 | 0x10, false, "Radeon HD 5600"}, + {0x68c1, RADEON_R1000 | 0x10, false, "Radeon HD 5650"}, + {0x68d8, RADEON_R1000 | 0x10, false, "Radeon HD 5670"}, + // Juniper + {0x68be, RADEON_R1000 | 0x20, false, "Radeon HD 5700"}, + {0x68b8, RADEON_R1000 | 0x20, false, "Radeon HD 5770"}, + // Cypress + {0x689e, RADEON_R1000 | 0x30, false, "Radeon HD 5800"}, + {0x6899, RADEON_R1000 | 0x30, false, "Radeon HD 5850"}, + {0x6898, RADEON_R1000 | 0x30, false, "Radeon HD 5870"}, + // Hemlock + {0x689c, RADEON_R1000 | 0x40, false, "Radeon HD 5900"}, + + // R2000 series (HD64xx - HD69xx) + // Codename: Nothern Islands + // Caicos + {0x6770, RADEON_R2000 | 0x00, true, "Radeon HD 6400"}, + {0x6779, RADEON_R2000 | 0x00, false, "Radeon HD 6450"}, + // Turks + {0x6759, RADEON_R2000 | 0x10, false, "Radeon HD 6570"}, + {0x6741, RADEON_R2000 | 0x10, true, "Radeon HD 6650M"}, + // Barts + {0x673e, RADEON_R2000 | 0x20, false, "Radeon HD 6790"}, + {0x6739, RADEON_R2000 | 0x20, false, "Radeon HD 6850"}, + {0x6738, RADEON_R2000 | 0x20, false, "Radeon HD 6870"}, + // Cayman + {0x6718, RADEON_R2000 | 0x30, false, "Radeon HD 6970"}, + // Antilles + {0x671d, RADEON_R2000 | 0x40, false, "Radeon HD 6990"} + + // R3000 series (HD74xx - HD79xx) + // Codename: Southern Islands + // Lombok + // R3000 | 0x00 + // Thames + // R3000 | 0x10 + // Tahiti + // R3000 | 0x20 + // New Zealand + // R3000 | 0x30 }; Modified: haiku/trunk/src/add-ons/kernel/drivers/graphics/radeon_hd/radeon_hd.cpp =================================================================== --- haiku/trunk/src/add-ons/kernel/drivers/graphics/radeon_hd/radeon_hd.cpp 2011-08-07 15:42:21 UTC (rev 42595) +++ haiku/trunk/src/add-ons/kernel/drivers/graphics/radeon_hd/radeon_hd.cpp 2011-08-07 20:16:32 UTC (rev 42596) @@ -156,6 +156,89 @@ status_t +radeon_hd_getbios_ni(radeon_info &info) +{ + TRACE("card(%ld): %s: called\n", info.id, __func__); + uint32 bus_cntl = read32(info.registers + R600_BUS_CNTL); + uint32 d1vga_control = read32(info.registers + AVIVO_D1VGA_CONTROL); + uint32 d2vga_control = read32(info.registers + AVIVO_D2VGA_CONTROL); + uint32 vga_render_control + = read32(info.registers + AVIVO_VGA_RENDER_CONTROL); + uint32 rom_cntl = read32(info.registers + R600_ROM_CNTL); + + // enable the rom + write32(info.registers + R600_BUS_CNTL, (bus_cntl & ~R600_BIOS_ROM_DIS)); + // disable VGA mode + write32(info.registers + AVIVO_D1VGA_CONTROL, (d1vga_control + & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE + | AVIVO_DVGA_CONTROL_TIMING_SELECT))); + write32(info.registers + D2VGA_CONTROL, (d2vga_control + & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE + | AVIVO_DVGA_CONTROL_TIMING_SELECT))); + write32(info.registers + AVIVO_VGA_RENDER_CONTROL, + (vga_render_control & ~AVIVO_VGA_VSTATUS_CNTL_MASK)); + + write32(info.registers + R600_ROM_CNTL, (rom_cntl | R600_SCK_OVERWRITE)); + + // try to grab the bios + status_t result = radeon_hd_getbios(info); + + // restore regs + write32(info.registers + R600_BUS_CNTL, bus_cntl); + write32(info.registers + AVIVO_D1VGA_CONTROL, d1vga_control); + write32(info.registers + AVIVO_D2VGA_CONTROL, d2vga_control); + write32(info.registers + AVIVO_VGA_RENDER_CONTROL, vga_render_control); + write32(info.registers + R600_ROM_CNTL, rom_cntl); + + return result; +} + + +status_t +radeon_hd_getbios_r700(radeon_info &info) +{ + TRACE("card(%ld): %s: called\n", info.id, __func__); + uint32 viph_control = read32(info.registers + RADEON_VIPH_CONTROL); + uint32 bus_cntl = read32(info.registers + R600_BUS_CNTL); + uint32 d1vga_control = read32(info.registers + AVIVO_D1VGA_CONTROL); + uint32 d2vga_control = read32(info.registers + AVIVO_D2VGA_CONTROL); + uint32 vga_render_control + = read32(info.registers + AVIVO_VGA_RENDER_CONTROL); + uint32 rom_cntl = read32(info.registers + R600_ROM_CNTL); + + // disable VIP + write32(info.registers + RADEON_VIPH_CONTROL, + (viph_control & ~RADEON_VIPH_EN)); + // enable the rom + write32(info.registers + R600_BUS_CNTL, (bus_cntl & ~R600_BIOS_ROM_DIS)); + // disable VGA mode + write32(info.registers + AVIVO_D1VGA_CONTROL, (d1vga_control + & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE + | AVIVO_DVGA_CONTROL_TIMING_SELECT))); + write32(info.registers + D2VGA_CONTROL, (d2vga_control + & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE + | AVIVO_DVGA_CONTROL_TIMING_SELECT))); + write32(info.registers + AVIVO_VGA_RENDER_CONTROL, + (vga_render_control & ~AVIVO_VGA_VSTATUS_CNTL_MASK)); + + write32(info.registers + R600_ROM_CNTL, (rom_cntl | R600_SCK_OVERWRITE)); + + // try to grab the bios + status_t result = radeon_hd_getbios(info); + + // restore regs + write32(info.registers + RADEON_VIPH_CONTROL, viph_control); + write32(info.registers + R600_BUS_CNTL, bus_cntl); + write32(info.registers + AVIVO_D1VGA_CONTROL, d1vga_control); + write32(info.registers + AVIVO_D2VGA_CONTROL, d2vga_control); + write32(info.registers + AVIVO_VGA_RENDER_CONTROL, vga_render_control); + write32(info.registers + R600_ROM_CNTL, rom_cntl); + + return result; +} + + +status_t radeon_hd_getbios_r600(radeon_info &info) { TRACE("card(%ld): %s: called\n", info.id, __func__); @@ -304,7 +387,13 @@ status_t biosStatus = radeon_hd_getbios(info); if (biosStatus != B_OK) { // If the active read fails, we do a disabled read - if (info.device_chipset > RADEON_R600) + + // TODO : IGP read + if (info.device_chipset >= (RADEON_R1000 | 0x20)) + biosStatus = radeon_hd_getbios_ni(info); + else if (info.device_chipset >= (RADEON_R700 | 0x70)) + biosStatus = radeon_hd_getbios_r700(info); + else if (info.device_chipset >= RADEON_R600) biosStatus = radeon_hd_getbios_r600(info); } @@ -330,7 +419,7 @@ } // *** Populate graphics_memory/aperture_size with KB - if (info.shared_info->device_chipset >= RADEON_R800) { + if (info.shared_info->device_chipset >= RADEON_R1000) { // R800+ has memory stored in MB info.shared_info->graphics_memory_size = read32(info.registers + R6XX_CONFIG_MEMSIZE) * 1024;