From patchwork Tue Feb 16 22:28:06 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Harry Wentland X-Patchwork-Id: 8332941 Return-Path: X-Original-To: patchwork-dri-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 95CA69F6E7 for ; Tue, 16 Feb 2016 22:30:03 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id E0EB020320 for ; Tue, 16 Feb 2016 22:30:01 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id A060F202EC for ; Tue, 16 Feb 2016 22:29:58 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id E9D086E8B4; Tue, 16 Feb 2016 22:29:00 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from na01-bn1-obe.outbound.protection.outlook.com (mail-bn1on0094.outbound.protection.outlook.com [157.56.110.94]) by gabe.freedesktop.org (Postfix) with ESMTPS id 0A7EC6E8C2 for ; Tue, 16 Feb 2016 22:28:59 +0000 (UTC) Received: from SN1PR12CA0008.namprd12.prod.outlook.com (10.162.96.146) by BN4PR12MB0849.namprd12.prod.outlook.com (10.164.59.11) with Microsoft SMTP Server (TLS) id 15.1.409.15; Tue, 16 Feb 2016 22:28:56 +0000 Received: from DM3NAM03FT027.eop-NAM03.prod.protection.outlook.com (2a01:111:f400:7e49::200) by SN1PR12CA0008.outlook.office365.com (2a01:111:e400:5174::18) with Microsoft SMTP Server (TLS) id 15.1.409.15 via Frontend Transport; Tue, 16 Feb 2016 22:28:56 +0000 Authentication-Results: spf=none (sender IP is 165.204.84.221) smtp.mailfrom=amd.com; lists.freedesktop.org; dkim=none (message not signed) header.d=none;lists.freedesktop.org; dmarc=permerror action=none header.from=amd.com; Received-SPF: None (protection.outlook.com: amd.com does not designate permitted sender hosts) Received: from atltwp01.amd.com (165.204.84.221) by DM3NAM03FT027.mail.protection.outlook.com (10.152.82.190) with Microsoft SMTP Server id 15.1.415.6 via Frontend Transport; Tue, 16 Feb 2016 22:28:56 +0000 X-WSS-ID: 0O2NVS6-07-L6Q-02 X-M-MSG: Received: from satlvexedge01.amd.com (satlvexedge01.amd.com [10.177.96.28]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by atltwp01.amd.com (Axway MailGate 5.3.1) with ESMTPS id 217A9CAE819 for ; Tue, 16 Feb 2016 17:28:54 -0500 (EST) Received: from SATLEXDAG04.amd.com (10.181.40.9) by satlvexedge01.amd.com (10.177.96.28) with Microsoft SMTP Server (TLS) id 14.3.195.1; Tue, 16 Feb 2016 16:28:57 -0600 Received: from STOREXDAG02.amd.com (10.1.13.11) by satlexdag04.amd.com (10.181.40.9) with Microsoft SMTP Server (TLS) id 14.3.266.1; Tue, 16 Feb 2016 17:28:53 -0500 Received: from cnhwentlanub.amd.com (172.29.225.36) by storexdag02.amd.com (10.1.13.11) with Microsoft SMTP Server id 14.3.266.1; Tue, 16 Feb 2016 17:28:53 -0500 From: Harry Wentland To: Subject: [PATCH v2 26/26] drm/amdgpu: Use dal driver for Carrizo, Tonga, and Fiji Date: Tue, 16 Feb 2016 17:28:06 -0500 Message-ID: <123e02e36bb33279182f736928799c2fe8002ca9.1455660367.git.harry.wentland@amd.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: References: <1455211209-26733-1-git-send-email-harry.wentland@amd.com> MIME-Version: 1.0 X-EOPAttributedMessage: 0 X-Forefront-Antispam-Report: CIP:165.204.84.221; CTRY:US; IPV:NLI; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(2980300002)(428002)(199003)(189002)(19580405001)(4326007)(5003600100002)(19580395003)(11100500001)(575784001)(47776003)(86362001)(2950100001)(50466002)(1096002)(5003940100001)(5008740100001)(2906002)(77096005)(586003)(53416004)(33646002)(36756003)(76176999)(92566002)(189998001)(50226001)(50986999)(229853001)(87936001)(118296001)(450100001)(110136002)(101416001)(106466001)(48376002)(1220700001)(105586002)(2351001); DIR:OUT; SFP:1101; SCL:1; SRVR:BN4PR12MB0849; H:atltwp01.amd.com; FPR:; SPF:None; MLV:sfv; A:1; MX:1; LANG:en; X-MS-Office365-Filtering-Correlation-Id: 08c36ca9-732a-4cbc-8e68-08d337208f24 X-Microsoft-Exchange-Diagnostics: 1; BN4PR12MB0849; 2:rRCk7eDzvGjXW3AuxQlUs+9wPgbI6pE69Nr3YEv2B69xagtNlgYvRXKmNswbmXQLM76KA9oTQ4J1asL9F44IV+bY+yBoDotU8fy/aO2cGTU4LpnMZMX9uJvIYLQ+bvFEHG+BZ0xnTlGt9T4ixBTI6ZM+jmtTWHpzt/FKRT0I4mau4nxCb9xhvmwJFtdb66XO; 3:UkG0dM8z9R4l6W/eJxXAK3ry/8rNnIbg67SPhH6CvWXdt4nAwajWI9fkx5VN2qRfMqS0yxV9DlM37NcW/YqfM6UYdqAcfud5ctJggeJ9HVYlNnFCAQYIpStJZyDy22my2k8OfyRcz9fo9QB6pcnciia1/Ur/BvHO1Sdmcwb4lclxBWD78ALYiuQ7v4A5BPrVm3E/y+t9tQKmafbarPmtBajFVUtscmNC29uy0KfbNLM=; 25:ZbKGxb0PSRl/Ox+qhN/hapiPnUntEqr3s2cpA1u47BE2AegBpTPe9IPA7MkkBUsy9bAPuPo8xMjaIN8xqc/LS/MK0lmxWFLqpOuMhQhm9JWWTMwKTvpR+rRb5iKoISe7DHxIPYQMEFV6/90Jq6+0z/BR222nZ02Pm2Rr2ra1kxal+yVhf8AmhBcJeMxiIGluCAPV4On4igISdGhg7vnWzgj/xmVAETwJAbVyA3wvmjXv11IHfw3bNvL2QKH7gdYtJGYYhzloQk9pvi/KciOLhsMbu/ppdfXd4xtcfU/uBJ0e2xdC8rB/1KxRh4bUQsHn X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BN4PR12MB0849; X-Microsoft-Exchange-Diagnostics: 1; BN4PR12MB0849; 20:3c66xbRqyRq4nC2kb3AFu9/ltX7Z9qQzNPieObxDLPLpaoUZH7rC7LVuka5D5+7iGYUUayl0+xvo8OvcsWEdQl9TaVzZED4eDszPUCtTHalCd0AG8YiDNJdPaSNWIP0Q20hJyJXMkcbaneWGSsEb/4Fub7uLClA62N0GH+ccUWuAAiuICLSNTp78S87DfqDYiK+JmXJmbfCp9uL4RwjAZtriQwNTN0P/0W8i+5DHHiNS5CCaNw+YWlGpCw4A7OzFZMg2t9lFTtT6aT/568vmNiPGfE8rQfVgQzsX4kzM84pgUlp2ql5ZClZ0TNpDZ0FRWLqxLrQWeZQIw/4S0PK4wW+tvuIM0RZgievxiCq/rCetjzWu+j+YqdRr5jdwyMIegNTHXKDX7VE4yjZLEf2oK3xNchDhDOXRCJY+KBWA+vhnhblZaI+BmWOzgKuHazJK/WtQnr7shk0vCx/aDT9mSbzzoO4rI11tuf71ykECa1dokBObEMQR8Uwlyk5+Vj+C X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(5005006)(13018025)(13017025)(13024025)(13023025)(13015025)(8121501046)(10201501046)(3002001); SRVR:BN4PR12MB0849; BCL:0; PCL:0; RULEID:; SRVR:BN4PR12MB0849; X-Microsoft-Exchange-Diagnostics: 1; BN4PR12MB0849; 4:gY9Z1TwRiaBAF8Wj/bpV2phfF2w6zaAK5q3AXnP4mECtZYW1d43Up8bJ3bG7CCB0IwQGlpW2i326d8APDjo0faWVDcj4KALscUFrVRxMc3s286O8f5JyxRNcogQtGyEDkXtc4eA1zLCY+UjcOMjE1ojtXrDKonqF4+PZc/J4QbSIeNAozUhlT37DBKyLGE4Ql7ZWoWZyUZf7ZZ8dG5cOZAtnmcF0WtDAqQ+hsczLdnz14stcPL7VXao1miM4QnaIdr4/9d8Zx4fcoMMynMcmmm0HdbmFkpeskb0piPzjhTXWNGLVm3LRN1pDQ34vrqOLD8dv1RuQ9q33uNVQHKNIoklmIA0bmWNIncbjp328rgsiiZQG4IAvvULoo2lEUv5nHMmsCaMk6Aw7DOUdGGY6ecCLELBSi87n2IaoalYIfrbYO7tgeh9Cm5O1kgGC6pxfqu+rahwRf6EyDh0JASIsne8bwR4ChziuznJhtV4EHKKTjSVuDRjCCPbXV+Pd6icO X-Forefront-PRVS: 0854128AF0 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BN4PR12MB0849; 23:JvUSMhfn5VaRgxI3UnHN2uhnewcqMc/CD4pivv1uI?= =?us-ascii?Q?s4gpdvhyYqKS9sruhrwv9vWI3qGVNlxhW+2jnHIuOtPzpsf3e7rbeeoax3HM?= =?us-ascii?Q?4BLyxT+ekyG2N7FsS+cklxS9xAzPQ5kaKm6KejSgGJz2ZyKlu6kaaGz0RTkD?= =?us-ascii?Q?jMqn9XAiOdmkkJm5wmEpGNbnXTFWwy8qYq3E9Ey+rAenZR6UcopTh6Ch11cp?= =?us-ascii?Q?79KmGTts75DMjLrimr/K48w9i+0+Vs+vBUXoSgOuWZBit/SG3//boJ6ALIii?= =?us-ascii?Q?xORKfo2HLZQ01ES0SIXZVVgDoGtP7x76CaryqAmtRbSxbOP/UuHj2VUvgxYW?= =?us-ascii?Q?hl5XvyPE+0yfBbqEnrzY3WPsOKGse2gDICJ74OPMv8EBpLn+ILnZLWXPf8Fw?= =?us-ascii?Q?0/o2tHs/7B3W4YuCvZFMsH/PxP2Qp30HrlwS1B8PZz8sGbvRMWSBocV4MLLN?= =?us-ascii?Q?ySQxyVs8KyFX4P0lMFhUgaeT0kb0Ap5waAoN6d3zM02NS8SZiL+vCJppsO09?= =?us-ascii?Q?EBZJgnGyQQDYgWgfw2diU9SE+tJjqqcS6hZJvLenHsJPdrru7ZY81m3+4bOu?= =?us-ascii?Q?hBs+H/IK4H0TAp5pWoLrx2rC44fCyfkGUrR7ysS0x4RZGBoSkHGpzr0/bSyW?= =?us-ascii?Q?Y+uhkUr+EpdNZJyrY4LzgYkcA/U81icL9B/ggB/XyT3wzowMFSIqrpTWV4Ul?= =?us-ascii?Q?eQp+DmY8d4M/aBDaQh8eb7t9jT7CnuJSL3C+ySFRV0ynIa2C24/7fhBbu4oh?= =?us-ascii?Q?Jo9MShTqw/5dq0iRR016KcWb8Z20lv0cFfJux6awGv+ELk+/ZATU7iMgu2nw?= =?us-ascii?Q?LFYN3jKXsBsoKK7fsk5EkjVQrbwvpb8fo14PfvALhHrBUnFG0WMDVUUeWjDE?= =?us-ascii?Q?tfYKVgiRG/s9WKdnaevp4Z/dbfqr9DS9rx4PNVkiHUDS3alyUnBJ1IxhfALO?= =?us-ascii?Q?I107JI3+nIkDUJiSs8i+dXrNmEGjEAgSgZtHWloRdhsWNENS2r8xZ6S2Lbg/?= =?us-ascii?Q?3AinuqFWYGiIYKI19IGXp89DigMniHJvh/9jJQJlyxGdDYP5MBliv8bmoJ2n?= =?us-ascii?Q?YRtvoA=3D?= X-Microsoft-Exchange-Diagnostics: 1; BN4PR12MB0849; 5:fjaV3KzpNgsDD9yCBMk1t+nwnPj2h5WOoVHyC/wKDGdSSZyZbTse/xkKtNVSQQ4M7ShEA8vk7N1fmzZQYJIJUnT+bwla7dh1ZWXcpRoZxUBxfVlRSG1WOnOnlxYQfPNxWc1ocPnUhGdekB0cRzB+xg==; 24:pn6gunLwCR2OA4VpwmLQbhxwhhZGfUicO6+SUkq1RH69TS9gfoRRQzxvbrDNJ24udBjk96ncfUGJm6z+YirnMgtLDhirPaAPnSwgZJe4H30=; 20:6hSA1NQbYWy/diT45lby68Xxy2ZR2iQfNDFdodCcaEhr0nPQC7rtr030nm/BixlE25QgQPJEFuYePaLZzHPhprMuVzS8r7qqzvnbujBpRkDucIAQQnLE6ro4em7rrjXCuy+ffuAO0cY3CQgwJ7/j+Oj0kg7sC1kH0lgMv+2yY445OeTt/XuKMPXKtpzozvyqKVFpD297D+M/9UzGrjtkDwuyms7W2QOWyv7uY5UFqTCs9cAE8T4rcvA1N/zpZvaE SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Feb 2016 22:28:56.7984 (UTC) X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d; Ip=[165.204.84.221]; Helo=[atltwp01.amd.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN4PR12MB0849 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Spam-Status: No, score=-4.2 required=5.0 tests=BAD_ENC_HEADER,BAYES_00, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Start to use dal by default on Carrizo, Tonga, and Fiji ASICs. Signed-off-by: Harry Wentland Reviewed-by: Alex Deucher --- drivers/gpu/drm/amd/amdgpu/Kconfig | 3 + drivers/gpu/drm/amd/amdgpu/Makefile | 17 +- drivers/gpu/drm/amd/amdgpu/amdgpu.h | 10 +- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 69 ++++++-- drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 4 + drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c | 5 - drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c | 20 ++- drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h | 54 ++++++- drivers/gpu/drm/amd/amdgpu/vi.c | 250 +++++++++++++++++++++++++++++ 9 files changed, 402 insertions(+), 30 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/Kconfig b/drivers/gpu/drm/amd/amdgpu/Kconfig index b30fcfa4b1f2..3a37e37bef28 100644 --- a/drivers/gpu/drm/amd/amdgpu/Kconfig +++ b/drivers/gpu/drm/amd/amdgpu/Kconfig @@ -15,3 +15,6 @@ config DRM_AMDGPU_USERPTR help This option selects CONFIG_MMU_NOTIFIER if it isn't already selected to enabled full userptr support. + +source "drivers/gpu/drm/amd/dal/Kconfig" + diff --git a/drivers/gpu/drm/amd/amdgpu/Makefile b/drivers/gpu/drm/amd/amdgpu/Makefile index c7fcdcedaadb..c434ee5c589f 100644 --- a/drivers/gpu/drm/amd/amdgpu/Makefile +++ b/drivers/gpu/drm/amd/amdgpu/Makefile @@ -3,13 +3,19 @@ # Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher. FULL_AMD_PATH=$(src)/.. +DAL_FOLDER_NAME=dal +FULL_AMD_DAL_PATH = $(FULL_AMD_PATH)/$(DAL_FOLDER_NAME) ccflags-y := -Iinclude/drm -I$(FULL_AMD_PATH)/include/asic_reg \ -I$(FULL_AMD_PATH)/include \ -I$(FULL_AMD_PATH)/amdgpu \ -I$(FULL_AMD_PATH)/scheduler \ -I$(FULL_AMD_PATH)/powerplay/inc \ - -I$(FULL_AMD_PATH)/acp/include + -I$(FULL_AMD_PATH)/acp/include \ + -I$(FULL_AMD_DAL_PATH) \ + -I$(FULL_AMD_DAL_PATH)/include \ + -I$(FULL_AMD_DAL_PATH)/dc \ + -I$(FULL_AMD_DAL_PATH)/amdgpu_dm amdgpu-y := amdgpu_drv.o @@ -118,6 +124,15 @@ amdgpu-y += $(AMD_POWERPLAY_FILES) endif +ifneq ($(CONFIG_DRM_AMD_DAL),) + +RELATIVE_AMD_DAL_PATH = ../$(DAL_FOLDER_NAME) +include $(FULL_AMD_DAL_PATH)/Makefile + +amdgpu-y += $(AMD_DAL_FILES) + +endif + obj-$(CONFIG_DRM_AMDGPU)+= amdgpu.o CFLAGS_amdgpu_trace_points.o := -I$(src) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 99e660fec190..d154b3473ae8 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h @@ -54,6 +54,7 @@ #include "amdgpu_gds.h" #include "amd_powerplay.h" #include "amdgpu_acp.h" +#include "amdgpu_dm.h" #include "gpu_scheduler.h" @@ -85,6 +86,7 @@ extern int amdgpu_vm_debug; extern int amdgpu_sched_jobs; extern int amdgpu_sched_hw_submission; extern int amdgpu_powerplay; +extern int amdgpu_dal; #define AMDGPU_WAIT_IDLE_TIMEOUT_IN_MS 3000 #define AMDGPU_MAX_USEC_TIMEOUT 100000 /* 100 ms */ @@ -2017,6 +2019,7 @@ struct amdgpu_device { /* display */ struct amdgpu_mode_info mode_info; + /* For pre-DCE11. DCE11 and later are in "struct amdgpu_device->dm" */ struct work_struct hotplug_work; struct amdgpu_irq_src crtc_irq; struct amdgpu_irq_src pageflip_irq; @@ -2064,6 +2067,9 @@ struct amdgpu_device { /* GDS */ struct amdgpu_gds gds; + /* display related functionality */ + struct amdgpu_display_manager dm; + const struct amdgpu_ip_block_version *ip_blocks; int num_ip_blocks; struct amdgpu_ip_block_status *ip_block_status; @@ -2100,7 +2106,7 @@ void amdgpu_io_wreg(struct amdgpu_device *adev, u32 reg, u32 v); u32 amdgpu_mm_rdoorbell(struct amdgpu_device *adev, u32 index); void amdgpu_mm_wdoorbell(struct amdgpu_device *adev, u32 index, u32 v); - +bool amdgpu_device_has_dal_support(struct amdgpu_device *adev); /* * Cast helper */ @@ -2345,6 +2351,8 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring) #define amdgpu_gds_switch(adev, r, v, d, w, a) (adev)->gds.funcs->patch_gds_switch((r), (v), (d), (w), (a)) +#define amdgpu_has_dal_support(adev) (amdgpu_dal && amdgpu_device_has_dal_support(adev)) + /* Common functions */ int amdgpu_gpu_reset(struct amdgpu_device *adev); void amdgpu_pci_config_reset(struct amdgpu_device *adev); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index f0fb938457d9..3df6fe35ec63 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -1369,6 +1369,32 @@ static int amdgpu_resume(struct amdgpu_device *adev) return 0; } + +/** + * amdgpu_device_has_dal_support - check if dal is supported + * + * @adev: amdgpu_device_pointer + * + * Returns true for supported, false for not supported + */ +bool amdgpu_device_has_dal_support(struct amdgpu_device *adev) +{ + switch(adev->asic_type) { +#if defined(CONFIG_DRM_AMD_DAL) && defined(CONFIG_DRM_AMD_DAL_DCE11_0) + case CHIP_CARRIZO: + return true; +#endif +#if defined(CONFIG_DRM_AMD_DAL) && defined(CONFIG_DRM_AMD_DAL_DCE10_0) + case CHIP_TONGA: + case CHIP_FIJI: + return true; +#endif + default: + return false; + } +} + + /** * amdgpu_device_init - initialize the driver * @@ -1522,7 +1548,8 @@ int amdgpu_device_init(struct amdgpu_device *adev, return r; } /* init i2c buses */ - amdgpu_atombios_i2c_init(adev); + if (!amdgpu_has_dal_support(adev)) + amdgpu_atombios_i2c_init(adev); /* Fence driver */ r = amdgpu_fence_driver_init(adev); @@ -1628,7 +1655,8 @@ void amdgpu_device_fini(struct amdgpu_device *adev) adev->ip_block_status = NULL; adev->accel_working = false; /* free i2c buses */ - amdgpu_i2c_fini(adev); + if (!amdgpu_has_dal_support(adev)) + amdgpu_i2c_fini(adev); amdgpu_atombios_fini(adev); kfree(adev->bios); adev->bios = NULL; @@ -1676,12 +1704,14 @@ int amdgpu_suspend_kms(struct drm_device *dev, bool suspend, bool fbcon) drm_kms_helper_poll_disable(dev); - /* turn off display hw */ - drm_modeset_lock_all(dev); - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { - drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); + if (!amdgpu_has_dal_support(adev)) { + /* turn off display hw */ + drm_modeset_lock_all(dev); + list_for_each_entry(connector, &dev->mode_config.connector_list, head) { + drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); + } + drm_modeset_unlock_all(dev); } - drm_modeset_unlock_all(dev); /* unpin the front buffers and cursors */ list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { @@ -1773,6 +1803,9 @@ int amdgpu_resume_kms(struct drm_device *dev, bool resume, bool fbcon) r = amdgpu_resume(adev); + if (r) + DRM_ERROR("amdgpu_resume failed (%d).\n", r); + amdgpu_fence_driver_resume(adev); r = amdgpu_ib_ring_tests(adev); @@ -1803,17 +1836,25 @@ int amdgpu_resume_kms(struct drm_device *dev, bool resume, bool fbcon) /* blat the mode back in */ if (fbcon) { - drm_helper_resume_force_mode(dev); - /* turn on display hw */ - drm_modeset_lock_all(dev); - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { - drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON); + if (!amdgpu_has_dal_support(adev)) { + /* pre DCE11 */ + drm_helper_resume_force_mode(dev); + + /* turn on display hw */ + drm_modeset_lock_all(dev); + list_for_each_entry(connector, &dev->mode_config.connector_list, head) { + drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON); + } + drm_modeset_unlock_all(dev); } - drm_modeset_unlock_all(dev); } drm_kms_helper_poll_enable(dev); - drm_helper_hpd_irq_event(dev); + + if (!amdgpu_has_dal_support(adev)) + drm_helper_hpd_irq_event(dev); + else + drm_kms_helper_hotplug_event(dev); if (fbcon) { amdgpu_fbdev_set_suspend(adev, 0); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c index ce79a8b605a0..6f1dec5d76c7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c @@ -80,6 +80,7 @@ int amdgpu_exp_hw_support = 0; int amdgpu_sched_jobs = 32; int amdgpu_sched_hw_submission = 2; int amdgpu_powerplay = -1; +int amdgpu_dal = 1; MODULE_PARM_DESC(vramlimit, "Restrict VRAM for testing, in megabytes"); module_param_named(vramlimit, amdgpu_vram_limit, int, 0600); @@ -158,6 +159,9 @@ MODULE_PARM_DESC(powerplay, "Powerplay component (1 = enable, 0 = disable, -1 = module_param_named(powerplay, amdgpu_powerplay, int, 0444); #endif +MODULE_PARM_DESC(dal, "DAL display driver (1 = enable (default), 0 = disable)"); +module_param_named(dal, amdgpu_dal, int, 0444); + static struct pci_device_id pciidlist[] = { #ifdef CONFIG_DRM_AMDGPU_CIK /* Kaveri */ diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c index 919146780a15..e694c9983bbd 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c @@ -42,11 +42,6 @@ this contains a helper + a amdgpu fb the helper contains a pointer to amdgpu framebuffer baseclass. */ -struct amdgpu_fbdev { - struct drm_fb_helper helper; - struct amdgpu_framebuffer rfb; - struct amdgpu_device *adev; -}; static struct fb_ops amdgpufb_ops = { .owner = THIS_MODULE, diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c index f594cfaa97e5..4775930b678d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c @@ -36,6 +36,10 @@ #include +#ifdef CONFIG_DRM_AMD_DAL +#include "amdgpu_dm_irq.h" +#endif + #define AMDGPU_WAIT_IDLE_TIMEOUT 200 /* @@ -215,10 +219,7 @@ int amdgpu_irq_init(struct amdgpu_device *adev) int r = 0; spin_lock_init(&adev->irq.lock); - r = drm_vblank_init(adev->ddev, adev->mode_info.num_crtc); - if (r) { - return r; - } + /* enable msi */ adev->irq.msi_enabled = false; @@ -230,7 +231,16 @@ int amdgpu_irq_init(struct amdgpu_device *adev) } } - INIT_WORK(&adev->hotplug_work, amdgpu_hotplug_work_func); + if (!amdgpu_has_dal_support(adev)) { + r = drm_vblank_init(adev->ddev, adev->mode_info.num_crtc); + if (r) + return r; + + /* pre DCE11 */ + INIT_WORK(&adev->hotplug_work, + amdgpu_hotplug_work_func); + } + INIT_WORK(&adev->reset_work, amdgpu_irq_reset_work_func); adev->irq.installed = true; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h index fdc1be8550da..e2fb0c5bab82 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h @@ -35,11 +35,13 @@ #include #include #include -#include #include +#include #include #include +#include + struct amdgpu_bo; struct amdgpu_device; struct amdgpu_encoder; @@ -305,6 +307,18 @@ struct amdgpu_display_funcs { struct amdgpu_mode_mc_save *save); }; +struct amdgpu_framebuffer { + struct drm_framebuffer base; + struct drm_gem_object *obj; +}; + +struct amdgpu_fbdev { + struct drm_fb_helper helper; + struct amdgpu_framebuffer rfb; + struct list_head fbdev_list; + struct amdgpu_device *adev; +}; + struct amdgpu_mode_info { struct atom_context *atom_context; struct card_info *atom_card_info; @@ -410,6 +424,9 @@ struct amdgpu_crtc { u32 wm_high; u32 lb_vblank_lead_lines; struct drm_display_mode hw_mode; + + /* After Set Mode target will be non-NULL */ + struct dc_target *target; }; struct amdgpu_encoder_atom_dig { @@ -499,6 +516,13 @@ enum amdgpu_connector_dither { AMDGPU_FMT_DITHER_ENABLE = 1, }; +struct amdgpu_dm_dp_aux { + struct drm_dp_aux aux; + uint32_t link_index; +}; + +#define TO_DM_AUX(x) container_of((x), struct amdgpu_dm_dp_aux, aux) + struct amdgpu_connector { struct drm_connector base; uint32_t connector_id; @@ -510,6 +534,13 @@ struct amdgpu_connector { /* we need to mind the EDID between detect and get modes due to analog/digital/tvencoder */ struct edid *edid; + /* number of modes generated from EDID at 'dc_sink' */ + int num_modes; + /* The 'old' sink - before an HPD. + * The 'current' sink is in dc_link->sink. */ + const struct dc_sink *dc_sink; + const struct dc_link *dc_link; + const struct dc_target *target; void *con_priv; bool dac_load_detect; bool detected_by_load; /* if the connection status was determined by load */ @@ -520,11 +551,26 @@ struct amdgpu_connector { enum amdgpu_connector_audio audio; enum amdgpu_connector_dither dither; unsigned pixelclock_for_modeset; + + struct drm_dp_mst_topology_mgr mst_mgr; + struct amdgpu_dm_dp_aux dm_dp_aux; + struct drm_dp_mst_port *port; + struct amdgpu_connector *mst_port; + bool is_mst_connector; + struct amdgpu_encoder *mst_encoder; + struct semaphore mst_sem; }; -struct amdgpu_framebuffer { - struct drm_framebuffer base; - struct drm_gem_object *obj; +/* TODO: start to use this struct and remove same field from base one */ +struct amdgpu_mst_connector { + struct amdgpu_connector base; + + struct drm_dp_mst_topology_mgr mst_mgr; + struct amdgpu_dm_dp_aux dm_dp_aux; + struct drm_dp_mst_port *port; + struct amdgpu_connector *mst_port; + bool is_mst_connector; + struct amdgpu_encoder *mst_encoder; }; #define ENCODER_MODE_IS_DP(em) (((em) == ATOM_ENCODER_MODE_DP) || \ diff --git a/drivers/gpu/drm/amd/amdgpu/vi.c b/drivers/gpu/drm/amd/amdgpu/vi.c index 125003517544..4b27092d14c7 100644 --- a/drivers/gpu/drm/amd/amdgpu/vi.c +++ b/drivers/gpu/drm/amd/amdgpu/vi.c @@ -77,6 +77,7 @@ #if defined(CONFIG_DRM_AMD_ACP) #include "amdgpu_acp.h" #endif +#include "amdgpu_dm.h" /* * Indirect registers accessor @@ -984,6 +985,225 @@ static const struct amdgpu_ip_block_version cz_ip_blocks[] = #endif }; +/* + * This is temporary. After we've gone through full testing with + * DAL we want to remove dce_v11 + */ +#if defined(CONFIG_DRM_AMD_DAL) +static const struct amdgpu_ip_block_version cz_ip_blocks_dal[] = +{ + /* ORDER MATTERS! */ + { + .type = AMD_IP_BLOCK_TYPE_COMMON, + .major = 2, + .minor = 0, + .rev = 0, + .funcs = &vi_common_ip_funcs, + }, + { + .type = AMD_IP_BLOCK_TYPE_GMC, + .major = 8, + .minor = 0, + .rev = 0, + .funcs = &gmc_v8_0_ip_funcs, + }, + { + .type = AMD_IP_BLOCK_TYPE_IH, + .major = 3, + .minor = 0, + .rev = 0, + .funcs = &cz_ih_ip_funcs, + }, + { + .type = AMD_IP_BLOCK_TYPE_SMC, + .major = 8, + .minor = 0, + .rev = 0, + .funcs = &amdgpu_pp_ip_funcs + }, + { + .type = AMD_IP_BLOCK_TYPE_DCE, + .major = 11, + .minor = 0, + .rev = 0, + .funcs = &amdgpu_dm_funcs, + }, + { + .type = AMD_IP_BLOCK_TYPE_GFX, + .major = 8, + .minor = 0, + .rev = 0, + .funcs = &gfx_v8_0_ip_funcs, + }, + { + .type = AMD_IP_BLOCK_TYPE_SDMA, + .major = 3, + .minor = 0, + .rev = 0, + .funcs = &sdma_v3_0_ip_funcs, + }, + { + .type = AMD_IP_BLOCK_TYPE_UVD, + .major = 6, + .minor = 0, + .rev = 0, + .funcs = &uvd_v6_0_ip_funcs, + }, + { + .type = AMD_IP_BLOCK_TYPE_VCE, + .major = 3, + .minor = 0, + .rev = 0, + .funcs = &vce_v3_0_ip_funcs, + }, +#if defined(CONFIG_DRM_AMD_ACP) + { + .type = AMD_IP_BLOCK_TYPE_ACP, + .major = 2, + .minor = 2, + .rev = 0, + .funcs = &acp_ip_funcs, + }, +#endif +}; + +static const struct amdgpu_ip_block_version tonga_ip_blocks_dal[] = +{ + /* ORDER MATTERS! */ + { + .type = AMD_IP_BLOCK_TYPE_COMMON, + .major = 2, + .minor = 0, + .rev = 0, + .funcs = &vi_common_ip_funcs, + }, + { + .type = AMD_IP_BLOCK_TYPE_GMC, + .major = 8, + .minor = 0, + .rev = 0, + .funcs = &gmc_v8_0_ip_funcs, + }, + { + .type = AMD_IP_BLOCK_TYPE_IH, + .major = 3, + .minor = 0, + .rev = 0, + .funcs = &tonga_ih_ip_funcs, + }, + { + .type = AMD_IP_BLOCK_TYPE_SMC, + .major = 7, + .minor = 1, + .rev = 0, + .funcs = &amdgpu_pp_ip_funcs, + }, + { + .type = AMD_IP_BLOCK_TYPE_DCE, + .major = 10, + .minor = 0, + .rev = 0, + .funcs = &amdgpu_dm_funcs, + }, + { + .type = AMD_IP_BLOCK_TYPE_GFX, + .major = 8, + .minor = 0, + .rev = 0, + .funcs = &gfx_v8_0_ip_funcs, + }, + { + .type = AMD_IP_BLOCK_TYPE_SDMA, + .major = 3, + .minor = 0, + .rev = 0, + .funcs = &sdma_v3_0_ip_funcs, + }, + { + .type = AMD_IP_BLOCK_TYPE_UVD, + .major = 5, + .minor = 0, + .rev = 0, + .funcs = &uvd_v5_0_ip_funcs, + }, + { + .type = AMD_IP_BLOCK_TYPE_VCE, + .major = 3, + .minor = 0, + .rev = 0, + .funcs = &vce_v3_0_ip_funcs, + }, +}; + +static const struct amdgpu_ip_block_version fiji_ip_blocks_dal[] = +{ + /* ORDER MATTERS! */ + { + .type = AMD_IP_BLOCK_TYPE_COMMON, + .major = 2, + .minor = 0, + .rev = 0, + .funcs = &vi_common_ip_funcs, + }, + { + .type = AMD_IP_BLOCK_TYPE_GMC, + .major = 8, + .minor = 5, + .rev = 0, + .funcs = &gmc_v8_0_ip_funcs, + }, + { + .type = AMD_IP_BLOCK_TYPE_IH, + .major = 3, + .minor = 0, + .rev = 0, + .funcs = &tonga_ih_ip_funcs, + }, + { + .type = AMD_IP_BLOCK_TYPE_SMC, + .major = 7, + .minor = 1, + .rev = 0, + .funcs = &amdgpu_pp_ip_funcs, + }, + { + .type = AMD_IP_BLOCK_TYPE_DCE, + .major = 10, + .minor = 1, + .rev = 0, + .funcs = &amdgpu_dm_funcs, + }, + { + .type = AMD_IP_BLOCK_TYPE_GFX, + .major = 8, + .minor = 0, + .rev = 0, + .funcs = &gfx_v8_0_ip_funcs, + }, + { + .type = AMD_IP_BLOCK_TYPE_SDMA, + .major = 3, + .minor = 0, + .rev = 0, + .funcs = &sdma_v3_0_ip_funcs, + }, + { + .type = AMD_IP_BLOCK_TYPE_UVD, + .major = 6, + .minor = 0, + .rev = 0, + .funcs = &uvd_v6_0_ip_funcs, + }, + { + .type = AMD_IP_BLOCK_TYPE_VCE, + .major = 3, + .minor = 0, + .rev = 0, + .funcs = &vce_v3_0_ip_funcs, + }, +}; +#endif + int vi_set_ip_blocks(struct amdgpu_device *adev) { switch (adev->asic_type) { @@ -992,17 +1212,47 @@ int vi_set_ip_blocks(struct amdgpu_device *adev) adev->num_ip_blocks = ARRAY_SIZE(topaz_ip_blocks); break; case CHIP_FIJI: +#if defined(CONFIG_DRM_AMD_DAL) + if (amdgpu_dal && amdgpu_device_has_dal_support(adev)) { + adev->ip_blocks = fiji_ip_blocks_dal; + adev->num_ip_blocks = ARRAY_SIZE(fiji_ip_blocks_dal); + } else { + adev->ip_blocks = fiji_ip_blocks; + adev->num_ip_blocks = ARRAY_SIZE(fiji_ip_blocks); + } +#else adev->ip_blocks = fiji_ip_blocks; adev->num_ip_blocks = ARRAY_SIZE(fiji_ip_blocks); +#endif break; case CHIP_TONGA: +#if defined(CONFIG_DRM_AMD_DAL) + if (amdgpu_dal && amdgpu_device_has_dal_support(adev)) { + adev->ip_blocks = tonga_ip_blocks_dal; + adev->num_ip_blocks = ARRAY_SIZE(tonga_ip_blocks_dal); + } else { + adev->ip_blocks = tonga_ip_blocks; + adev->num_ip_blocks = ARRAY_SIZE(tonga_ip_blocks); + } +#else adev->ip_blocks = tonga_ip_blocks; adev->num_ip_blocks = ARRAY_SIZE(tonga_ip_blocks); +#endif break; case CHIP_CARRIZO: case CHIP_STONEY: +#if defined(CONFIG_DRM_AMD_DAL) + if (amdgpu_dal && amdgpu_device_has_dal_support(adev)) { + adev->ip_blocks = cz_ip_blocks_dal; + adev->num_ip_blocks = ARRAY_SIZE(cz_ip_blocks_dal); + } else { + adev->ip_blocks = cz_ip_blocks; + adev->num_ip_blocks = ARRAY_SIZE(cz_ip_blocks); + } +#else adev->ip_blocks = cz_ip_blocks; adev->num_ip_blocks = ARRAY_SIZE(cz_ip_blocks); +#endif break; default: /* FIXME: not supported yet */