summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2018-05-17 03:38:27 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2018-05-17 03:38:26 -0700
commit99a11f15e4ced45efe166f1bf3b073be06f71db4 (patch)
tree671ee45c1f4e14b052bb8f12ce3004192535c33a
parent308200f414f3e85b2ed6931bfceee49dae188d1d (diff)
parentc342078792a4813368f1127272a26039112decb5 (diff)
Merge "Revert "sound: usb: Provide controller number in QMI response""
-rw-r--r--drivers/usb/core/hcd.c11
-rw-r--r--drivers/usb/core/usb.c10
-rw-r--r--drivers/usb/host/xhci.c12
-rw-r--r--include/linux/usb.h1
-rw-r--r--include/linux/usb/hcd.h3
-rw-r--r--sound/usb/usb_audio_qmi_svc.c83
-rw-r--r--sound/usb/usb_audio_qmi_v01.c40
-rw-r--r--sound/usb/usb_audio_qmi_v01.h16
8 files changed, 88 insertions, 88 deletions
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 6fb109d88510..2184c5b53970 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -2242,6 +2242,17 @@ usb_hcd_get_sec_event_ring_dma_addr(struct usb_device *udev,
}
dma_addr_t
+usb_hcd_get_dcba_dma_addr(struct usb_device *udev)
+{
+ struct usb_hcd *hcd = bus_to_hcd(udev->bus);
+
+ if (!HCD_RH_RUNNING(hcd))
+ return 0;
+
+ return hcd->driver->get_dcba_dma_addr(hcd, udev);
+}
+
+dma_addr_t
usb_hcd_get_xfer_ring_dma_addr(struct usb_device *udev,
struct usb_host_endpoint *ep)
{
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
index 65bf86f18a34..e64fd6570a23 100644
--- a/drivers/usb/core/usb.c
+++ b/drivers/usb/core/usb.c
@@ -697,6 +697,16 @@ usb_get_sec_event_ring_dma_addr(struct usb_device *dev,
}
EXPORT_SYMBOL(usb_get_sec_event_ring_dma_addr);
+dma_addr_t
+usb_get_dcba_dma_addr(struct usb_device *dev)
+{
+ if (dev->state == USB_STATE_NOTATTACHED)
+ return 0;
+
+ return usb_hcd_get_dcba_dma_addr(dev);
+}
+EXPORT_SYMBOL(usb_get_dcba_dma_addr);
+
dma_addr_t usb_get_xfer_ring_dma_addr(struct usb_device *dev,
struct usb_host_endpoint *ep)
{
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
index 7e76573c8236..8a4217c0c56c 100644
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -4999,6 +4999,17 @@ dma_addr_t xhci_get_sec_event_ring_dma_addr(struct usb_hcd *hcd,
return 0;
}
+static dma_addr_t xhci_get_dcba_dma_addr(struct usb_hcd *hcd,
+ struct usb_device *udev)
+{
+ struct xhci_hcd *xhci = hcd_to_xhci(hcd);
+
+ if (!(xhci->xhc_state & XHCI_STATE_HALTED) && xhci->dcbaa)
+ return xhci->dcbaa->dev_context_ptrs[udev->slot_id];
+
+ return 0;
+}
+
dma_addr_t xhci_get_xfer_ring_dma_addr(struct usb_hcd *hcd,
struct usb_device *udev, struct usb_host_endpoint *ep)
{
@@ -5094,6 +5105,7 @@ static const struct hc_driver xhci_hc_driver = {
.sec_event_ring_cleanup = xhci_sec_event_ring_cleanup,
.get_sec_event_ring_dma_addr = xhci_get_sec_event_ring_dma_addr,
.get_xfer_ring_dma_addr = xhci_get_xfer_ring_dma_addr,
+ .get_dcba_dma_addr = xhci_get_dcba_dma_addr,
.get_core_id = xhci_get_core_id,
};
diff --git a/include/linux/usb.h b/include/linux/usb.h
index 1821d34c24a5..2189e292d50c 100644
--- a/include/linux/usb.h
+++ b/include/linux/usb.h
@@ -753,6 +753,7 @@ extern int usb_sec_event_ring_cleanup(struct usb_device *dev,
extern dma_addr_t
usb_get_sec_event_ring_dma_addr(struct usb_device *dev,
unsigned intr_num);
+extern dma_addr_t usb_get_dcba_dma_addr(struct usb_device *dev);
extern dma_addr_t usb_get_xfer_ring_dma_addr(struct usb_device *dev,
struct usb_host_endpoint *ep);
extern int usb_get_controller_id(struct usb_device *dev);
diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h
index 8cbf59e6406b..f603b46ff48a 100644
--- a/include/linux/usb/hcd.h
+++ b/include/linux/usb/hcd.h
@@ -403,6 +403,8 @@ struct hc_driver {
unsigned intr_num);
dma_addr_t (*get_xfer_ring_dma_addr)(struct usb_hcd *hcd,
struct usb_device *udev, struct usb_host_endpoint *ep);
+ dma_addr_t (*get_dcba_dma_addr)(struct usb_hcd *hcd,
+ struct usb_device *udev);
int (*get_core_id)(struct usb_hcd *hcd);
};
@@ -449,6 +451,7 @@ extern int usb_hcd_sec_event_ring_cleanup(struct usb_device *udev,
extern dma_addr_t
usb_hcd_get_sec_event_ring_dma_addr(struct usb_device *udev,
unsigned intr_num);
+extern dma_addr_t usb_hcd_get_dcba_dma_addr(struct usb_device *udev);
extern dma_addr_t
usb_hcd_get_xfer_ring_dma_addr(struct usb_device *udev,
struct usb_host_endpoint *ep);
diff --git a/sound/usb/usb_audio_qmi_svc.c b/sound/usb/usb_audio_qmi_svc.c
index 0e83ff2877de..dc66b6016f8d 100644
--- a/sound/usb/usb_audio_qmi_svc.c
+++ b/sound/usb/usb_audio_qmi_svc.c
@@ -46,7 +46,8 @@
/* event ring iova base address */
#define IOVA_BASE 0x1000
-#define IOVA_XFER_RING_BASE (IOVA_BASE + PAGE_SIZE * (SNDRV_CARDS + 1))
+#define IOVA_DCBA_BASE 0x2000
+#define IOVA_XFER_RING_BASE (IOVA_DCBA_BASE + PAGE_SIZE * (SNDRV_CARDS + 1))
#define IOVA_XFER_BUF_BASE (IOVA_XFER_RING_BASE + PAGE_SIZE * SNDRV_CARDS * 32)
#define IOVA_XFER_RING_MAX (IOVA_XFER_BUF_BASE - PAGE_SIZE)
#define IOVA_XFER_BUF_MAX (0xfffff000 - PAGE_SIZE)
@@ -83,6 +84,8 @@ struct uaudio_dev {
unsigned int card_num;
atomic_t in_use;
struct kref kref;
+ unsigned long dcba_iova;
+ size_t dcba_size;
wait_queue_head_t disconnect_wq;
/* interface specific */
@@ -99,6 +102,9 @@ struct uaudio_qmi_dev {
struct iommu_domain *domain;
/* list to keep track of available iova */
+ struct list_head dcba_list;
+ size_t dcba_iova_size;
+ unsigned long curr_dcba_iova;
struct list_head xfer_ring_list;
size_t xfer_ring_iova_size;
unsigned long curr_xfer_ring_iova;
@@ -145,6 +151,7 @@ static struct msg_desc uaudio_stream_ind_desc = {
enum mem_type {
MEM_EVENT_RING,
+ MEM_DCBA,
MEM_XFER_RING,
MEM_XFER_BUF,
};
@@ -170,24 +177,6 @@ enum usb_qmi_audio_format {
USB_QMI_PCM_FORMAT_U32_BE,
};
-static enum usb_audio_device_speed_enum_v01
-get_speed_info(enum usb_device_speed udev_speed)
-{
- switch (udev_speed) {
- case USB_SPEED_LOW:
- return USB_AUDIO_DEVICE_SPEED_LOW_V01;
- case USB_SPEED_FULL:
- return USB_AUDIO_DEVICE_SPEED_FULL_V01;
- case USB_SPEED_HIGH:
- return USB_AUDIO_DEVICE_SPEED_HIGH_V01;
- case USB_SPEED_SUPER:
- return USB_AUDIO_DEVICE_SPEED_SUPER_V01;
- default:
- pr_err("%s: udev speed %d\n", __func__, udev_speed);
- return USB_AUDIO_DEVICE_SPEED_INVALID_V01;
- }
-}
-
static unsigned long uaudio_get_iova(unsigned long *curr_iova,
size_t *curr_iova_size, struct list_head *head, size_t size)
{
@@ -287,6 +276,10 @@ static unsigned long uaudio_iommu_map(enum mem_type mtype, phys_addr_t pa,
if (uaudio_qdev->er_phys_addr == pa)
map = false;
break;
+ case MEM_DCBA:
+ va = uaudio_get_iova(&uaudio_qdev->curr_dcba_iova,
+ &uaudio_qdev->dcba_iova_size, &uaudio_qdev->dcba_list, size);
+ break;
case MEM_XFER_RING:
va = uaudio_get_iova(&uaudio_qdev->curr_xfer_ring_iova,
&uaudio_qdev->xfer_ring_iova_size, &uaudio_qdev->xfer_ring_list,
@@ -371,7 +364,10 @@ static void uaudio_iommu_unmap(enum mem_type mtype, unsigned long va,
else
unmap = false;
break;
-
+ case MEM_DCBA:
+ uaudio_put_iova(va, size, &uaudio_qdev->dcba_list,
+ &uaudio_qdev->dcba_iova_size);
+ break;
case MEM_XFER_RING:
uaudio_put_iova(va, size, &uaudio_qdev->xfer_ring_list,
&uaudio_qdev->xfer_ring_iova_size);
@@ -413,7 +409,8 @@ static int prepare_qmi_response(struct snd_usb_substream *subs,
void *hdr_ptr;
u8 *xfer_buf;
u32 len, mult, remainder, xfer_buf_len;
- unsigned long va, tr_data_va = 0, tr_sync_va = 0, xfer_buf_va = 0;
+ unsigned long va, tr_data_va = 0, tr_sync_va = 0, dcba_va = 0,
+ xfer_buf_va = 0;
phys_addr_t xhci_pa, xfer_buf_pa;
iface = usb_ifnum_to_if(subs->dev, subs->interface);
@@ -558,13 +555,6 @@ skip_sync_ep:
resp->interrupter_num = uaudio_qdev->intr_num;
resp->interrupter_num_valid = 1;
- ret = usb_get_controller_id(subs->dev);
- if (ret < 0)
- goto err;
-
- resp->controller_num = ret;
- resp->controller_num_valid = 1;
-
/* map xhci data structures PA memory to iova */
/* event ring */
@@ -592,17 +582,33 @@ skip_sync_ep:
resp->xhci_mem_info.evt_ring.size = PAGE_SIZE;
uaudio_qdev->er_phys_addr = xhci_pa;
- resp->speed_info = get_speed_info(subs->dev->speed);
- if (resp->speed_info == USB_AUDIO_DEVICE_SPEED_INVALID_V01)
+ /* dcba */
+ xhci_pa = usb_get_dcba_dma_addr(subs->dev);
+ if (!xhci_pa) {
+ pr_err("%s:failed to get dcba dma address\n", __func__);
goto unmap_er;
+ }
+
+ if (!uadev[card_num].dcba_iova) { /* mappped per usb device */
+ va = uaudio_iommu_map(MEM_DCBA, xhci_pa, PAGE_SIZE);
+ if (!va)
+ goto unmap_er;
+
+ uadev[card_num].dcba_iova = va;
+ uadev[card_num].dcba_size = PAGE_SIZE;
+ }
- resp->speed_info_valid = 1;
+ dcba_va = uadev[card_num].dcba_iova;
+ resp->xhci_mem_info.dcba.va = PREPEND_SID_TO_IOVA(dcba_va,
+ uaudio_qdev->sid);
+ resp->xhci_mem_info.dcba.pa = xhci_pa;
+ resp->xhci_mem_info.dcba.size = PAGE_SIZE;
/* data transfer ring */
xhci_pa = resp->xhci_mem_info.tr_data.pa;
va = uaudio_iommu_map(MEM_XFER_RING, xhci_pa, PAGE_SIZE);
if (!va)
- goto unmap_er;
+ goto unmap_dcba;
tr_data_va = va;
resp->xhci_mem_info.tr_data.va = PREPEND_SID_TO_IOVA(va,
@@ -702,6 +708,8 @@ unmap_sync:
uaudio_iommu_unmap(MEM_XFER_RING, tr_sync_va, PAGE_SIZE);
unmap_data:
uaudio_iommu_unmap(MEM_XFER_RING, tr_data_va, PAGE_SIZE);
+unmap_dcba:
+ uaudio_iommu_unmap(MEM_DCBA, dcba_va, PAGE_SIZE);
unmap_er:
uaudio_iommu_unmap(MEM_EVENT_RING, IOVA_BASE, PAGE_SIZE);
err:
@@ -747,6 +755,11 @@ static void uaudio_dev_cleanup(struct uaudio_dev *dev)
dev->info[if_idx].intf_num, dev->card_num);
}
+ /* iommu_unmap dcba iova for a usb device */
+ uaudio_iommu_unmap(MEM_DCBA, dev->dcba_iova, dev->dcba_size);
+
+ dev->dcba_iova = 0;
+ dev->dcba_size = 0;
dev->num_intf = 0;
/* free interface info */
@@ -1216,7 +1229,11 @@ static int uaudio_qmi_plat_probe(struct platform_device *pdev)
goto free_domain;
}
- /* initialize xfer ring and xfer buf iova list */
+ /* initialize dcba, xfer ring and xfer buf iova list */
+ INIT_LIST_HEAD(&uaudio_qdev->dcba_list);
+ uaudio_qdev->curr_dcba_iova = IOVA_DCBA_BASE;
+ uaudio_qdev->dcba_iova_size = SNDRV_CARDS * PAGE_SIZE;
+
INIT_LIST_HEAD(&uaudio_qdev->xfer_ring_list);
uaudio_qdev->curr_xfer_ring_iova = IOVA_XFER_RING_BASE;
uaudio_qdev->xfer_ring_iova_size =
diff --git a/sound/usb/usb_audio_qmi_v01.c b/sound/usb/usb_audio_qmi_v01.c
index 9b97fd22a099..beff1aaf4981 100644
--- a/sound/usb/usb_audio_qmi_v01.c
+++ b/sound/usb/usb_audio_qmi_v01.c
@@ -633,46 +633,6 @@ struct elem_info qmi_uaudio_stream_resp_msg_v01_ei[] = {
interrupter_num),
},
{
- .data_type = QMI_OPT_FLAG,
- .elem_len = 1,
- .elem_size = sizeof(uint8_t),
- .is_array = NO_ARRAY,
- .tlv_type = 0x1C,
- .offset = offsetof(
- struct qmi_uaudio_stream_resp_msg_v01,
- speed_info_valid),
- },
- {
- .data_type = QMI_SIGNED_4_BYTE_ENUM,
- .elem_len = 1,
- .elem_size = sizeof(enum usb_audio_device_speed_enum_v01),
- .is_array = NO_ARRAY,
- .tlv_type = 0x1C,
- .offset = offsetof(
- struct qmi_uaudio_stream_resp_msg_v01,
- speed_info),
- },
- {
- .data_type = QMI_OPT_FLAG,
- .elem_len = 1,
- .elem_size = sizeof(uint8_t),
- .is_array = NO_ARRAY,
- .tlv_type = 0x1D,
- .offset = offsetof(
- struct qmi_uaudio_stream_resp_msg_v01,
- controller_num_valid),
- },
- {
- .data_type = QMI_UNSIGNED_1_BYTE,
- .elem_len = 1,
- .elem_size = sizeof(uint8_t),
- .is_array = NO_ARRAY,
- .tlv_type = 0x1D,
- .offset = offsetof(
- struct qmi_uaudio_stream_resp_msg_v01,
- controller_num),
- },
- {
.data_type = QMI_EOTI,
.is_array = NO_ARRAY,
.is_array = QMI_COMMON_TLV_TYPE,
diff --git a/sound/usb/usb_audio_qmi_v01.h b/sound/usb/usb_audio_qmi_v01.h
index 32315fde0907..f3b6eb05d5f0 100644
--- a/sound/usb/usb_audio_qmi_v01.h
+++ b/sound/usb/usb_audio_qmi_v01.h
@@ -77,16 +77,6 @@ enum usb_audio_device_indication_enum_v01 {
USB_AUDIO_DEVICE_INDICATION_ENUM_MAX_VAL_V01 = INT_MAX,
};
-enum usb_audio_device_speed_enum_v01 {
- USB_AUDIO_DEVICE_SPEED_ENUM_MIN_VAL_V01 = INT_MIN,
- USB_AUDIO_DEVICE_SPEED_INVALID_V01 = 0,
- USB_AUDIO_DEVICE_SPEED_LOW_V01 = 1,
- USB_AUDIO_DEVICE_SPEED_FULL_V01 = 2,
- USB_AUDIO_DEVICE_SPEED_HIGH_V01 = 3,
- USB_AUDIO_DEVICE_SPEED_SUPER_V01 = 4,
- USB_AUDIO_DEVICE_SPEED_ENUM_MAX_VAL_V01 = INT_MAX,
-};
-
struct qmi_uaudio_stream_req_msg_v01 {
uint8_t enable;
uint32_t usb_token;
@@ -128,12 +118,8 @@ struct qmi_uaudio_stream_resp_msg_v01 {
struct apps_mem_info_v01 xhci_mem_info;
uint8_t interrupter_num_valid;
uint8_t interrupter_num;
- uint8_t speed_info_valid;
- enum usb_audio_device_speed_enum_v01 speed_info;
- uint8_t controller_num_valid;
- uint8_t controller_num;
};
-#define QMI_UAUDIO_STREAM_RESP_MSG_V01_MAX_MSG_LEN 202
+#define QMI_UAUDIO_STREAM_RESP_MSG_V01_MAX_MSG_LEN 191
extern struct elem_info qmi_uaudio_stream_resp_msg_v01_ei[];
struct qmi_uaudio_stream_ind_msg_v01 {