From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2992670AbbHHQKl (ORCPT ); Sat, 8 Aug 2015 12:10:41 -0400 Received: from pandora.arm.linux.org.uk ([78.32.30.218]:45240 "EHLO pandora.arm.linux.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2992543AbbHHQKi (ORCPT ); Sat, 8 Aug 2015 12:10:38 -0400 In-Reply-To: <20150808160936.GN7557@n2100.arm.linux.org.uk> References: <20150808160936.GN7557@n2100.arm.linux.org.uk> From: Russell King To: linux-rockchip@lists.infradead.org, alsa-devel@alsa-project.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Cc: Philipp Zabel , Andy Yan , Yakir Yang , Fabio Estevam , Mark Brown , Takashi Iwai , Jaroslav Kysela , Sascha Hauer , Jon Nettleton , David Airlie Subject: [PATCH 4/9] drm: bridge/dw_hdmi-ahb-audio: allow larger buffer sizes MIME-Version: 1.0 Content-Disposition: inline Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="utf-8" Message-Id: Date: Sat, 08 Aug 2015 17:10:21 +0100 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org With multichannel audio, we need to allow larger buffer sizes to avoid XRUNs during playback. Push the buffer size up to 1024K, but as we maintain two buffers, ensure that the vmalloc buffer does not exceed the userspace buffer size. Signed-off-by: Russell King --- drivers/gpu/drm/bridge/dw_hdmi-ahb-audio.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/bridge/dw_hdmi-ahb-audio.c b/drivers/gpu/drm/bridge/dw_hdmi-ahb-audio.c index 3a8f32e04b63..4b537f9ce8f0 100644 --- a/drivers/gpu/drm/bridge/dw_hdmi-ahb-audio.c +++ b/drivers/gpu/drm/bridge/dw_hdmi-ahb-audio.c @@ -312,7 +312,7 @@ static struct snd_pcm_hardware dw_hdmi_hw = { SNDRV_PCM_RATE_192000, .channels_min = 2, .channels_max = 8, - .buffer_bytes_max = 64 * 1024, + .buffer_bytes_max = 1024 * 1024, .period_bytes_min = 256, .period_bytes_max = 8192, /* ERR004323: must limit to 8k */ .periods_min = 2, @@ -337,7 +337,15 @@ static int dw_hdmi_open(struct snd_pcm_substream *substream) if (ret < 0) return ret; - ret = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); + ret = snd_pcm_hw_constraint_integer(runtime, + SNDRV_PCM_HW_PARAM_PERIODS); + if (ret < 0) + return ret; + + /* Limit the buffer size to the size of the preallocated buffer */ + ret = snd_pcm_hw_constraint_minmax(runtime, + SNDRV_PCM_HW_PARAM_BUFFER_SIZE, + 0, substream->dma_buffer.bytes); if (ret < 0) return ret; @@ -387,6 +395,7 @@ static int dw_hdmi_hw_free(struct snd_pcm_substream *substream) static int dw_hdmi_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { + /* Allocate the PCM runtime buffer, which is exposed to userspace. */ return snd_pcm_lib_alloc_vmalloc_buffer(substream, params_buffer_bytes(params)); } @@ -552,8 +561,12 @@ static int snd_dw_hdmi_probe(struct platform_device *pdev) strlcpy(pcm->name, DRIVER_NAME, sizeof(pcm->name)); snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_dw_hdmi_ops); + /* + * To support 8-channel 96kHz audio reliably, we need 512k + * to satisfy alsa with our restricted period (ERR004323). + */ snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, - dev, 64 * 1024, 64 * 1024); + dev, 128 * 1024, 1024 * 1024); ret = snd_card_register(card); if (ret < 0) -- 2.1.0 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Russell King Subject: [PATCH 4/9] drm: bridge/dw_hdmi-ahb-audio: allow larger buffer sizes Date: Sat, 08 Aug 2015 17:10:21 +0100 Message-ID: References: <20150808160936.GN7557@n2100.arm.linux.org.uk> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20150808160936.GN7557@n2100.arm.linux.org.uk> Content-Disposition: inline List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: linux-rockchip@lists.infradead.org, alsa-devel@alsa-project.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Cc: Fabio Estevam , Jaroslav Kysela , Mark Brown , Yakir Yang , Andy Yan List-Id: alsa-devel@alsa-project.org V2l0aCBtdWx0aWNoYW5uZWwgYXVkaW8sIHdlIG5lZWQgdG8gYWxsb3cgbGFyZ2VyIGJ1ZmZlciBz aXplcyB0byBhdm9pZApYUlVOcyBkdXJpbmcgcGxheWJhY2suICBQdXNoIHRoZSBidWZmZXIgc2l6 ZSB1cCB0byAxMDI0SywgYnV0IGFzIHdlCm1haW50YWluIHR3byBidWZmZXJzLCBlbnN1cmUgdGhh dCB0aGUgdm1hbGxvYyBidWZmZXIgZG9lcyBub3QgZXhjZWVkCnRoZSB1c2Vyc3BhY2UgYnVmZmVy IHNpemUuCgpTaWduZWQtb2ZmLWJ5OiBSdXNzZWxsIEtpbmcgPHJtaytrZXJuZWxAYXJtLmxpbnV4 Lm9yZy51az4KLS0tCiBkcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2R3X2hkbWktYWhiLWF1ZGlvLmMg fCAxOSArKysrKysrKysrKysrKysrLS0tCiAxIGZpbGUgY2hhbmdlZCwgMTYgaW5zZXJ0aW9ucygr KSwgMyBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2R3 X2hkbWktYWhiLWF1ZGlvLmMgYi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2R3X2hkbWktYWhiLWF1 ZGlvLmMKaW5kZXggM2E4ZjMyZTA0YjYzLi40YjUzN2Y5Y2U4ZjAgMTAwNjQ0Ci0tLSBhL2RyaXZl cnMvZ3B1L2RybS9icmlkZ2UvZHdfaGRtaS1haGItYXVkaW8uYworKysgYi9kcml2ZXJzL2dwdS9k cm0vYnJpZGdlL2R3X2hkbWktYWhiLWF1ZGlvLmMKQEAgLTMxMiw3ICszMTIsNyBAQCBzdGF0aWMg c3RydWN0IHNuZF9wY21faGFyZHdhcmUgZHdfaGRtaV9odyA9IHsKIAkJIFNORFJWX1BDTV9SQVRF XzE5MjAwMCwKIAkuY2hhbm5lbHNfbWluID0gMiwKIAkuY2hhbm5lbHNfbWF4ID0gOCwKLQkuYnVm ZmVyX2J5dGVzX21heCA9IDY0ICogMTAyNCwKKwkuYnVmZmVyX2J5dGVzX21heCA9IDEwMjQgKiAx MDI0LAogCS5wZXJpb2RfYnl0ZXNfbWluID0gMjU2LAogCS5wZXJpb2RfYnl0ZXNfbWF4ID0gODE5 MiwJLyogRVJSMDA0MzIzOiBtdXN0IGxpbWl0IHRvIDhrICovCiAJLnBlcmlvZHNfbWluID0gMiwK QEAgLTMzNyw3ICszMzcsMTUgQEAgc3RhdGljIGludCBkd19oZG1pX29wZW4oc3RydWN0IHNuZF9w Y21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAK LQlyZXQgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihydW50aW1lLCBTTkRSVl9QQ01f SFdfUEFSQU1fUEVSSU9EUyk7CisJcmV0ID0gc25kX3BjbV9od19jb25zdHJhaW50X2ludGVnZXIo cnVudGltZSwKKwkJCQkJICAgIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKKwlpZiAocmV0 IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIExpbWl0IHRoZSBidWZmZXIgc2l6ZSB0byB0aGUg c2l6ZSBvZiB0aGUgcHJlYWxsb2NhdGVkIGJ1ZmZlciAqLworCXJldCA9IHNuZF9wY21faHdfY29u c3RyYWludF9taW5tYXgocnVudGltZSwKKwkJCQkJICAgU05EUlZfUENNX0hXX1BBUkFNX0JVRkZF Ul9TSVpFLAorCQkJCQkgICAwLCBzdWJzdHJlYW0tPmRtYV9idWZmZXIuYnl0ZXMpOwogCWlmIChy ZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0zODcsNiArMzk1LDcgQEAgc3RhdGljIGludCBk d19oZG1pX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiBzdGF0 aWMgaW50IGR3X2hkbWlfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3Ry ZWFtLAogCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQogeworCS8qIEFsbG9jYXRl IHRoZSBQQ00gcnVudGltZSBidWZmZXIsIHdoaWNoIGlzIGV4cG9zZWQgdG8gdXNlcnNwYWNlLiAq LwogCXJldHVybiBzbmRfcGNtX2xpYl9hbGxvY192bWFsbG9jX2J1ZmZlcihzdWJzdHJlYW0sCiAJ CQkJCQlwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcykpOwogfQpAQCAtNTUyLDggKzU2MSwxMiBA QCBzdGF0aWMgaW50IHNuZF9kd19oZG1pX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBk ZXYpCiAJc3RybGNweShwY20tPm5hbWUsIERSSVZFUl9OQU1FLCBzaXplb2YocGNtLT5uYW1lKSk7 CiAJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgJnNuZF9k d19oZG1pX29wcyk7CiAKKwkvKgorCSAqIFRvIHN1cHBvcnQgOC1jaGFubmVsIDk2a0h6IGF1ZGlv IHJlbGlhYmx5LCB3ZSBuZWVkIDUxMmsKKwkgKiB0byBzYXRpc2Z5IGFsc2Egd2l0aCBvdXIgcmVz dHJpY3RlZCBwZXJpb2QgKEVSUjAwNDMyMykuCisJICovCiAJc25kX3BjbV9saWJfcHJlYWxsb2Nh dGVfcGFnZXNfZm9yX2FsbChwY20sIFNORFJWX0RNQV9UWVBFX0RFViwKLQkJCWRldiwgNjQgKiAx MDI0LCA2NCAqIDEwMjQpOworCQkJZGV2LCAxMjggKiAxMDI0LCAxMDI0ICogMTAyNCk7CiAKIAly ZXQgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKIAlpZiAocmV0IDwgMCkKLS0gCjIuMS4wCgpf X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwg bWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cDovL2xpc3Rz LmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo= From mboxrd@z Thu Jan 1 00:00:00 1970 From: rmk+kernel@arm.linux.org.uk (Russell King) Date: Sat, 08 Aug 2015 17:10:21 +0100 Subject: [PATCH 4/9] drm: bridge/dw_hdmi-ahb-audio: allow larger buffer sizes In-Reply-To: <20150808160936.GN7557@n2100.arm.linux.org.uk> References: <20150808160936.GN7557@n2100.arm.linux.org.uk> Message-ID: To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org With multichannel audio, we need to allow larger buffer sizes to avoid XRUNs during playback. Push the buffer size up to 1024K, but as we maintain two buffers, ensure that the vmalloc buffer does not exceed the userspace buffer size. Signed-off-by: Russell King --- drivers/gpu/drm/bridge/dw_hdmi-ahb-audio.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/bridge/dw_hdmi-ahb-audio.c b/drivers/gpu/drm/bridge/dw_hdmi-ahb-audio.c index 3a8f32e04b63..4b537f9ce8f0 100644 --- a/drivers/gpu/drm/bridge/dw_hdmi-ahb-audio.c +++ b/drivers/gpu/drm/bridge/dw_hdmi-ahb-audio.c @@ -312,7 +312,7 @@ static struct snd_pcm_hardware dw_hdmi_hw = { SNDRV_PCM_RATE_192000, .channels_min = 2, .channels_max = 8, - .buffer_bytes_max = 64 * 1024, + .buffer_bytes_max = 1024 * 1024, .period_bytes_min = 256, .period_bytes_max = 8192, /* ERR004323: must limit to 8k */ .periods_min = 2, @@ -337,7 +337,15 @@ static int dw_hdmi_open(struct snd_pcm_substream *substream) if (ret < 0) return ret; - ret = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); + ret = snd_pcm_hw_constraint_integer(runtime, + SNDRV_PCM_HW_PARAM_PERIODS); + if (ret < 0) + return ret; + + /* Limit the buffer size to the size of the preallocated buffer */ + ret = snd_pcm_hw_constraint_minmax(runtime, + SNDRV_PCM_HW_PARAM_BUFFER_SIZE, + 0, substream->dma_buffer.bytes); if (ret < 0) return ret; @@ -387,6 +395,7 @@ static int dw_hdmi_hw_free(struct snd_pcm_substream *substream) static int dw_hdmi_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) { + /* Allocate the PCM runtime buffer, which is exposed to userspace. */ return snd_pcm_lib_alloc_vmalloc_buffer(substream, params_buffer_bytes(params)); } @@ -552,8 +561,12 @@ static int snd_dw_hdmi_probe(struct platform_device *pdev) strlcpy(pcm->name, DRIVER_NAME, sizeof(pcm->name)); snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_dw_hdmi_ops); + /* + * To support 8-channel 96kHz audio reliably, we need 512k + * to satisfy alsa with our restricted period (ERR004323). + */ snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, - dev, 64 * 1024, 64 * 1024); + dev, 128 * 1024, 1024 * 1024); ret = snd_card_register(card); if (ret < 0) -- 2.1.0