mirror of
https://github.com/archr-linux/Arch-R.git
synced 2026-03-31 14:41:55 -07:00
@@ -3,8 +3,8 @@
|
||||
# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv)
|
||||
|
||||
PKG_NAME="iwlwifi-firmware"
|
||||
PKG_VERSION="2eb6baa08b3a3c9bf3f9f12ec6d9b94eca1d36e7"
|
||||
PKG_SHA256="2641d8587536f646e28468dad6cda962fbdee9c45571075546135c4ca8776162"
|
||||
PKG_VERSION="83d522a7b8c7fab580a8a7cbe6a8637d206d0cc3"
|
||||
PKG_SHA256="f7e0124f15461fefbd93b6323dcde451362d81fee9da331f6168dec028a453d4"
|
||||
PKG_LICENSE="Free-to-use"
|
||||
PKG_SITE="https://github.com/LibreELEC/iwlwifi-firmware"
|
||||
PKG_URL="https://github.com/LibreELEC/iwlwifi-firmware/archive/${PKG_VERSION}.tar.gz"
|
||||
|
||||
@@ -29,8 +29,8 @@ case "${LINUX}" in
|
||||
PKG_SOURCE_NAME="linux-${LINUX}-${PKG_VERSION}.tar.gz"
|
||||
;;
|
||||
*)
|
||||
PKG_VERSION="6.1.23"
|
||||
PKG_SHA256="7458372e8750afe37fd1ac3e7ab3c22f2c6018f760f8134055a03f54aba3ebeb"
|
||||
PKG_VERSION="6.3"
|
||||
PKG_SHA256="ba3491f5ed6bd270a370c440434e3d69085fcdd528922fa01e73d7657db73b1e"
|
||||
PKG_URL="https://www.kernel.org/pub/linux/kernel/v${PKG_VERSION/.*/}.x/${PKG_NAME}-${PKG_VERSION}.tar.xz"
|
||||
PKG_PATCH_DIRS="default"
|
||||
;;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,231 +0,0 @@
|
||||
From: Sascha Hauer <s.hauer@pengutronix.de>
|
||||
To: linux-wireless@vger.kernel.org
|
||||
Cc: Neo Jou <neojou@gmail.com>, Hans Ulli Kroll <linux@ulli-kroll.de>,
|
||||
Ping-Ke Shih <pkshih@realtek.com>,
|
||||
Yan-Hsuan Chuang <tony0620emma@gmail.com>,
|
||||
Kalle Valo <kvalo@kernel.org>, netdev@vger.kernel.org,
|
||||
linux-kernel@vger.kernel.org,
|
||||
Martin Blumenstingl <martin.blumenstingl@googlemail.com>,
|
||||
kernel@pengutronix.de, Alexander Hochbaum <alex@appudo.com>,
|
||||
Da Xue <da@libre.computer>, Po-Hao Huang <phhuang@realtek.com>,
|
||||
Andreas Henriksson <andreas@fatal.se>,
|
||||
Viktor Petrenko <g0000ga@gmail.com>,
|
||||
Sascha Hauer <s.hauer@pengutronix.de>
|
||||
Subject: [PATCH v2 0/3] wifi: rtw88: USB fixes
|
||||
Date: Fri, 10 Feb 2023 12:16:29 +0100
|
||||
Message-Id: <20230210111632.1985205-1-s.hauer@pengutronix.de>
|
||||
X-Mailer: git-send-email 2.30.2
|
||||
MIME-Version: 1.0
|
||||
X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2
|
||||
X-SA-Exim-Mail-From: sha@pengutronix.de
|
||||
X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de);
|
||||
SAEximRunCond expanded to false
|
||||
X-PTX-Original-Recipient: linux-wireless@vger.kernel.org
|
||||
Precedence: bulk
|
||||
List-ID: <linux-wireless.vger.kernel.org>
|
||||
X-Mailing-List: linux-wireless@vger.kernel.org
|
||||
|
||||
This series addresses issues for the recently added RTW88 USB support
|
||||
reported by Andreas Henriksson and also our customer.
|
||||
|
||||
The hardware can't handle urbs that have a size of multiple of the
|
||||
bulkout_size (usually 512 bytes). The symptom is that the hardware
|
||||
stalls completely. The issue can be reproduced by sending a suitably
|
||||
sized ping packet from the device:
|
||||
|
||||
ping -s 394 <somehost>
|
||||
|
||||
(It's 394 bytes here on a RTL8822CU and RTL8821CU, the actual size may
|
||||
differ on other chips, it was 402 bytes on a RTL8723DU)
|
||||
|
||||
Other than that qsel was not set correctly. The sympton here is that
|
||||
only one of multiple bulk endpoints was used to send data.
|
||||
|
||||
Changes since v1:
|
||||
- Use URB_ZERO_PACKET to let the USB host controller handle it automatically
|
||||
rather than working around the issue.
|
||||
|
||||
Sascha Hauer (3):
|
||||
wifi: rtw88: usb: Set qsel correctly
|
||||
wifi: rtw88: usb: send Zero length packets if necessary
|
||||
wifi: rtw88: usb: drop now unnecessary URB size check
|
||||
|
||||
drivers/net/wireless/realtek/rtw88/usb.c | 18 +++---------------
|
||||
1 file changed, 3 insertions(+), 15 deletions(-)
|
||||
Reported-by: Andreas Henriksson <andreas@fatal.se>
|
||||
Tested-by: Andreas Henriksson <andreas@fatal.se>
|
||||
|
||||
From: Sascha Hauer <s.hauer@pengutronix.de>
|
||||
To: linux-wireless@vger.kernel.org
|
||||
Cc: Neo Jou <neojou@gmail.com>, Hans Ulli Kroll <linux@ulli-kroll.de>,
|
||||
Ping-Ke Shih <pkshih@realtek.com>,
|
||||
Yan-Hsuan Chuang <tony0620emma@gmail.com>,
|
||||
Kalle Valo <kvalo@kernel.org>, netdev@vger.kernel.org,
|
||||
linux-kernel@vger.kernel.org,
|
||||
Martin Blumenstingl <martin.blumenstingl@googlemail.com>,
|
||||
kernel@pengutronix.de, Alexander Hochbaum <alex@appudo.com>,
|
||||
Da Xue <da@libre.computer>, Po-Hao Huang <phhuang@realtek.com>,
|
||||
Andreas Henriksson <andreas@fatal.se>,
|
||||
Viktor Petrenko <g0000ga@gmail.com>,
|
||||
Sascha Hauer <s.hauer@pengutronix.de>
|
||||
Subject: [PATCH v2 1/3] wifi: rtw88: usb: Set qsel correctly
|
||||
Date: Fri, 10 Feb 2023 12:16:30 +0100
|
||||
Message-Id: <20230210111632.1985205-2-s.hauer@pengutronix.de>
|
||||
X-Mailer: git-send-email 2.30.2
|
||||
In-Reply-To: <20230210111632.1985205-1-s.hauer@pengutronix.de>
|
||||
References: <20230210111632.1985205-1-s.hauer@pengutronix.de>
|
||||
MIME-Version: 1.0
|
||||
X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2
|
||||
X-SA-Exim-Mail-From: sha@pengutronix.de
|
||||
X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de);
|
||||
SAEximRunCond expanded to false
|
||||
X-PTX-Original-Recipient: linux-wireless@vger.kernel.org
|
||||
Precedence: bulk
|
||||
List-ID: <linux-wireless.vger.kernel.org>
|
||||
X-Mailing-List: linux-wireless@vger.kernel.org
|
||||
|
||||
We have to extract qsel from the skb before doing skb_push() on it,
|
||||
otherwise qsel will always be 0.
|
||||
|
||||
Fixes: a82dfd33d1237 ("wifi: rtw88: Add common USB chip support")
|
||||
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/usb.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
index 4ef38279b64c9..d9e995544e405 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
@@ -471,9 +471,9 @@ static int rtw_usb_tx_write(struct rtw_dev *rtwdev,
|
||||
u8 *pkt_desc;
|
||||
int ep;
|
||||
|
||||
+ pkt_info->qsel = rtw_usb_tx_queue_mapping_to_qsel(skb);
|
||||
pkt_desc = skb_push(skb, chip->tx_pkt_desc_sz);
|
||||
memset(pkt_desc, 0, chip->tx_pkt_desc_sz);
|
||||
- pkt_info->qsel = rtw_usb_tx_queue_mapping_to_qsel(skb);
|
||||
ep = qsel_to_ep(rtwusb, pkt_info->qsel);
|
||||
rtw_tx_fill_tx_desc(pkt_info, skb);
|
||||
rtw_tx_fill_txdesc_checksum(rtwdev, pkt_info, skb->data);
|
||||
|
||||
From: Sascha Hauer <s.hauer@pengutronix.de>
|
||||
To: linux-wireless@vger.kernel.org
|
||||
Cc: Neo Jou <neojou@gmail.com>, Hans Ulli Kroll <linux@ulli-kroll.de>,
|
||||
Ping-Ke Shih <pkshih@realtek.com>,
|
||||
Yan-Hsuan Chuang <tony0620emma@gmail.com>,
|
||||
Kalle Valo <kvalo@kernel.org>, netdev@vger.kernel.org,
|
||||
linux-kernel@vger.kernel.org,
|
||||
Martin Blumenstingl <martin.blumenstingl@googlemail.com>,
|
||||
kernel@pengutronix.de, Alexander Hochbaum <alex@appudo.com>,
|
||||
Da Xue <da@libre.computer>, Po-Hao Huang <phhuang@realtek.com>,
|
||||
Andreas Henriksson <andreas@fatal.se>,
|
||||
Viktor Petrenko <g0000ga@gmail.com>,
|
||||
Sascha Hauer <s.hauer@pengutronix.de>
|
||||
Subject: [PATCH v2 2/3] wifi: rtw88: usb: send Zero length packets if
|
||||
necessary
|
||||
Date: Fri, 10 Feb 2023 12:16:31 +0100
|
||||
Message-Id: <20230210111632.1985205-3-s.hauer@pengutronix.de>
|
||||
X-Mailer: git-send-email 2.30.2
|
||||
In-Reply-To: <20230210111632.1985205-1-s.hauer@pengutronix.de>
|
||||
References: <20230210111632.1985205-1-s.hauer@pengutronix.de>
|
||||
MIME-Version: 1.0
|
||||
X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2
|
||||
X-SA-Exim-Mail-From: sha@pengutronix.de
|
||||
X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de);
|
||||
SAEximRunCond expanded to false
|
||||
X-PTX-Original-Recipient: linux-wireless@vger.kernel.org
|
||||
Precedence: bulk
|
||||
List-ID: <linux-wireless.vger.kernel.org>
|
||||
X-Mailing-List: linux-wireless@vger.kernel.org
|
||||
|
||||
Zero length packets are necessary when sending URBs with size
|
||||
multiple of bulkout_size, otherwise the hardware just stalls.
|
||||
|
||||
Fixes: a82dfd33d1237 ("wifi: rtw88: Add common USB chip support")
|
||||
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/usb.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
index d9e995544e405..1a09c9288198a 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
@@ -271,6 +271,7 @@ static int rtw_usb_write_port(struct rtw_dev *rtwdev, u8 qsel, struct sk_buff *s
|
||||
return -ENOMEM;
|
||||
|
||||
usb_fill_bulk_urb(urb, usbd, pipe, skb->data, skb->len, cb, context);
|
||||
+ urb->transfer_flags |= URB_ZERO_PACKET;
|
||||
ret = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
|
||||
usb_free_urb(urb);
|
||||
|
||||
From: Sascha Hauer <s.hauer@pengutronix.de>
|
||||
To: linux-wireless@vger.kernel.org
|
||||
Cc: Neo Jou <neojou@gmail.com>, Hans Ulli Kroll <linux@ulli-kroll.de>,
|
||||
Ping-Ke Shih <pkshih@realtek.com>,
|
||||
Yan-Hsuan Chuang <tony0620emma@gmail.com>,
|
||||
Kalle Valo <kvalo@kernel.org>, netdev@vger.kernel.org,
|
||||
linux-kernel@vger.kernel.org,
|
||||
Martin Blumenstingl <martin.blumenstingl@googlemail.com>,
|
||||
kernel@pengutronix.de, Alexander Hochbaum <alex@appudo.com>,
|
||||
Da Xue <da@libre.computer>, Po-Hao Huang <phhuang@realtek.com>,
|
||||
Andreas Henriksson <andreas@fatal.se>,
|
||||
Viktor Petrenko <g0000ga@gmail.com>,
|
||||
Sascha Hauer <s.hauer@pengutronix.de>
|
||||
Subject: [PATCH v2 3/3] wifi: rtw88: usb: drop now unnecessary URB size check
|
||||
Date: Fri, 10 Feb 2023 12:16:32 +0100
|
||||
Message-Id: <20230210111632.1985205-4-s.hauer@pengutronix.de>
|
||||
X-Mailer: git-send-email 2.30.2
|
||||
In-Reply-To: <20230210111632.1985205-1-s.hauer@pengutronix.de>
|
||||
References: <20230210111632.1985205-1-s.hauer@pengutronix.de>
|
||||
MIME-Version: 1.0
|
||||
X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2
|
||||
X-SA-Exim-Mail-From: sha@pengutronix.de
|
||||
X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de);
|
||||
SAEximRunCond expanded to false
|
||||
X-PTX-Original-Recipient: linux-wireless@vger.kernel.org
|
||||
Precedence: bulk
|
||||
List-ID: <linux-wireless.vger.kernel.org>
|
||||
X-Mailing-List: linux-wireless@vger.kernel.org
|
||||
|
||||
Now that we send URBs with the URB_ZERO_PACKET flag set we no longer
|
||||
need to make sure that the URB sizes are not multiple of the
|
||||
bulkout_size. Drop the check.
|
||||
|
||||
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/usb.c | 15 +--------------
|
||||
1 file changed, 1 insertion(+), 14 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
index 1a09c9288198a..2a8336b1847a5 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
@@ -414,24 +414,11 @@ static int rtw_usb_write_data_rsvd_page(struct rtw_dev *rtwdev, u8 *buf,
|
||||
u32 size)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
- struct rtw_usb *rtwusb;
|
||||
struct rtw_tx_pkt_info pkt_info = {0};
|
||||
- u32 len, desclen;
|
||||
-
|
||||
- rtwusb = rtw_get_usb_priv(rtwdev);
|
||||
|
||||
pkt_info.tx_pkt_size = size;
|
||||
pkt_info.qsel = TX_DESC_QSEL_BEACON;
|
||||
-
|
||||
- desclen = chip->tx_pkt_desc_sz;
|
||||
- len = desclen + size;
|
||||
- if (len % rtwusb->bulkout_size == 0) {
|
||||
- len += RTW_USB_PACKET_OFFSET_SZ;
|
||||
- pkt_info.offset = desclen + RTW_USB_PACKET_OFFSET_SZ;
|
||||
- pkt_info.pkt_offset = 1;
|
||||
- } else {
|
||||
- pkt_info.offset = desclen;
|
||||
- }
|
||||
+ pkt_info.offset = chip->tx_pkt_desc_sz;
|
||||
|
||||
return rtw_usb_write_data(rtwdev, &pkt_info, buf);
|
||||
}
|
||||
@@ -1,303 +0,0 @@
|
||||
From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
To: linux-wireless@vger.kernel.org
|
||||
Cc: tony0620emma@gmail.com, kvalo@kernel.org, pkshih@realtek.com,
|
||||
s.hauer@pengutronix.de, netdev@vger.kernel.org,
|
||||
linux-kernel@vger.kernel.org,
|
||||
Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
Subject: [PATCH v3 0/3] wifi: rtw88: Three locking fixes for existing code
|
||||
Date: Sun, 8 Jan 2023 22:13:21 +0100
|
||||
Message-Id: <20230108211324.442823-1-martin.blumenstingl@googlemail.com>
|
||||
X-Mailer: git-send-email 2.39.0
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Precedence: bulk
|
||||
List-ID: <linux-wireless.vger.kernel.org>
|
||||
X-Mailing-List: linux-wireless@vger.kernel.org
|
||||
|
||||
This series consists of three patches which are fixing existing
|
||||
behavior (meaning: it either affects PCIe or USB or both) in the rtw88
|
||||
driver.
|
||||
We previously had discussed patches for these locking issues while
|
||||
working on SDIO support, but the problem never ocurred while testing
|
||||
USB cards. It turns out that these are still needed and I think that
|
||||
they also fix the same problems for USB users (it's not clear how often
|
||||
it happens there though) - and possibly even PCIe card users.
|
||||
|
||||
The issue fixed by the second and third patches have been spotted by a
|
||||
user who tested rtw88 SDIO support. Everything is working fine for him
|
||||
but there are warnings [1] and [2] in the kernel log stating "Voluntary
|
||||
context switch within RCU read-side critical section!".
|
||||
|
||||
The solution in the third and fourth patch was actually suggested by
|
||||
Ping-Ke in [3]. Thanks again!
|
||||
|
||||
These fixes are indepdent of my other series adding SDIO support to the
|
||||
rtw88 driver, meaning they can be added to the wireless driver tree on
|
||||
top of Linux 6.2-rc1 or linux-next.
|
||||
|
||||
|
||||
Changes since v1 at [4]:
|
||||
- Keep the u8 bitfields in patch 1 but split the res2 field into res2_1
|
||||
and res2_2 as suggested by Ping-Ke
|
||||
- Added Ping-Ke's reviewed-by to patches 2-4 - thank you!
|
||||
- Added a paragraph in the cover-letter to avoid confusion whether
|
||||
these patches depend on the rtw88 SDIO support series
|
||||
|
||||
Changes since v2 at [5]:
|
||||
- Added Ping-Ke's Reviewed-by and Sascha's Tested-by (thanks to both of
|
||||
you!)
|
||||
- Dropped patch 1/4 "rtw88: Add packed attribute to the eFuse structs"
|
||||
This requires more discussion. I'll send a separate patch for this.
|
||||
- Updated cover letter title so it's clear that this is independent of
|
||||
SDIO support code
|
||||
|
||||
|
||||
[0] https://lore.kernel.org/linux-wireless/695c976e02ed44a2b2345a3ceb226fc4@realtek.com/
|
||||
[1] https://github.com/LibreELEC/LibreELEC.tv/pull/7301#issuecomment-1366421445
|
||||
[2] https://github.com/LibreELEC/LibreELEC.tv/pull/7301#issuecomment-1366610249
|
||||
[3] https://lore.kernel.org/lkml/e0aa1ba4336ab130712e1fcb425e6fd0adca4145.camel@realtek.com/
|
||||
[4] https://lore.kernel.org/linux-wireless/20221228133547.633797-1-martin.blumenstingl@googlemail.com/
|
||||
[5] https://lore.kernel.org/linux-wireless/20221229124845.1155429-1-martin.blumenstingl@googlemail.com/
|
||||
|
||||
|
||||
Martin Blumenstingl (3):
|
||||
wifi: rtw88: Move register access from rtw_bf_assoc() outside the RCU
|
||||
wifi: rtw88: Use rtw_iterate_vifs() for rtw_vif_watch_dog_iter()
|
||||
wifi: rtw88: Use non-atomic sta iterator in rtw_ra_mask_info_update()
|
||||
|
||||
drivers/net/wireless/realtek/rtw88/bf.c | 13 +++++++------
|
||||
drivers/net/wireless/realtek/rtw88/mac80211.c | 4 +++-
|
||||
drivers/net/wireless/realtek/rtw88/main.c | 6 ++++--
|
||||
3 files changed, 14 insertions(+), 9 deletions(-)
|
||||
|
||||
--
|
||||
2.39.0
|
||||
|
||||
From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
To: linux-wireless@vger.kernel.org
|
||||
Cc: tony0620emma@gmail.com, kvalo@kernel.org, pkshih@realtek.com,
|
||||
s.hauer@pengutronix.de, netdev@vger.kernel.org,
|
||||
linux-kernel@vger.kernel.org,
|
||||
Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
Subject: [PATCH v3 1/3] wifi: rtw88: Move register access from rtw_bf_assoc() outside the RCU
|
||||
Date: Sun, 8 Jan 2023 22:13:22 +0100
|
||||
Message-Id: <20230108211324.442823-2-martin.blumenstingl@googlemail.com>
|
||||
X-Mailer: git-send-email 2.39.0
|
||||
In-Reply-To: <20230108211324.442823-1-martin.blumenstingl@googlemail.com>
|
||||
References: <20230108211324.442823-1-martin.blumenstingl@googlemail.com>
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Precedence: bulk
|
||||
List-ID: <linux-wireless.vger.kernel.org>
|
||||
X-Mailing-List: linux-wireless@vger.kernel.org
|
||||
|
||||
USB and (upcoming) SDIO support may sleep in the read/write handlers.
|
||||
Shrink the RCU critical section so it only cover the call to
|
||||
ieee80211_find_sta() and finding the ic_vht_cap/vht_cap based on the
|
||||
found station. This moves the chip's BFEE configuration outside the
|
||||
rcu_read_lock section and thus prevent "scheduling while atomic" or
|
||||
"Voluntary context switch within RCU read-side critical section!"
|
||||
warnings when accessing the registers using an SDIO card (which is
|
||||
where this issue has been spotted in the real world - but it also
|
||||
affects USB cards).
|
||||
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Tested-by: Sascha Hauer <s.hauer@pengutronix.de>
|
||||
Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
---
|
||||
v1 -> v2:
|
||||
- Added Ping-Ke's Reviewed-by (thank you!)
|
||||
|
||||
v2 -> v3:
|
||||
- Added Sascha's Tested-by (thank you!)
|
||||
- added "wifi" prefix to the subject and reworded the title accordingly
|
||||
|
||||
|
||||
drivers/net/wireless/realtek/rtw88/bf.c | 13 +++++++------
|
||||
1 file changed, 7 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/bf.c b/drivers/net/wireless/realtek/rtw88/bf.c
|
||||
index 038a30b170ef..c827c4a2814b 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/bf.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/bf.c
|
||||
@@ -49,19 +49,23 @@ void rtw_bf_assoc(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
|
||||
sta = ieee80211_find_sta(vif, bssid);
|
||||
if (!sta) {
|
||||
+ rcu_read_unlock();
|
||||
+
|
||||
rtw_warn(rtwdev, "failed to find station entry for bss %pM\n",
|
||||
bssid);
|
||||
- goto out_unlock;
|
||||
+ return;
|
||||
}
|
||||
|
||||
ic_vht_cap = &hw->wiphy->bands[NL80211_BAND_5GHZ]->vht_cap;
|
||||
vht_cap = &sta->deflink.vht_cap;
|
||||
|
||||
+ rcu_read_unlock();
|
||||
+
|
||||
if ((ic_vht_cap->cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) &&
|
||||
(vht_cap->cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
|
||||
if (bfinfo->bfer_mu_cnt >= chip->bfer_mu_max_num) {
|
||||
rtw_dbg(rtwdev, RTW_DBG_BF, "mu bfer number over limit\n");
|
||||
- goto out_unlock;
|
||||
+ return;
|
||||
}
|
||||
|
||||
ether_addr_copy(bfee->mac_addr, bssid);
|
||||
@@ -75,7 +79,7 @@ void rtw_bf_assoc(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
(vht_cap->cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) {
|
||||
if (bfinfo->bfer_su_cnt >= chip->bfer_su_max_num) {
|
||||
rtw_dbg(rtwdev, RTW_DBG_BF, "su bfer number over limit\n");
|
||||
- goto out_unlock;
|
||||
+ return;
|
||||
}
|
||||
|
||||
sound_dim = vht_cap->cap &
|
||||
@@ -98,9 +102,6 @@ void rtw_bf_assoc(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
|
||||
rtw_chip_config_bfee(rtwdev, rtwvif, bfee, true);
|
||||
}
|
||||
-
|
||||
-out_unlock:
|
||||
- rcu_read_unlock();
|
||||
}
|
||||
|
||||
void rtw_bf_init_bfer_entry_mu(struct rtw_dev *rtwdev,
|
||||
--
|
||||
2.39.0
|
||||
|
||||
From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
To: linux-wireless@vger.kernel.org
|
||||
Cc: tony0620emma@gmail.com, kvalo@kernel.org, pkshih@realtek.com,
|
||||
s.hauer@pengutronix.de, netdev@vger.kernel.org,
|
||||
linux-kernel@vger.kernel.org,
|
||||
Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
Subject: [PATCH v3 2/3] wifi: rtw88: Use rtw_iterate_vifs() for rtw_vif_watch_dog_iter()
|
||||
Date: Sun, 8 Jan 2023 22:13:23 +0100
|
||||
Message-Id: <20230108211324.442823-3-martin.blumenstingl@googlemail.com>
|
||||
X-Mailer: git-send-email 2.39.0
|
||||
In-Reply-To: <20230108211324.442823-1-martin.blumenstingl@googlemail.com>
|
||||
References: <20230108211324.442823-1-martin.blumenstingl@googlemail.com>
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Precedence: bulk
|
||||
List-ID: <linux-wireless.vger.kernel.org>
|
||||
X-Mailing-List: linux-wireless@vger.kernel.org
|
||||
|
||||
USB and (upcoming) SDIO support may sleep in the read/write handlers.
|
||||
Make rtw_watch_dog_work() use rtw_iterate_vifs() to prevent "scheduling
|
||||
while atomic" or "Voluntary context switch within RCU read-side
|
||||
critical section!" warnings when accessing the registers using an SDIO
|
||||
card (which is where this issue has been spotted in the real world but
|
||||
it also affects USB cards).
|
||||
|
||||
Fixes: 78d5bf925f30 ("wifi: rtw88: iterate over vif/sta list non-atomically")
|
||||
Suggested-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Tested-by: Sascha Hauer <s.hauer@pengutronix.de>
|
||||
Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
---
|
||||
v1 -> v2:
|
||||
- no change
|
||||
|
||||
v2 -> v3:
|
||||
- Added Ping-Ke's Reviewed-by (thank you!)
|
||||
- Added Sascha's Tested-by (thank you!)
|
||||
- added "wifi" prefix to the subject and reworded the title accordingly
|
||||
|
||||
|
||||
drivers/net/wireless/realtek/rtw88/main.c | 6 ++++--
|
||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c
|
||||
index 888427cf3bdf..b2e78737bd5d 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.c
|
||||
@@ -241,8 +241,10 @@ static void rtw_watch_dog_work(struct work_struct *work)
|
||||
rtw_phy_dynamic_mechanism(rtwdev);
|
||||
|
||||
data.rtwdev = rtwdev;
|
||||
- /* use atomic version to avoid taking local->iflist_mtx mutex */
|
||||
- rtw_iterate_vifs_atomic(rtwdev, rtw_vif_watch_dog_iter, &data);
|
||||
+ /* rtw_iterate_vifs internally uses an atomic iterator which is needed
|
||||
+ * to avoid taking local->iflist_mtx mutex
|
||||
+ */
|
||||
+ rtw_iterate_vifs(rtwdev, rtw_vif_watch_dog_iter, &data);
|
||||
|
||||
/* fw supports only one station associated to enter lps, if there are
|
||||
* more than two stations associated to the AP, then we can not enter
|
||||
--
|
||||
2.39.0
|
||||
|
||||
From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
To: linux-wireless@vger.kernel.org
|
||||
Cc: tony0620emma@gmail.com, kvalo@kernel.org, pkshih@realtek.com,
|
||||
s.hauer@pengutronix.de, netdev@vger.kernel.org,
|
||||
linux-kernel@vger.kernel.org,
|
||||
Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
Subject: [PATCH v3 3/3] wifi: rtw88: Use non-atomic sta iterator in rtw_ra_mask_info_update()
|
||||
Date: Sun, 8 Jan 2023 22:13:24 +0100
|
||||
Message-Id: <20230108211324.442823-4-martin.blumenstingl@googlemail.com>
|
||||
X-Mailer: git-send-email 2.39.0
|
||||
In-Reply-To: <20230108211324.442823-1-martin.blumenstingl@googlemail.com>
|
||||
References: <20230108211324.442823-1-martin.blumenstingl@googlemail.com>
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Precedence: bulk
|
||||
List-ID: <linux-wireless.vger.kernel.org>
|
||||
X-Mailing-List: linux-wireless@vger.kernel.org
|
||||
|
||||
USB and (upcoming) SDIO support may sleep in the read/write handlers.
|
||||
Use non-atomic rtw_iterate_stas() in rtw_ra_mask_info_update() because
|
||||
the iterator function rtw_ra_mask_info_update_iter() needs to read and
|
||||
write registers from within rtw_update_sta_info(). Using the non-atomic
|
||||
iterator ensures that we can sleep during USB and SDIO register reads
|
||||
and writes. This fixes "scheduling while atomic" or "Voluntary context
|
||||
switch within RCU read-side critical section!" warnings as seen by SDIO
|
||||
card users (but it also affects USB cards).
|
||||
|
||||
Fixes: 78d5bf925f30 ("wifi: rtw88: iterate over vif/sta list non-atomically")
|
||||
Suggested-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Tested-by: Sascha Hauer <s.hauer@pengutronix.de>
|
||||
Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||
---
|
||||
v1 -> v2:
|
||||
- Added Ping-Ke's Reviewed-by (thank you!)
|
||||
|
||||
v2 -> v3:
|
||||
- Added Sascha's Tested-by (thank you!)
|
||||
- added "wifi" prefix to the subject and reworded the title accordingly
|
||||
|
||||
|
||||
drivers/net/wireless/realtek/rtw88/mac80211.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireless/realtek/rtw88/mac80211.c
|
||||
index 776a9a9884b5..3b92ac611d3f 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/mac80211.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/mac80211.c
|
||||
@@ -737,7 +737,7 @@ static void rtw_ra_mask_info_update(struct rtw_dev *rtwdev,
|
||||
br_data.rtwdev = rtwdev;
|
||||
br_data.vif = vif;
|
||||
br_data.mask = mask;
|
||||
- rtw_iterate_stas_atomic(rtwdev, rtw_ra_mask_info_update_iter, &br_data);
|
||||
+ rtw_iterate_stas(rtwdev, rtw_ra_mask_info_update_iter, &br_data);
|
||||
}
|
||||
|
||||
static int rtw_ops_set_bitrate_mask(struct ieee80211_hw *hw,
|
||||
@@ -746,7 +746,9 @@ static int rtw_ops_set_bitrate_mask(struct ieee80211_hw *hw,
|
||||
{
|
||||
struct rtw_dev *rtwdev = hw->priv;
|
||||
|
||||
+ mutex_lock(&rtwdev->mutex);
|
||||
rtw_ra_mask_info_update(rtwdev, vif, mask);
|
||||
+ mutex_unlock(&rtwdev->mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
--
|
||||
2.39.0
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,43 +0,0 @@
|
||||
From git@z Thu Jan 1 00:00:00 1970
|
||||
Subject: [PATCH] Input: xpad - add 8BitDo Pro 2 Wired Controller support
|
||||
From: John Butler <radon86dev@gmail.com>
|
||||
Date: Tue, 24 Jan 2023 00:52:06 +0000
|
||||
Message-Id: <20230124005206.80706-1-radon86dev@gmail.com>
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
Content-Transfer-Encoding: 7bit
|
||||
|
||||
Add VID and PID to the xpad_device table to allow driver
|
||||
to use the 8BitDo Pro 2 Wired Controller, which is
|
||||
XTYPE_XBOX360 compatible by default.
|
||||
|
||||
Signed-off-by: John Butler <radon86dev@gmail.com>
|
||||
Cc: linux-input@vger.kernel.org
|
||||
Reviewed-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
|
||||
---
|
||||
drivers/input/joystick/xpad.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c
|
||||
index 2959d80f7fdb..f642ec8e92dd 100644
|
||||
--- a/drivers/input/joystick/xpad.c
|
||||
+++ b/drivers/input/joystick/xpad.c
|
||||
@@ -359,6 +359,7 @@ static const struct xpad_device {
|
||||
{ 0x24c6, 0xfafe, "Rock Candy Gamepad for Xbox 360", 0, XTYPE_XBOX360 },
|
||||
{ 0x2563, 0x058d, "OneXPlayer Gamepad", 0, XTYPE_XBOX360 },
|
||||
{ 0x2dc8, 0x2000, "8BitDo Pro 2 Wired Controller fox Xbox", 0, XTYPE_XBOXONE },
|
||||
+ { 0x2dc8, 0x3106, "8BitDo Pro 2 Wired Controller", 0, XTYPE_XBOX360 },
|
||||
{ 0x31e3, 0x1100, "Wooting One", 0, XTYPE_XBOX360 },
|
||||
{ 0x31e3, 0x1200, "Wooting Two", 0, XTYPE_XBOX360 },
|
||||
{ 0x31e3, 0x1210, "Wooting Lekker", 0, XTYPE_XBOX360 },
|
||||
@@ -492,6 +493,7 @@ static const struct usb_device_id xpad_table[] = {
|
||||
XPAD_XBOXONE_VENDOR(0x24c6), /* PowerA Controllers */
|
||||
XPAD_XBOX360_VENDOR(0x2563), /* OneXPlayer Gamepad */
|
||||
XPAD_XBOX360_VENDOR(0x260d), /* Dareu H101 */
|
||||
+ XPAD_XBOX360_VENDOR(0x2dc8), /* 8BitDo Pro 2 Wired Controller */
|
||||
XPAD_XBOXONE_VENDOR(0x2dc8), /* 8BitDo Pro 2 Wired Controller for Xbox */
|
||||
XPAD_XBOXONE_VENDOR(0x2e24), /* Hyperkin Duke X-Box One pad */
|
||||
XPAD_XBOX360_VENDOR(0x2f24), /* GameSir Controllers */
|
||||
--
|
||||
2.39.1
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
--- a/kernel/nv-mmap.c 2019-12-11 22:04:24.000000000 +0000
|
||||
+++ b/kernel/nv-mmap.c 2023-04-24 11:43:59.912426877 +0000
|
||||
@@ -312,7 +312,7 @@
|
||||
goto done;
|
||||
}
|
||||
|
||||
- vma->vm_flags |= VM_IO;
|
||||
+ vm_flags_set(vma, VM_IO);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -363,8 +363,8 @@
|
||||
|
||||
NV_PRINT_AT(NV_DBG_MEMINFO, at);
|
||||
|
||||
- vma->vm_flags |= (VM_IO | VM_LOCKED | VM_RESERVED);
|
||||
- vma->vm_flags |= (VM_DONTEXPAND | VM_DONTDUMP);
|
||||
+ vm_flags_set(vma, VM_IO | VM_LOCKED | VM_RESERVED);
|
||||
+ vm_flags_set(vma, VM_DONTEXPAND | VM_DONTDUMP);
|
||||
}
|
||||
|
||||
if (status == 0)
|
||||
@@ -374,8 +374,8 @@
|
||||
if ((prot & NV_PROTECT_WRITEABLE) == 0)
|
||||
{
|
||||
vma->vm_page_prot = NV_PGPROT_READ_ONLY(vma->vm_page_prot);
|
||||
- vma->vm_flags &= ~VM_WRITE;
|
||||
- vma->vm_flags &= ~VM_MAYWRITE;
|
||||
+ vm_flags_clear(vma, VM_WRITE);
|
||||
+ vm_flags_clear(vma, VM_MAYWRITE);
|
||||
}
|
||||
|
||||
vma->vm_ops = &nv_vm_ops;
|
||||
@@ -0,0 +1,145 @@
|
||||
From 5db7eb5a62003bbe04f3f07d089fcf5445b34a29 Mon Sep 17 00:00:00 2001
|
||||
From: Joan Bruguera <joanbrugueram@gmail.com>
|
||||
Date: Sun, 25 Dec 2022 22:05:14 +0000
|
||||
Subject: [PATCH] Tentative fix for NVIDIA 470.161.03 driver for Linux 6.2-rc1
|
||||
|
||||
---
|
||||
kernel/nvidia-drm/nvidia-drm-connector.c | 22 ++++++++++++++++++++++
|
||||
kernel/nvidia-drm/nvidia-drm-drv.c | 4 ++++
|
||||
kernel/nvidia/nv-acpi.c | 19 ++++++++++++++++---
|
||||
3 files changed, 42 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/kernel/nvidia-drm/nvidia-drm-connector.c b/kernel/nvidia-drm/nvidia-drm-connector.c
|
||||
index 6fbcd63..a5ab9e9 100644
|
||||
--- a/kernel/nvidia-drm/nvidia-drm-connector.c
|
||||
+++ b/kernel/nvidia-drm/nvidia-drm-connector.c
|
||||
@@ -20,6 +20,8 @@
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
+#include <linux/version.h>
|
||||
+#include <drm/drm_edid.h>
|
||||
#include "nvidia-drm-conftest.h" /* NV_DRM_ATOMIC_MODESET_AVAILABLE */
|
||||
|
||||
#if defined(NV_DRM_ATOMIC_MODESET_AVAILABLE)
|
||||
@@ -98,6 +100,7 @@ __nv_drm_detect_encoder(struct NvKmsKapiDynamicDisplayParams *pDetectParams,
|
||||
break;
|
||||
}
|
||||
|
||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 2, 0)
|
||||
if (connector->override_edid) {
|
||||
const struct drm_property_blob *edid = connector->edid_blob_ptr;
|
||||
|
||||
@@ -110,6 +113,25 @@ __nv_drm_detect_encoder(struct NvKmsKapiDynamicDisplayParams *pDetectParams,
|
||||
sizeof(pDetectParams->edid.buffer));
|
||||
}
|
||||
}
|
||||
+#else
|
||||
+ // Rel. commit "drm/edid: detach debugfs EDID override from EDID property update" (Jani Nikula, 24 Oct 2022)
|
||||
+ // NOTE: HUGE HACK!
|
||||
+ mutex_lock(&connector->edid_override_mutex);
|
||||
+ if (connector->edid_override) {
|
||||
+ const struct edid *edid = drm_edid_raw(connector->edid_override);
|
||||
+ size_t edid_length = EDID_LENGTH * (edid->extensions + 1);
|
||||
+ if (edid_length <= sizeof(pDetectParams->edid.buffer)) {
|
||||
+ memcpy(pDetectParams->edid.buffer, edid, edid_length);
|
||||
+ pDetectParams->edid.bufferSize = edid_length;
|
||||
+ pDetectParams->overrideEdid = NV_TRUE;
|
||||
+ } else {
|
||||
+ WARN_ON(edid_length >
|
||||
+ sizeof(pDetectParams->edid.buffer));
|
||||
+ }
|
||||
+ }
|
||||
+ mutex_unlock(&connector->edid_override_mutex);
|
||||
+
|
||||
+#endif
|
||||
|
||||
if (!nvKms->getDynamicDisplayInfo(nv_dev->pDevice, pDetectParams)) {
|
||||
NV_DRM_DEV_LOG_ERR(
|
||||
diff --git a/kernel/nvidia-drm/nvidia-drm-drv.c b/kernel/nvidia-drm/nvidia-drm-drv.c
|
||||
index 6d007b1..d08ab4c 100644
|
||||
--- a/kernel/nvidia-drm/nvidia-drm-drv.c
|
||||
+++ b/kernel/nvidia-drm/nvidia-drm-drv.c
|
||||
@@ -20,6 +20,7 @@
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
+#include <linux/version.h>
|
||||
#include "nvidia-drm-conftest.h" /* NV_DRM_AVAILABLE and NV_DRM_DRM_GEM_H_PRESENT */
|
||||
|
||||
#include "nvidia-drm-priv.h"
|
||||
@@ -240,9 +241,12 @@ nv_drm_init_mode_config(struct nv_drm_device *nv_dev,
|
||||
dev->mode_config.preferred_depth = 24;
|
||||
dev->mode_config.prefer_shadow = 1;
|
||||
|
||||
+// Rel. commit "drm: Remove drm_mode_config::fb_base" (Zack Rusin, 18 Oct 2022)
|
||||
+#if defined(CONFIG_FB) && LINUX_VERSION_CODE < KERNEL_VERSION(6, 2, 0)
|
||||
/* Currently unused. Update when needed. */
|
||||
|
||||
dev->mode_config.fb_base = 0;
|
||||
+#endif
|
||||
|
||||
#if defined(NV_DRM_CRTC_STATE_HAS_ASYNC_FLIP) || \
|
||||
defined(NV_DRM_CRTC_STATE_HAS_PAGEFLIP_FLAGS)
|
||||
diff --git a/kernel/nvidia/nv-acpi.c b/kernel/nvidia/nv-acpi.c
|
||||
index 07501eb..1fdf71c 100644
|
||||
--- a/kernel/nvidia/nv-acpi.c
|
||||
+++ b/kernel/nvidia/nv-acpi.c
|
||||
@@ -8,6 +8,7 @@
|
||||
* _NVRM_COPYRIGHT_END_
|
||||
*/
|
||||
|
||||
+#include <linux/version.h>
|
||||
#define __NO_VERSION__
|
||||
|
||||
#include "os-interface.h"
|
||||
@@ -24,7 +25,10 @@ static NV_STATUS nv_acpi_extract_object (const union acpi_object *, void *, N
|
||||
|
||||
static int nv_acpi_add (struct acpi_device *);
|
||||
|
||||
-#if !defined(NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT) || (NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT == 2)
|
||||
+// Rel. commit "ACPI: make remove callback of ACPI driver void" (Dawei Li, 14 Nov 2022)
|
||||
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 2, 0))
|
||||
+static void nv_acpi_remove_one_arg_void(struct acpi_device *device);
|
||||
+#elif !defined(NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT) || (NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT == 2)
|
||||
static int nv_acpi_remove_two_args(struct acpi_device *device, int type);
|
||||
#else
|
||||
static int nv_acpi_remove_one_arg(struct acpi_device *device);
|
||||
@@ -80,7 +84,10 @@ static const struct acpi_driver nv_acpi_driver_template = {
|
||||
.ids = nv_video_device_ids,
|
||||
.ops = {
|
||||
.add = nv_acpi_add,
|
||||
-#if !defined(NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT) || (NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT == 2)
|
||||
+// Rel. commit "ACPI: make remove callback of ACPI driver void" (Dawei Li, 14 Nov 2022)
|
||||
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 2, 0))
|
||||
+ .remove = nv_acpi_remove_one_arg_void,
|
||||
+#elif !defined(NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT) || (NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT == 2)
|
||||
.remove = nv_acpi_remove_two_args,
|
||||
#else
|
||||
.remove = nv_acpi_remove_one_arg,
|
||||
@@ -342,7 +349,10 @@ static int nv_acpi_add(struct acpi_device *device)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-#if !defined(NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT) || (NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT == 2)
|
||||
+// Rel. commit "ACPI: make remove callback of ACPI driver void" (Dawei Li, 14 Nov 2022)
|
||||
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 2, 0))
|
||||
+static void nv_acpi_remove_one_arg_void(struct acpi_device *device)
|
||||
+#elif !defined(NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT) || (NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT == 2)
|
||||
static int nv_acpi_remove_two_args(struct acpi_device *device, int type)
|
||||
#else
|
||||
static int nv_acpi_remove_one_arg(struct acpi_device *device)
|
||||
@@ -396,7 +406,10 @@ static int nv_acpi_remove_one_arg(struct acpi_device *device)
|
||||
device->driver_data = NULL;
|
||||
}
|
||||
|
||||
+// Rel. commit "ACPI: make remove callback of ACPI driver void" (Dawei Li, 14 Nov 2022)
|
||||
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(6, 2, 0))
|
||||
return status;
|
||||
+#endif
|
||||
}
|
||||
|
||||
/*
|
||||
--
|
||||
2.39.0
|
||||
|
||||
@@ -0,0 +1,117 @@
|
||||
From a77f2da778f4a62695a6c7d26bba674d59ad9170 Mon Sep 17 00:00:00 2001
|
||||
From: Joan Bruguera <joanbrugueram@gmail.com>
|
||||
Date: Sat, 25 Feb 2023 10:57:09 +0000
|
||||
Subject: [PATCH] Tentative fix for NVIDIA 470.161.03 driver for Linux 6.3-rc1
|
||||
|
||||
---
|
||||
kernel/common/inc/nv-linux.h | 13 +++++++++++++
|
||||
kernel/nvidia-drm/nvidia-drm-gem-user-memory.c | 7 ++++---
|
||||
kernel/nvidia-uvm/uvm.c | 2 +-
|
||||
kernel/nvidia/nv-mmap.c | 12 ++++++------
|
||||
4 files changed, 24 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/kernel/common/inc/nv-linux.h b/kernel/common/inc/nv-linux.h
|
||||
index f8df9e3..5b22cf1 100644
|
||||
--- a/kernel/common/inc/nv-linux.h
|
||||
+++ b/kernel/common/inc/nv-linux.h
|
||||
@@ -1988,4 +1988,17 @@ static inline void nv_mutex_destroy(struct mutex *lock)
|
||||
|
||||
}
|
||||
|
||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 3, 0)
|
||||
+// Rel. commit "mm: introduce vma->vm_flags wrapper functions" (Suren Baghdasaryan, 26 Jan 2023)
|
||||
+static inline void vm_flags_set(struct vm_area_struct *vma, vm_flags_t flags)
|
||||
+{
|
||||
+ vma->vm_flags |= flags;
|
||||
+}
|
||||
+
|
||||
+static inline void vm_flags_clear(struct vm_area_struct *vma, vm_flags_t flags)
|
||||
+{
|
||||
+ vma->vm_flags &= ~flags;
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
#endif /* _NV_LINUX_H_ */
|
||||
diff --git a/kernel/nvidia-drm/nvidia-drm-gem-user-memory.c b/kernel/nvidia-drm/nvidia-drm-gem-user-memory.c
|
||||
index 8824daa..3ea9099 100644
|
||||
--- a/kernel/nvidia-drm/nvidia-drm-gem-user-memory.c
|
||||
+++ b/kernel/nvidia-drm/nvidia-drm-gem-user-memory.c
|
||||
@@ -35,6 +35,7 @@
|
||||
#include "linux/dma-buf.h"
|
||||
#include "linux/mm.h"
|
||||
#include "nv-mm.h"
|
||||
+#include "nv-linux.h"
|
||||
|
||||
static inline
|
||||
void __nv_drm_gem_user_memory_free(struct nv_drm_gem_object *nv_gem)
|
||||
@@ -92,9 +93,9 @@ static int __nv_drm_gem_user_memory_mmap(struct nv_drm_gem_object *nv_gem,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
- vma->vm_flags &= ~VM_PFNMAP;
|
||||
- vma->vm_flags &= ~VM_IO;
|
||||
- vma->vm_flags |= VM_MIXEDMAP;
|
||||
+ vm_flags_clear(vma, VM_PFNMAP);
|
||||
+ vm_flags_clear(vma, VM_IO);
|
||||
+ vm_flags_set(vma, VM_MIXEDMAP);
|
||||
|
||||
return 0;
|
||||
}
|
||||
diff --git a/kernel/nvidia-uvm/uvm.c b/kernel/nvidia-uvm/uvm.c
|
||||
index 3e7318d..7eddff7 100644
|
||||
--- a/kernel/nvidia-uvm/uvm.c
|
||||
+++ b/kernel/nvidia-uvm/uvm.c
|
||||
@@ -812,7 +812,7 @@ static int uvm_mmap(struct file *filp, struct vm_area_struct *vma)
|
||||
// Using VM_DONTCOPY would be nice, but madvise(MADV_DOFORK) can reset that
|
||||
// so we have to handle vm_open on fork anyway. We could disable MADV_DOFORK
|
||||
// with VM_IO, but that causes other mapping issues.
|
||||
- vma->vm_flags |= VM_MIXEDMAP | VM_DONTEXPAND;
|
||||
+ vm_flags_set(vma, VM_MIXEDMAP | VM_DONTEXPAND);
|
||||
|
||||
vma->vm_ops = &uvm_vm_ops_managed;
|
||||
|
||||
diff --git a/kernel/nvidia/nv-mmap.c b/kernel/nvidia/nv-mmap.c
|
||||
index df514c9..8f85ff6 100644
|
||||
--- a/kernel/nvidia/nv-mmap.c
|
||||
+++ b/kernel/nvidia/nv-mmap.c
|
||||
@@ -447,7 +447,7 @@ static int nvidia_mmap_numa(
|
||||
}
|
||||
|
||||
// Needed for the linux kernel for mapping compound pages
|
||||
- vma->vm_flags |= VM_MIXEDMAP;
|
||||
+ vm_flags_set(vma, VM_MIXEDMAP);
|
||||
|
||||
for (i = 0, addr = mmap_context->page_array[0]; i < pages;
|
||||
addr = mmap_context->page_array[++i], start += PAGE_SIZE)
|
||||
@@ -596,7 +596,7 @@ int nvidia_mmap_helper(
|
||||
}
|
||||
up(&nvl->mmap_lock);
|
||||
|
||||
- vma->vm_flags |= VM_IO | VM_PFNMAP | VM_DONTEXPAND;
|
||||
+ vm_flags_set(vma, VM_IO | VM_PFNMAP | VM_DONTEXPAND);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -663,15 +663,15 @@ int nvidia_mmap_helper(
|
||||
|
||||
NV_PRINT_AT(NV_DBG_MEMINFO, at);
|
||||
|
||||
- vma->vm_flags |= (VM_IO | VM_LOCKED | VM_RESERVED);
|
||||
- vma->vm_flags |= (VM_DONTEXPAND | VM_DONTDUMP);
|
||||
+ vm_flags_set(vma, VM_IO | VM_LOCKED | VM_RESERVED);
|
||||
+ vm_flags_set(vma, VM_DONTEXPAND | VM_DONTDUMP);
|
||||
}
|
||||
|
||||
if ((prot & NV_PROTECT_WRITEABLE) == 0)
|
||||
{
|
||||
vma->vm_page_prot = NV_PGPROT_READ_ONLY(vma->vm_page_prot);
|
||||
- vma->vm_flags &= ~VM_WRITE;
|
||||
- vma->vm_flags &= ~VM_MAYWRITE;
|
||||
+ vm_flags_clear(vma, VM_WRITE);
|
||||
+ vm_flags_clear(vma, VM_MAYWRITE);
|
||||
}
|
||||
|
||||
vma->vm_ops = &nv_vm_ops;
|
||||
--
|
||||
2.39.2
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -21,17 +21,8 @@ Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||
|
||||
--- a/drivers/input/misc/axp20x-pek.c
|
||||
+++ b/drivers/input/misc/axp20x-pek.c
|
||||
@@ -354,7 +354,7 @@ static int axp20x_pek_probe(struct platf
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int __maybe_unused axp20x_pek_suspend(struct device *dev)
|
||||
+static int axp20x_pek_suspend(struct device *dev)
|
||||
{
|
||||
struct axp20x_pek *axp20x_pek = dev_get_drvdata(dev);
|
||||
|
||||
@@ -413,6 +413,11 @@ static const struct dev_pm_ops axp20x_pe
|
||||
#endif
|
||||
.resume_noirq = pm_sleep_ptr(axp20x_pek_resume_noirq),
|
||||
};
|
||||
|
||||
+static void axp20x_pek_shutdown(struct platform_device *pdev)
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
From b6d288bb8823e11114297d1e406ccd977106aaf9 Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Date: Sat, 9 Nov 2019 13:06:15 +0100
|
||||
Subject: [PATCH 28/44] media: cedrus: Add callback for buffer cleanup
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
---
|
||||
drivers/staging/media/sunxi/cedrus/cedrus.h | 1 +
|
||||
drivers/staging/media/sunxi/cedrus/cedrus_video.c | 13 +++++++++++++
|
||||
2 files changed, 14 insertions(+)
|
||||
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus.h
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus.h
|
||||
@@ -166,6 +166,7 @@ struct cedrus_dec_ops {
|
||||
int (*start)(struct cedrus_ctx *ctx);
|
||||
void (*stop)(struct cedrus_ctx *ctx);
|
||||
void (*trigger)(struct cedrus_ctx *ctx);
|
||||
+ void (*buf_cleanup)(struct cedrus_ctx *ctx, struct cedrus_buffer *buf);
|
||||
};
|
||||
|
||||
struct cedrus_variant {
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus_video.c
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_video.c
|
||||
@@ -469,6 +469,18 @@ static int cedrus_buf_prepare(struct vb2
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static void cedrus_buf_cleanup(struct vb2_buffer *vb)
|
||||
+{
|
||||
+ struct vb2_queue *vq = vb->vb2_queue;
|
||||
+ struct cedrus_ctx *ctx = vb2_get_drv_priv(vq);
|
||||
+ struct cedrus_dev *dev = ctx->dev;
|
||||
+ struct cedrus_dec_ops *ops = dev->dec_ops[ctx->current_codec];
|
||||
+
|
||||
+ if (!V4L2_TYPE_IS_OUTPUT(vq->type) && ops->buf_cleanup)
|
||||
+ ops->buf_cleanup(ctx,
|
||||
+ vb2_to_cedrus_buffer(vq->bufs[vb->index]));
|
||||
+}
|
||||
+
|
||||
static int cedrus_start_streaming(struct vb2_queue *vq, unsigned int count)
|
||||
{
|
||||
struct cedrus_ctx *ctx = vb2_get_drv_priv(vq);
|
||||
@@ -551,6 +563,7 @@ static void cedrus_buf_request_complete(
|
||||
static struct vb2_ops cedrus_qops = {
|
||||
.queue_setup = cedrus_queue_setup,
|
||||
.buf_prepare = cedrus_buf_prepare,
|
||||
+ .buf_cleanup = cedrus_buf_cleanup,
|
||||
.buf_queue = cedrus_buf_queue,
|
||||
.buf_out_validate = cedrus_buf_out_validate,
|
||||
.buf_request_complete = cedrus_buf_request_complete,
|
||||
@@ -1,240 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Date: Sat, 9 Nov 2019 13:22:05 +0100
|
||||
Subject: [PATCH] media: cedrus: hevc: Improve buffer management
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
---
|
||||
drivers/staging/media/sunxi/cedrus/cedrus.h | 9 +-
|
||||
.../staging/media/sunxi/cedrus/cedrus_h265.c | 119 ++++++++++--------
|
||||
2 files changed, 69 insertions(+), 59 deletions(-)
|
||||
|
||||
diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.h b/drivers/staging/media/sunxi/cedrus/cedrus.h
|
||||
index ab7653c8915e..54a860ec738d 100644
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus.h
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus.h
|
||||
@@ -106,6 +106,11 @@ struct cedrus_buffer {
|
||||
unsigned int position;
|
||||
enum cedrus_h264_pic_type pic_type;
|
||||
} h264;
|
||||
+ struct {
|
||||
+ void *mv_col_buf;
|
||||
+ dma_addr_t mv_col_buf_dma;
|
||||
+ ssize_t mv_col_buf_size;
|
||||
+ } h265;
|
||||
} codec;
|
||||
};
|
||||
|
||||
@@ -139,10 +144,6 @@ struct cedrus_ctx {
|
||||
ssize_t intra_pred_buf_size;
|
||||
} h264;
|
||||
struct {
|
||||
- void *mv_col_buf;
|
||||
- dma_addr_t mv_col_buf_addr;
|
||||
- ssize_t mv_col_buf_size;
|
||||
- ssize_t mv_col_buf_unit_size;
|
||||
void *neighbor_info_buf;
|
||||
dma_addr_t neighbor_info_buf_addr;
|
||||
void *entry_points_buf;
|
||||
diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c
|
||||
index 4b01d3881214..4d425196d415 100644
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c
|
||||
@@ -91,26 +91,65 @@ static void cedrus_h265_sram_write_data(struct cedrus_dev *dev, void *data,
|
||||
|
||||
static inline dma_addr_t
|
||||
cedrus_h265_frame_info_mv_col_buf_addr(struct cedrus_ctx *ctx,
|
||||
- unsigned int index, unsigned int field)
|
||||
+ unsigned int index,
|
||||
+ const struct v4l2_ctrl_hevc_sps *sps)
|
||||
{
|
||||
- return ctx->codec.h265.mv_col_buf_addr + index *
|
||||
- ctx->codec.h265.mv_col_buf_unit_size +
|
||||
- field * ctx->codec.h265.mv_col_buf_unit_size / 2;
|
||||
+ struct cedrus_buffer *cedrus_buf = NULL;
|
||||
+ struct vb2_buffer *buf = NULL;
|
||||
+ struct vb2_queue *vq;
|
||||
+
|
||||
+ vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
|
||||
+ if (vq)
|
||||
+ buf = vb2_get_buffer(vq, index);
|
||||
+
|
||||
+ if (buf)
|
||||
+ cedrus_buf = vb2_to_cedrus_buffer(buf);
|
||||
+
|
||||
+ if (!cedrus_buf)
|
||||
+ return 0;
|
||||
+
|
||||
+ if (!cedrus_buf->codec.h265.mv_col_buf_size) {
|
||||
+ unsigned int log2_max_luma_coding_block_size;
|
||||
+ unsigned int ctb_size_luma;
|
||||
+
|
||||
+ log2_max_luma_coding_block_size =
|
||||
+ sps->log2_min_luma_coding_block_size_minus3 + 3 +
|
||||
+ sps->log2_diff_max_min_luma_coding_block_size;
|
||||
+ ctb_size_luma = 1 << log2_max_luma_coding_block_size;
|
||||
+
|
||||
+ cedrus_buf->codec.h265.mv_col_buf_size =
|
||||
+ DIV_ROUND_UP(sps->pic_width_in_luma_samples, ctb_size_luma) *
|
||||
+ DIV_ROUND_UP(sps->pic_height_in_luma_samples, ctb_size_luma) *
|
||||
+ CEDRUS_H265_MV_COL_BUF_UNIT_CTB_SIZE + SZ_1K;
|
||||
+
|
||||
+ cedrus_buf->codec.h265.mv_col_buf =
|
||||
+ dma_alloc_attrs(ctx->dev->dev,
|
||||
+ cedrus_buf->codec.h265.mv_col_buf_size,
|
||||
+ &cedrus_buf->codec.h265.mv_col_buf_dma,
|
||||
+ GFP_KERNEL, DMA_ATTR_NO_KERNEL_MAPPING);
|
||||
+
|
||||
+ if (!cedrus_buf->codec.h265.mv_col_buf) {
|
||||
+ cedrus_buf->codec.h265.mv_col_buf_size = 0;
|
||||
+ cedrus_buf->codec.h265.mv_col_buf_dma = 0;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return cedrus_buf->codec.h265.mv_col_buf_dma;
|
||||
}
|
||||
|
||||
static void cedrus_h265_frame_info_write_single(struct cedrus_ctx *ctx,
|
||||
unsigned int index,
|
||||
bool field_pic,
|
||||
u32 pic_order_cnt[],
|
||||
- struct vb2_buffer *buf)
|
||||
+ struct vb2_buffer *buf,
|
||||
+ const struct v4l2_ctrl_hevc_sps *sps)
|
||||
{
|
||||
struct cedrus_dev *dev = ctx->dev;
|
||||
dma_addr_t dst_luma_addr = cedrus_dst_buf_addr(ctx, buf, 0);
|
||||
dma_addr_t dst_chroma_addr = cedrus_dst_buf_addr(ctx, buf, 1);
|
||||
dma_addr_t mv_col_buf_addr[2] = {
|
||||
- cedrus_h265_frame_info_mv_col_buf_addr(ctx, buf->index, 0),
|
||||
- cedrus_h265_frame_info_mv_col_buf_addr(ctx, buf->index,
|
||||
- field_pic ? 1 : 0)
|
||||
+ cedrus_h265_frame_info_mv_col_buf_addr(ctx, buf->index, sps),
|
||||
+ cedrus_h265_frame_info_mv_col_buf_addr(ctx, buf->index, sps)
|
||||
};
|
||||
u32 offset = VE_DEC_H265_SRAM_OFFSET_FRAME_INFO +
|
||||
VE_DEC_H265_SRAM_OFFSET_FRAME_INFO_UNIT * index;
|
||||
@@ -134,7 +173,8 @@ static void cedrus_h265_frame_info_write_single(struct cedrus_ctx *ctx,
|
||||
|
||||
static void cedrus_h265_frame_info_write_dpb(struct cedrus_ctx *ctx,
|
||||
const struct v4l2_hevc_dpb_entry *dpb,
|
||||
- u8 num_active_dpb_entries)
|
||||
+ u8 num_active_dpb_entries,
|
||||
+ const struct v4l2_ctrl_hevc_sps *sps)
|
||||
{
|
||||
struct vb2_queue *vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx,
|
||||
V4L2_BUF_TYPE_VIDEO_CAPTURE);
|
||||
@@ -149,7 +189,7 @@ static void cedrus_h265_frame_info_write_dpb(struct cedrus_ctx *ctx,
|
||||
|
||||
cedrus_h265_frame_info_write_single(ctx, i, dpb[i].field_pic,
|
||||
pic_order_cnt,
|
||||
- buf);
|
||||
+ buf, sps);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -388,36 +428,6 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx,
|
||||
width_in_ctb_luma =
|
||||
DIV_ROUND_UP(sps->pic_width_in_luma_samples, ctb_size_luma);
|
||||
|
||||
- /* MV column buffer size and allocation. */
|
||||
- if (!ctx->codec.h265.mv_col_buf_size) {
|
||||
- unsigned int num_buffers =
|
||||
- run->dst->vb2_buf.vb2_queue->num_buffers;
|
||||
-
|
||||
- /*
|
||||
- * Each CTB requires a MV col buffer with a specific unit size.
|
||||
- * Since the address is given with missing lsb bits, 1 KiB is
|
||||
- * added to each buffer to ensure proper alignment.
|
||||
- */
|
||||
- ctx->codec.h265.mv_col_buf_unit_size =
|
||||
- DIV_ROUND_UP(ctx->src_fmt.width, ctb_size_luma) *
|
||||
- DIV_ROUND_UP(ctx->src_fmt.height, ctb_size_luma) *
|
||||
- CEDRUS_H265_MV_COL_BUF_UNIT_CTB_SIZE + SZ_1K;
|
||||
-
|
||||
- ctx->codec.h265.mv_col_buf_size = num_buffers *
|
||||
- ctx->codec.h265.mv_col_buf_unit_size;
|
||||
-
|
||||
- /* Buffer is never accessed by CPU, so we can skip kernel mapping. */
|
||||
- ctx->codec.h265.mv_col_buf =
|
||||
- dma_alloc_attrs(dev->dev,
|
||||
- ctx->codec.h265.mv_col_buf_size,
|
||||
- &ctx->codec.h265.mv_col_buf_addr,
|
||||
- GFP_KERNEL, DMA_ATTR_NO_KERNEL_MAPPING);
|
||||
- if (!ctx->codec.h265.mv_col_buf) {
|
||||
- ctx->codec.h265.mv_col_buf_size = 0;
|
||||
- return -ENOMEM;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
/* Activate H265 engine. */
|
||||
cedrus_engine_enable(ctx, CEDRUS_CODEC_H265);
|
||||
|
||||
@@ -672,7 +681,7 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx,
|
||||
|
||||
/* Write decoded picture buffer in pic list. */
|
||||
cedrus_h265_frame_info_write_dpb(ctx, decode_params->dpb,
|
||||
- decode_params->num_active_dpb_entries);
|
||||
+ decode_params->num_active_dpb_entries, sps);
|
||||
|
||||
/* Output frame. */
|
||||
|
||||
@@ -683,7 +692,7 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx,
|
||||
cedrus_h265_frame_info_write_single(ctx, output_pic_list_index,
|
||||
slice_params->pic_struct != 0,
|
||||
pic_order_cnt,
|
||||
- &run->dst->vb2_buf);
|
||||
+ &run->dst->vb2_buf, sps);
|
||||
|
||||
cedrus_write(dev, VE_DEC_H265_OUTPUT_FRAME_IDX, output_pic_list_index);
|
||||
|
||||
@@ -732,9 +741,6 @@ static int cedrus_h265_start(struct cedrus_ctx *ctx)
|
||||
{
|
||||
struct cedrus_dev *dev = ctx->dev;
|
||||
|
||||
- /* The buffer size is calculated at setup time. */
|
||||
- ctx->codec.h265.mv_col_buf_size = 0;
|
||||
-
|
||||
/* Buffer is never accessed by CPU, so we can skip kernel mapping. */
|
||||
ctx->codec.h265.neighbor_info_buf =
|
||||
dma_alloc_attrs(dev->dev, CEDRUS_H265_NEIGHBOR_INFO_BUF_SIZE,
|
||||
@@ -761,15 +767,6 @@ static void cedrus_h265_stop(struct cedrus_ctx *ctx)
|
||||
{
|
||||
struct cedrus_dev *dev = ctx->dev;
|
||||
|
||||
- if (ctx->codec.h265.mv_col_buf_size > 0) {
|
||||
- dma_free_attrs(dev->dev, ctx->codec.h265.mv_col_buf_size,
|
||||
- ctx->codec.h265.mv_col_buf,
|
||||
- ctx->codec.h265.mv_col_buf_addr,
|
||||
- DMA_ATTR_NO_KERNEL_MAPPING);
|
||||
-
|
||||
- ctx->codec.h265.mv_col_buf_size = 0;
|
||||
- }
|
||||
-
|
||||
dma_free_attrs(dev->dev, CEDRUS_H265_NEIGHBOR_INFO_BUF_SIZE,
|
||||
ctx->codec.h265.neighbor_info_buf,
|
||||
ctx->codec.h265.neighbor_info_buf_addr,
|
||||
@@ -786,6 +783,17 @@ static void cedrus_h265_trigger(struct cedrus_ctx *ctx)
|
||||
cedrus_write(dev, VE_DEC_H265_TRIGGER, VE_DEC_H265_TRIGGER_DEC_SLICE);
|
||||
}
|
||||
|
||||
+static void cedrus_h265_buf_cleanup(struct cedrus_ctx *ctx,
|
||||
+ struct cedrus_buffer *buf)
|
||||
+{
|
||||
+ if (buf->codec.h265.mv_col_buf_size)
|
||||
+ dma_free_attrs(ctx->dev->dev,
|
||||
+ buf->codec.h265.mv_col_buf_size,
|
||||
+ buf->codec.h265.mv_col_buf,
|
||||
+ buf->codec.h265.mv_col_buf_dma,
|
||||
+ DMA_ATTR_NO_KERNEL_MAPPING);
|
||||
+}
|
||||
+
|
||||
struct cedrus_dec_ops cedrus_dec_ops_h265 = {
|
||||
.irq_clear = cedrus_h265_irq_clear,
|
||||
.irq_disable = cedrus_h265_irq_disable,
|
||||
@@ -794,4 +802,5 @@ struct cedrus_dec_ops cedrus_dec_ops_h265 = {
|
||||
.start = cedrus_h265_start,
|
||||
.stop = cedrus_h265_stop,
|
||||
.trigger = cedrus_h265_trigger,
|
||||
+ .buf_cleanup = cedrus_h265_buf_cleanup,
|
||||
};
|
||||
@@ -1,201 +0,0 @@
|
||||
From a881ce25cba8e45c6a86b5a680981c3b14b5b1e1 Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Date: Sat, 9 Nov 2019 14:12:42 +0100
|
||||
Subject: [PATCH 30/44] media: cedrus: h264: Improve buffer management
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
---
|
||||
drivers/staging/media/sunxi/cedrus/cedrus.h | 3 +
|
||||
.../staging/media/sunxi/cedrus/cedrus_h264.c | 93 ++++++++-----------
|
||||
2 files changed, 44 insertions(+), 52 deletions(-)
|
||||
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus.h
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus.h
|
||||
@@ -104,6 +104,9 @@ struct cedrus_buffer {
|
||||
struct {
|
||||
unsigned int position;
|
||||
enum cedrus_h264_pic_type pic_type;
|
||||
+ void *mv_col_buf;
|
||||
+ dma_addr_t mv_col_buf_dma;
|
||||
+ ssize_t mv_col_buf_size;
|
||||
} h264;
|
||||
struct {
|
||||
void *mv_col_buf;
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus_h264.c
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_h264.c
|
||||
@@ -55,16 +55,14 @@ static void cedrus_h264_write_sram(struc
|
||||
}
|
||||
|
||||
static dma_addr_t cedrus_h264_mv_col_buf_addr(struct cedrus_ctx *ctx,
|
||||
- unsigned int position,
|
||||
+ struct cedrus_buffer *buf,
|
||||
unsigned int field)
|
||||
{
|
||||
- dma_addr_t addr = ctx->codec.h264.mv_col_buf_dma;
|
||||
+ dma_addr_t addr = buf->codec.h264.mv_col_buf_dma;
|
||||
|
||||
- /* Adjust for the position */
|
||||
- addr += position * ctx->codec.h264.mv_col_buf_field_size * 2;
|
||||
-
|
||||
- /* Adjust for the field */
|
||||
- addr += field * ctx->codec.h264.mv_col_buf_field_size;
|
||||
+ /* Adjust for the field */
|
||||
+ if (field)
|
||||
+ addr += buf->codec.h264.mv_col_buf_size / 2;
|
||||
|
||||
return addr;
|
||||
}
|
||||
@@ -76,7 +74,6 @@ static void cedrus_fill_ref_pic(struct c
|
||||
struct cedrus_h264_sram_ref_pic *pic)
|
||||
{
|
||||
struct vb2_buffer *vbuf = &buf->m2m_buf.vb.vb2_buf;
|
||||
- unsigned int position = buf->codec.h264.position;
|
||||
|
||||
pic->top_field_order_cnt = cpu_to_le32(top_field_order_cnt);
|
||||
pic->bottom_field_order_cnt = cpu_to_le32(bottom_field_order_cnt);
|
||||
@@ -85,9 +82,9 @@ static void cedrus_fill_ref_pic(struct c
|
||||
pic->luma_ptr = cpu_to_le32(cedrus_buf_addr(vbuf, &ctx->dst_fmt, 0));
|
||||
pic->chroma_ptr = cpu_to_le32(cedrus_buf_addr(vbuf, &ctx->dst_fmt, 1));
|
||||
pic->mv_col_top_ptr =
|
||||
- cpu_to_le32(cedrus_h264_mv_col_buf_addr(ctx, position, 0));
|
||||
+ cpu_to_le32(cedrus_h264_mv_col_buf_addr(ctx, buf, 0));
|
||||
pic->mv_col_bot_ptr =
|
||||
- cpu_to_le32(cedrus_h264_mv_col_buf_addr(ctx, position, 1));
|
||||
+ cpu_to_le32(cedrus_h264_mv_col_buf_addr(ctx, buf, 1));
|
||||
}
|
||||
|
||||
static void cedrus_write_frame_list(struct cedrus_ctx *ctx,
|
||||
@@ -146,6 +143,28 @@ static void cedrus_write_frame_list(stru
|
||||
output_buf = vb2_to_cedrus_buffer(&run->dst->vb2_buf);
|
||||
output_buf->codec.h264.position = position;
|
||||
|
||||
+ if (!output_buf->codec.h264.mv_col_buf_size) {
|
||||
+ const struct v4l2_ctrl_h264_sps *sps = run->h264.sps;
|
||||
+ unsigned int field_size;
|
||||
+
|
||||
+ field_size = DIV_ROUND_UP(ctx->src_fmt.width, 16) *
|
||||
+ DIV_ROUND_UP(ctx->src_fmt.height, 16) * 16;
|
||||
+ if (!(sps->flags & V4L2_H264_SPS_FLAG_DIRECT_8X8_INFERENCE))
|
||||
+ field_size = field_size * 2;
|
||||
+ if (!(sps->flags & V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY))
|
||||
+ field_size = field_size * 2;
|
||||
+
|
||||
+ output_buf->codec.h264.mv_col_buf_size = field_size * 2;
|
||||
+ output_buf->codec.h264.mv_col_buf =
|
||||
+ dma_alloc_attrs(dev->dev,
|
||||
+ output_buf->codec.h264.mv_col_buf_size,
|
||||
+ &output_buf->codec.h264.mv_col_buf_dma,
|
||||
+ GFP_KERNEL, DMA_ATTR_NO_KERNEL_MAPPING);
|
||||
+
|
||||
+ if (!output_buf->codec.h264.mv_col_buf)
|
||||
+ output_buf->codec.h264.mv_col_buf_size = 0;
|
||||
+ }
|
||||
+
|
||||
if (decode->flags & V4L2_H264_DECODE_PARAM_FLAG_FIELD_PIC)
|
||||
output_buf->codec.h264.pic_type = CEDRUS_H264_PIC_TYPE_FIELD;
|
||||
else if (sps->flags & V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD)
|
||||
@@ -516,8 +535,6 @@ static int cedrus_h264_start(struct cedr
|
||||
{
|
||||
struct cedrus_dev *dev = ctx->dev;
|
||||
unsigned int pic_info_size;
|
||||
- unsigned int field_size;
|
||||
- unsigned int mv_col_size;
|
||||
int ret;
|
||||
|
||||
/* Formula for picture buffer size is taken from CedarX source. */
|
||||
@@ -560,38 +577,6 @@ static int cedrus_h264_start(struct cedr
|
||||
goto err_pic_buf;
|
||||
}
|
||||
|
||||
- field_size = DIV_ROUND_UP(ctx->src_fmt.width, 16) *
|
||||
- DIV_ROUND_UP(ctx->src_fmt.height, 16) * 16;
|
||||
-
|
||||
- /*
|
||||
- * FIXME: This is actually conditional to
|
||||
- * V4L2_H264_SPS_FLAG_DIRECT_8X8_INFERENCE not being set, we
|
||||
- * might have to rework this if memory efficiency ever is
|
||||
- * something we need to work on.
|
||||
- */
|
||||
- field_size = field_size * 2;
|
||||
-
|
||||
- /*
|
||||
- * FIXME: This is actually conditional to
|
||||
- * V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY not being set, we might
|
||||
- * have to rework this if memory efficiency ever is something
|
||||
- * we need to work on.
|
||||
- */
|
||||
- field_size = field_size * 2;
|
||||
- ctx->codec.h264.mv_col_buf_field_size = field_size;
|
||||
-
|
||||
- mv_col_size = field_size * 2 * CEDRUS_H264_FRAME_NUM;
|
||||
- ctx->codec.h264.mv_col_buf_size = mv_col_size;
|
||||
- ctx->codec.h264.mv_col_buf =
|
||||
- dma_alloc_attrs(dev->dev,
|
||||
- ctx->codec.h264.mv_col_buf_size,
|
||||
- &ctx->codec.h264.mv_col_buf_dma,
|
||||
- GFP_KERNEL, DMA_ATTR_NO_KERNEL_MAPPING);
|
||||
- if (!ctx->codec.h264.mv_col_buf) {
|
||||
- ret = -ENOMEM;
|
||||
- goto err_neighbor_buf;
|
||||
- }
|
||||
-
|
||||
if (ctx->src_fmt.width > 2048) {
|
||||
/*
|
||||
* Formulas for deblock and intra prediction buffer sizes
|
||||
@@ -606,7 +592,7 @@ static int cedrus_h264_start(struct cedr
|
||||
GFP_KERNEL);
|
||||
if (!ctx->codec.h264.deblk_buf) {
|
||||
ret = -ENOMEM;
|
||||
- goto err_mv_col_buf;
|
||||
+ goto err_neighbor_buf;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -633,12 +619,6 @@ err_deblk_buf:
|
||||
ctx->codec.h264.deblk_buf,
|
||||
ctx->codec.h264.deblk_buf_dma);
|
||||
|
||||
-err_mv_col_buf:
|
||||
- dma_free_attrs(dev->dev, ctx->codec.h264.mv_col_buf_size,
|
||||
- ctx->codec.h264.mv_col_buf,
|
||||
- ctx->codec.h264.mv_col_buf_dma,
|
||||
- DMA_ATTR_NO_KERNEL_MAPPING);
|
||||
-
|
||||
err_neighbor_buf:
|
||||
dma_free_attrs(dev->dev, CEDRUS_NEIGHBOR_INFO_BUF_SIZE,
|
||||
ctx->codec.h264.neighbor_info_buf,
|
||||
@@ -654,10 +635,6 @@ static void cedrus_h264_stop(struct cedr
|
||||
{
|
||||
struct cedrus_dev *dev = ctx->dev;
|
||||
|
||||
- dma_free_attrs(dev->dev, ctx->codec.h264.mv_col_buf_size,
|
||||
- ctx->codec.h264.mv_col_buf,
|
||||
- ctx->codec.h264.mv_col_buf_dma,
|
||||
- DMA_ATTR_NO_KERNEL_MAPPING);
|
||||
dma_free_attrs(dev->dev, CEDRUS_NEIGHBOR_INFO_BUF_SIZE,
|
||||
ctx->codec.h264.neighbor_info_buf,
|
||||
ctx->codec.h264.neighbor_info_buf_dma,
|
||||
@@ -681,6 +659,17 @@ static void cedrus_h264_trigger(struct c
|
||||
VE_H264_TRIGGER_TYPE_AVC_SLICE_DECODE);
|
||||
}
|
||||
|
||||
+static void cedrus_h264_buf_cleanup(struct cedrus_ctx *ctx,
|
||||
+ struct cedrus_buffer *buf)
|
||||
+{
|
||||
+ if (buf->codec.h264.mv_col_buf_size)
|
||||
+ dma_free_attrs(ctx->dev->dev,
|
||||
+ buf->codec.h264.mv_col_buf_size,
|
||||
+ buf->codec.h264.mv_col_buf,
|
||||
+ buf->codec.h264.mv_col_buf_dma,
|
||||
+ DMA_ATTR_NO_KERNEL_MAPPING);
|
||||
+}
|
||||
+
|
||||
struct cedrus_dec_ops cedrus_dec_ops_h264 = {
|
||||
.irq_clear = cedrus_h264_irq_clear,
|
||||
.irq_disable = cedrus_h264_irq_disable,
|
||||
@@ -689,4 +677,5 @@ struct cedrus_dec_ops cedrus_dec_ops_h26
|
||||
.start = cedrus_h264_start,
|
||||
.stop = cedrus_h264_stop,
|
||||
.trigger = cedrus_h264_trigger,
|
||||
+ .buf_cleanup = cedrus_h264_buf_cleanup,
|
||||
};
|
||||
@@ -1,155 +0,0 @@
|
||||
From 54389b5956af51023b073a08eeb7a746a4a37119 Mon Sep 17 00:00:00 2001
|
||||
From: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
Date: Sun, 15 Mar 2020 21:35:39 +0100
|
||||
Subject: [PATCH 31/44] WIp: 10-bit HEVC support
|
||||
|
||||
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
---
|
||||
drivers/staging/media/sunxi/cedrus/cedrus.c | 4 +--
|
||||
.../staging/media/sunxi/cedrus/cedrus_h265.c | 12 ++++++++
|
||||
.../staging/media/sunxi/cedrus/cedrus_regs.h | 4 +++
|
||||
.../staging/media/sunxi/cedrus/cedrus_video.c | 30 +++++++++++++++----
|
||||
.../staging/media/sunxi/cedrus/cedrus_video.h | 2 +-
|
||||
5 files changed, 44 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus.c
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus.c
|
||||
@@ -289,7 +289,7 @@ static int cedrus_open(struct file *file
|
||||
goto err_ctrls;
|
||||
}
|
||||
ctx->dst_fmt.pixelformat = V4L2_PIX_FMT_NV12_32L32;
|
||||
- cedrus_prepare_format(&ctx->dst_fmt);
|
||||
+ cedrus_prepare_format(&ctx->dst_fmt, 0);
|
||||
ctx->src_fmt.pixelformat = V4L2_PIX_FMT_MPEG2_SLICE;
|
||||
/*
|
||||
* TILED_NV12 has more strict requirements, so copy the width and
|
||||
@@ -297,7 +297,7 @@ static int cedrus_open(struct file *file
|
||||
*/
|
||||
ctx->src_fmt.width = ctx->dst_fmt.width;
|
||||
ctx->src_fmt.height = ctx->dst_fmt.height;
|
||||
- cedrus_prepare_format(&ctx->src_fmt);
|
||||
+ cedrus_prepare_format(&ctx->src_fmt, 0);
|
||||
|
||||
v4l2_fh_add(&ctx->fh);
|
||||
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c
|
||||
@@ -534,6 +534,18 @@ static void cedrus_h265_setup(struct ced
|
||||
|
||||
cedrus_write(dev, VE_DEC_H265_DEC_PCM_CTRL, reg);
|
||||
|
||||
+ if (sps->bit_depth_luma_minus8 == 2) {
|
||||
+ unsigned int size;
|
||||
+
|
||||
+ size = ALIGN(ctx->src_fmt.width, 16) * ALIGN(ctx->src_fmt.height, 16);
|
||||
+
|
||||
+ reg = (size * 3) / 2;
|
||||
+ cedrus_write(dev, VE_DEC_H265_OFFSET_ADDR_FIRST_OUT, reg);
|
||||
+
|
||||
+ reg = DIV_ROUND_UP(ctx->src_fmt.width, 4);
|
||||
+ cedrus_write(dev, VE_DEC_H265_10BIT_CONFIGURE, ALIGN(reg, 32));
|
||||
+ }
|
||||
+
|
||||
/* PPS. */
|
||||
|
||||
reg = VE_DEC_H265_DEC_PPS_CTRL0_PPS_CR_QP_OFFSET(pps->pps_cr_qp_offset) |
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus_regs.h
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_regs.h
|
||||
@@ -499,6 +499,10 @@
|
||||
|
||||
#define VE_DEC_H265_LOW_ADDR (VE_ENGINE_DEC_H265 + 0x80)
|
||||
|
||||
+#define VE_DEC_H265_OFFSET_ADDR_FIRST_OUT (VE_ENGINE_DEC_H265 + 0x84)
|
||||
+#define VE_DEC_H265_OFFSET_ADDR_SECOND_OUT (VE_ENGINE_DEC_H265 + 0x88)
|
||||
+#define VE_DEC_H265_10BIT_CONFIGURE (VE_ENGINE_DEC_H265 + 0x8c)
|
||||
+
|
||||
#define VE_DEC_H265_LOW_ADDR_PRIMARY_CHROMA(a) \
|
||||
SHIFT_AND_MASK_BITS(a, 31, 24)
|
||||
#define VE_DEC_H265_LOW_ADDR_SECONDARY_CHROMA(a) \
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus_video.c
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_video.c
|
||||
@@ -100,7 +100,7 @@ static struct cedrus_format *cedrus_find
|
||||
return &cedrus_formats[i];
|
||||
}
|
||||
|
||||
-void cedrus_prepare_format(struct v4l2_pix_format *pix_fmt)
|
||||
+void cedrus_prepare_format(struct v4l2_pix_format *pix_fmt, int extended)
|
||||
{
|
||||
unsigned int width = pix_fmt->width;
|
||||
unsigned int height = pix_fmt->height;
|
||||
@@ -155,6 +155,17 @@ void cedrus_prepare_format(struct v4l2_p
|
||||
break;
|
||||
}
|
||||
|
||||
+ if (extended) {
|
||||
+ unsigned int extra_size;
|
||||
+
|
||||
+ extra_size = DIV_ROUND_UP(pix_fmt->width, 4);
|
||||
+ extra_size = ALIGN(extra_size, 32);
|
||||
+ extra_size *= ALIGN(pix_fmt->height, 16) * 3;
|
||||
+ extra_size /= 2;
|
||||
+
|
||||
+ sizeimage += extra_size;
|
||||
+ }
|
||||
+
|
||||
pix_fmt->width = width;
|
||||
pix_fmt->height = height;
|
||||
|
||||
@@ -247,17 +258,27 @@ static int cedrus_try_fmt_vid_cap(struct
|
||||
struct cedrus_ctx *ctx = cedrus_file2ctx(file);
|
||||
struct cedrus_dev *dev = ctx->dev;
|
||||
struct v4l2_pix_format *pix_fmt = &f->fmt.pix;
|
||||
+ const struct v4l2_ctrl_hevc_sps *sps;
|
||||
struct cedrus_format *fmt =
|
||||
cedrus_find_format(pix_fmt->pixelformat, CEDRUS_DECODE_DST,
|
||||
dev->capabilities);
|
||||
+ int extended;
|
||||
|
||||
if (!fmt)
|
||||
return -EINVAL;
|
||||
|
||||
+ sps = cedrus_find_control_data(ctx, V4L2_CID_STATELESS_HEVC_SPS);
|
||||
+
|
||||
+ /* The 10-bitHEVC decoder needs extra size on the output buffer. */
|
||||
+ extended = ctx->src_fmt.pixelformat == V4L2_PIX_FMT_HEVC_SLICE &&
|
||||
+ sps->bit_depth_luma_minus8 == 2;
|
||||
+
|
||||
pix_fmt->pixelformat = fmt->pixelformat;
|
||||
pix_fmt->width = ctx->src_fmt.width;
|
||||
pix_fmt->height = ctx->src_fmt.height;
|
||||
- cedrus_prepare_format(pix_fmt);
|
||||
+
|
||||
+ pix_fmt->pixelformat = fmt->pixelformat;
|
||||
+ cedrus_prepare_format(pix_fmt, extended);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -275,8 +296,7 @@ static int cedrus_try_fmt_vid_out(struct
|
||||
if (!fmt)
|
||||
return -EINVAL;
|
||||
|
||||
- pix_fmt->pixelformat = fmt->pixelformat;
|
||||
- cedrus_prepare_format(pix_fmt);
|
||||
+ cedrus_prepare_format(pix_fmt, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -357,7 +377,7 @@ static int cedrus_s_fmt_vid_out(struct f
|
||||
ctx->dst_fmt.quantization = f->fmt.pix.quantization;
|
||||
ctx->dst_fmt.width = ctx->src_fmt.width;
|
||||
ctx->dst_fmt.height = ctx->src_fmt.height;
|
||||
- cedrus_prepare_format(&ctx->dst_fmt);
|
||||
+ cedrus_prepare_format(&ctx->dst_fmt, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
--- a/drivers/staging/media/sunxi/cedrus/cedrus_video.h
|
||||
+++ b/drivers/staging/media/sunxi/cedrus/cedrus_video.h
|
||||
@@ -26,6 +26,6 @@ extern const struct v4l2_ioctl_ops cedru
|
||||
|
||||
int cedrus_queue_init(void *priv, struct vb2_queue *src_vq,
|
||||
struct vb2_queue *dst_vq);
|
||||
-void cedrus_prepare_format(struct v4l2_pix_format *pix_fmt);
|
||||
+void cedrus_prepare_format(struct v4l2_pix_format *pix_fmt, int extended);
|
||||
|
||||
#endif
|
||||
@@ -1,150 +0,0 @@
|
||||
From git@z Thu Jan 1 00:00:00 1970
|
||||
Subject: [PATCH] net: phy: add support for Motorcomm yt8531C phy
|
||||
From: Peter Geis <pgwipeout@gmail.com>
|
||||
Date: Sun, 09 Oct 2022 22:24:05 +0300
|
||||
Message-Id: <20221009192405.97118-1-f.kardame@manjaro.org>
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
Content-Transfer-Encoding: 7bit
|
||||
|
||||
This patch adds support for Motorcomm YT8531C which is
|
||||
used in OrangePi 3 LTS, OrangePi 4 LTS and OrangePi 800
|
||||
Currently being used by Manjaro Arm kernel
|
||||
|
||||
Signed-off-by: Peter Geis <pgwipeout@gmail.com>
|
||||
Signed-off-by: Furkan Kardame <f.kardame@manjaro.org>
|
||||
---
|
||||
drivers/net/phy/motorcomm.c | 90 +++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 90 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/phy/motorcomm.c b/drivers/net/phy/motorcomm.c
|
||||
index 7e6ac2c5e..cbc8ef15d 100644
|
||||
--- a/drivers/net/phy/motorcomm.c
|
||||
+++ b/drivers/net/phy/motorcomm.c
|
||||
@@ -10,6 +10,7 @@
|
||||
#include <linux/phy.h>
|
||||
|
||||
#define PHY_ID_YT8511 0x0000010a
|
||||
+#define PHY_ID_YT8531 0x4f51e91b
|
||||
|
||||
#define YT8511_PAGE_SELECT 0x1e
|
||||
#define YT8511_PAGE 0x1f
|
||||
@@ -38,6 +39,38 @@
|
||||
#define YT8511_DELAY_FE_TX_EN (0xf << 12)
|
||||
#define YT8511_DELAY_FE_TX_DIS (0x2 << 12)
|
||||
|
||||
+#define YT8531_RGMII_CONFIG1 0xa003
|
||||
+
|
||||
+/* TX Gig-E Delay is bits 3:0, default 0x1
|
||||
+ * TX Fast-E Delay is bits 7:4, default 0xf
|
||||
+ * RX Delay is bits 13:10, default 0x0
|
||||
+ * Delay = 150ps * N
|
||||
+ * On = 2000ps, off = 50ps
|
||||
+ */
|
||||
+#define YT8531_DELAY_GE_TX_EN (0xd << 0)
|
||||
+#define YT8531_DELAY_GE_TX_DIS (0x0 << 0)
|
||||
+#define YT8531_DELAY_FE_TX_EN (0xd << 4)
|
||||
+#define YT8531_DELAY_FE_TX_DIS (0x0 << 4)
|
||||
+#define YT8531_DELAY_RX_EN (0xd << 10)
|
||||
+#define YT8531_DELAY_RX_DIS (0x0 << 10)
|
||||
+#define YT8531_DELAY_MASK (GENMASK(13, 10) | GENMASK(7, 0))
|
||||
+
|
||||
+#define YT8531_SYNCE_CFG 0xa012
|
||||
+
|
||||
+/* Clk src config is bits 3:1
|
||||
+ * 3b000 src from pll
|
||||
+ * 3b001 src from rx_clk
|
||||
+ * 3b010 src from serdes
|
||||
+ * 3b011 src from ptp_in
|
||||
+ * 3b100 src from 25mhz refclk *default*
|
||||
+ * 3b101 src from 25mhz ssc
|
||||
+ * Clk rate select is bit 4
|
||||
+ * 1b0 25mhz clk output *default*
|
||||
+ * 1b1 125mhz clk output
|
||||
+ * Clkout enable is bit 6
|
||||
+ */
|
||||
+#define YT8531_CLKCFG_125M (BIT(6) | BIT(4) | (0x0 < 1))
|
||||
+
|
||||
static int yt8511_read_page(struct phy_device *phydev)
|
||||
{
|
||||
return __phy_read(phydev, YT8511_PAGE_SELECT);
|
||||
@@ -111,6 +145,51 @@ static int yt8511_config_init(struct phy_device *phydev)
|
||||
return phy_restore_page(phydev, oldpage, ret);
|
||||
}
|
||||
|
||||
+static int yt8531_config_init(struct phy_device *phydev)
|
||||
+{
|
||||
+ int oldpage, ret = 0;
|
||||
+ unsigned int val;
|
||||
+
|
||||
+ oldpage = phy_select_page(phydev, YT8531_RGMII_CONFIG1);
|
||||
+ if (oldpage < 0)
|
||||
+ goto err_restore_page;
|
||||
+
|
||||
+ /* set rgmii delay mode */
|
||||
+ switch (phydev->interface) {
|
||||
+ case PHY_INTERFACE_MODE_RGMII:
|
||||
+ val = YT8531_DELAY_RX_DIS | YT8531_DELAY_GE_TX_DIS | YT8531_DELAY_FE_TX_DIS;
|
||||
+ break;
|
||||
+ case PHY_INTERFACE_MODE_RGMII_RXID:
|
||||
+ val = YT8531_DELAY_RX_EN | YT8531_DELAY_GE_TX_DIS | YT8531_DELAY_FE_TX_DIS;
|
||||
+ break;
|
||||
+ case PHY_INTERFACE_MODE_RGMII_TXID:
|
||||
+ val = YT8531_DELAY_RX_DIS | YT8531_DELAY_GE_TX_EN | YT8531_DELAY_FE_TX_EN;
|
||||
+ break;
|
||||
+ case PHY_INTERFACE_MODE_RGMII_ID:
|
||||
+ val = YT8531_DELAY_RX_EN | YT8531_DELAY_GE_TX_EN | YT8531_DELAY_FE_TX_EN;
|
||||
+ break;
|
||||
+ default: /* do not support other modes */
|
||||
+ ret = -EOPNOTSUPP;
|
||||
+ goto err_restore_page;
|
||||
+ }
|
||||
+
|
||||
+ ret = __phy_modify(phydev, YT8511_PAGE, YT8531_DELAY_MASK, val);
|
||||
+ if (ret < 0)
|
||||
+ goto err_restore_page;
|
||||
+
|
||||
+ /* set clock mode to 125mhz */
|
||||
+ ret = __phy_write(phydev, YT8511_PAGE_SELECT, YT8531_SYNCE_CFG);
|
||||
+ if (ret < 0)
|
||||
+ goto err_restore_page;
|
||||
+
|
||||
+ ret = __phy_write(phydev, YT8511_PAGE, YT8531_CLKCFG_125M);
|
||||
+ if (ret < 0)
|
||||
+ goto err_restore_page;
|
||||
+
|
||||
+err_restore_page:
|
||||
+ return phy_restore_page(phydev, oldpage, ret);
|
||||
+}
|
||||
+
|
||||
static struct phy_driver motorcomm_phy_drvs[] = {
|
||||
{
|
||||
PHY_ID_MATCH_EXACT(PHY_ID_YT8511),
|
||||
@@ -120,7 +200,16 @@ static struct phy_driver motorcomm_phy_drvs[] = {
|
||||
.resume = genphy_resume,
|
||||
.read_page = yt8511_read_page,
|
||||
.write_page = yt8511_write_page,
|
||||
+ }, {
|
||||
+ PHY_ID_MATCH_EXACT(PHY_ID_YT8531),
|
||||
+ .name = "YT8531 Gigabit Ethernet",
|
||||
+ .config_init = yt8531_config_init,
|
||||
+ .suspend = genphy_suspend,
|
||||
+ .resume = genphy_resume,
|
||||
+ .read_page = yt8511_read_page,
|
||||
+ .write_page = yt8511_write_page,
|
||||
},
|
||||
+
|
||||
};
|
||||
|
||||
module_phy_driver(motorcomm_phy_drvs);
|
||||
@@ -131,6 +220,7 @@ MODULE_LICENSE("GPL");
|
||||
|
||||
static const struct mdio_device_id __maybe_unused motorcomm_tbl[] = {
|
||||
{ PHY_ID_MATCH_EXACT(PHY_ID_YT8511) },
|
||||
+ { PHY_ID_MATCH_EXACT(PHY_ID_YT8531) },
|
||||
{ /* sentinal */ }
|
||||
};
|
||||
|
||||
--
|
||||
2.37.3
|
||||
|
||||
@@ -27,7 +27,7 @@ new file mode 100644
|
||||
index 000000000000..6a5df1103a90
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3-lts.dts
|
||||
@@ -0,0 +1,313 @@
|
||||
@@ -0,0 +1,315 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
+// Copyright (C) 2023 Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||
+// Based on sun50i-h6-orangepi-3.dts, which is:
|
||||
@@ -133,8 +133,8 @@ index 000000000000..6a5df1103a90
|
||||
+ phy-mode = "rgmii";
|
||||
+ phy-handle = <&ext_rgmii_phy>;
|
||||
+ phy-supply = <®_gmac_3v3>;
|
||||
+ allwinner,rx-delay-ps = <200>;
|
||||
+ allwinner,tx-delay-ps = <300>;
|
||||
+ allwinner,rx-delay-ps = <1500>;
|
||||
+ allwinner,tx-delay-ps = <700>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
@@ -159,6 +159,8 @@ index 000000000000..6a5df1103a90
|
||||
+ compatible = "ethernet-phy-ieee802.3-c22";
|
||||
+ reg = <1>;
|
||||
+
|
||||
+ motorcomm,clk-out-frequency-hz = <125000000>;
|
||||
+
|
||||
+ reset-gpios = <&pio 3 14 GPIO_ACTIVE_LOW>; /* PD14 */
|
||||
+ reset-assert-us = <15000>;
|
||||
+ reset-deassert-us = <40000>;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user