* [PATCH v3 2/4] drivers: iio: ti_am335x_adc: add dma support
From: Mugunthan V N @ 2016-10-05 9:04 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <20161005090443.24576-1-mugunthanvnm@ti.com>
This patch adds the required pieces to ti_am335x_adc driver for
DMA support
Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com>
---
drivers/iio/adc/ti_am335x_adc.c | 148 ++++++++++++++++++++++++++++++++++-
include/linux/mfd/ti_am335x_tscadc.h | 7 ++
2 files changed, 152 insertions(+), 3 deletions(-)
diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index c3cfacca..ad9dec3 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -30,10 +30,28 @@
#include <linux/iio/buffer.h>
#include <linux/iio/kfifo_buf.h>
+#include <linux/dmaengine.h>
+#include <linux/dma-mapping.h>
+
+#define DMA_BUFFER_SIZE SZ_2K
+
+struct tiadc_dma {
+ struct dma_slave_config conf;
+ struct dma_chan *chan;
+ dma_addr_t addr;
+ dma_cookie_t cookie;
+ u8 *buf;
+ int current_period;
+ int period_size;
+ u8 fifo_thresh;
+};
+
struct tiadc_device {
struct ti_tscadc_dev *mfd_tscadc;
+ struct tiadc_dma dma;
struct mutex fifo1_lock; /* to protect fifo access */
int channels;
+ int total_ch_enabled;
u8 channel_line[8];
u8 channel_step[8];
int buffer_en_ch_steps;
@@ -198,6 +216,67 @@ static irqreturn_t tiadc_worker_h(int irq, void *private)
return IRQ_HANDLED;
}
+static void tiadc_dma_rx_complete(void *param)
+{
+ struct iio_dev *indio_dev = param;
+ struct tiadc_device *adc_dev = iio_priv(indio_dev);
+ struct tiadc_dma *dma = &adc_dev->dma;
+ u8 *data;
+ int i;
+
+ data = dma->buf + dma->current_period * dma->period_size;
+ dma->current_period = 1 - dma->current_period; /* swap the buffer ID */
+
+ for (i = 0; i < dma->period_size; i += indio_dev->scan_bytes) {
+ iio_push_to_buffers(indio_dev, data);
+ data += indio_dev->scan_bytes;
+ }
+}
+
+static int tiadc_start_dma(struct iio_dev *indio_dev)
+{
+ struct tiadc_device *adc_dev = iio_priv(indio_dev);
+ struct tiadc_dma *dma = &adc_dev->dma;
+ struct dma_async_tx_descriptor *desc;
+
+ dma->current_period = 0; /* We start to fill period 0 */
+ /*
+ * Make the fifo thresh as the multiple of total number of
+ * channels enabled, so make sure that cyclic DMA period
+ * length is also a multiple of total number of channels
+ * enabled. This ensures that no invalid data is reported
+ * to the stack via iio_push_to_buffers().
+ */
+ dma->fifo_thresh = rounddown(FIFO1_THRESHOLD + 1,
+ adc_dev->total_ch_enabled) - 1;
+ /* Make sure that period length is multiple of fifo thresh level */
+ dma->period_size = rounddown(DMA_BUFFER_SIZE / 2,
+ (dma->fifo_thresh + 1) * sizeof(u16));
+
+ dma->conf.src_maxburst = dma->fifo_thresh + 1;
+ dmaengine_slave_config(dma->chan, &dma->conf);
+
+ desc = dmaengine_prep_dma_cyclic(dma->chan, dma->addr,
+ dma->period_size * 2,
+ dma->period_size, DMA_DEV_TO_MEM,
+ DMA_PREP_INTERRUPT);
+ if (!desc)
+ return -EBUSY;
+
+ desc->callback = tiadc_dma_rx_complete;
+ desc->callback_param = indio_dev;
+
+ dma->cookie = dmaengine_submit(desc);
+
+ dma_async_issue_pending(dma->chan);
+
+ tiadc_writel(adc_dev, REG_FIFO1THR, dma->fifo_thresh);
+ tiadc_writel(adc_dev, REG_DMA1REQ, dma->fifo_thresh);
+ tiadc_writel(adc_dev, REG_DMAENABLE_SET, DMA_FIFO1);
+
+ return 0;
+}
+
static int tiadc_buffer_preenable(struct iio_dev *indio_dev)
{
struct tiadc_device *adc_dev = iio_priv(indio_dev);
@@ -218,20 +297,30 @@ static int tiadc_buffer_preenable(struct iio_dev *indio_dev)
static int tiadc_buffer_postenable(struct iio_dev *indio_dev)
{
struct tiadc_device *adc_dev = iio_priv(indio_dev);
+ struct tiadc_dma *dma = &adc_dev->dma;
+ unsigned int irq_enable;
unsigned int enb = 0;
u8 bit;
tiadc_step_config(indio_dev);
- for_each_set_bit(bit, indio_dev->active_scan_mask, adc_dev->channels)
+ for_each_set_bit(bit, indio_dev->active_scan_mask, adc_dev->channels) {
enb |= (get_adc_step_bit(adc_dev, bit) << 1);
+ adc_dev->total_ch_enabled++;
+ }
adc_dev->buffer_en_ch_steps = enb;
+ if (dma->chan)
+ tiadc_start_dma(indio_dev);
+
am335x_tsc_se_set_cache(adc_dev->mfd_tscadc, enb);
tiadc_writel(adc_dev, REG_IRQSTATUS, IRQENB_FIFO1THRES
| IRQENB_FIFO1OVRRUN | IRQENB_FIFO1UNDRFLW);
- tiadc_writel(adc_dev, REG_IRQENABLE, IRQENB_FIFO1THRES
- | IRQENB_FIFO1OVRRUN);
+
+ irq_enable = IRQENB_FIFO1OVRRUN;
+ if (!dma->chan)
+ irq_enable |= IRQENB_FIFO1THRES;
+ tiadc_writel(adc_dev, REG_IRQENABLE, irq_enable);
return 0;
}
@@ -239,12 +328,18 @@ static int tiadc_buffer_postenable(struct iio_dev *indio_dev)
static int tiadc_buffer_predisable(struct iio_dev *indio_dev)
{
struct tiadc_device *adc_dev = iio_priv(indio_dev);
+ struct tiadc_dma *dma = &adc_dev->dma;
int fifo1count, i, read;
tiadc_writel(adc_dev, REG_IRQCLR, (IRQENB_FIFO1THRES |
IRQENB_FIFO1OVRRUN | IRQENB_FIFO1UNDRFLW));
am335x_tsc_se_clr(adc_dev->mfd_tscadc, adc_dev->buffer_en_ch_steps);
adc_dev->buffer_en_ch_steps = 0;
+ adc_dev->total_ch_enabled = 0;
+ if (dma->chan) {
+ tiadc_writel(adc_dev, REG_DMAENABLE_CLEAR, 0x2);
+ dmaengine_terminate_async(dma->chan);
+ }
/* Flush FIFO of leftover data in the time it takes to disable adc */
fifo1count = tiadc_readl(adc_dev, REG_FIFO1CNT);
@@ -430,6 +525,41 @@ static const struct iio_info tiadc_info = {
.driver_module = THIS_MODULE,
};
+static int tiadc_request_dma(struct platform_device *pdev,
+ struct tiadc_device *adc_dev)
+{
+ struct tiadc_dma *dma = &adc_dev->dma;
+ dma_cap_mask_t mask;
+
+ /* Default slave configuration parameters */
+ dma->conf.direction = DMA_DEV_TO_MEM;
+ dma->conf.src_addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;
+ dma->conf.src_addr = adc_dev->mfd_tscadc->tscadc_phys_base + REG_FIFO1;
+
+ dma_cap_zero(mask);
+ dma_cap_set(DMA_CYCLIC, mask);
+
+ /* Get a channel for RX */
+ dma->chan = dma_request_chan(adc_dev->mfd_tscadc->dev, "fifo1");
+ if (IS_ERR(dma->chan)) {
+ int ret = PTR_ERR(dma->chan);
+
+ dma->chan = NULL;
+ return ret;
+ }
+
+ /* RX buffer */
+ dma->buf = dma_alloc_coherent(dma->chan->device->dev, DMA_BUFFER_SIZE,
+ &dma->addr, GFP_KERNEL);
+ if (!dma->buf)
+ goto err;
+
+ return 0;
+err:
+ dma_release_channel(dma->chan);
+ return -ENOMEM;
+}
+
static int tiadc_parse_dt(struct platform_device *pdev,
struct tiadc_device *adc_dev)
{
@@ -512,8 +642,14 @@ static int tiadc_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, indio_dev);
+ err = tiadc_request_dma(pdev, adc_dev);
+ if (err && err == -EPROBE_DEFER)
+ goto err_dma;
+
return 0;
+err_dma:
+ iio_device_unregister(indio_dev);
err_buffer_unregister:
tiadc_iio_buffered_hardware_remove(indio_dev);
err_free_channels:
@@ -525,8 +661,14 @@ static int tiadc_remove(struct platform_device *pdev)
{
struct iio_dev *indio_dev = platform_get_drvdata(pdev);
struct tiadc_device *adc_dev = iio_priv(indio_dev);
+ struct tiadc_dma *dma = &adc_dev->dma;
u32 step_en;
+ if (dma->chan) {
+ dma_free_coherent(dma->chan->device->dev, DMA_BUFFER_SIZE,
+ dma->buf, dma->addr);
+ dma_release_channel(dma->chan);
+ }
iio_device_unregister(indio_dev);
tiadc_iio_buffered_hardware_remove(indio_dev);
tiadc_channels_remove(indio_dev);
diff --git a/include/linux/mfd/ti_am335x_tscadc.h b/include/linux/mfd/ti_am335x_tscadc.h
index e45a208..b9a53e0 100644
--- a/include/linux/mfd/ti_am335x_tscadc.h
+++ b/include/linux/mfd/ti_am335x_tscadc.h
@@ -23,6 +23,8 @@
#define REG_IRQENABLE 0x02C
#define REG_IRQCLR 0x030
#define REG_IRQWAKEUP 0x034
+#define REG_DMAENABLE_SET 0x038
+#define REG_DMAENABLE_CLEAR 0x03c
#define REG_CTRL 0x040
#define REG_ADCFSM 0x044
#define REG_CLKDIV 0x04C
@@ -36,6 +38,7 @@
#define REG_FIFO0THR 0xE8
#define REG_FIFO1CNT 0xF0
#define REG_FIFO1THR 0xF4
+#define REG_DMA1REQ 0xF8
#define REG_FIFO0 0x100
#define REG_FIFO1 0x200
@@ -126,6 +129,10 @@
#define FIFOREAD_DATA_MASK (0xfff << 0)
#define FIFOREAD_CHNLID_MASK (0xf << 16)
+/* DMA ENABLE/CLEAR Register */
+#define DMA_FIFO0 BIT(0)
+#define DMA_FIFO1 BIT(1)
+
/* Sequencer Status */
#define SEQ_STATUS BIT(5)
#define CHARGE_STEP 0x11
--
2.10.0.372.g6fe1b14
^ permalink raw reply related
* [PATCH v3 1/4] mfd: ti_am335x_tscadc: store physical address
From: Mugunthan V N @ 2016-10-05 9:04 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <20161005090443.24576-1-mugunthanvnm@ti.com>
store the physical address of the device in its priv to use it
for DMA addressing in the client drivers.
Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com>
---
drivers/mfd/ti_am335x_tscadc.c | 1 +
include/linux/mfd/ti_am335x_tscadc.h | 1 +
2 files changed, 2 insertions(+)
diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
index c8f027b..0f3fab4 100644
--- a/drivers/mfd/ti_am335x_tscadc.c
+++ b/drivers/mfd/ti_am335x_tscadc.c
@@ -183,6 +183,7 @@ static int ti_tscadc_probe(struct platform_device *pdev)
tscadc->irq = err;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ tscadc->tscadc_phys_base = res->start;
tscadc->tscadc_base = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(tscadc->tscadc_base))
return PTR_ERR(tscadc->tscadc_base);
diff --git a/include/linux/mfd/ti_am335x_tscadc.h b/include/linux/mfd/ti_am335x_tscadc.h
index 7f55b8b..e45a208 100644
--- a/include/linux/mfd/ti_am335x_tscadc.h
+++ b/include/linux/mfd/ti_am335x_tscadc.h
@@ -155,6 +155,7 @@ struct ti_tscadc_dev {
struct device *dev;
struct regmap *regmap;
void __iomem *tscadc_base;
+ phys_addr_t tscadc_phys_base;
int irq;
int used_cells; /* 1-2 */
int tsc_wires;
--
2.10.0.372.g6fe1b14
^ permalink raw reply related
* [PATCH v3 0/4] Add DMA support for ti_am335x_adc driver
From: Mugunthan V N @ 2016-10-05 9:04 UTC (permalink / raw)
To: linux-arm-kernel
The ADC has a 64 word depth fifo length which holds the ADC data
till the CPU reads. So when a user program needs a large ADC data
to operate on, then it has to do multiple reads to get its
buffer. Currently if the application asks for 4 samples per
channel with all 8 channels are enabled, kernel can provide only
3 samples per channel when all 8 channels are enabled (logs at
[1]). So with DMA support user can request for large number of
samples at a time (logs at [1]).
Tested the patch on AM437x-gp-evm and AM335x Boneblack with the
patch [2] to enable ADC and pushed a branch for testing [3]
Changes from v2:
* Fixed an issue on handling of error return from dma_request_chan().
Changes from Initial version:
* Changed DMA api from dma_request_slave_channel_compat() to
dma_request_chan()
* Changed variable names to have more clear information as per
comments from Peter.
[1] - http://pastebin.ubuntu.com/23278405/
[2] - http://pastebin.ubuntu.com/23211494/
[3] - git://git.ti.com/~mugunthanvnm/ti-linux-kernel/linux.git iio-dma-v2
Mugunthan V N (4):
mfd: ti_am335x_tscadc: store physical address
drivers: iio: ti_am335x_adc: add dma support
ARM: dts: am33xx: add DMA properties for tscadc
ARM: dts: am4372: add DMA properties for tscadc
arch/arm/boot/dts/am33xx.dtsi | 2 +
arch/arm/boot/dts/am4372.dtsi | 2 +
drivers/iio/adc/ti_am335x_adc.c | 148 ++++++++++++++++++++++++++++++++++-
drivers/mfd/ti_am335x_tscadc.c | 1 +
include/linux/mfd/ti_am335x_tscadc.h | 8 ++
5 files changed, 158 insertions(+), 3 deletions(-)
--
2.10.0.372.g6fe1b14
^ permalink raw reply
* [PATCH v2 2/4] drivers: iio: ti_am335x_adc: add dma support
From: Mugunthan V N @ 2016-10-05 8:52 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <f00632fa-a542-c633-ae5e-3a42cf364a9f@ti.com>
On Wednesday 05 October 2016 02:16 PM, Peter Ujfalusi wrote:
> On 10/05/16 11:17, Mugunthan V N wrote:
>> On Wednesday 05 October 2016 12:01 PM, Peter Ujfalusi wrote:
>>> On 10/05/16 09:21, Mugunthan V N wrote:
>>>> On Tuesday 04 October 2016 02:02 PM, Peter Ujfalusi wrote:
>>>>> On 10/03/16 16:03, Mugunthan V N wrote:
>>>>>> +static int tiadc_request_dma(struct platform_device *pdev,
>>>>>> + struct tiadc_device *adc_dev)
>>>>>> +{
>>>>>> + struct tiadc_dma *dma = &adc_dev->dma;
>>>>>> + dma_cap_mask_t mask;
>>>>>> +
>>>>>> + /* Default slave configuration parameters */
>>>>>> + dma->conf.direction = DMA_DEV_TO_MEM;
>>>>>> + dma->conf.src_addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;
>>>>>> + dma->conf.src_addr = adc_dev->mfd_tscadc->tscadc_phys_base + REG_FIFO1;
>>>>>> +
>>>>>> + dma_cap_zero(mask);
>>>>>> + dma_cap_set(DMA_CYCLIC, mask);
>>>>>> +
>>>>>> + /* Get a channel for RX */
>>>>>> + dma->chan = dma_request_chan(adc_dev->mfd_tscadc->dev, "fifo1");
>>>>>> + if (!dma->chan)
>>>>>> + return -ENODEV;
>>>>>
>>>>> dma_request_chan() ERR_PTR in case of failure, never NULL. You should reuse
>>>>> the returned error code to support deferred probing.
>>>>
>>>> Will fix this in v3.
>>>>
>>>>>
>>>>>> +
>>>>>> + /* RX buffer */
>>>>>> + dma->buf = dma_alloc_coherent(dma->chan->device->dev, DMA_BUFFER_SIZE,
>>>>>> + &dma->addr, GFP_KERNEL);
>>>>>> + if (!dma->buf)
>>>>>> + goto err;
>>>>>> +
>>>>>> + return 0;
>>>>>> +err:
>>>>>> + dma_release_channel(dma->chan);
>>>>>> +
>>>>>> + return -ENOMEM;
>>>>>> +}
>>>>>> +
>>>>>> static int tiadc_parse_dt(struct platform_device *pdev,
>>>>>> struct tiadc_device *adc_dev)
>>>>>> {
>>>>>> @@ -512,8 +639,14 @@ static int tiadc_probe(struct platform_device *pdev)
>>>>>>
>>>>>> platform_set_drvdata(pdev, indio_dev);
>>>>>>
>>>>>> + err = tiadc_request_dma(pdev, adc_dev);
>>>>>> + if (err && err != -ENODEV)
>>>>>> + goto err_dma;
>>>>>
>>>>> You should handle the deferred probing for DMA channel.
>>>>
>>>> + dma->chan = dma_request_chan(adc_dev->mfd_tscadc->dev, "fifo1");
>>>> + if (IS_ERR(dma->chan)) {
>>>> + int ret = PTR_ERR(dma->chan);
>>>> +
>>>> + dma->chan = NULL;
>>>> + return ret;
>>>
>>> You don't need the 'ret' variable:
>>> return PTR_ERR(dma->chan);
>>
>> So you mean change all *if (dma->chan)* to *if (IS_ERR(dma->chan))*?
>
> Oh, sorry. Your version was fine as you NULL the dma->chan before the return.
>
>>
>>>
>>>> + }
>>>>
>>>> With this probe defer will be taken care and ADC will continue without
>>>> DMA when request channel returns -ENODEV.
>>>
>>> I would rather have explicit check for deferred probe:
>>>
>>> err = tiadc_request_dma(pdev, adc_dev);
>>> if (err && err == -EPROBE_DEFER)
>>> goto err_dma;
>>
>> But in this case any other failure other than -EPROBE_DEFER will be
>> masked and ADC will be in PIO mode?
>
> Yes, exactly. If we fail to get the DMA channel we should not use the DMA and
> we only want to handle the deferred probing.
>
Okay, will update accordingly in next version.
Regards
Mugunthan V N
^ permalink raw reply
* [PATCH v2 2/4] drivers: iio: ti_am335x_adc: add dma support
From: Peter Ujfalusi @ 2016-10-05 8:46 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <1ffce826-b94a-5b9f-ffb4-ba2d0324b246@ti.com>
On 10/05/16 11:17, Mugunthan V N wrote:
> On Wednesday 05 October 2016 12:01 PM, Peter Ujfalusi wrote:
>> On 10/05/16 09:21, Mugunthan V N wrote:
>>> On Tuesday 04 October 2016 02:02 PM, Peter Ujfalusi wrote:
>>>> On 10/03/16 16:03, Mugunthan V N wrote:
>>>>> +static int tiadc_request_dma(struct platform_device *pdev,
>>>>> + struct tiadc_device *adc_dev)
>>>>> +{
>>>>> + struct tiadc_dma *dma = &adc_dev->dma;
>>>>> + dma_cap_mask_t mask;
>>>>> +
>>>>> + /* Default slave configuration parameters */
>>>>> + dma->conf.direction = DMA_DEV_TO_MEM;
>>>>> + dma->conf.src_addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;
>>>>> + dma->conf.src_addr = adc_dev->mfd_tscadc->tscadc_phys_base + REG_FIFO1;
>>>>> +
>>>>> + dma_cap_zero(mask);
>>>>> + dma_cap_set(DMA_CYCLIC, mask);
>>>>> +
>>>>> + /* Get a channel for RX */
>>>>> + dma->chan = dma_request_chan(adc_dev->mfd_tscadc->dev, "fifo1");
>>>>> + if (!dma->chan)
>>>>> + return -ENODEV;
>>>>
>>>> dma_request_chan() ERR_PTR in case of failure, never NULL. You should reuse
>>>> the returned error code to support deferred probing.
>>>
>>> Will fix this in v3.
>>>
>>>>
>>>>> +
>>>>> + /* RX buffer */
>>>>> + dma->buf = dma_alloc_coherent(dma->chan->device->dev, DMA_BUFFER_SIZE,
>>>>> + &dma->addr, GFP_KERNEL);
>>>>> + if (!dma->buf)
>>>>> + goto err;
>>>>> +
>>>>> + return 0;
>>>>> +err:
>>>>> + dma_release_channel(dma->chan);
>>>>> +
>>>>> + return -ENOMEM;
>>>>> +}
>>>>> +
>>>>> static int tiadc_parse_dt(struct platform_device *pdev,
>>>>> struct tiadc_device *adc_dev)
>>>>> {
>>>>> @@ -512,8 +639,14 @@ static int tiadc_probe(struct platform_device *pdev)
>>>>>
>>>>> platform_set_drvdata(pdev, indio_dev);
>>>>>
>>>>> + err = tiadc_request_dma(pdev, adc_dev);
>>>>> + if (err && err != -ENODEV)
>>>>> + goto err_dma;
>>>>
>>>> You should handle the deferred probing for DMA channel.
>>>
>>> + dma->chan = dma_request_chan(adc_dev->mfd_tscadc->dev, "fifo1");
>>> + if (IS_ERR(dma->chan)) {
>>> + int ret = PTR_ERR(dma->chan);
>>> +
>>> + dma->chan = NULL;
>>> + return ret;
>>
>> You don't need the 'ret' variable:
>> return PTR_ERR(dma->chan);
>
> So you mean change all *if (dma->chan)* to *if (IS_ERR(dma->chan))*?
Oh, sorry. Your version was fine as you NULL the dma->chan before the return.
>
>>
>>> + }
>>>
>>> With this probe defer will be taken care and ADC will continue without
>>> DMA when request channel returns -ENODEV.
>>
>> I would rather have explicit check for deferred probe:
>>
>> err = tiadc_request_dma(pdev, adc_dev);
>> if (err && err == -EPROBE_DEFER)
>> goto err_dma;
>
> But in this case any other failure other than -EPROBE_DEFER will be
> masked and ADC will be in PIO mode?
Yes, exactly. If we fail to get the DMA channel we should not use the DMA and
we only want to handle the deferred probing.
>
> Regards
> Mugunthan V N
>
--
P?ter
^ permalink raw reply
* [PATCH 6/6] ARM: da850: adjust memory settings for tilcdc
From: Peter Ujfalusi @ 2016-10-05 8:22 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <7hvax8ferr.fsf@baylibre.com>
On 10/04/16 16:02, Kevin Hilman wrote:
> Peter Ujfalusi <peter.ujfalusi@ti.com> writes:
>
>> On 10/01/16 12:24, Sekhar Nori wrote:
>
> [...]
>
>>> In any case, to configure the PBBR, you will have to introduce a driver
>>> for it in drivers/memory. Then you can set it up per board using a DT
>>> parameter.
>>
>> and we can reuse the introduced bindings for am335x and OMAP1/2 as well. On
>> OMAP the legacy DMA API provided a call to raise the priority of the sDMA in
>> EMIF :o That needs to be removed and replaced.
>
> Can you point us to the bindings you're referring to?
We don't have one atm.
And the DMA priority hack in legacy sDMA code is for OMAP1:
omap_set_dma_priority(). Basically it can change the sDMA priority in
OCPT1_PRIOR, OCPT2_PRIOR, EMIFF_PRIOR and EMIFS_PRIOR registers.
> Also, a new driver in drivers/memory is fine for setting the PBBR, but
> what about the SYSCFG0 registers. Are you OK with leaving those in the
> init code as proposed in $SUBJECT patch?
My problem is - as I described it in reply to Bartosz - is that for example I
don't want the LCDC to get high priority on OMAP-L138 EVM from Logic as it
does not have LCD/VGA by default. ifdef for LCDC is not good either since my
kernel have LCDC compiled in, but it is disabled.
The easiest way would be to have pdata quirk to handle the LCDK until we have
proper handling of the priority configuration.
--
P?ter
^ permalink raw reply
* [PATCH v2 2/4] drivers: iio: ti_am335x_adc: add dma support
From: Mugunthan V N @ 2016-10-05 8:17 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <de6bbf1c-e9e2-83b1-73c2-49aa64cc939c@ti.com>
On Wednesday 05 October 2016 12:01 PM, Peter Ujfalusi wrote:
> On 10/05/16 09:21, Mugunthan V N wrote:
>> On Tuesday 04 October 2016 02:02 PM, Peter Ujfalusi wrote:
>>> On 10/03/16 16:03, Mugunthan V N wrote:
>>>> +static int tiadc_request_dma(struct platform_device *pdev,
>>>> + struct tiadc_device *adc_dev)
>>>> +{
>>>> + struct tiadc_dma *dma = &adc_dev->dma;
>>>> + dma_cap_mask_t mask;
>>>> +
>>>> + /* Default slave configuration parameters */
>>>> + dma->conf.direction = DMA_DEV_TO_MEM;
>>>> + dma->conf.src_addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;
>>>> + dma->conf.src_addr = adc_dev->mfd_tscadc->tscadc_phys_base + REG_FIFO1;
>>>> +
>>>> + dma_cap_zero(mask);
>>>> + dma_cap_set(DMA_CYCLIC, mask);
>>>> +
>>>> + /* Get a channel for RX */
>>>> + dma->chan = dma_request_chan(adc_dev->mfd_tscadc->dev, "fifo1");
>>>> + if (!dma->chan)
>>>> + return -ENODEV;
>>>
>>> dma_request_chan() ERR_PTR in case of failure, never NULL. You should reuse
>>> the returned error code to support deferred probing.
>>
>> Will fix this in v3.
>>
>>>
>>>> +
>>>> + /* RX buffer */
>>>> + dma->buf = dma_alloc_coherent(dma->chan->device->dev, DMA_BUFFER_SIZE,
>>>> + &dma->addr, GFP_KERNEL);
>>>> + if (!dma->buf)
>>>> + goto err;
>>>> +
>>>> + return 0;
>>>> +err:
>>>> + dma_release_channel(dma->chan);
>>>> +
>>>> + return -ENOMEM;
>>>> +}
>>>> +
>>>> static int tiadc_parse_dt(struct platform_device *pdev,
>>>> struct tiadc_device *adc_dev)
>>>> {
>>>> @@ -512,8 +639,14 @@ static int tiadc_probe(struct platform_device *pdev)
>>>>
>>>> platform_set_drvdata(pdev, indio_dev);
>>>>
>>>> + err = tiadc_request_dma(pdev, adc_dev);
>>>> + if (err && err != -ENODEV)
>>>> + goto err_dma;
>>>
>>> You should handle the deferred probing for DMA channel.
>>
>> + dma->chan = dma_request_chan(adc_dev->mfd_tscadc->dev, "fifo1");
>> + if (IS_ERR(dma->chan)) {
>> + int ret = PTR_ERR(dma->chan);
>> +
>> + dma->chan = NULL;
>> + return ret;
>
> You don't need the 'ret' variable:
> return PTR_ERR(dma->chan);
So you mean change all *if (dma->chan)* to *if (IS_ERR(dma->chan))*?
>
>> + }
>>
>> With this probe defer will be taken care and ADC will continue without
>> DMA when request channel returns -ENODEV.
>
> I would rather have explicit check for deferred probe:
>
> err = tiadc_request_dma(pdev, adc_dev);
> if (err && err == -EPROBE_DEFER)
> goto err_dma;
But in this case any other failure other than -EPROBE_DEFER will be
masked and ADC will be in PIO mode?
Regards
Mugunthan V N
^ permalink raw reply
* [PATCH v2 2/2] ARM: dts: meson-gxbb: Add support for the Nexbox A95X Board
From: Neil Armstrong @ 2016-10-05 8:09 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <1475654980-16414-1-git-send-email-narmstrong@baylibre.com>
Add support for the S905 (GXBB) version of the Nexbox A95X.
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
---
arch/arm64/boot/dts/amlogic/Makefile | 1 +
.../boot/dts/amlogic/meson-gxbb-nexbox-a95x.dts | 108 +++++++++++++++++++++
2 files changed, 109 insertions(+)
create mode 100644 arch/arm64/boot/dts/amlogic/meson-gxbb-nexbox-a95x.dts
diff --git a/arch/arm64/boot/dts/amlogic/Makefile b/arch/arm64/boot/dts/amlogic/Makefile
index 57e0ae0..5a64050 100644
--- a/arch/arm64/boot/dts/amlogic/Makefile
+++ b/arch/arm64/boot/dts/amlogic/Makefile
@@ -1,3 +1,4 @@
+dtb-$(CONFIG_ARCH_MESON) += meson-gxbb-nexbox-a95x.dtb
dtb-$(CONFIG_ARCH_MESON) += meson-gxbb-odroidc2.dtb
dtb-$(CONFIG_ARCH_MESON) += meson-gxbb-p200.dtb
dtb-$(CONFIG_ARCH_MESON) += meson-gxbb-p201.dtb
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb-nexbox-a95x.dts b/arch/arm64/boot/dts/amlogic/meson-gxbb-nexbox-a95x.dts
new file mode 100644
index 0000000..80d7b35
--- /dev/null
+++ b/arch/arm64/boot/dts/amlogic/meson-gxbb-nexbox-a95x.dts
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2016 Andreas F?rber
+ * Copyright (c) 2016 BayLibre, Inc.
+ * Author: Neil Armstrong <narmstrong@kernel.org>
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ * a) This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ * b) Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/dts-v1/;
+
+#include "meson-gxbb.dtsi"
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+/ {
+ compatible = "nexbox,a95x", "amlogic,meson-gxbb";
+ model = "NEXBOX A95X";
+
+ aliases {
+ serial0 = &uart_AO;
+ };
+
+ chosen {
+ stdout-path = "serial0:115200n8";
+ };
+
+ memory at 0 {
+ device_type = "memory";
+ reg = <0x0 0x0 0x0 0x40000000>;
+ };
+
+ leds {
+ compatible = "gpio-leds";
+ blue {
+ label = "a95x:system-status";
+ gpios = <&gpio_ao GPIOAO_13 GPIO_ACTIVE_LOW>;
+ linux,default-trigger = "heartbeat";
+ default-state = "off";
+ };
+ };
+
+ gpio-keys-polled {
+ compatible = "gpio-keys-polled";
+ #address-cells = <1>;
+ #size-cells = <0>;
+ poll-interval = <100>;
+
+ button at 0 {
+ label = "reset";
+ linux,code = <KEY_RESTART>;
+ gpios = <&gpio_ao GPIOAO_3 GPIO_ACTIVE_LOW>;
+ };
+ };
+};
+
+&uart_AO {
+ status = "okay";
+ pinctrl-0 = <&uart_ao_a_pins>;
+ pinctrl-names = "default";
+};
+
+ðmac {
+ status = "okay";
+ pinctrl-0 = <ð_pins>;
+ pinctrl-names = "default";
+};
+
+&ir {
+ status = "okay";
+ pinctrl-0 = <&remote_input_ao_pins>;
+ pinctrl-names = "default";
+};
--
1.9.1
^ permalink raw reply related
* [PATCH v2 1/2] devicetree: Add vendor prefix for Nexbox
From: Neil Armstrong @ 2016-10-05 8:09 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <1475654980-16414-1-git-send-email-narmstrong@baylibre.com>
Nexbox is an IPTV set-top-box distributor, mainly with Amlogic SoCs:
https://www.inexbox.com
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
---
Documentation/devicetree/bindings/vendor-prefixes.txt | 1 +
1 file changed, 1 insertion(+)
diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt b/Documentation/devicetree/bindings/vendor-prefixes.txt
index a9999a3..ecb360f 100644
--- a/Documentation/devicetree/bindings/vendor-prefixes.txt
+++ b/Documentation/devicetree/bindings/vendor-prefixes.txt
@@ -182,6 +182,7 @@ neonode Neonode Inc.
netgear NETGEAR
netlogic Broadcom Corporation (formerly NetLogic Microsystems)
netxeon Shenzhen Netxeon Technology CO., LTD
+nexbox Nexbox
newhaven Newhaven Display International
nintendo Nintendo
nokia Nokia
--
1.9.1
^ permalink raw reply related
* [PATCH v2 0/2] ARM64: meson-gxbb: Add support for the Nexbox A95X Board
From: Neil Armstrong @ 2016-10-05 8:09 UTC (permalink / raw)
To: linux-arm-kernel
Add support for the Amlogic S905 (GXBB) version of the Nexbox A95X, an IPTV
set-top-box with Ethernet, SDCard, eMMC, USB, HDMI, IR, Led, Reset button and Audio Jack.
Changes since v1 at: http://lkml.kernel.org/r/1471951370-29269-1-git-send-email-narmstrong at baylibre.com
- Rebase on linux-next-20161004 with patchset [1]
- Add nexbox vendor prefix
[1] http://lkml.kernel.org/r/1475595430-30075-1-git-send-email-narmstrong at baylibre.com
Neil Armstrong (2):
devicetree: Add vendor prefix for Nexbox
ARM: dts: meson-gxbb: Add support for the Nexbox A95X Board
.../devicetree/bindings/vendor-prefixes.txt | 1 +
arch/arm64/boot/dts/amlogic/Makefile | 1 +
.../boot/dts/amlogic/meson-gxbb-nexbox-a95x.dts | 108 +++++++++++++++++++++
3 files changed, 110 insertions(+)
create mode 100644 arch/arm64/boot/dts/amlogic/meson-gxbb-nexbox-a95x.dts
--
1.9.1
^ permalink raw reply
* [PATCH 6/6] ARM: da850: adjust memory settings for tilcdc
From: Peter Ujfalusi @ 2016-10-05 8:02 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <CAMpxmJW=JgXvM8Rnk40nXxNL7dcqX2jU6HCR2MtQZXRJMd-UZw@mail.gmail.com>
On 10/04/16 12:20, Bartosz Golaszewski wrote:
> 2016-09-30 21:19 GMT+02:00 Peter Ujfalusi <peter.ujfalusi@ti.com>:
>> On 09/30/2016 06:06 PM, Bartosz Golaszewski wrote:
>>>
>>> Just ran a quick test with speaker-test -c2 -twav. Besides the fact
>>> that the left and right channels are inverted (I'm looking into that),
>>> I didn't notice any problems. Even at 1024x768 resolution, playing
>>> audio at the same time seems to work fine.
>>
>
> Hi Peter
>
>> That's good to hear, but I think the priorities should be set:
>> LCDC and EDMA30TC1 to highest priority
>> EDMA30TC0 to priority 2
>>
>> The 0TC0 is used by MMC and if you want to play a video you might need the
>> servicing TC to be higher priority then other masters.
>>
>> If audio playback would trigger sync losts in lcdc then we might need to move
>> 0TC1 to priority 1.
>>
>
> Did you mean "set EDMA31TC0 to priority 2"? EDMA30TC0 is already at
> the highest priority. Or did you mean that we need to lower the
> EDMA30TC0 priority? In that case: is 2 the correct value? EDMA31TC0 is
> used by mmc1 and its priority is 4. Shouldn't we set both to be the
> same?
What I mean is:
EMDA30TC1 = LCDC = 0;
EDMA30TC0 = 2;
I don't know what the MMC1 is used on the LCDK, but it is only used by add-on
card on Logic's OMAP-L138 EVM (wifi if I recall right). I would leave
EDMA31TC0 as 4.
And while we are here: this is my problem, I don't want LCDC to be high
priority on OMAP-L138 EVM as it has no display by default, no point of
fiddling with the EMIF priority there.
This is the reason why we should have a way via DT to set these priorities. A
DT fragment for OMAP-L138 EVM's wifi module might want to increase the
EDMA31TC0 priority to get better throughput, but on a bare board we don't want
that. If I would have the display module for the EVM, I would like to rise the
LCDC priority also, but I don't have one. If I have the aduio add-on module I
would want to keep audio as the highest priority (and the MMC0 to be able to
record/play audio files). etc.
>> I agree that LCDC priority needs to be higher, but I do wonder why the default
>> (5) is not working and if it is not working why it is 5...
>>
>> My guess is that the change in the PBBPR register is the one actually helping
>> here.
>>
>
> While it seems that lowering the EDMA30TC0 priority is indeed
> unnecessary, if I don't set the LCDC master to priority 0, I still get
> FIFO underflows even with the change in PBBPR.
I believe it is valid to raise the LCDC priority, but I wonder what blocks the
LCDC accesses when you don't really have anything going on in the background.
--
P?ter
^ permalink raw reply
* [PATCH v4 2/2] crypto: marvell - Don't break chain for computable last ahash requests
From: Romain Perier @ 2016-10-05 7:56 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <20161005075633.12711-1-romain.perier@free-electrons.com>
Currently, the driver breaks chain for all kind of hash requests in order to
don't override intermediate states of partial ahash updates. However, some final
ahash requests can be directly processed by the engine, and so without
intermediate state. This is typically the case for most for the HMAC requests
processed via IPSec.
This commits adds a TDMA descriptor to copy context for these of requests
into the "op" dma pool, then it allow to chain these requests at the DMA level.
The 'complete' operation is also updated to retrieve the MAC digest from the
right location.
Signed-off-by: Romain Perier <romain.perier@free-electrons.com>
---
Changes in v4:
- Remove the dummy descriptor at the end of the chain, when a TDMA_RESULT
is present. So, we re-wrote a bit the code of ahash_complete accordingly.
Changes in v3:
- Copy the whole context back to RAM and not just the digest. Also
fixed a rebase issue ^^ (whoops)
Changes in v2:
- Replaced BUG_ON by an error
- Add a variable "break_chain", with "type" to break the chain
drivers/crypto/marvell/hash.c | 65 ++++++++++++++++++++++++++++++++-----------
1 file changed, 49 insertions(+), 16 deletions(-)
diff --git a/drivers/crypto/marvell/hash.c b/drivers/crypto/marvell/hash.c
index 9f28468..2a92605 100644
--- a/drivers/crypto/marvell/hash.c
+++ b/drivers/crypto/marvell/hash.c
@@ -312,24 +312,40 @@ static void mv_cesa_ahash_complete(struct crypto_async_request *req)
int i;
digsize = crypto_ahash_digestsize(crypto_ahash_reqtfm(ahashreq));
- for (i = 0; i < digsize / 4; i++)
- creq->state[i] = readl_relaxed(engine->regs + CESA_IVDIG(i));
- if (creq->last_req) {
+ if (mv_cesa_req_get_type(&creq->base) == CESA_DMA_REQ &&
+ (creq->base.chain.last->flags & CESA_TDMA_TYPE_MSK) == CESA_TDMA_RESULT) {
+ __le32 *data = NULL;
+
/*
- * Hardware's MD5 digest is in little endian format, but
- * SHA in big endian format
+ * Result is already in the correct endianess when the SA is
+ * used
*/
- if (creq->algo_le) {
- __le32 *result = (void *)ahashreq->result;
+ data = creq->base.chain.last->op->ctx.hash.hash;
+ for (i = 0; i < digsize / 4; i++)
+ creq->state[i] = cpu_to_le32(data[i]);
- for (i = 0; i < digsize / 4; i++)
- result[i] = cpu_to_le32(creq->state[i]);
- } else {
- __be32 *result = (void *)ahashreq->result;
+ memcpy(ahashreq->result, data, digsize);
+ } else {
+ for (i = 0; i < digsize / 4; i++)
+ creq->state[i] = readl_relaxed(engine->regs +
+ CESA_IVDIG(i));
+ if (creq->last_req) {
+ /*
+ * Hardware's MD5 digest is in little endian format, but
+ * SHA in big endian format
+ */
+ if (creq->algo_le) {
+ __le32 *result = (void *)ahashreq->result;
+
+ for (i = 0; i < digsize / 4; i++)
+ result[i] = cpu_to_le32(creq->state[i]);
+ } else {
+ __be32 *result = (void *)ahashreq->result;
- for (i = 0; i < digsize / 4; i++)
- result[i] = cpu_to_be32(creq->state[i]);
+ for (i = 0; i < digsize / 4; i++)
+ result[i] = cpu_to_be32(creq->state[i]);
+ }
}
}
@@ -504,6 +520,12 @@ mv_cesa_ahash_dma_last_req(struct mv_cesa_tdma_chain *chain,
CESA_SA_DESC_CFG_LAST_FRAG,
CESA_SA_DESC_CFG_FRAG_MSK);
+ ret = mv_cesa_dma_add_result_op(chain,
+ CESA_SA_CFG_SRAM_OFFSET,
+ CESA_SA_DATA_SRAM_OFFSET,
+ CESA_TDMA_SRC_IN_SRAM, flags);
+ if (ret)
+ return ERR_PTR(-ENOMEM);
return op;
}
@@ -564,6 +586,7 @@ static int mv_cesa_ahash_dma_req_init(struct ahash_request *req)
struct mv_cesa_op_ctx *op = NULL;
unsigned int frag_len;
int ret;
+ u32 type;
basereq->chain.first = NULL;
basereq->chain.last = NULL;
@@ -635,7 +658,15 @@ static int mv_cesa_ahash_dma_req_init(struct ahash_request *req)
goto err_free_tdma;
}
- if (op) {
+ /*
+ * If results are copied via DMA, this means that this
+ * request can be directly processed by the engine,
+ * without partial updates. So we can chain it at the
+ * DMA level with other requests.
+ */
+ type = basereq->chain.last->flags & CESA_TDMA_TYPE_MSK;
+
+ if (op && type != CESA_TDMA_RESULT) {
/* Add dummy desc to wait for crypto operation end */
ret = mv_cesa_dma_add_dummy_end(&basereq->chain, flags);
if (ret)
@@ -648,8 +679,10 @@ static int mv_cesa_ahash_dma_req_init(struct ahash_request *req)
else
creq->cache_ptr = 0;
- basereq->chain.last->flags |= (CESA_TDMA_END_OF_REQ |
- CESA_TDMA_BREAK_CHAIN);
+ basereq->chain.last->flags |= CESA_TDMA_END_OF_REQ;
+
+ if (type != CESA_TDMA_RESULT)
+ basereq->chain.last->flags |= CESA_TDMA_BREAK_CHAIN;
return 0;
--
2.9.3
^ permalink raw reply related
* [PATCH v4 1/2] crypto: marvell - Use an unique pool to copy results of requests
From: Romain Perier @ 2016-10-05 7:56 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <20161005075633.12711-1-romain.perier@free-electrons.com>
So far, we used a dedicated dma pool to copy the result of outer IV for
cipher requests. Instead of using a dma pool per outer data, we prefer
use the op dma pool that contains all part of the request from the SRAM.
Then, the outer data that is likely to be used by the 'complete'
operation, is copied later. In this way, any type of result can be
retrieved by DMA for cipher or ahash requests.
Signed-off-by: Romain Perier <romain.perier@free-electrons.com>
Acked-by: Boris Brezillon <boris.brezillon@free-electrons.com>
---
Changes in v4:
- Added a comment that explains why we retrieve the first op ctx
of the chain.
- Added the tag 'Acked-by'
Changes in v3:
- Don't allocate a new op ctx for the last tdma descriptor. Instead
we point to the last op ctx in the tdma chain, and copy the context
of the current request to this location.
Changes in v2:
- Use the dma pool "op" to retrieve outer data intead of introducing
a new one.
drivers/crypto/marvell/cesa.c | 4 ----
drivers/crypto/marvell/cesa.h | 5 ++---
drivers/crypto/marvell/cipher.c | 8 +++++---
drivers/crypto/marvell/tdma.c | 33 +++++++++++++++++++--------------
4 files changed, 26 insertions(+), 24 deletions(-)
diff --git a/drivers/crypto/marvell/cesa.c b/drivers/crypto/marvell/cesa.c
index 37dadb2..6e7a5c7 100644
--- a/drivers/crypto/marvell/cesa.c
+++ b/drivers/crypto/marvell/cesa.c
@@ -375,10 +375,6 @@ static int mv_cesa_dev_dma_init(struct mv_cesa_dev *cesa)
if (!dma->padding_pool)
return -ENOMEM;
- dma->iv_pool = dmam_pool_create("cesa_iv", dev, 16, 1, 0);
- if (!dma->iv_pool)
- return -ENOMEM;
-
cesa->dma = dma;
return 0;
diff --git a/drivers/crypto/marvell/cesa.h b/drivers/crypto/marvell/cesa.h
index e423d33..a768da7 100644
--- a/drivers/crypto/marvell/cesa.h
+++ b/drivers/crypto/marvell/cesa.h
@@ -277,7 +277,7 @@ struct mv_cesa_op_ctx {
#define CESA_TDMA_DUMMY 0
#define CESA_TDMA_DATA 1
#define CESA_TDMA_OP 2
-#define CESA_TDMA_IV 3
+#define CESA_TDMA_RESULT 3
/**
* struct mv_cesa_tdma_desc - TDMA descriptor
@@ -393,7 +393,6 @@ struct mv_cesa_dev_dma {
struct dma_pool *op_pool;
struct dma_pool *cache_pool;
struct dma_pool *padding_pool;
- struct dma_pool *iv_pool;
};
/**
@@ -839,7 +838,7 @@ mv_cesa_tdma_desc_iter_init(struct mv_cesa_tdma_chain *chain)
memset(chain, 0, sizeof(*chain));
}
-int mv_cesa_dma_add_iv_op(struct mv_cesa_tdma_chain *chain, dma_addr_t src,
+int mv_cesa_dma_add_result_op(struct mv_cesa_tdma_chain *chain, dma_addr_t src,
u32 size, u32 flags, gfp_t gfp_flags);
struct mv_cesa_op_ctx *mv_cesa_dma_add_op(struct mv_cesa_tdma_chain *chain,
diff --git a/drivers/crypto/marvell/cipher.c b/drivers/crypto/marvell/cipher.c
index d19dc96..098871a 100644
--- a/drivers/crypto/marvell/cipher.c
+++ b/drivers/crypto/marvell/cipher.c
@@ -212,7 +212,8 @@ mv_cesa_ablkcipher_complete(struct crypto_async_request *req)
struct mv_cesa_req *basereq;
basereq = &creq->base;
- memcpy(ablkreq->info, basereq->chain.last->data, ivsize);
+ memcpy(ablkreq->info, basereq->chain.last->op->ctx.blkcipher.iv,
+ ivsize);
} else {
memcpy_fromio(ablkreq->info,
engine->sram + CESA_SA_CRYPT_IV_SRAM_OFFSET,
@@ -373,8 +374,9 @@ static int mv_cesa_ablkcipher_dma_req_init(struct ablkcipher_request *req,
/* Add output data for IV */
ivsize = crypto_ablkcipher_ivsize(crypto_ablkcipher_reqtfm(req));
- ret = mv_cesa_dma_add_iv_op(&basereq->chain, CESA_SA_CRYPT_IV_SRAM_OFFSET,
- ivsize, CESA_TDMA_SRC_IN_SRAM, flags);
+ ret = mv_cesa_dma_add_result_op(&basereq->chain, CESA_SA_CFG_SRAM_OFFSET,
+ CESA_SA_DATA_SRAM_OFFSET,
+ CESA_TDMA_SRC_IN_SRAM, flags);
if (ret)
goto err_free_tdma;
diff --git a/drivers/crypto/marvell/tdma.c b/drivers/crypto/marvell/tdma.c
index 9fd7a5f..4416b88 100644
--- a/drivers/crypto/marvell/tdma.c
+++ b/drivers/crypto/marvell/tdma.c
@@ -69,9 +69,6 @@ void mv_cesa_dma_cleanup(struct mv_cesa_req *dreq)
if (type == CESA_TDMA_OP)
dma_pool_free(cesa_dev->dma->op_pool, tdma->op,
le32_to_cpu(tdma->src));
- else if (type == CESA_TDMA_IV)
- dma_pool_free(cesa_dev->dma->iv_pool, tdma->data,
- le32_to_cpu(tdma->dst));
tdma = tdma->next;
dma_pool_free(cesa_dev->dma->tdma_desc_pool, old_tdma,
@@ -209,29 +206,37 @@ mv_cesa_dma_add_desc(struct mv_cesa_tdma_chain *chain, gfp_t flags)
return new_tdma;
}
-int mv_cesa_dma_add_iv_op(struct mv_cesa_tdma_chain *chain, dma_addr_t src,
+int mv_cesa_dma_add_result_op(struct mv_cesa_tdma_chain *chain, dma_addr_t src,
u32 size, u32 flags, gfp_t gfp_flags)
{
-
- struct mv_cesa_tdma_desc *tdma;
- u8 *iv;
- dma_addr_t dma_handle;
+ struct mv_cesa_tdma_desc *tdma, *op_desc;
tdma = mv_cesa_dma_add_desc(chain, gfp_flags);
if (IS_ERR(tdma))
return PTR_ERR(tdma);
- iv = dma_pool_alloc(cesa_dev->dma->iv_pool, gfp_flags, &dma_handle);
- if (!iv)
- return -ENOMEM;
+ /* We re-use an existing op_desc object to retrieve the context
+ * and result instead of allocating a new one.
+ * There is at least one object of this type in a CESA crypto
+ * req, just pick the first one in the chain.
+ */
+ for (op_desc = chain->first; op_desc; op_desc = op_desc->next) {
+ u32 type = op_desc->flags & CESA_TDMA_TYPE_MSK;
+
+ if (type == CESA_TDMA_OP)
+ break;
+ }
+
+ if (!op_desc)
+ return -EIO;
tdma->byte_cnt = cpu_to_le32(size | BIT(31));
tdma->src = src;
- tdma->dst = cpu_to_le32(dma_handle);
- tdma->data = iv;
+ tdma->dst = op_desc->src;
+ tdma->op = op_desc->op;
flags &= (CESA_TDMA_DST_IN_SRAM | CESA_TDMA_SRC_IN_SRAM);
- tdma->flags = flags | CESA_TDMA_IV;
+ tdma->flags = flags | CESA_TDMA_RESULT;
return 0;
}
--
2.9.3
^ permalink raw reply related
* [PATCH v4 0/2] Improve DMA chaining for ahash requests
From: Romain Perier @ 2016-10-05 7:56 UTC (permalink / raw)
To: linux-arm-kernel
This series contain performance improvement regarding ahash requests.
So far, ahash requests were systematically not chained at the DMA level.
However, in some case, like this is the case by using IPSec, some ahash
requests can be processed directly by the engine, and don't have
intermediaire partial update states.
This series firstly re-work the way outer IVs are copied from the SRAM
into the dma pool. To do so, we introduce a common dma pool for all type
of requests that contains outer results (like IV or digest). Then, for
ahash requests that can be processed directly by the engine, outer
results are copied from the SRAM into the common dma pool. These requests
are then allowed to be chained at the DMA level.
Benchmarking results with iperf throught IPSec
==============================================
ESP AH
Before 343 Mbits/s 492 Mbits/s
After 422 Mbits/s 577 Mbits/s
Improvement +23% +17%
Romain Perier (2):
crypto: marvell - Use an unique pool to copy results of requests
crypto: marvell - Don't break chain for computable last ahash requests
drivers/crypto/marvell/cesa.c | 4 ---
drivers/crypto/marvell/cesa.h | 5 ++--
drivers/crypto/marvell/cipher.c | 8 +++--
drivers/crypto/marvell/hash.c | 65 +++++++++++++++++++++++++++++++----------
drivers/crypto/marvell/tdma.c | 28 +++++++++---------
5 files changed, 70 insertions(+), 40 deletions(-)
--
2.9.3
^ permalink raw reply
* PROBLEM: DWC3 USB 3.0 not working on Odroid-XU4 with Exynos 5422
From: Anand Moon @ 2016-10-05 7:48 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <CAFp+6iE6aqvOKE4HVCeCokPk_oTHLduS6Gsv+CF4_p4JjkF2TQ@mail.gmail.com>
Hi Vivek,
On 5 October 2016 at 10:15, Vivek Gautam <vivek.gautam@codeaurora.org> wrote:
> Hi Anand,
>
>
> On Tue, Oct 4, 2016 at 8:39 PM, Anand Moon <linux.amoon@gmail.com> wrote:
>> Hi Vivek,
>>
>
> [snip]
>
>>
>> What I feel is that their need to be some reset of usb phy so that
>> device are assigned to respective bus ports.
>
> The phy resets are what we do in the phy-exynos5-usbdrd driver. In
> addition to what we
> have currently in this phy driver, we just need the phy calibration
> patch [1] for phy configurations.
>
> [1] https://lkml.org/lkml/2015/2/2/259
Yes I am only using the above patch.
If you dont mind please resend this patch again.
>
>> odroid at odroid:~$ lsusb -t
>> /: Bus 06.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 5000M
>> /: Bus 05.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 480M
>> |__ Port 1: Dev 3, If 0, Class=Vendor Specific Class, Driver=r8152, 480M
>
> This shows the ethernet device gets detected on the high-speed port of one
> of the controller.
> The lsusb output for kernel v4.7.x posted by Michael show that the
> ethernet device got detected on super-speed port of the controller.
> So, there seems to be a difference between the two.
> Or, is this how it is behaving ?
With other patches it miss behaves and the ethernet land onto another bus
port
.
> Is this lsusb output on 4.8 kernel with the patch [1] ?
Yes correct.
>
>> /: Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 5000M
>> |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/2p, 5000M
>> |__ Port 1: Dev 3, If 0, Class=Mass Storage, Driver=usb-storage, 5000M
>> |__ Port 2: Dev 4, If 0, Class=Mass Storage, Driver=usb-storage, 5000M
>> /: Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 480M
>> |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/2p, 480M
>> /: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=exynos-ohci/3p, 12M
>> /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=exynos-ehci/3p, 480M
>> |__ Port 1: Dev 3, If 0, Class=Mass Storage, Driver=usb-storage, 480M
>>
>>
>> Bus 06.Port should register the Realtek Ethernet r8153 device.
>> But I am not able to trace out how it's should happen.
>
> If i understand, below is how the configuration looks like on the board?
>
> +-----------------------+
> +------>| |
> | | Bus 6 |-------+
> +-----------+ | (super-speed) | |
> | | +-----------------------+ |
> |Controller | | --------> Ethernet device
> | 2 | |
> | | +-----------------------+ |
> +-----------+ | | |
> | | Bus 5 |-------+
> +------>| (high-speed) |
> +-----------------------+
>
>
> +-----------------------+
> +------>| |
> | | Bus 4 |-------+
> +-----------+ | (super-speed) | |
> | | +-----------------------+ |
> |Controller | | --------> (On board
> hub ?? _OR_ external hub with downstream devices) ???
> | 1 | |
> | | +-----------------------+ |
> +-----------+ | | |
> | | Bus 3 |-------+
> +------>| (high-speed) |
> +-----------------------+
>
[snip]
Yes this is correct mapping of usb ports and ethernet on the board.
Below is the schematic of the board.
http://dn.odroid.com/5422/ODROID-XU4/Schematics/XU4_MAIN_REV0.1_20151202.pdf
I have couple of questions so if you can help me out.
1 > Their is no vbus pin connector to the usb ports ?
2 > I have also tried to configure usbdrd_dwc3_0/1 nodes with no luck
snps,usb3_lpm_capable;
snps,dis_u3_susphy_quirk;
snps,dis_u2_susphy_quirk;
3 > do you feel their could be way to reset the USB PHY (ethenet)
either though the DTS using gpio and pincrt
4 > how should be the port mapping done to the usb hub.
Odroid XU4 has 2 usb 3.0 and 1 ehci port.
Odroid XU3 has 1 usb 3.0 and 1 usb 3.0 otg port and 4 ehci
port
I would like to know how to debug low level debug of USB connection.
so that we could solve the issue.
Thanks for you help in looking to this, please guide me.
Attach is the logs of lsusb -v and console output.
-Best Regards
Anand Moon
-------------- next part --------------
odroid at odroid:~$ lsusb -v
Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Couldn't open device, some information will be missing
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 3.00
bDeviceClass 9 Hub
bDeviceSubClass 0 Unused
bDeviceProtocol 3
bMaxPacketSize0 9
idVendor 0x1d6b Linux Foundation
idProduct 0x0003 3.0 root hub
bcdDevice 4.08
iManufacturer 3
iProduct 2
iSerial 1
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 31
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xe0
Self Powered
Remote Wakeup
MaxPower 0mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 9 Hub
bInterfaceSubClass 0 Unused
bInterfaceProtocol 0 Full speed (or root) hub
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0004 1x 4 bytes
bInterval 12
bMaxBurst 0
Bus 005 Device 002: ID 0bda:8153 Realtek Semiconductor Corp.
Couldn't open device, some information will be missing
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.10
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x0bda Realtek Semiconductor Corp.
idProduct 0x8153
bcdDevice 30.00
iManufacturer 1
iProduct 2
iSerial 6
bNumConfigurations 2
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 39
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xa0
(Bus Powered)
Remote Wakeup
MaxPower 180mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 3
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 255 Vendor Specific Subclass
bInterfaceProtocol 0
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0002 1x 2 bytes
bInterval 8
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 80
bNumInterfaces 2
bConfigurationValue 2
iConfiguration 0
bmAttributes 0xa0
(Bus Powered)
Remote Wakeup
MaxPower 180mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 2 Communications
bInterfaceSubClass 6 Ethernet Networking
bInterfaceProtocol 0
iInterface 5
CDC Header:
bcdCDC 1.10
CDC Union:
bMasterInterface 0
bSlaveInterface 1
CDC Ethernet:
iMacAddress 3 (??)
bmEthernetStatistics 0x00000000
wMaxSegmentSize 1514
wNumberMCFilters 0x0000
bNumberPowerFilters 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 8
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 10 CDC Data
bInterfaceSubClass 0 Unused
bInterfaceProtocol 0
iInterface 0
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 1
bNumEndpoints 2
bInterfaceClass 10 CDC Data
bInterfaceSubClass 0 Unused
bInterfaceProtocol 0
iInterface 4
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Couldn't open device, some information will be missing
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 9 Hub
bDeviceSubClass 0 Unused
bDeviceProtocol 1 Single TT
bMaxPacketSize0 64
idVendor 0x1d6b Linux Foundation
idProduct 0x0002 2.0 root hub
bcdDevice 4.08
iManufacturer 3
iProduct 2
iSerial 1
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 25
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xe0
Self Powered
Remote Wakeup
MaxPower 0mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 9 Hub
bInterfaceSubClass 0 Unused
bInterfaceProtocol 0 Full speed (or root) hub
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0004 1x 4 bytes
bInterval 12
Bus 004 Device 003: ID 05e3:0735 Genesys Logic, Inc.
Couldn't open device, some information will be missing
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 3.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 9
idVendor 0x05e3 Genesys Logic, Inc.
idProduct 0x0735
bcdDevice 10.03
iManufacturer 1
iProduct 2
iSerial 3
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 44
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xc0
Self Powered
MaxPower 24mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 8 Mass Storage
bInterfaceSubClass 6 SCSI
bInterfaceProtocol 80 Bulk-Only
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0400 1x 1024 bytes
bInterval 0
bMaxBurst 15
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0400 1x 1024 bytes
bInterval 0
bMaxBurst 15
Bus 004 Device 002: ID 05e3:0616 Genesys Logic, Inc. hub
Couldn't open device, some information will be missing
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 3.00
bDeviceClass 9 Hub
bDeviceSubClass 0 Unused
bDeviceProtocol 3
bMaxPacketSize0 9
idVendor 0x05e3 Genesys Logic, Inc.
idProduct 0x0616 hub
bcdDevice 92.22
iManufacturer 1
iProduct 2
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 31
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xe0
Self Powered
Remote Wakeup
MaxPower 0mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 9 Hub
bInterfaceSubClass 0 Unused
bInterfaceProtocol 0 Full speed (or root) hub
iInterface 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 19
Transfer Type Interrupt
Synch Type None
Usage Type Feedback
wMaxPacketSize 0x0002 1x 2 bytes
bInterval 8
bMaxBurst 0
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Couldn't open device, some information will be missing
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 3.00
bDeviceClass 9 Hub
bDeviceSubClass 0 Unused
bDeviceProtocol 3
bMaxPacketSize0 9
idVendor 0x1d6b Linux Foundation
idProduct 0x0003 3.0 root hub
bcdDevice 4.08
iManufacturer 3
iProduct 2
iSerial 1
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 31
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xe0
Self Powered
Remote Wakeup
MaxPower 0mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 9 Hub
bInterfaceSubClass 0 Unused
bInterfaceProtocol 0 Full speed (or root) hub
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0004 1x 4 bytes
bInterval 12
bMaxBurst 0
Bus 003 Device 002: ID 05e3:0610 Genesys Logic, Inc. 4-port hub
Couldn't open device, some information will be missing
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.10
bDeviceClass 9 Hub
bDeviceSubClass 0 Unused
bDeviceProtocol 2 TT per port
bMaxPacketSize0 64
idVendor 0x05e3 Genesys Logic, Inc.
idProduct 0x0610 4-port hub
bcdDevice 92.22
iManufacturer 1
iProduct 2
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 41
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xe0
Self Powered
Remote Wakeup
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 9 Hub
bInterfaceSubClass 0 Unused
bInterfaceProtocol 1 Single TT
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0001 1x 1 bytes
bInterval 12
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 1
bNumEndpoints 1
bInterfaceClass 9 Hub
bInterfaceSubClass 0 Unused
bInterfaceProtocol 2 TT per port
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0001 1x 1 bytes
bInterval 12
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Couldn't open device, some information will be missing
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 9 Hub
bDeviceSubClass 0 Unused
bDeviceProtocol 1 Single TT
bMaxPacketSize0 64
idVendor 0x1d6b Linux Foundation
idProduct 0x0002 2.0 root hub
bcdDevice 4.08
iManufacturer 3
iProduct 2
iSerial 1
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 25
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xe0
Self Powered
Remote Wakeup
MaxPower 0mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 9 Hub
bInterfaceSubClass 0 Unused
bInterfaceProtocol 0 Full speed (or root) hub
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0004 1x 4 bytes
bInterval 12
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Couldn't open device, some information will be missing
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.10
bDeviceClass 9 Hub
bDeviceSubClass 0 Unused
bDeviceProtocol 0 Full speed (or root) hub
bMaxPacketSize0 64
idVendor 0x1d6b Linux Foundation
idProduct 0x0001 1.1 root hub
bcdDevice 4.08
iManufacturer 3
iProduct 2
iSerial 1
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 25
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xe0
Self Powered
Remote Wakeup
MaxPower 0mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 9 Hub
bInterfaceSubClass 0 Unused
bInterfaceProtocol 0 Full speed (or root) hub
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0002 1x 2 bytes
bInterval 255
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Couldn't open device, some information will be missing
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 9 Hub
bDeviceSubClass 0 Unused
bDeviceProtocol 0 Full speed (or root) hub
bMaxPacketSize0 64
idVendor 0x1d6b Linux Foundation
idProduct 0x0002 2.0 root hub
bcdDevice 4.08
iManufacturer 3
iProduct 2
iSerial 1
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 25
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xe0
Self Powered
Remote Wakeup
MaxPower 0mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 9 Hub
bInterfaceSubClass 0 Unused
bInterfaceProtocol 0 Full speed (or root) hub
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0004 1x 4 bytes
bInterval 12
odroid at odroid:~$
----------------------------------------------------------------------------------------
U-Boot 2012.07-00036-g4d29c46-dirty (Dec 04 2015 - 15:52:26) for Exynos5422
CPU: Exynos5422 Rev0.1 [Samsung SOC on SMP Platform Base on ARM CortexA7]
APLL = 800MHz, KPLL = 800MHz
MPLL = 532MHz, BPLL = 825MHz
Board: HardKernel ODROID
DRAM: 2 GiB
WARNING: Caches not enabled
TrustZone Enabled BSP
BL1 version: ?/???
VDD_KFC: 0x44
LDO19: 0xf2
Checking Boot Mode ... SDMMC
MMC: S5P_MSHC2: 0, S5P_MSHC0: 1
MMC Device 0: 29 GiB
MMC Device 1: [ERROR] response timeout error : 00000104 cmd 1
Card did not respond to voltage select!
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
Net: No ethernet found.
Press quickly 'Enter' twice to stop autoboot: 0
there are pending interrupts 0x00000001
reading boot.ini
9183 bytes read
Loading boot.ini from FAT
Find boot.ini file from FAT/Ext4 Area!!
boot.ini command = setenv initrd_high "0xffffffff"
boot.ini command = setenv fdt_high "0xffffffff"
boot.ini command = setenv macaddr "00:1e:06:61:7a:39"
boot.ini command = setenv bootrootfs "console=tty1 console=ttySAC2,115200n8 root=UUID=e139ce78-9841-40fe-8823-96a304a09859 rootwait ro fsck.repair=yes net.ifnames=0"
boot.ini command = setenv vout "hdmi"
boot.ini command = setenv cecenable "false" # false or true
boot.ini command = setenv governor "performance"
boot.ini command = setenv HPD "true"
boot.ini command = setenv hdmi_tx_amp_lvl "31"
boot.ini command = setenv hdmi_tx_lvl_ch0 "3"
boot.ini command = setenv hdmi_tx_lvl_ch1 "3"
boot.ini command = setenv hdmi_tx_lvl_ch2 "3"
boot.ini command = setenv hdmi_tx_emp_lvl "6"
boot.ini command = setenv hdmi_clk_amp_lvl "31"
boot.ini command = setenv hdmi_tx_res "0"
boot.ini command = setenv hdmi_phy_control "hdmi_tx_amp_lvl=${hdmi_tx_amp_lvl} hdmi_tx_lvl_ch0=${hdmi_tx_lvl_ch0} hdmi_tx_lvl_ch1=${hdmi_tx_lvl_ch1} hdmi_tx_lvl_ch2=${hdmi_tx_lvl_ch2} hdmi_tx_emp_lvl=${hdmi_tx_emp_lvl} hdmi_clk_amp_lvl=${hdmi_clk_amp_lvl} hdmi_tx_res=${hdmi_tx_res} HPD=${HPD} vout=${vout}"
boot.ini command = fatload mmc 0:1 0x40008000 zImage
reading zImage
4942552 bytes read
boot.ini command = fatload mmc 0:1 0x42000000 uInitrd
reading uInitrd
8303688 bytes read
boot.ini command = fatload mmc 0:1 0x44000000 exynos5422-odroidxu3.dtb
reading exynos5422-odroidxu3.dtb
54647 bytes read
boot.ini command = fdt addr 0x44000000
boot.ini command = if test "${cecenable}" = "false"; then fdt rm /cec at 101B0000; fi
libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND
boot.ini command = setenv bootargs "${bootrootfs} ${videoconfig} smsc95xx.macaddr=${macaddr} governor=${governor} ${hdmi_phy_control}"
boot.ini command = bootz 0x40008000 0x42000000 0x44000000
## Loading init Ramdisk from Legacy Image at 42000000 ...
Image Name: uInitrd
Image Type: ARM Linux RAMDisk Image (uncompressed)
Data Size: 8303624 Bytes = 7.9 MiB
Load Address: 00000000
Entry Point: 00000000
## Flattened Device Tree blob at 44000000
Booting using the fdt blob at 0x44000000
Using Device Tree in place at 44000000, end 44010576
Starting kernel ...
[ 0.000000] Booting Linux on physical CPU 0x100
[ 0.000000] Linux version 4.8.0-xu4ml (root at odroid) (gcc version 5.4.0 20160609 (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.2) ) #16 SMP PREEMPT Mon Oct 3 17:28:30 UTC 2016
[ 0.000000] CPU: ARMv7 Processor [410fc073] revision 3 (ARMv7), cr=10c5387d
[ 0.000000] CPU: div instructions available: patching division code
[ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[ 0.000000] OF: fdt:Machine model: Hardkernel Odroid XU4
[ 0.000000] Reserved memory: created DMA memory pool at 0xbe200000, size 8 MiB
[ 0.000000] OF: reserved mem: initialized node region_mfc_right, compatible id shared-dma-pool
[ 0.000000] Reserved memory: created DMA memory pool at 0xbd200000, size 16 MiB
[ 0.000000] OF: reserved mem: initialized node region_mfc_left, compatible id shared-dma-pool
[ 0.000000] cma: Reserved 64 MiB at 0xb9000000
[ 0.000000] Memory policy: Data cache writealloc
[ 0.000000] Samsung CPU ID: 0xe5422001
[ 0.000000] Running under secure firmware.
[ 0.000000] percpu: Embedded 366 pages/cpu @ee484000 s1470000 r8192 d20944 u1499136
[ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 510976
[ 0.000000] Kernel command line: console=tty1 console=ttySAC2,115200n8 root=UUID=e139ce78-9841-40fe-8823-96a304a09859 rootwait ro fsck.repair=yes net.ifnames=0 smsc95xx.macaddr=00:1e:06:61:7a:39 governor=performance hdmi_tx_amp_lvl=31 hdmi_tx_lvl_ch0=3 hdmi_tx_lvl_ch1=3 hdmi_tx_lvl_ch2=3 hdmi_tx_emp_lvl=6 hdmi_clk_amp_lvl=31 hdmi_tx_res=0 HPD=true vout=hdmi
[ 0.000000] PID hash table entries: 4096 (order: 2, 16384 bytes)
[ 0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes)
[ 0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)
[ 0.000000] Memory: 1925660K/2050048K available (7168K kernel code, 327K rwdata, 2380K rodata, 2048K init, 9112K bss, 58852K reserved, 65536K cma-reserved, 1198080K highmem)
[ 0.000000] Virtual kernel memory layout:
[ 0.000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB)
[ 0.000000] fixmap : 0xffc00000 - 0xfff00000 (3072 kB)
[ 0.000000] vmalloc : 0xf0800000 - 0xff800000 ( 240 MB)
[ 0.000000] lowmem : 0xc0000000 - 0xf0000000 ( 768 MB)
[ 0.000000] pkmap : 0xbfe00000 - 0xc0000000 ( 2 MB)
[ 0.000000] modules : 0xbf000000 - 0xbfe00000 ( 14 MB)
[ 0.000000] .text : 0xc0008000 - 0xc0800000 (8160 kB)
[ 0.000000] .init : 0xc0b00000 - 0xc0d00000 (2048 kB)
[ 0.000000] .data : 0xc0d00000 - 0xc0d51fc0 ( 328 kB)
[ 0.000000] .bss : 0xc0d53000 - 0xc16392b4 (9113 kB)
[ 0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=8, Nodes=1
[ 0.000000] Running RCU self tests
[ 0.000000] Preemptible hierarchical RCU implementation.
[ 0.000000] RCU debugfs-based tracing is enabled.
[ 0.000000] RCU dyntick-idle grace-period acceleration is enabled.
[ 0.000000] RCU lockdep checking is enabled.
[ 0.000000] RCU kthread priority: 1.
[ 0.000000] NR_IRQS:16 nr_irqs:16 16
[ 0.000000] Switching to timer-based delay loop, resolution 41ns
[ 0.000000] clocksource: mct-frc: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 79635851949 ns
[ 0.000009] sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 89478484971ns
[ 0.001989] Console: colour dummy device 80x30
[ 0.014024] console [tty1] enabled
[ 0.014064] Lock dependency validator: Copyright (c) 2006 Red Hat, Inc., Ingo Molnar
[ 0.014121] ... MAX_LOCKDEP_SUBCLASSES: 8
[ 0.014157] ... MAX_LOCK_DEPTH: 48
[ 0.014192] ... MAX_LOCKDEP_KEYS: 8191
[ 0.014228] ... CLASSHASH_SIZE: 4096
[ 0.014264] ... MAX_LOCKDEP_ENTRIES: 32768
[ 0.014300] ... MAX_LOCKDEP_CHAINS: 65536
[ 0.014336] ... CHAINHASH_SIZE: 32768
[ 0.014372] memory used by lock dependency info: 5423 kB
[ 0.014411] per task-struct memory footprint: 2304 bytes
[ 0.014450] ------------------------
[ 0.014483] | Locking API testsuite:
[ 0.014517] ----------------------------------------------------------------------------
[ 0.014574] | spin |wlock |rlock |mutex | wsem | rsem |
[ 0.014631] --------------------------------------------------------------------------
[ 0.014708] A-A deadlock: ok | ok | ok | ok | ok | ok |
[ 0.025766] A-B-B-A deadlock: ok | ok | ok | ok | ok | ok |
[ 0.036982] A-B-B-C-C-A deadlock: ok | ok | ok | ok | ok | ok |
[ 0.048501] A-B-C-A-B-C deadlock: ok | ok | ok | ok | ok | ok |
[ 0.060095] A-B-B-C-C-D-D-A deadlock: ok | ok | ok | ok | ok | ok |
[ 0.071953] A-B-C-D-B-D-D-A deadlock: ok | ok | ok | ok | ok | ok |
[ 0.083788] A-B-C-D-B-C-D-A deadlock: ok | ok | ok | ok | ok | ok |
[ 0.095683] double unlock: ok | ok | ok | ok | ok | ok |
[ 0.106444] initialize held: ok | ok | ok | ok | ok | ok |
[ 0.117112] bad unlock order: ok | ok | ok | ok | ok | ok |
[ 0.128173] --------------------------------------------------------------------------
[ 0.128234] recursive read-lock: | ok | | ok |
[ 0.131898] recursive read-lock #2: | ok | | ok |
[ 0.135563] mixed read-write-lock: | ok | | ok |
[ 0.139172] mixed write-read-lock: | ok | | ok |
[ 0.142868] --------------------------------------------------------------------------
[ 0.142927] hard-irqs-on + irq-safe-A/12: ok | ok | ok |
[ 0.148317] soft-irqs-on + irq-safe-A/12: ok | ok | ok |
[ 0.153736] hard-irqs-on + irq-safe-A/21: ok | ok | ok |
[ 0.159152] soft-irqs-on + irq-safe-A/21: ok | ok | ok |
[ 0.164566] sirq-safe-A => hirqs-on/12: ok | ok | ok |
[ 0.170071] sirq-safe-A => hirqs-on/21: ok | ok | ok |
[ 0.175479] hard-safe-A + irqs-on/12: ok | ok | ok |
[ 0.180876] soft-safe-A + irqs-on/12: ok | ok | ok |
[ 0.186296] hard-safe-A + irqs-on/21: ok | ok | ok |
[ 0.191700] soft-safe-A + irqs-on/21: ok | ok | ok |
[ 0.197120] hard-safe-A + unsafe-B #1/123: ok | ok | ok |
[ 0.202694] soft-safe-A + unsafe-B #1/123: ok | ok | ok |
[ 0.208265] hard-safe-A + unsafe-B #1/132: ok | ok | ok |
[ 0.213834] soft-safe-A + unsafe-B #1/132: ok | ok | ok |
[ 0.219405] hard-safe-A + unsafe-B #1/213: ok | ok | ok |
[ 0.225066] soft-safe-A + unsafe-B #1/213: ok | ok | ok |
[ 0.230650] hard-safe-A + unsafe-B #1/231: ok | ok | ok |
[ 0.236184] soft-safe-A + unsafe-B #1/231: ok | ok | ok |
[ 0.241731] hard-safe-A + unsafe-B #1/312: ok | ok | ok |
[ 0.247178] soft-safe-A + unsafe-B #1/312: ok | ok | ok |
[ 0.252645] hard-safe-A + unsafe-B #1/321: ok | ok | ok |
[ 0.258178] soft-safe-A + unsafe-B #1/321: ok | ok | ok |
[ 0.263731] hard-safe-A + unsafe-B #2/123: ok | ok | ok |
[ 0.269268] soft-safe-A + unsafe-B #2/123: ok | ok | ok |
[ 0.274831] hard-safe-A + unsafe-B #2/132: ok | ok | ok |
[ 0.280436] soft-safe-A + unsafe-B #2/132: ok | ok | ok |
[ 0.285997] hard-safe-A + unsafe-B #2/213: ok | ok | ok |
[ 0.291537] soft-safe-A + unsafe-B #2/213: ok | ok | ok |
[ 0.297103] hard-safe-A + unsafe-B #2/231: ok | ok | ok |
[ 0.302616] soft-safe-A + unsafe-B #2/231: ok | ok | ok |
[ 0.308158] hard-safe-A + unsafe-B #2/312: ok | ok | ok |
[ 0.313671] soft-safe-A + unsafe-B #2/312: ok | ok | ok |
[ 0.319238] hard-safe-A + unsafe-B #2/321: ok | ok | ok |
[ 0.324782] soft-safe-A + unsafe-B #2/321: ok | ok | ok |
[ 0.330420] hard-irq lock-inversion/123: ok | ok | ok |
[ 0.335965] soft-irq lock-inversion/123: ok | ok | ok |
[ 0.341541] hard-irq lock-inversion/132: ok | ok | ok |
[ 0.347068] soft-irq lock-inversion/132: ok | ok | ok |
[ 0.352649] hard-irq lock-inversion/213: ok | ok | ok |
[ 0.358203] soft-irq lock-inversion/213: ok | ok | ok |
[ 0.363786] hard-irq lock-inversion/231: ok | ok | ok |
[ 0.369312] soft-irq lock-inversion/231: ok | ok | ok |
[ 0.374877] hard-irq lock-inversion/312: ok | ok | ok |
[ 0.380497] soft-irq lock-inversion/312: ok | ok | ok |
[ 0.386083] hard-irq lock-inversion/321: ok | ok | ok |
[ 0.391612] soft-irq lock-inversion/321: ok | ok | ok |
[ 0.397179] hard-irq read-recursion/123: ok |
[ 0.399039] soft-irq read-recursion/123: ok |
[ 0.401000] hard-irq read-recursion/132: ok |
[ 0.402865] soft-irq read-recursion/132: ok |
[ 0.404739] hard-irq read-recursion/213: ok |
[ 0.406691] soft-irq read-recursion/213: ok |
[ 0.408567] hard-irq read-recursion/231: ok |
[ 0.410519] soft-irq read-recursion/231: ok |
[ 0.412395] hard-irq read-recursion/312: ok |
[ 0.414257] soft-irq read-recursion/312: ok |
[ 0.416219] hard-irq read-recursion/321: ok |
[ 0.418082] soft-irq read-recursion/321: ok |
[ 0.420043] --------------------------------------------------------------------------
[ 0.420103] | Wound/wait tests |
[ 0.420136] ---------------------
[ 0.420170] ww api failures: ok | ok | ok |
[ 0.425739] ww contexts mixing: ok | ok |
[ 0.429342] finishing ww context: ok | ok | ok | ok |
[ 0.436673] locking mismatches: ok | ok | ok |
[ 0.442165] EDEADLK handling: ok | ok | ok | ok | ok | ok | ok | ok | ok | ok |
[ 0.460772] spinlock nest unlocked: ok |
[ 0.462567] -----------------------------------------------------
[ 0.462612] |block | try |context|
[ 0.462653] -----------------------------------------------------
[ 0.462695] context: ok | ok | ok |
[ 0.468263] try: ok | ok | ok |
[ 0.473716] block: ok | ok | ok |
[ 0.479164] spinlock: ok | ok | ok |
[ 0.484832] -------------------------------------------------------
[ 0.484877] Good, all 253 testcases passed! |
[ 0.484913] ---------------------------------
[ 0.487844] ODEBUG: selftest passed
[ 0.487981] Calibrating delay loop (skipped), value calculated using timer frequency.. 48.00 BogoMIPS (lpj=120000)
[ 0.488065] pid_max: default: 32768 minimum: 301
[ 0.488835] Mount-cache hash table entries: 2048 (order: 1, 8192 bytes)
[ 0.488898] Mountpoint-cache hash table entries: 2048 (order: 1, 8192 bytes)
[ 0.494043] CPU: Testing write buffer coherency: ok
[ 0.497000] CPU0: update cpu_capacity 448
[ 0.497061] CPU0: thread -1, cpu 0, socket 1, mpidr 80000100
[ 0.497432] Setting up static identity map for 0x40100000 - 0x40100058
[ 0.498995] ARM CCI driver probed
[ 0.499373] Exynos MCPM support installed
[ 0.565666] CPU1: update cpu_capacity 448
[ 0.565677] CPU1: thread -1, cpu 1, socket 1, mpidr 80000101
[ 0.585574] CPU2: update cpu_capacity 448
[ 0.585584] CPU2: thread -1, cpu 2, socket 1, mpidr 80000102
[ 0.605569] CPU3: update cpu_capacity 448
[ 0.605580] CPU3: thread -1, cpu 3, socket 1, mpidr 80000103
[ 0.625596] CPU4: update cpu_capacity 1535
[ 0.625606] CPU4: thread -1, cpu 0, socket 0, mpidr 80000000
[ 0.645558] CPU5: update cpu_capacity 1535
[ 0.645566] CPU5: thread -1, cpu 1, socket 0, mpidr 80000001
[ 0.665565] CPU6: update cpu_capacity 1535
[ 0.665574] CPU6: thread -1, cpu 2, socket 0, mpidr 80000002
[ 0.685573] CPU7: update cpu_capacity 1535
[ 0.685582] CPU7: thread -1, cpu 3, socket 0, mpidr 80000003
[ 0.686297] Brought up 8 CPUs
[ 0.686807] SMP: Total of 8 processors activated (384.00 BogoMIPS).
[ 0.686856] CPU: WARNING: CPU(s) started in wrong/inconsistent modes (primary CPU mode 0x1a)
[ 0.686921] CPU: This may indicate a broken bootloader or firmware.
[ 0.692572] devtmpfs: initialized
[ 0.887025] VFP support v0.3: implementor 41 architecture 2 part 30 variant 7 rev 3
[ 0.889761] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 9556302231375000 ns
[ 0.894403] pinctrl core: initialized pinctrl subsystem
[ 0.905716] random: fast init done
[ 0.906048] NET: Registered protocol family 16
[ 0.913914] DMA: preallocated 256 KiB pool for atomic coherent allocations
[ 0.935361] cpuidle: using governor menu
[ 1.012107] hw-breakpoint: found 5 (+1 reserved) breakpoint and 4 watchpoint registers.
[ 1.012192] hw-breakpoint: maximum watchpoint size is 8 bytes.
[ 1.062219] iommu: Adding device 11000000.codec to group 0
[ 1.201513] iommu: Adding device 14450000.mixer to group 1
[ 1.203951] iommu: Adding device 11c00000.rotator to group 2
[ 1.211482] iommu: Adding device 13e00000.video-scaler to group 3
[ 1.213822] iommu: Adding device 13e10000.video-scaler to group 4
[ 1.216276] iommu: Adding device 11f50000.jpeg to group 5
[ 1.218608] iommu: Adding device 11f60000.jpeg to group 6
[ 1.220528] EXYNOS5420 PMU initialized
[ 1.394101] SCSI subsystem initialized
[ 1.396405] usbcore: registered new interface driver usbfs
[ 1.396937] usbcore: registered new interface driver hub
[ 1.397930] usbcore: registered new device driver usb
[ 1.401832] s3c-i2c 12c80000.i2c: slave address 0x00
[ 1.401902] s3c-i2c 12c80000.i2c: bus frequency set to 65 KHz
[ 1.406177] s3c-i2c 12c80000.i2c: i2c-2: S3C I2C adapter
[ 1.413676] Advanced Linux Sound Architecture Driver Initialized.
[ 1.425111] clocksource: Switched to clocksource mct-frc
[ 1.538374] NET: Registered protocol family 2
[ 1.543373] TCP established hash table entries: 8192 (order: 3, 32768 bytes)
[ 1.543799] TCP bind hash table entries: 8192 (order: 6, 360448 bytes)
[ 1.547768] TCP: Hash tables configured (established 8192 bind 8192)
[ 1.548243] UDP hash table entries: 512 (order: 3, 49152 bytes)
[ 1.548826] UDP-Lite hash table entries: 512 (order: 3, 49152 bytes)
[ 1.551253] NET: Registered protocol family 1
[ 1.555460] RPC: Registered named UNIX socket transport module.
[ 1.555530] RPC: Registered udp transport module.
[ 1.555578] RPC: Registered tcp transport module.
[ 1.555626] RPC: Registered tcp NFSv4.1 backchannel transport module.
[ 1.557953] Trying to unpack rootfs image as initramfs...
[ 2.611882] Freeing initrd memory: 8112K (c2000000 - c27ec000)
[ 2.630889] futex hash table entries: 2048 (order: 5, 131072 bytes)
[ 2.639384] workingset: timestamp_bits=30 max_order=19 bucket_order=0
[ 2.740930] NFS: Registering the id_resolver key type
[ 2.741405] Key type id_resolver registered
[ 2.741460] Key type id_legacy registered
[ 2.741779] romfs: ROMFS MTD (C) 2007 Red Hat, Inc.
[ 2.751948] bounce: pool size: 64 pages
[ 2.752041] io scheduler noop registered
[ 2.752076] io scheduler deadline registered
[ 2.754658] io scheduler cfq registered (default)
[ 2.777976] 12130000.phy supply vbus not found, using dummy regulator
[ 2.783590] 12100000.phy supply vbus not found, using dummy regulator
[ 2.783991] 12100000.phy supply vbus-boost not found, using dummy regulator
[ 2.786673] 12500000.phy supply vbus not found, using dummy regulator
[ 2.787076] 12500000.phy supply vbus-boost not found, using dummy regulator
[ 2.825399] dma-pl330 121a0000.pdma: Loaded driver for PL330 DMAC-241330
[ 2.825440] dma-pl330 121a0000.pdma: DBUFF-32x4bytes Num_Chans-8 Num_Peri-32 Num_Events-32
[ 2.853163] dma-pl330 121b0000.pdma: Loaded driver for PL330 DMAC-241330
[ 2.853206] dma-pl330 121b0000.pdma: DBUFF-32x4bytes Num_Chans-8 Num_Peri-32 Num_Events-32
[ 2.861305] dma-pl330 10800000.mdma: Loaded driver for PL330 DMAC-241330
[ 2.861346] dma-pl330 10800000.mdma: DBUFF-64x8bytes Num_Chans-8 Num_Peri-1 Num_Events-32
[ 3.434364] Serial: 8250/16550 driver, 4 ports, IRQ sharing disabled
[ 3.448226] 12c00000.serial: ttySAC0 at MMIO 0x12c00000 (irq = 76, base_baud = 0) is a S3C6400/10
[ 3.451531] 12c10000.serial: ttySAC1 at MMIO 0x12c10000 (irq = 77, base_baud = 0) is a S3C6400/10
[ 3.454276] 12c20000.serial: ttySAC2 at MMIO 0x12c20000 (irq = 78, base_baud = 0) is a S3C6400/10
[ 4.961339] console [ttySAC2] enabled
[ 4.967171] 12c30000.serial: ttySAC3 at MMIO 0x12c30000 (irq = 79, base_baud = 0) is a S3C6400/10
[ 4.981564] [drm] Initialized drm 1.1.0 20060810
[ 4.993954] exynos-hdmi 14530000.hdmi: Failed to get supply 'vdd': -517
[ 5.103379] brd: module loaded
[ 5.166067] loop: module loaded
[ 5.175261] libphy: Fixed MDIO Bus: probed
[ 5.179518] usbcore: registered new interface driver r8152
[ 5.183986] usbcore: registered new interface driver asix
[ 5.189229] usbcore: registered new interface driver ax88179_178a
[ 5.195293] usbcore: registered new interface driver cdc_ether
[ 5.201234] usbcore: registered new interface driver smsc75xx
[ 5.206947] usbcore: registered new interface driver smsc95xx
[ 5.212533] usbcore: registered new interface driver net1080
[ 5.218166] usbcore: registered new interface driver cdc_subset
[ 5.224058] usbcore: registered new interface driver zaurus
[ 5.229749] usbcore: registered new interface driver cdc_ncm
[ 5.236943] exynos-dwc3 soc:usb3-0: no suspend clk specified
[ 5.241685] exynos-dwc3 soc:usb3-1: no suspend clk specified
[ 5.250614] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[ 5.255725] ehci-exynos: EHCI EXYNOS driver
[ 5.261306] exynos-ehci 12110000.usb: EHCI Host Controller
[ 5.265898] exynos-ehci 12110000.usb: new USB bus registered, assigned bus number 1
[ 5.274063] exynos-ehci 12110000.usb: irq 89, io mem 0x12110000
[ 5.290248] exynos-ehci 12110000.usb: USB 2.0 started, EHCI 1.00
[ 5.296528] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002
[ 5.301901] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 5.309094] usb usb1: Product: EHCI Host Controller
[ 5.313938] usb usb1: Manufacturer: Linux 4.8.0-xu4ml ehci_hcd
[ 5.319745] usb usb1: SerialNumber: 12110000.usb
[ 5.331377] hub 1-0:1.0: USB hub found
[ 5.334177] hub 1-0:1.0: 3 ports detected
[ 5.346639] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[ 5.351465] ohci-exynos: OHCI EXYNOS driver
[ 5.356554] exynos-ohci 12120000.usb: USB Host Controller
[ 5.361060] exynos-ohci 12120000.usb: new USB bus registered, assigned bus number 2
[ 5.369111] exynos-ohci 12120000.usb: irq 89, io mem 0x12120000
[ 5.435215] usb usb2: New USB device found, idVendor=1d6b, idProduct=0001
[ 5.440677] usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 5.451036] usb usb2: Product: USB Host Controller
[ 5.454368] usb usb2: Manufacturer: Linux 4.8.0-xu4ml ohci_hcd
[ 5.460222] usb usb2: SerialNumber: 12120000.usb
[ 5.470257] hub 2-0:1.0: USB hub found
[ 5.472773] hub 2-0:1.0: 3 ports detected
[ 5.484882] usbcore: registered new interface driver usb-storage
[ 5.492112] udc-core: couldn't find an available UDC - added [g_ether] to list of pending drivers
[ 5.502592] mousedev: PS/2 mouse device common for all mice
[ 5.515535] i2c /dev entries driver
[ 5.565161] vdd_ldo9: Bringing 3300000uV into 3000000-3000000uV
[ 5.590207] vddq_mmc2: Bringing 3300000uV into 2800000-2800000uV
[ 5.604597] vdd_ldo15: Bringing 3300000uV into 3100000-3100000uV
[ 5.627972] vdd_sd: Bringing 3300000uV into 2800000-2800000uV
[ 5.763205] s5m-rtc s2mps14-rtc: rtc core: registered s5m-rtc as rtc0
[ 5.792698] exynos-tmu 10060000.tmu: More trip points than supported by this TMU.
[ 5.798784] exynos-tmu 10060000.tmu: 2 trip points should be configured in polling mode.
[ 5.823322] s3c2410-wdt 101d0000.watchdog: watchdog inactive, reset disabled, irq disabled
[ 5.834415] device-mapper: ioctl: 4.35.0-ioctl (2016-06-23) initialised: dm-devel at redhat.com
[ 5.906444] sdhci: Secure Digital Host Controller Interface driver
[ 5.911179] sdhci: Copyright(c) Pierre Ossman
[ 5.916313] Synopsys Designware Multimedia Card Interface Driver
[ 5.923653] dwmmc_exynos 12200000.mmc: IDMAC supports 32-bit address mode.
[ 5.929186] dwmmc_exynos 12200000.mmc: Using internal DMA controller.
[ 5.935496] dwmmc_exynos 12200000.mmc: Version ID is 250a
[ 5.941022] dwmmc_exynos 12200000.mmc: DW MMC controller at irq 91,64 bit host data width,64 deep fifo
[ 5.951131] dwmmc_exynos 12200000.mmc: Got CD GPIO
[ 5.955154] dwmmc_exynos 12200000.mmc: allocated mmc-pwrseq
[ 5.987072] mmc_host mmc0: Bus speed (slot 0) = 50000000Hz (slot req 400000Hz, actual 396825HZ div = 63)
[ 6.016598] dwmmc_exynos 12200000.mmc: 1 slots initialized
[ 6.021878] dwmmc_exynos 12220000.mmc: IDMAC supports 32-bit address mode.
[ 6.028621] dwmmc_exynos 12220000.mmc: Using internal DMA controller.
[ 6.033898] dwmmc_exynos 12220000.mmc: Version ID is 250a
[ 6.039421] dwmmc_exynos 12220000.mmc: DW MMC controller at irq 92,64 bit host data width,64 deep fifo
[ 6.074555] mmc_host mmc1: Bus speed (slot 0) = 50000000Hz (slot req 400000Hz, actual 396825HZ div = 63)
[ 6.100553] dwmmc_exynos 12220000.mmc: 1 slots initialized
[ 6.124479] s5p-secss 10830000.sss: s5p-sss driver registered
[ 6.130437] usbcore: registered new interface driver usbhid
[ 6.134533] usbhid: USB HID core driver
[ 6.144641] exynos-audss-clk 3810000.audss-clock-controller: setup completed
[ 6.154414] mmc_host mmc1: Bus speed (slot 0) = 50000000Hz (slot req 50000000Hz, actual 50000000HZ div = 0)
[ 6.164555] mmc1: new high speed SDHC card at address 0007
[ 6.176291] mmcblk1: mmc1:0007 SL32G 29.0 GiB
[ 6.189221] mmcblk1: p1 p2
[ 6.335992] dma-pl330 3880000.adma: Loaded driver for PL330 DMAC-241330
[ 6.342033] dma-pl330 3880000.adma: DBUFF-4x8bytes Num_Chans-6 Num_Peri-16 Num_Events-6
[ 6.493694] exynos-nocp: new NoC Probe device registered: 10ca1000.nocp
[ 6.501406] exynos-nocp: new NoC Probe device registered: 10ca1400.nocp
[ 6.507705] exynos-nocp: new NoC Probe device registered: 10ca1800.nocp
[ 6.514305] exynos-nocp: new NoC Probe device registered: 10ca1c00.nocp
[ 6.543455] NET: Registered protocol family 10
[ 6.551803] sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver
[ 6.560630] NET: Registered protocol family 17
[ 6.563701] NET: Registered protocol family 15
[ 6.568461] Key type dns_resolver registered
[ 6.572963] Registering SWP/SWPB emulation handler
[ 6.581222] registered taskstats version 1
[ 6.609635] [drm] Exynos DRM: using 14450000.mixer device for DMA mapping operations
[ 6.621991] exynos-drm exynos-drm: bound 14450000.mixer (ops mixer_component_ops)
[ 6.631014] exynos-drm exynos-drm: bound 14530000.hdmi (ops hdmi_component_ops)
[ 6.636979] [drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
[ 6.643508] [drm] No driver support for vblank timestamp query.
[ 6.649557] [drm] Initialized exynos 1.0.0 20110530 on minor 0
[ 6.657109] exynos-dwc3 soc:usb3-0: no suspend clk specified
[ 6.677069] xhci-hcd xhci-hcd.2.auto: xHCI Host Controller
[ 6.681666] xhci-hcd xhci-hcd.2.auto: new USB bus registered, assigned bus number 3
[ 6.690853] xhci-hcd xhci-hcd.2.auto: hcc params 0x0220f04c hci version 0x100 quirks 0x00010010
[ 6.698706] xhci-hcd xhci-hcd.2.auto: irq 135, io mem 0x12000000
[ 6.706038] usb usb3: New USB device found, idVendor=1d6b, idProduct=0002
[ 6.711446] usb usb3: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 6.718639] usb usb3: Product: xHCI Host Controller
[ 6.723471] usb usb3: Manufacturer: Linux 4.8.0-xu4ml xhci-hcd
[ 6.729279] usb usb3: SerialNumber: xhci-hcd.2.auto
[ 6.745775] hub 3-0:1.0: USB hub found
[ 6.749150] hub 3-0:1.0: 1 port detected
[ 6.756985] xhci-hcd xhci-hcd.2.auto: xHCI Host Controller
[ 6.761158] xhci-hcd xhci-hcd.2.auto: new USB bus registered, assigned bus number 4
[ 6.769304] usb usb4: We don't know the algorithms for LPM for this host, disabling LPM.
[ 6.777554] usb usb4: New USB device found, idVendor=1d6b, idProduct=0003
[ 6.783496] usb usb4: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 6.790699] usb usb4: Product: xHCI Host Controller
[ 6.795531] usb usb4: Manufacturer: Linux 4.8.0-xu4ml xhci-hcd
[ 6.801338] usb usb4: SerialNumber: xhci-hcd.2.auto
[ 6.817156] hub 4-0:1.0: USB hub found
[ 6.820680] hub 4-0:1.0: 1 port detected
[ 6.837850] exynos-dwc3 soc:usb3-1: no suspend clk specified
[ 6.864294] xhci-hcd xhci-hcd.5.auto: xHCI Host Controller
[ 6.868803] xhci-hcd xhci-hcd.5.auto: new USB bus registered, assigned bus number 5
[ 6.878997] xhci-hcd xhci-hcd.5.auto: hcc params 0x0220f04c hci version 0x100 quirks 0x00010010
[ 6.887128] xhci-hcd xhci-hcd.5.auto: irq 136, io mem 0x12400000
[ 6.898523] usb usb5: New USB device found, idVendor=1d6b, idProduct=0002
[ 6.904701] usb usb5: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 6.912027] usb usb5: Product: xHCI Host Controller
[ 6.916297] usb usb5: Manufacturer: Linux 4.8.0-xu4ml xhci-hcd
[ 6.922091] usb usb5: SerialNumber: xhci-hcd.5.auto
[ 6.933692] hub 5-0:1.0: USB hub found
[ 6.936536] hub 5-0:1.0: 1 port detected
[ 6.945285] xhci-hcd xhci-hcd.5.auto: xHCI Host Controller
[ 6.949453] xhci-hcd xhci-hcd.5.auto: new USB bus registered, assigned bus number 6
[ 6.957908] usb usb6: We don't know the algorithms for LPM for this host, disabling LPM.
[ 6.966716] usb usb6: New USB device found, idVendor=1d6b, idProduct=0003
[ 6.972150] usb usb6: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 6.979339] usb usb6: Product: xHCI Host Controller
[ 6.984158] usb usb6: Manufacturer: Linux 4.8.0-xu4ml xhci-hcd
[ 6.989975] usb usb6: SerialNumber: xhci-hcd.5.auto
[ 7.001938] hub 6-0:1.0: USB hub found
[ 7.004559] hub 6-0:1.0: 1 port detected
[ 7.019004] rtc rtc1: invalid alarm value: 1900-1-2 0:0:0
[ 7.025764] s3c-rtc 101e0000.rtc: rtc core: registered s3c as rtc1
[ 7.047933] exynos-bus: new bus device registered: soc:bus_wcore ( 84000 KHz ~ 400000 KHz)
[ 7.061924] exynos-bus: new bus device registered: soc:bus_noc ( 67000 KHz ~ 100000 KHz)
[ 7.072543] exynos-bus: new bus device registered: soc:bus_fsys_apb (100000 KHz ~ 200000 KHz)
[ 7.082157] exynos-bus: new bus device registered: soc:bus_fsys (100000 KHz ~ 200000 KHz)
[ 7.090228] usb 3-1: new high-speed USB device number 2 using xhci-hcd
[ 7.093504] exynos-bus: new bus device registered: soc:bus_fsys2 ( 75000 KHz ~ 150000 KHz)
[ 7.099508] exynos-bus: new bus device registered: soc:bus_mfc ( 96000 KHz ~ 333000 KHz)
[ 7.105157] exynos-bus: new bus device registered: soc:bus_gen ( 89000 KHz ~ 267000 KHz)
[ 7.108593] exynos-bus: new bus device registered: soc:bus_peri ( 67000 KHz ~ 67000 KHz)
[ 7.114826] exynos-bus: new bus device registered: soc:bus_g2d ( 84000 KHz ~ 333000 KHz)
[ 7.120974] exynos-bus: new bus device registered: soc:bus_g2d_acp ( 67000 KHz ~ 267000 KHz)
[ 7.126826] exynos-bus: new bus device registered: soc:bus_jpeg ( 75000 KHz ~ 300000 KHz)
[ 7.132557] exynos-bus: new bus device registered: soc:bus_jpeg_apb ( 84000 KHz ~ 167000 KHz)
[ 7.136811] exynos-bus: new bus device registered: soc:bus_disp1_fimd (120000 KHz ~ 200000 KHz)
[ 7.141702] exynos-bus: new bus device registered: soc:bus_disp1 (120000 KHz ~ 300000 KHz)
[ 7.146580] exynos-bus: new bus device registered: soc:bus_gscl_scaler (150000 KHz ~ 300000 KHz)
[ 7.153005] exynos-bus: new bus device registered: soc:bus_mscl ( 84000 KHz ~ 400000 KHz)
[ 7.163772] Power domain power-domain at 10044120 disable failed
[ 7.202630] devfreq soc:bus_wcore: Couldn't update frequency transition information.
[ 7.209025] s5m-rtc s2mps14-rtc: setting system clock to 2016-10-05 07:13:35 UTC (1475651615)
[ 7.275209] usb 5-1: new high-speed USB device number 2 using xhci-hcd
[ 7.345114] usb 3-1: New USB device found, idVendor=05e3, idProduct=0610
[ 7.350416] usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 7.357510] usb 3-1: Product: USB2.0 Hub
[ 7.361404] usb 3-1: Manufacturer: GenesysLogic
[ 7.415145] hub 3-1:1.0: USB hub found
[ 7.419174] hub 3-1:1.0: 2 ports detected
[ 7.428489] usb 5-1: New USB device found, idVendor=0bda, idProduct=8153
[ 7.430628] ALSA device list:
[ 7.430632] No soundcards found.
[ 7.440214] usb 5-1: New USB device strings: Mfr=1, Product=2, SerialNumber=6
[ 7.440233] usb 5-1: Product: USB 10/100/1000 LAN
[ 7.440250] usb 5-1: Manufacturer: Realtek
[ 7.440266] usb 5-1: SerialNumber: 000001000000
[ 7.469431] Freeing unused kernel memory: 2048K (c0b00000 - c0d00000)
Loading, please wait...
[ 7.662635] usb 5-1: reset high-speed USB device number 2 using xhci-hcd
starting version 229
[ 7.942419] r8152 5-1:1.0 eth0: v1.08.6
[ 14.520569] random: crng init done
Begin: Loading essential drivers ... done.
Begin: Running /scripts/init-premount ... done.
Begin: Mounting root file system ... Begin: Running /scripts/local-top ... done.
Begin: Running /scripts/local-premount ... done.
Begin: Will now check root file system ... fsck from util-linux 2.27.1
[/sbin/fsck.ext4 (1) -- /dev/mmcblk1p2] fsck.ext4 -y -C0 /dev/mmcblk1p2
e2fsck 1.42.13 (17-May-2015)
rootfs: clean, 478044/1892352 files, 4932280/7560832 blocks
done.
[ 21.986013] EXT4-fs (mmcblk1p2): mounted filesystem without journal. Opts: (null)
done.
Begin: Running /scripts/local-bottom ... done.
Begin: Running /scripts/init-bottom ... done.
[ 23.500468] systemd[1]: systemd 229 running in system mode. (+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD -IDN)
[ 23.524853] systemd[1]: Detected architecture arm.
Welcome to Ubuntu 16.04.1 LTS!
[ 23.572858] systemd[1]: Set hostname to <odroid>.
[ 25.172926] systemd[1]: Started Forward Password Requests to Wall Directory Watch.
[ OK ] Started Forward Password Requests to Wall Directory Watch.
[ 25.202947] systemd[1]: Created slice System Slice.
[ OK ] Created slice System Slice.
[ 25.227532] systemd[1]: Created slice system-serial\x2dgetty.slice.
[ OK ] Created slice system-serial\x2dgetty.slice.
[ 25.256654] systemd[1]: Listening on Journal Socket (/dev/log).
[ OK ] Listening on Journal Socket (/dev/log).
[ 25.282055] systemd[1]: Created slice system-systemd\x2dfsck.slice.
[ OK ] Created slice system-systemd\x2dfsck.slice.
[ 25.306151] systemd[1]: Listening on udev Kernel Socket.
[ OK ] Listening on udev Kernel Socket.
[ 25.331323] systemd[1]: Listening on Syslog Socket.
[ OK ] Listening on Syslog Socket.
[ OK ] Reached target Remote File Systems (Pre).
[ OK ] Reached target Remote File Systems.
[ OK ] Reached target Encrypted Volumes.
[ OK ] Listening on Journal Socket.
[ OK ] Started Read required files in advance.
Starting Uncomplicated firewall...
Starting Create list of required st... nodes for the current kernel...
Mounting Debug File System...
Starting Journal Service...
[ OK ] Listening on fsck to fsckd communication Socket.
Starting Load Kernel Modules...
Starting Nameserver information manager...
[ OK ] Listening on /dev/initctl Compatibility Named Pipe.
[ OK ] Created slice User and Session Slice.
[ OK ] Reached target Slices.
[ OK ] Listening on udev Control Socket.
Starting Remount Root and Kernel File Systems...
[ OK ] Reached target User and Group Name Lookups.
[ OK ] Started Braille Device Support.
[ OK ] Reached target Swap.
Starting Set console keymap...
[ 26.211220] EXT4-fs (mmcblk1p2): re-mounted. Opts: errors=remount-ro
[ OK ] Mounted Debug File System.
[ OK ] Started Uncomplicated firewall.
[ OK ] Started Create list of required sta...ce nodes for the current kernel.
[FAILED] Failed to start Load Kernel Modules.
See 'systemctl status systemd-modules-load.service' for details.
[ OK ] Started Remount Root and Kernel File Systems.
[ OK ] Started Set console keymap.
[ OK ] Started Nameserver information manager.
Starting udev Coldplug all Devices...
Starting Load/Save Random Seed...
Starting Apply Kernel Variables...
Mounting Configuration File System...
Starting Create Static Device Nodes in /dev...
[ OK ] Mounted Configuration File System.
[ OK ] Started Journal Service.
[ OK ] Started Load/Save Random Seed.
[ OK ] Started Apply Kernel Variables.
[ OK ] Started Create Static Device Nodes in /dev.
Starting udev Kernel Device Manager...
[ OK ] Reached target Local File Systems (Pre).
Starting Flush Journal to Persistent Storage...
[ OK ] Started Flush Journal to Persistent Storage.
[ OK ] Started udev Kernel Device Manager.
[ OK ] Found device /dev/ttySAC2.
[ OK ] Found device /dev/disk/by-label/boot.
Starting File System Check on /dev/disk/by-label/boot...
[ OK ] Started File System Check Daemon to report status.
[ OK ] Started File System Check on /dev/disk/by-label/boot.
Mounting /media/boot...
[ OK ] Mounted /media/boot.
[ OK ] Reached target Local File Systems.
Starting Run snappy firstboot setup...
Starting Set console font and keymap...
Starting Create Volatile Files and Directories...
Starting Tell Plymouth To Write Out Runtime Data...
Starting LSB: AppArmor initialization...
[ OK ] Started Create Volatile Files and Directories.
[ OK ] Started Tell Plymouth To Write Out Runtime Data.
[ OK ] Started Run snappy firstboot setup.
[ OK ] Started LSB: AppArmor initialization.
[ OK ] Started udev Coldplug all Devices.
[ OK ] Started Dispatch Password Requests to Console Directory Watch.
Starting Raise network interfaces...
[ OK ] Reached target System Time Synchronized.
Starting Update UTMP about System Boot/Shutdown...
[ OK ] Started Update UTMP about System Boot/Shutdown.
[ OK ] Started Set console font and keymap.
[ OK ] Started Raise network interfaces.
[ OK ] Created slice system-getty.slice.
[ OK ] Reached target System Initialization.
[ OK ] Started Timer to automatically refresh installed snaps.
[ OK ] Listening on D-Bus System Message Bus Socket.
[ OK ] Listening on CUPS Scheduler.
[ OK ] Started Trigger resolvconf update for networkd DNS.
[ OK ] Started Daily Cleanup of Temporary Directories.
Starting Socket activation for snappy daemon.
[ OK ] Listening on Avahi mDNS/DNS-SD Stack Activation Socket.
[ OK ] Started Daily apt activities.
[ OK ] Reached target Timers.
[ OK ] Started CUPS Scheduler.
[ OK ] Reached target Paths.
[ OK ] Listening on Socket activation for snappy daemon.
[ OK ] Reached target Sockets.
[ OK ] Reached target Basic System.
Starting Avahi mDNS/DNS-SD Stack...
Starting LSB: Load kernel modules needed to enable cpufreq scaling...
Starting LSB: automatic crash report generation...
[ OK ] Started Self Monitoring and Reporting Technology (SMART) Daemon.
[ OK ] Started Regular background program processing daemon.
[ OK ] Started crash report submission daemon.
Starting Initialize hardware monitoring sensors...
Starting Login Service...
Starting LSB: Execute the kexec -e command to reboot system...
Starting System Logging Service...
[ OK ] Started Run anacron jobs.
Starting Restore /etc/resolv.conf i...re the ppp link was shut down...
Starting Modem Manager...
[ OK ] Started D-Bus System Message Bus.
[ OK ] Started Avahi mDNS/DNS-SD Stack.
Starting Network Manager...
Starting Accounts Service...
Starting LSB: Speech Dispatcher...
Starting Permit User Sessions...
Starting LSB: Set the CPU Frequency Scaling governor to "ondemand"...
[ OK ] Started CUPS Scheduler.
[ OK ] Started Make remote CUPS printers available locally.
[ OK ] Started Avahi DNS Configuration Daemon.
[ OK ] Started Snappy daemon.
[ OK ] Started System Logging Service.
[ OK ] Started Restore /etc/resolv.conf if...fore the ppp link was shut down.
[ OK ] Started Permit User Sessions.
[ OK ] Started Initialize hardware monitoring sensors.
[ 45.216172] scsi host0: runtime PM trying to activate child device host0 but parent (4-1.1:1.0) is not active
[ OK ] Started LSB: automatic crash report generation.
[ OK ] Started LSB: Execute the kexec -e command to reboot system.
[ OK ] Started LSB: Speech Dispatcher.
[ OK ] Started LSB: Set the CPU Frequency Scaling governor to "ondemand".
[ OK ] Started Login Service.
Starting Authenticate and Authorize Users to Run Privileged Tasks...
Starting LSB: Load kernel image with kexec...
Starting Light Display Manager...
[ OK ] Started Network Manager.
[ OK ] Reached target Network.
Starting OpenBSD Secure Shell server...
Starting Network Manager Wait Online...
[ OK ] Started Authenticate and Authorize Users to Run Privileged Tasks.
[ OK ] Started LSB: Load kernel image with kexec.
[ OK ] Started OpenBSD Secure Shell server.
[ OK ] Started Accounts Service.
Starting Network Manager Script Dispatcher Service...
[ OK ] Started Modem Manager.
[ OK ] Started LSB: Load kernel modules needed to enable cpufreq scaling.
Starting LSB: set CPUFreq kernel parameters...
[ OK ] Started Light Display Manager.
[ OK ] Started Network Manager Script Dispatcher Service.
Starting Hostname Service...
[ OK ] Started LSB: set CPUFreq kernel parameters.
[FAILED] Failed to start Hostname Service.
See 'systemctl status systemd-hostnamed.service' for details.
[ OK ] Created slice User Slice of lightdm.
Starting User Manager for UID 110...
[ OK ] Started Session c1 of user lightdm.
[ OK ] Started User Manager for UID 110.
[ OK ] Stopped Braille Device Support.
[ OK ] Started Braille Device Support.
[FAILED] Failed to start Network Manager Wait Online.
See 'systemctl status NetworkManager-wait-online.service' for details.
[ OK ] Reached target Network is Online.
Starting LSB: disk temperature monitoring daemon...
Starting /etc/rc.local Compatibility...
Starting LSB: Start NTP daemon...
[ OK ] Started /etc/rc.local Compatibility.
Starting Hold until boot process finishes up...
[ OK ] Started LSB: disk temperature monitoring daemon.
[ OK ] Started Hold until boot process finishes up.
[ OK ] Started Serial Getty on ttySAC2.
Starting Set console scheme...
[ OK ] Started Getty on tty1.
[ OK ] Reached target Login Prompts.
[ OK ] Started LSB: Start NTP daemon.
[ OK ] Started Set console scheme.
[ OK ] Reached target Multi-User System.
Starting Notify bootloader that boot was successful...
[ OK ] Started TLP system startup/shutdown.
[ OK ] Reached target Graphical Interface.
[ OK ] Started Stop ureadahead data collection 45s after completed startup.
Starting Update UTMP about System Runlevel Changes...
[ OK ] Started Notify bootloader that boot was successful.
[ OK ] Started Update UTMP about System Runlevel Changes.
Ubuntu 16.04.1 LTS odroid ttySAC2
odroid login: odroid
Password:
Login incorrect
odroid login: odroid
Password:
Last login: Wed Oct 5 06:52:49 UTC 2016 from 10.0.0.104 on pts/0
Welcome to Ubuntu 16.04.1 LTS (GNU/Linux 4.8.0-xu4ml armv7l)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
9 packages can be updated.
0 updates are security updates.
odroid at odroid:~$ lsusb -t
/: Bus 06.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 5000M
/: Bus 05.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 480M
|__ Port 1: Dev 2, If 0, Class=Vendor Specific Class, Driver=r8152, 480M
/: Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 5000M
|__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/2p, 5000M
|__ Port 1: Dev 3, If 0, Class=Mass Storage, Driver=usb-storage, 5000M
/: Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 480M
|__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/2p, 480M
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=exynos-ohci/3p, 12M
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=exynos-ehci/3p, 480M
odroid at odroid:~$
^ permalink raw reply
* [PATCH RFC v2 11/12] ARM: dts: sk-rzg1m: initial device tree
From: Geert Uytterhoeven @ 2016-10-05 7:46 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <2785627.2cnnnPXLS1@wasted.cogentembedded.com>
On Fri, Sep 30, 2016 at 12:34 AM, Sergei Shtylyov
<sergei.shtylyov@cogentembedded.com> wrote:
> Add the initial device tree for the R8A7743 SoC based SK-RZG1M board.
> The board has one debug serial port (SCIF0); include support for it, so
> that the serial console can work.
>
> Based on the original (and large) patch by Dmitry Shifrin
> <dmitry.shifrin@cogentembedded.com>.
>
> Signed-off-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert at linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
^ permalink raw reply
* [PATCH v4 8/8] ARM64: dts: meson-gxbb: Add SCPI with cpufreq & sensors Nodes
From: Neil Armstrong @ 2016-10-05 7:33 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <1475652814-30619-1-git-send-email-narmstrong@baylibre.com>
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
---
arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi | 48 +++++++++++++++++++++++++++++
1 file changed, 48 insertions(+)
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi
index 88f98f5..3fdb2d7 100644
--- a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi
+++ b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi
@@ -74,6 +74,28 @@
};
};
+ scpi {
+ compatible = "amlogic,meson-gxbb-scpi";
+ mboxes = <&mailbox 1 &mailbox 2>;
+ shmem = <&cpu_scp_lpri &cpu_scp_hpri>;
+
+ clocks {
+ compatible = "arm,scpi-clocks";
+
+ scpi_dvfs: scpi_clocks at 0 {
+ compatible = "arm,scpi-dvfs-clocks";
+ #clock-cells = <1>;
+ clock-indices = <0>;
+ clock-output-names = "vcpu";
+ };
+ };
+
+ scpi_sensors: sensors {
+ compatible = "arm,scpi-sensors";
+ #thermal-sensor-cells = <1>;
+ };
+ };
+
soc {
usb0_phy: phy at c0000000 {
compatible = "amlogic,meson-gxbb-usb2-phy";
@@ -101,6 +123,16 @@
#address-cells = <1>;
#size-cells = <1>;
ranges = <0 0x0 0xc8000000 0x14000>;
+
+ cpu_scp_lpri: scp-shmem at 0 {
+ compatible = "amlogic,meson-gxbb-scp-shmem";
+ reg = <0x13000 0x400>;
+ };
+
+ cpu_scp_hpri: scp-shmem at 200 {
+ compatible = "amlogic,meson-gxbb-scp-shmem";
+ reg = <0x13400 0x400>;
+ };
};
usb0: usb at c9000000 {
@@ -143,6 +175,22 @@
};
};
+&cpu0 {
+ clocks = <&scpi_dvfs 0>;
+};
+
+&cpu1 {
+ clocks = <&scpi_dvfs 0>;
+};
+
+&cpu2 {
+ clocks = <&scpi_dvfs 0>;
+};
+
+&cpu3 {
+ clocks = <&scpi_dvfs 0>;
+};
+
&cbus {
reset: reset-controller at 4404 {
compatible = "amlogic,meson-gxbb-reset";
--
1.9.1
^ permalink raw reply related
* [PATCH v4 7/8] ARM64: dts: meson-gxbb: Add SRAM node
From: Neil Armstrong @ 2016-10-05 7:33 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <1475652814-30619-1-git-send-email-narmstrong@baylibre.com>
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
---
arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi
index 443811b..88f98f5 100644
--- a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi
+++ b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi
@@ -94,6 +94,15 @@
status = "disabled";
};
+ sram: sram at c8000000 {
+ compatible = "amlogic,meson-gxbb-sram", "mmio-sram";
+ reg = <0x0 0xc8000000 0x0 0x14000>;
+
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges = <0 0x0 0xc8000000 0x14000>;
+ };
+
usb0: usb at c9000000 {
compatible = "amlogic,meson-gxbb-usb", "snps,dwc2";
reg = <0x0 0xc9000000 0x0 0x40000>;
--
1.9.1
^ permalink raw reply related
* [PATCH v4 6/8] dt-bindings: Add support for Amlogic GXBB SCPI Interface
From: Neil Armstrong @ 2016-10-05 7:33 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <1475652814-30619-1-git-send-email-narmstrong@baylibre.com>
Acked-by: Rob Herring <robh@kernel.org>
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
---
Documentation/devicetree/bindings/arm/arm,scpi.txt | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/Documentation/devicetree/bindings/arm/arm,scpi.txt b/Documentation/devicetree/bindings/arm/arm,scpi.txt
index faa4b44..04bc171 100644
--- a/Documentation/devicetree/bindings/arm/arm,scpi.txt
+++ b/Documentation/devicetree/bindings/arm/arm,scpi.txt
@@ -7,7 +7,7 @@ by Linux to initiate various system control and power operations.
Required properties:
-- compatible : should be "arm,scpi"
+- compatible : should be "arm,scpi" or "amlogic,meson-gxbb-scpi"
- mboxes: List of phandle and mailbox channel specifiers
All the channels reserved by remote SCP firmware for use by
SCPI message protocol should be specified in any order
@@ -60,7 +60,8 @@ A small area of SRAM is reserved for SCPI communication between application
processors and SCP.
Required properties:
-- compatible : should be "arm,juno-sram-ns" for Non-secure SRAM on Juno
+- compatible : should be "arm,juno-sram-ns" for Non-secure SRAM on Juno,
+ or "amlogic,meson-gxbb-sram" for Amlogic GXBB SoC.
The rest of the properties should follow the generic mmio-sram description
found in ../../sram/sram.txt
@@ -70,7 +71,8 @@ Each sub-node represents the reserved area for SCPI.
Required sub-node properties:
- reg : The base offset and size of the reserved area with the SRAM
- compatible : should be "arm,juno-scp-shmem" for Non-secure SRAM based
- shared memory on Juno platforms
+ shared memory on Juno platforms or
+ "amlogic,meson-gxbb-scp-shmem" for Amlogic GXBB SoC.
Sensor bindings for the sensors based on SCPI Message Protocol
--------------------------------------------------------------
--
1.9.1
^ permalink raw reply related
* [PATCH v4 5/8] scpi: grow MAX_DVFS_OPPS to 16 entries
From: Neil Armstrong @ 2016-10-05 7:33 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <1475652814-30619-1-git-send-email-narmstrong@baylibre.com>
Since Amlogic SoCs reports more than 8 OPPs per domains, grow the structure
size to 16.
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
---
drivers/firmware/arm_scpi.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/firmware/arm_scpi.c b/drivers/firmware/arm_scpi.c
index 21fafbe..bc15348 100644
--- a/drivers/firmware/arm_scpi.c
+++ b/drivers/firmware/arm_scpi.c
@@ -70,7 +70,7 @@
#define SCPI_SLOT 0
#define MAX_DVFS_DOMAINS 8
-#define MAX_DVFS_OPPS 8
+#define MAX_DVFS_OPPS 16
#define DVFS_LATENCY(hdr) (le32_to_cpu(hdr) >> 16)
#define DVFS_OPP_COUNT(hdr) ((le32_to_cpu(hdr) >> 8) & 0xff)
--
1.9.1
^ permalink raw reply related
* [PATCH v4 4/8] scpi: Add support for Legacy match table for Amlogic GXBB SoC
From: Neil Armstrong @ 2016-10-05 7:33 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <1475652814-30619-1-git-send-email-narmstrong@baylibre.com>
Add new DT match table to setup the is_legacy boolean value across
the scpi functions.
Add the Amlogic GXBB SoC compatible for platform and as legacy match entry.
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
---
drivers/firmware/arm_scpi.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/drivers/firmware/arm_scpi.c b/drivers/firmware/arm_scpi.c
index 1fb3bbf..21fafbe 100644
--- a/drivers/firmware/arm_scpi.c
+++ b/drivers/firmware/arm_scpi.c
@@ -895,6 +895,11 @@ static int scpi_alloc_xfer_list(struct device *dev, struct scpi_chan *ch)
return 0;
}
+static const struct of_device_id legacy_scpi_of_match[] = {
+ {.compatible = "amlogic,meson-gxbb-scpi"},
+ {},
+};
+
static int scpi_probe(struct platform_device *pdev)
{
int count, idx, ret;
@@ -907,6 +912,9 @@ static int scpi_probe(struct platform_device *pdev)
if (!scpi_info)
return -ENOMEM;
+ if (of_match_device(legacy_scpi_of_match, &pdev->dev))
+ scpi_info->is_legacy = true;
+
count = of_count_phandle_with_args(np, "mboxes", "#mbox-cells");
if (count < 0) {
dev_err(dev, "no mboxes property in '%s'\n", np->full_name);
@@ -1009,6 +1017,7 @@ static int scpi_probe(struct platform_device *pdev)
static const struct of_device_id scpi_of_match[] = {
{.compatible = "arm,scpi"},
+ {.compatible = "amlogic,meson-gxbb-scpi"},
{},
};
--
1.9.1
^ permalink raw reply related
* [PATCH v4 3/8] scpi: Do not fail if get_capabilities is not implemented
From: Neil Armstrong @ 2016-10-05 7:33 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <1475652814-30619-1-git-send-email-narmstrong@baylibre.com>
On Amlogic SCPI legacy implementation, the GET_CAPABILITIES is not
supported, failover by using 0.0.0 version.
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
---
drivers/firmware/arm_scpi.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/drivers/firmware/arm_scpi.c b/drivers/firmware/arm_scpi.c
index 6244eb1..1fb3bbf 100644
--- a/drivers/firmware/arm_scpi.c
+++ b/drivers/firmware/arm_scpi.c
@@ -807,6 +807,10 @@ static int scpi_init_versions(struct scpi_drvinfo *info)
info->protocol_version = le32_to_cpu(caps.protocol_version);
info->firmware_version = le32_to_cpu(caps.platform_version);
}
+ /* Ignore error if not implemented */
+ if (scpi_info->is_legacy && ret == -EOPNOTSUPP)
+ return 0;
+
return ret;
}
--
1.9.1
^ permalink raw reply related
* [PATCH v4 2/8] scpi: Add alternative legacy structures, functions and macros
From: Neil Armstrong @ 2016-10-05 7:33 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <1475652814-30619-1-git-send-email-narmstrong@baylibre.com>
This patch adds support for the Legacy SCPI protocol in early JUNO versions and
shipped Amlogic ARMv8 based SoCs. Some Rockchip SoC are also known to use this
version of protocol with extended vendor commands
.
In order to support the legacy SCPI protocol variant, add back the structures
and macros that varies against the final specification.
Then add indirection table for legacy commands.
Finally Add bitmap field for channel selection since the Legacy protocol mandates to
send a selected subset of the commands on the high priority channel instead of the
low priority channel.
The message sending path differs from the final SCPI procotocol because the
Amlogic SCP firmware always reply 1 instead of a special value containing the command
byte and replied rx data length.
For this reason commands queuing cannot be used and we assume the reply command is
the head of the rx_pending list since we ensure sequential command sending with a
separate dedicated mutex.
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
---
drivers/firmware/arm_scpi.c | 221 +++++++++++++++++++++++++++++++++++++++-----
1 file changed, 199 insertions(+), 22 deletions(-)
diff --git a/drivers/firmware/arm_scpi.c b/drivers/firmware/arm_scpi.c
index 498afa0..6244eb1 100644
--- a/drivers/firmware/arm_scpi.c
+++ b/drivers/firmware/arm_scpi.c
@@ -50,13 +50,20 @@
#define CMD_TOKEN_ID_MASK 0xff
#define CMD_DATA_SIZE_SHIFT 16
#define CMD_DATA_SIZE_MASK 0x1ff
+#define CMD_LEGACY_DATA_SIZE_SHIFT 20
+#define CMD_LEGACY_DATA_SIZE_MASK 0x1ff
#define PACK_SCPI_CMD(cmd_id, tx_sz) \
((((cmd_id) & CMD_ID_MASK) << CMD_ID_SHIFT) | \
(((tx_sz) & CMD_DATA_SIZE_MASK) << CMD_DATA_SIZE_SHIFT))
#define ADD_SCPI_TOKEN(cmd, token) \
((cmd) |= (((token) & CMD_TOKEN_ID_MASK) << CMD_TOKEN_ID_SHIFT))
+#define PACK_LEGACY_SCPI_CMD(cmd_id, tx_sz) \
+ ((((cmd_id) & CMD_ID_MASK) << CMD_ID_SHIFT) | \
+ (((tx_sz) & CMD_LEGACY_DATA_SIZE_MASK) << CMD_LEGACY_DATA_SIZE_SHIFT))
#define CMD_SIZE(cmd) (((cmd) >> CMD_DATA_SIZE_SHIFT) & CMD_DATA_SIZE_MASK)
+#define CMD_LEGACY_SIZE(cmd) (((cmd) >> CMD_LEGACY_DATA_SIZE_SHIFT) & \
+ CMD_LEGACY_DATA_SIZE_MASK)
#define CMD_UNIQ_MASK (CMD_TOKEN_ID_MASK << CMD_TOKEN_ID_SHIFT | CMD_ID_MASK)
#define CMD_XTRACT_UNIQ(cmd) ((cmd) & CMD_UNIQ_MASK)
@@ -133,6 +140,61 @@ enum scpi_std_cmd {
SCPI_CMD_COUNT
};
+/* SCPI Legacy Commands */
+enum legacy_scpi_std_cmd {
+ LEGACY_SCPI_CMD_INVALID = 0x00,
+ LEGACY_SCPI_CMD_SCPI_READY = 0x01,
+ LEGACY_SCPI_CMD_SCPI_CAPABILITIES = 0x02,
+ LEGACY_SCPI_CMD_EVENT = 0x03,
+ LEGACY_SCPI_CMD_SET_CSS_PWR_STATE = 0x04,
+ LEGACY_SCPI_CMD_GET_CSS_PWR_STATE = 0x05,
+ LEGACY_SCPI_CMD_CFG_PWR_STATE_STAT = 0x06,
+ LEGACY_SCPI_CMD_GET_PWR_STATE_STAT = 0x07,
+ LEGACY_SCPI_CMD_SYS_PWR_STATE = 0x08,
+ LEGACY_SCPI_CMD_L2_READY = 0x09,
+ LEGACY_SCPI_CMD_SET_AP_TIMER = 0x0a,
+ LEGACY_SCPI_CMD_CANCEL_AP_TIME = 0x0b,
+ LEGACY_SCPI_CMD_DVFS_CAPABILITIES = 0x0c,
+ LEGACY_SCPI_CMD_GET_DVFS_INFO = 0x0d,
+ LEGACY_SCPI_CMD_SET_DVFS = 0x0e,
+ LEGACY_SCPI_CMD_GET_DVFS = 0x0f,
+ LEGACY_SCPI_CMD_GET_DVFS_STAT = 0x10,
+ LEGACY_SCPI_CMD_SET_RTC = 0x11,
+ LEGACY_SCPI_CMD_GET_RTC = 0x12,
+ LEGACY_SCPI_CMD_CLOCK_CAPABILITIES = 0x13,
+ LEGACY_SCPI_CMD_SET_CLOCK_INDEX = 0x14,
+ LEGACY_SCPI_CMD_SET_CLOCK_VALUE = 0x15,
+ LEGACY_SCPI_CMD_GET_CLOCK_VALUE = 0x16,
+ LEGACY_SCPI_CMD_PSU_CAPABILITIES = 0x17,
+ LEGACY_SCPI_CMD_SET_PSU = 0x18,
+ LEGACY_SCPI_CMD_GET_PSU = 0x19,
+ LEGACY_SCPI_CMD_SENSOR_CAPABILITIES = 0x1a,
+ LEGACY_SCPI_CMD_SENSOR_INFO = 0x1b,
+ LEGACY_SCPI_CMD_SENSOR_VALUE = 0x1c,
+ LEGACY_SCPI_CMD_SENSOR_CFG_PERIODIC = 0x1d,
+ LEGACY_SCPI_CMD_SENSOR_CFG_BOUNDS = 0x1e,
+ LEGACY_SCPI_CMD_SENSOR_ASYNC_VALUE = 0x1f,
+ LEGACY_SCPI_CMD_COUNT
+};
+
+/* List all commands that are required to go through the high priority link */
+static int legacy_hpriority_cmds[] = {
+ LEGACY_SCPI_CMD_GET_CSS_PWR_STATE,
+ LEGACY_SCPI_CMD_CFG_PWR_STATE_STAT,
+ LEGACY_SCPI_CMD_GET_PWR_STATE_STAT,
+ LEGACY_SCPI_CMD_SET_DVFS,
+ LEGACY_SCPI_CMD_GET_DVFS,
+ LEGACY_SCPI_CMD_SET_RTC,
+ LEGACY_SCPI_CMD_GET_RTC,
+ LEGACY_SCPI_CMD_SET_CLOCK_INDEX,
+ LEGACY_SCPI_CMD_SET_CLOCK_VALUE,
+ LEGACY_SCPI_CMD_GET_CLOCK_VALUE,
+ LEGACY_SCPI_CMD_SET_PSU,
+ LEGACY_SCPI_CMD_GET_PSU,
+ LEGACY_SCPI_CMD_SENSOR_CFG_PERIODIC,
+ LEGACY_SCPI_CMD_SENSOR_CFG_BOUNDS,
+};
+
/* List all commands used by this driver, used as indexes */
enum scpi_drv_cmds {
CMD_SCPI_CAPABILITIES = 0,
@@ -165,6 +227,21 @@ enum scpi_drv_cmds {
SCPI_CMD_GET_DEVICE_PWR_STATE,
};
+static int scpi_legacy_commands[CMD_MAX_COUNT] = {
+ LEGACY_SCPI_CMD_SCPI_CAPABILITIES,
+ -1, /* GET_CLOCK_INFO */
+ LEGACY_SCPI_CMD_GET_CLOCK_VALUE,
+ LEGACY_SCPI_CMD_SET_CLOCK_VALUE,
+ LEGACY_SCPI_CMD_GET_DVFS,
+ LEGACY_SCPI_CMD_SET_DVFS,
+ LEGACY_SCPI_CMD_GET_DVFS_INFO,
+ LEGACY_SCPI_CMD_SENSOR_CAPABILITIES,
+ LEGACY_SCPI_CMD_SENSOR_INFO,
+ LEGACY_SCPI_CMD_SENSOR_VALUE,
+ -1, /* SET_DEVICE_PWR_STATE */
+ -1, /* GET_DEVICE_PWR_STATE */
+};
+
struct scpi_xfer {
u32 slot; /* has to be first element */
u32 cmd;
@@ -187,14 +264,17 @@ struct scpi_chan {
struct scpi_xfer *xfers;
spinlock_t rx_lock; /* locking for the rx pending list */
struct mutex xfers_lock;
+ struct mutex legacy_lock;
u8 token;
};
struct scpi_drvinfo {
u32 protocol_version;
u32 firmware_version;
+ bool is_legacy;
int num_chans;
int *scpi_cmds;
+ DECLARE_BITMAP(cmd_priority, LEGACY_SCPI_CMD_COUNT);
atomic_t next_chan;
struct scpi_ops *scpi_ops;
struct scpi_chan *channels;
@@ -211,6 +291,11 @@ struct scpi_shared_mem {
u8 payload[0];
} __packed;
+struct legacy_scpi_shared_mem {
+ __le32 status;
+ u8 payload[0];
+} __packed;
+
struct scp_capabilities {
__le32 protocol_version;
__le32 event_version;
@@ -236,6 +321,12 @@ struct clk_set_value {
__le32 rate;
} __packed;
+struct legacy_clk_set_value {
+ __le32 rate;
+ __le16 id;
+ __le16 reserved;
+} __packed;
+
struct dvfs_info {
__le32 header;
struct {
@@ -307,21 +398,46 @@ static void scpi_process_cmd(struct scpi_chan *ch, u32 cmd)
return;
}
- list_for_each_entry(t, &ch->rx_pending, node)
- if (CMD_XTRACT_UNIQ(t->cmd) == CMD_XTRACT_UNIQ(cmd)) {
- list_del(&t->node);
- match = t;
- break;
- }
+ /* Command type is not replied by the SCP Firmware in legacy Mode
+ * We should consider that command is the head of pending RX commands
+ * if the list is not empty. In TX only mode, the list would be empty.
+ */
+ if (scpi_info->is_legacy) {
+ match = list_first_entry(&ch->rx_pending, struct scpi_xfer,
+ node);
+ list_del(&match->node);
+ } else {
+ list_for_each_entry(t, &ch->rx_pending, node)
+ if (CMD_XTRACT_UNIQ(t->cmd) == CMD_XTRACT_UNIQ(cmd)) {
+ list_del(&t->node);
+ match = t;
+ break;
+ }
+ }
/* check if wait_for_completion is in progress or timed-out */
if (match && !completion_done(&match->done)) {
- struct scpi_shared_mem *mem = ch->rx_payload;
- unsigned int len = min(match->rx_len, CMD_SIZE(cmd));
+ unsigned int len;
+
+ if (scpi_info->is_legacy) {
+ struct legacy_scpi_shared_mem *mem = ch->rx_payload;
+
+ /* RX Length is not replied by the lagcy Firmware */
+ len = match->rx_len;
+
+ match->status = le32_to_cpu(mem->status);
+ memcpy_fromio(match->rx_buf, mem->payload, len);
+ } else {
+ struct scpi_shared_mem *mem = ch->rx_payload;
+
+ len = min(match->rx_len, CMD_SIZE(cmd));
+
+ match->status = le32_to_cpu(mem->status);
+ memcpy_fromio(match->rx_buf, mem->payload, len);
+ }
- match->status = le32_to_cpu(mem->status);
- memcpy_fromio(match->rx_buf, mem->payload, len);
if (match->rx_len > len)
memset(match->rx_buf + len, 0, match->rx_len - len);
+
complete(&match->done);
}
spin_unlock_irqrestore(&ch->rx_lock, flags);
@@ -331,7 +447,12 @@ static void scpi_handle_remote_msg(struct mbox_client *c, void *msg)
{
struct scpi_chan *ch = container_of(c, struct scpi_chan, cl);
struct scpi_shared_mem *mem = ch->rx_payload;
- u32 cmd = le32_to_cpu(mem->command);
+ u32 cmd;
+
+ if (scpi_info->is_legacy)
+ cmd = *(u32 *)msg;
+ else
+ cmd = le32_to_cpu(mem->command);
scpi_process_cmd(ch, cmd);
}
@@ -343,17 +464,26 @@ static void scpi_tx_prepare(struct mbox_client *c, void *msg)
struct scpi_chan *ch = container_of(c, struct scpi_chan, cl);
struct scpi_shared_mem *mem = (struct scpi_shared_mem *)ch->tx_payload;
- if (t->tx_buf)
- memcpy_toio(mem->payload, t->tx_buf, t->tx_len);
+ if (t->tx_buf) {
+ if (scpi_info->is_legacy)
+ memcpy_toio(ch->tx_payload, t->tx_buf, t->tx_len);
+ else
+ memcpy_toio(mem->payload, t->tx_buf, t->tx_len);
+ }
+
if (t->rx_buf) {
if (!(++ch->token))
++ch->token;
ADD_SCPI_TOKEN(t->cmd, ch->token);
+ if (scpi_info->is_legacy)
+ t->slot = t->cmd;
spin_lock_irqsave(&ch->rx_lock, flags);
list_add_tail(&t->node, &ch->rx_pending);
spin_unlock_irqrestore(&ch->rx_lock, flags);
}
- mem->command = cpu_to_le32(t->cmd);
+
+ if (!scpi_info->is_legacy)
+ mem->command = cpu_to_le32(t->cmd);
}
static struct scpi_xfer *get_scpi_xfer(struct scpi_chan *ch)
@@ -396,21 +526,37 @@ static int scpi_send_message(unsigned int offset, void *tx_buf,
cmd = scpi_info->scpi_cmds[offset];
- chan = atomic_inc_return(&scpi_info->next_chan) % scpi_info->num_chans;
+ if (scpi_info->is_legacy)
+ chan = test_bit(cmd, scpi_info->cmd_priority) ? 1 : 0;
+ else
+ chan = atomic_inc_return(&scpi_info->next_chan) %
+ scpi_info->num_chans;
scpi_chan = scpi_info->channels + chan;
msg = get_scpi_xfer(scpi_chan);
if (!msg)
return -ENOMEM;
- msg->slot = BIT(SCPI_SLOT);
- msg->cmd = PACK_SCPI_CMD(cmd, tx_len);
+ if (scpi_info->is_legacy) {
+ msg->cmd = PACK_LEGACY_SCPI_CMD(cmd, tx_len);
+ msg->slot = msg->cmd;
+ } else {
+ msg->slot = BIT(SCPI_SLOT);
+ msg->cmd = PACK_SCPI_CMD(cmd, tx_len);
+ }
msg->tx_buf = tx_buf;
msg->tx_len = tx_len;
msg->rx_buf = rx_buf;
msg->rx_len = rx_len;
init_completion(&msg->done);
+ /* Since we cannot distinguish the original command in the
+ * MHU reply stat value from a Legacy SCP firmware, ensure
+ * sequential command sending to the firmware.
+ */
+ if (scpi_info->is_legacy)
+ mutex_lock(&scpi_chan->legacy_lock);
+
ret = mbox_send_message(scpi_chan->chan, msg);
if (ret < 0 || !rx_buf)
goto out;
@@ -421,9 +567,13 @@ static int scpi_send_message(unsigned int offset, void *tx_buf,
/* first status word */
ret = msg->status;
out:
- if (ret < 0 && rx_buf) /* remove entry from the list if timed-out */
+ if (ret < 0 && rx_buf)
+ /* remove entry from the list if timed-out */
scpi_process_cmd(scpi_chan, msg->cmd);
+ if (scpi_info->is_legacy)
+ mutex_unlock(&scpi_chan->legacy_lock);
+
put_scpi_xfer(msg, scpi_chan);
/* SCPI error codes > 0, translate them to Linux scale*/
return ret > 0 ? scpi_to_linux_errno(ret) : ret;
@@ -474,6 +624,18 @@ static int scpi_clk_set_val(u16 clk_id, unsigned long rate)
&stat, sizeof(stat));
}
+static int legacy_scpi_clk_set_val(u16 clk_id, unsigned long rate)
+{
+ int stat;
+ struct legacy_clk_set_value clk = {
+ .id = cpu_to_le16(clk_id),
+ .rate = cpu_to_le32(rate)
+ };
+
+ return scpi_send_message(CMD_SET_CLOCK_VALUE, &clk, sizeof(clk),
+ &stat, sizeof(stat));
+}
+
static int scpi_dvfs_get_idx(u8 domain)
{
int ret;
@@ -525,7 +687,6 @@ static struct scpi_dvfs_info *scpi_dvfs_get_info(u8 domain)
info->count = DVFS_OPP_COUNT(buf.header);
info->latency = DVFS_LATENCY(buf.header) * 1000; /* uS to nS */
-
info->opps = kcalloc(info->count, sizeof(*opp), GFP_KERNEL);
if (!info->opps) {
kfree(info);
@@ -580,9 +741,13 @@ static int scpi_sensor_get_value(u16 sensor, u64 *val)
ret = scpi_send_message(CMD_SENSOR_VALUE, &id, sizeof(id),
&buf, sizeof(buf));
- if (!ret)
- *val = (u64)le32_to_cpu(buf.hi_val) << 32 |
- le32_to_cpu(buf.lo_val);
+ if (!ret) {
+ if (scpi_info->is_legacy)
+ *val = (u64)le32_to_cpu(buf.lo_val);
+ else
+ *val = (u64)le32_to_cpu(buf.hi_val) << 32 |
+ le32_to_cpu(buf.lo_val);
+ }
return ret;
}
@@ -781,6 +946,7 @@ static int scpi_probe(struct platform_device *pdev)
INIT_LIST_HEAD(&pchan->xfers_list);
spin_lock_init(&pchan->rx_lock);
mutex_init(&pchan->xfers_lock);
+ mutex_init(&pchan->legacy_lock);
ret = scpi_alloc_xfer_list(dev, pchan);
if (!ret) {
@@ -804,6 +970,17 @@ static int scpi_probe(struct platform_device *pdev)
scpi_info->scpi_cmds = scpi_std_commands;
+ if (scpi_info->is_legacy) {
+ /* Replace with legacy variants */
+ scpi_ops.clk_set_val = legacy_scpi_clk_set_val;
+ scpi_info->scpi_cmds = scpi_legacy_commands;
+
+ /* Fill priority bitmap */
+ for (idx = 0; idx < ARRAY_SIZE(legacy_hpriority_cmds); idx++)
+ set_bit(legacy_hpriority_cmds[idx],
+ scpi_info->cmd_priority);
+ }
+
ret = scpi_init_versions(scpi_info);
if (ret) {
dev_err(dev, "incorrect or no SCP firmware found\n");
--
1.9.1
^ permalink raw reply related
* [PATCH v4 1/8] scpi: Add cmd indirection table to prepare for legacy commands
From: Neil Armstrong @ 2016-10-05 7:33 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <1475652814-30619-1-git-send-email-narmstrong@baylibre.com>
From: Sudeep Holla <sudeep.holla@arm.com>
Add indirection table to permit multiple command values for legacy support.
[narmstrong at baylibre.com: Added cmd check in scpi_send_message]
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
---
drivers/firmware/arm_scpi.c | 81 +++++++++++++++++++++++++++++++++++----------
1 file changed, 64 insertions(+), 17 deletions(-)
diff --git a/drivers/firmware/arm_scpi.c b/drivers/firmware/arm_scpi.c
index ce2bc2a..498afa0 100644
--- a/drivers/firmware/arm_scpi.c
+++ b/drivers/firmware/arm_scpi.c
@@ -99,6 +99,7 @@ enum scpi_error_codes {
SCPI_ERR_MAX
};
+/* SCPI Standard commands */
enum scpi_std_cmd {
SCPI_CMD_INVALID = 0x00,
SCPI_CMD_SCPI_READY = 0x01,
@@ -132,6 +133,38 @@ enum scpi_std_cmd {
SCPI_CMD_COUNT
};
+/* List all commands used by this driver, used as indexes */
+enum scpi_drv_cmds {
+ CMD_SCPI_CAPABILITIES = 0,
+ CMD_GET_CLOCK_INFO,
+ CMD_GET_CLOCK_VALUE,
+ CMD_SET_CLOCK_VALUE,
+ CMD_GET_DVFS,
+ CMD_SET_DVFS,
+ CMD_GET_DVFS_INFO,
+ CMD_SENSOR_CAPABILITIES,
+ CMD_SENSOR_INFO,
+ CMD_SENSOR_VALUE,
+ CMD_SET_DEVICE_PWR_STATE,
+ CMD_GET_DEVICE_PWR_STATE,
+ CMD_MAX_COUNT,
+};
+
+static int scpi_std_commands[CMD_MAX_COUNT] = {
+ SCPI_CMD_SCPI_CAPABILITIES,
+ SCPI_CMD_GET_CLOCK_INFO,
+ SCPI_CMD_GET_CLOCK_VALUE,
+ SCPI_CMD_SET_CLOCK_VALUE,
+ SCPI_CMD_GET_DVFS,
+ SCPI_CMD_SET_DVFS,
+ SCPI_CMD_GET_DVFS_INFO,
+ SCPI_CMD_SENSOR_CAPABILITIES,
+ SCPI_CMD_SENSOR_INFO,
+ SCPI_CMD_SENSOR_VALUE,
+ SCPI_CMD_SET_DEVICE_PWR_STATE,
+ SCPI_CMD_GET_DEVICE_PWR_STATE,
+};
+
struct scpi_xfer {
u32 slot; /* has to be first element */
u32 cmd;
@@ -161,6 +194,7 @@ struct scpi_drvinfo {
u32 protocol_version;
u32 firmware_version;
int num_chans;
+ int *scpi_cmds;
atomic_t next_chan;
struct scpi_ops *scpi_ops;
struct scpi_chan *channels;
@@ -344,14 +378,24 @@ static void put_scpi_xfer(struct scpi_xfer *t, struct scpi_chan *ch)
mutex_unlock(&ch->xfers_lock);
}
-static int scpi_send_message(u8 cmd, void *tx_buf, unsigned int tx_len,
- void *rx_buf, unsigned int rx_len)
+static int scpi_send_message(unsigned int offset, void *tx_buf,
+ unsigned int tx_len, void *rx_buf,
+ unsigned int rx_len)
{
int ret;
u8 chan;
+ u8 cmd;
struct scpi_xfer *msg;
struct scpi_chan *scpi_chan;
+ if (offset >= CMD_MAX_COUNT || !scpi_info->scpi_cmds)
+ return -EINVAL;
+
+ if (scpi_info->scpi_cmds[offset] < 0)
+ return -EOPNOTSUPP;
+
+ cmd = scpi_info->scpi_cmds[offset];
+
chan = atomic_inc_return(&scpi_info->next_chan) % scpi_info->num_chans;
scpi_chan = scpi_info->channels + chan;
@@ -397,7 +441,7 @@ static u32 scpi_get_version(void)
struct clk_get_info clk;
__le16 le_clk_id = cpu_to_le16(clk_id);
- ret = scpi_send_message(SCPI_CMD_GET_CLOCK_INFO, &le_clk_id,
+ ret = scpi_send_message(CMD_GET_CLOCK_INFO, &le_clk_id,
sizeof(le_clk_id), &clk, sizeof(clk));
if (!ret) {
*min = le32_to_cpu(clk.min_rate);
@@ -412,8 +456,9 @@ static unsigned long scpi_clk_get_val(u16 clk_id)
struct clk_get_value clk;
__le16 le_clk_id = cpu_to_le16(clk_id);
- ret = scpi_send_message(SCPI_CMD_GET_CLOCK_VALUE, &le_clk_id,
+ ret = scpi_send_message(CMD_GET_CLOCK_VALUE, &le_clk_id,
sizeof(le_clk_id), &clk, sizeof(clk));
+
return ret ? ret : le32_to_cpu(clk.rate);
}
@@ -425,7 +470,7 @@ static int scpi_clk_set_val(u16 clk_id, unsigned long rate)
.rate = cpu_to_le32(rate)
};
- return scpi_send_message(SCPI_CMD_SET_CLOCK_VALUE, &clk, sizeof(clk),
+ return scpi_send_message(CMD_SET_CLOCK_VALUE, &clk, sizeof(clk),
&stat, sizeof(stat));
}
@@ -434,8 +479,9 @@ static int scpi_dvfs_get_idx(u8 domain)
int ret;
u8 dvfs_idx;
- ret = scpi_send_message(SCPI_CMD_GET_DVFS, &domain, sizeof(domain),
+ ret = scpi_send_message(CMD_GET_DVFS, &domain, sizeof(domain),
&dvfs_idx, sizeof(dvfs_idx));
+
return ret ? ret : dvfs_idx;
}
@@ -444,7 +490,7 @@ static int scpi_dvfs_set_idx(u8 domain, u8 index)
int stat;
struct dvfs_set dvfs = {domain, index};
- return scpi_send_message(SCPI_CMD_SET_DVFS, &dvfs, sizeof(dvfs),
+ return scpi_send_message(CMD_SET_DVFS, &dvfs, sizeof(dvfs),
&stat, sizeof(stat));
}
@@ -468,9 +514,8 @@ static struct scpi_dvfs_info *scpi_dvfs_get_info(u8 domain)
if (scpi_info->dvfs[domain]) /* data already populated */
return scpi_info->dvfs[domain];
- ret = scpi_send_message(SCPI_CMD_GET_DVFS_INFO, &domain, sizeof(domain),
+ ret = scpi_send_message(CMD_GET_DVFS_INFO, &domain, sizeof(domain),
&buf, sizeof(buf));
-
if (ret)
return ERR_PTR(ret);
@@ -503,8 +548,8 @@ static int scpi_sensor_get_capability(u16 *sensors)
struct sensor_capabilities cap_buf;
int ret;
- ret = scpi_send_message(SCPI_CMD_SENSOR_CAPABILITIES, NULL, 0, &cap_buf,
- sizeof(cap_buf));
+ ret = scpi_send_message(CMD_SENSOR_CAPABILITIES, NULL, 0,
+ &cap_buf, sizeof(cap_buf));
if (!ret)
*sensors = le16_to_cpu(cap_buf.sensors);
@@ -517,7 +562,7 @@ static int scpi_sensor_get_info(u16 sensor_id, struct scpi_sensor_info *info)
struct _scpi_sensor_info _info;
int ret;
- ret = scpi_send_message(SCPI_CMD_SENSOR_INFO, &id, sizeof(id),
+ ret = scpi_send_message(CMD_SENSOR_INFO, &id, sizeof(id),
&_info, sizeof(_info));
if (!ret) {
memcpy(info, &_info, sizeof(*info));
@@ -533,7 +578,7 @@ static int scpi_sensor_get_value(u16 sensor, u64 *val)
struct sensor_value buf;
int ret;
- ret = scpi_send_message(SCPI_CMD_SENSOR_VALUE, &id, sizeof(id),
+ ret = scpi_send_message(CMD_SENSOR_VALUE, &id, sizeof(id),
&buf, sizeof(buf));
if (!ret)
*val = (u64)le32_to_cpu(buf.hi_val) << 32 |
@@ -548,8 +593,8 @@ static int scpi_device_get_power_state(u16 dev_id)
u8 pstate;
__le16 id = cpu_to_le16(dev_id);
- ret = scpi_send_message(SCPI_CMD_GET_DEVICE_PWR_STATE, &id,
- sizeof(id), &pstate, sizeof(pstate));
+ ret = scpi_send_message(CMD_GET_DEVICE_PWR_STATE, &id, sizeof(id),
+ &pstate, sizeof(pstate));
return ret ? ret : pstate;
}
@@ -561,7 +606,7 @@ static int scpi_device_set_power_state(u16 dev_id, u8 pstate)
.pstate = pstate,
};
- return scpi_send_message(SCPI_CMD_SET_DEVICE_PWR_STATE, &dev_set,
+ return scpi_send_message(CMD_SET_DEVICE_PWR_STATE, &dev_set,
sizeof(dev_set), &stat, sizeof(stat));
}
@@ -591,7 +636,7 @@ static int scpi_init_versions(struct scpi_drvinfo *info)
int ret;
struct scp_capabilities caps;
- ret = scpi_send_message(SCPI_CMD_SCPI_CAPABILITIES, NULL, 0,
+ ret = scpi_send_message(CMD_SCPI_CAPABILITIES, NULL, 0,
&caps, sizeof(caps));
if (!ret) {
info->protocol_version = le32_to_cpu(caps.protocol_version);
@@ -757,6 +802,8 @@ static int scpi_probe(struct platform_device *pdev)
scpi_info->num_chans = count;
platform_set_drvdata(pdev, scpi_info);
+ scpi_info->scpi_cmds = scpi_std_commands;
+
ret = scpi_init_versions(scpi_info);
if (ret) {
dev_err(dev, "incorrect or no SCP firmware found\n");
--
1.9.1
^ permalink raw reply related
* [PATCH v4 0/8] Add support for legacy SCPI protocol
From: Neil Armstrong @ 2016-10-05 7:33 UTC (permalink / raw)
To: linux-arm-kernel
This patchset aims to support the legacy SCPI firmware implementation that was
delivered as early technology preview for the JUNO platform.
Finally a stable, maintained and public implementation for the SCPI protocol
has been upstreamed part of the JUNO support and it is the recommended way
of implementing SCP communication on ARMv8 platforms.
The Amlogic GXBB platform is using this legacy protocol, as the RK3368 & RK3399
platforms. This patchset will only add support for Amlogic GXBB SoC.
This patchset add support for the legacy protocol in the arm_scpi.c file,
avoiding code duplication.
Last RFC discution tread can be found at : https://lkml.org/lkml/2016/8/9/210
Changes since v3 at : http://lkml.kernel.org/r/1473262477-18045-1-git-send-email-narmstrong at baylibre.com
- Changed back author to Sudeep Holla for first patch
- Merged legacy functions to scpi_send_message, tx_prepare and handle_remote_message
- Added legacy locking scheme
- Merged back legacy_scpi_sensor_get_value into scpi_sensor_get_value
- Rebased on linux-next-20161004 with patchset [1]
Changes since v2 at : http://lkml.kernel.org/r/1471952816-30877-1-git-send-email-narmstrong at baylibre.com
- Added command indirection table and use it in each commands
- Added bitmap for high priority commands
- Cleaned up legacy tx_prepare/handle_message to align to standard functions
- Dropped legacy_scpi_ops
Changes since v1 at : http://lkml.kernel.org/r/1471515066-3626-1-git-send-email-narmstrong at baylibre.com
- Dropped vendor_send_message and rockchip vendor mechanism patches
- Merged alternate functions into main functions using is_legacy boolean
- Added DT match table to set is_legacy to true
- Kept alternate scpi_ops structure for legacy
[1] http://lkml.kernel.org/r/1475595430-30075-1-git-send-email-narmstrong at baylibre.com
Neil Armstrong (7):
scpi: Add alternative legacy structures, functions and macros
scpi: Do not fail if get_capabilities is not implemented
scpi: Add support for Legacy match table for Amlogic GXBB SoC
scpi: grow MAX_DVFS_OPPS to 16 entries
dt-bindings: Add support for Amlogic GXBB SCPI Interface
ARM64: dts: meson-gxbb: Add SRAM node
ARM64: dts: meson-gxbb: Add SCPI with cpufreq & sensors Nodes
Sudeep Holla (1):
scpi: Add cmd indirection table to prepare for legacy commands
Documentation/devicetree/bindings/arm/arm,scpi.txt | 8 +-
arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi | 57 ++++
drivers/firmware/arm_scpi.c | 317 ++++++++++++++++++---
3 files changed, 339 insertions(+), 43 deletions(-)
--
1.9.1
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox