04 Aug, 2020

1 commit

  • The acpi_get_table() should be coupled with acpi_put_table() if
    the mapped table is not used at runtime to release the table
    mapping.

    In acpi_pcc_probe(), the PCCT table entries will be used as private
    data for communication chan at runtime, but the table should be put
    for error path.

    Signed-off-by: Hanjun Guo
    Signed-off-by: Jassi Brar

    Hanjun Guo
     

31 May, 2020

1 commit


31 May, 2019

1 commit

  • Based on 3 normalized pattern(s):

    this program 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 program 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

    this program 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 [author] [kishon] [vijay] [abraham]
    [i] [kishon]@[ti] [com] this program 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

    this program 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 [author] [graeme] [gregory]
    [gg]@[slimlogic] [co] [uk] [author] [kishon] [vijay] [abraham] [i]
    [kishon]@[ti] [com] [based] [on] [twl6030]_[usb] [c] [author] [hema]
    [hk] [hemahk]@[ti] [com] this program 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

    extracted by the scancode license scanner the SPDX license identifier

    GPL-2.0-or-later

    has been chosen to replace the boilerplate/reference in 1105 file(s).

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Allison Randal
    Reviewed-by: Richard Fontana
    Reviewed-by: Kate Stewart
    Cc: linux-spdx@vger.kernel.org
    Link: https://lkml.kernel.org/r/20190527070033.202006027@linutronix.de
    Signed-off-by: Greg Kroah-Hartman

    Thomas Gleixner
     

05 Apr, 2019

1 commit

  • Parsing entries in an ACPI table had assumed a generic header
    structure. There is no standard ACPI header, though, so less common
    layouts with different field sizes required custom parsers to go through
    their subtable entry list.

    Create the infrastructure for adding different table types so parsing
    the entries array may be more reused for all ACPI system tables and
    the common code doesn't need to be duplicated.

    Reviewed-by: Rafael J. Wysocki
    Acked-by: Jonathan Cameron
    Tested-by: Jonathan Cameron
    Signed-off-by: Keith Busch
    Tested-by: Brice Goglin
    Signed-off-by: Greg Kroah-Hartman

    Keith Busch
     

10 Sep, 2018

1 commit

  • acpi_pcc_probe() calls acpi_table_parse_entries_array() but fails
    to check for an error return. This in turn can result in calling
    kcalloc() with a negative count as well as emitting the following
    misleading erorr message:

    [ 2.642015] Could not allocate space for PCC mbox channels

    Fixes: 8f8027c5f935 (mailbox: PCC: erroneous error message when parsing ACPI PCCT)
    Signed-off-by: David Arcari
    Reviewed-by: Al Stone
    Cc: 4.18+ # 4.18+
    Signed-off-by: Rafael J. Wysocki

    David Arcari
     

13 Jun, 2018

1 commit

  • The kzalloc() function has a 2-factor argument form, kcalloc(). This
    patch replaces cases of:

    kzalloc(a * b, gfp)

    with:
    kcalloc(a * b, gfp)

    as well as handling cases of:

    kzalloc(a * b * c, gfp)

    with:

    kzalloc(array3_size(a, b, c), gfp)

    as it's slightly less ugly than:

    kzalloc_array(array_size(a, b), c, gfp)

    This does, however, attempt to ignore constant size factors like:

    kzalloc(4 * 1024, gfp)

    though any constants defined via macros get caught up in the conversion.

    Any factors with a sizeof() of "unsigned char", "char", and "u8" were
    dropped, since they're redundant.

    The Coccinelle script used for this was:

    // Fix redundant parens around sizeof().
    @@
    type TYPE;
    expression THING, E;
    @@

    (
    kzalloc(
    - (sizeof(TYPE)) * E
    + sizeof(TYPE) * E
    , ...)
    |
    kzalloc(
    - (sizeof(THING)) * E
    + sizeof(THING) * E
    , ...)
    )

    // Drop single-byte sizes and redundant parens.
    @@
    expression COUNT;
    typedef u8;
    typedef __u8;
    @@

    (
    kzalloc(
    - sizeof(u8) * (COUNT)
    + COUNT
    , ...)
    |
    kzalloc(
    - sizeof(__u8) * (COUNT)
    + COUNT
    , ...)
    |
    kzalloc(
    - sizeof(char) * (COUNT)
    + COUNT
    , ...)
    |
    kzalloc(
    - sizeof(unsigned char) * (COUNT)
    + COUNT
    , ...)
    |
    kzalloc(
    - sizeof(u8) * COUNT
    + COUNT
    , ...)
    |
    kzalloc(
    - sizeof(__u8) * COUNT
    + COUNT
    , ...)
    |
    kzalloc(
    - sizeof(char) * COUNT
    + COUNT
    , ...)
    |
    kzalloc(
    - sizeof(unsigned char) * COUNT
    + COUNT
    , ...)
    )

    // 2-factor product with sizeof(type/expression) and identifier or constant.
    @@
    type TYPE;
    expression THING;
    identifier COUNT_ID;
    constant COUNT_CONST;
    @@

    (
    - kzalloc
    + kcalloc
    (
    - sizeof(TYPE) * (COUNT_ID)
    + COUNT_ID, sizeof(TYPE)
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - sizeof(TYPE) * COUNT_ID
    + COUNT_ID, sizeof(TYPE)
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - sizeof(TYPE) * (COUNT_CONST)
    + COUNT_CONST, sizeof(TYPE)
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - sizeof(TYPE) * COUNT_CONST
    + COUNT_CONST, sizeof(TYPE)
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - sizeof(THING) * (COUNT_ID)
    + COUNT_ID, sizeof(THING)
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - sizeof(THING) * COUNT_ID
    + COUNT_ID, sizeof(THING)
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - sizeof(THING) * (COUNT_CONST)
    + COUNT_CONST, sizeof(THING)
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - sizeof(THING) * COUNT_CONST
    + COUNT_CONST, sizeof(THING)
    , ...)
    )

    // 2-factor product, only identifiers.
    @@
    identifier SIZE, COUNT;
    @@

    - kzalloc
    + kcalloc
    (
    - SIZE * COUNT
    + COUNT, SIZE
    , ...)

    // 3-factor product with 1 sizeof(type) or sizeof(expression), with
    // redundant parens removed.
    @@
    expression THING;
    identifier STRIDE, COUNT;
    type TYPE;
    @@

    (
    kzalloc(
    - sizeof(TYPE) * (COUNT) * (STRIDE)
    + array3_size(COUNT, STRIDE, sizeof(TYPE))
    , ...)
    |
    kzalloc(
    - sizeof(TYPE) * (COUNT) * STRIDE
    + array3_size(COUNT, STRIDE, sizeof(TYPE))
    , ...)
    |
    kzalloc(
    - sizeof(TYPE) * COUNT * (STRIDE)
    + array3_size(COUNT, STRIDE, sizeof(TYPE))
    , ...)
    |
    kzalloc(
    - sizeof(TYPE) * COUNT * STRIDE
    + array3_size(COUNT, STRIDE, sizeof(TYPE))
    , ...)
    |
    kzalloc(
    - sizeof(THING) * (COUNT) * (STRIDE)
    + array3_size(COUNT, STRIDE, sizeof(THING))
    , ...)
    |
    kzalloc(
    - sizeof(THING) * (COUNT) * STRIDE
    + array3_size(COUNT, STRIDE, sizeof(THING))
    , ...)
    |
    kzalloc(
    - sizeof(THING) * COUNT * (STRIDE)
    + array3_size(COUNT, STRIDE, sizeof(THING))
    , ...)
    |
    kzalloc(
    - sizeof(THING) * COUNT * STRIDE
    + array3_size(COUNT, STRIDE, sizeof(THING))
    , ...)
    )

    // 3-factor product with 2 sizeof(variable), with redundant parens removed.
    @@
    expression THING1, THING2;
    identifier COUNT;
    type TYPE1, TYPE2;
    @@

    (
    kzalloc(
    - sizeof(TYPE1) * sizeof(TYPE2) * COUNT
    + array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
    , ...)
    |
    kzalloc(
    - sizeof(TYPE1) * sizeof(THING2) * (COUNT)
    + array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
    , ...)
    |
    kzalloc(
    - sizeof(THING1) * sizeof(THING2) * COUNT
    + array3_size(COUNT, sizeof(THING1), sizeof(THING2))
    , ...)
    |
    kzalloc(
    - sizeof(THING1) * sizeof(THING2) * (COUNT)
    + array3_size(COUNT, sizeof(THING1), sizeof(THING2))
    , ...)
    |
    kzalloc(
    - sizeof(TYPE1) * sizeof(THING2) * COUNT
    + array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
    , ...)
    |
    kzalloc(
    - sizeof(TYPE1) * sizeof(THING2) * (COUNT)
    + array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
    , ...)
    )

    // 3-factor product, only identifiers, with redundant parens removed.
    @@
    identifier STRIDE, SIZE, COUNT;
    @@

    (
    kzalloc(
    - (COUNT) * STRIDE * SIZE
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kzalloc(
    - COUNT * (STRIDE) * SIZE
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kzalloc(
    - COUNT * STRIDE * (SIZE)
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kzalloc(
    - (COUNT) * (STRIDE) * SIZE
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kzalloc(
    - COUNT * (STRIDE) * (SIZE)
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kzalloc(
    - (COUNT) * STRIDE * (SIZE)
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kzalloc(
    - (COUNT) * (STRIDE) * (SIZE)
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kzalloc(
    - COUNT * STRIDE * SIZE
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    )

    // Any remaining multi-factor products, first at least 3-factor products,
    // when they're not all constants...
    @@
    expression E1, E2, E3;
    constant C1, C2, C3;
    @@

    (
    kzalloc(C1 * C2 * C3, ...)
    |
    kzalloc(
    - (E1) * E2 * E3
    + array3_size(E1, E2, E3)
    , ...)
    |
    kzalloc(
    - (E1) * (E2) * E3
    + array3_size(E1, E2, E3)
    , ...)
    |
    kzalloc(
    - (E1) * (E2) * (E3)
    + array3_size(E1, E2, E3)
    , ...)
    |
    kzalloc(
    - E1 * E2 * E3
    + array3_size(E1, E2, E3)
    , ...)
    )

    // And then all remaining 2 factors products when they're not all constants,
    // keeping sizeof() as the second factor argument.
    @@
    expression THING, E1, E2;
    type TYPE;
    constant C1, C2, C3;
    @@

    (
    kzalloc(sizeof(THING) * C2, ...)
    |
    kzalloc(sizeof(TYPE) * C2, ...)
    |
    kzalloc(C1 * C2 * C3, ...)
    |
    kzalloc(C1 * C2, ...)
    |
    - kzalloc
    + kcalloc
    (
    - sizeof(TYPE) * (E2)
    + E2, sizeof(TYPE)
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - sizeof(TYPE) * E2
    + E2, sizeof(TYPE)
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - sizeof(THING) * (E2)
    + E2, sizeof(THING)
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - sizeof(THING) * E2
    + E2, sizeof(THING)
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - (E1) * E2
    + E1, E2
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - (E1) * (E2)
    + E1, E2
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - E1 * E2
    + E1, E2
    , ...)
    )

    Signed-off-by: Kees Cook

    Kees Cook
     

18 May, 2018

1 commit

  • There have been multiple reports of the following error message:

    [ 0.068293] Error parsing PCC subspaces from PCCT

    This error message is not correct. In multiple cases examined, the PCCT
    (Platform Communications Channel Table) concerned is actually properly
    constructed; the problem is that acpi_pcc_probe() which reads the PCCT
    is making the assumption that the only valid PCCT is one that contains
    subtables of one of two types: ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE or
    ACPI_PCCT_TYPE_HW_REDUCED_TYPE2. The number of subtables of these
    types are counted and as long as there is at least one of the desired
    types, the acpi_pcc_probe() succeeds. When no subtables of these types
    are found, regardless of whether or not any other subtable types are
    present, the error mentioned above is reported.

    In the cases reported to me personally, the PCCT contains exactly one
    subtable of type ACPI_PCCT_TYPE_GENERIC_SUBSPACE. The function
    acpi_pcc_probe() does not count it as a valid subtable, so believes
    there to be no valid subtables, and hence outputs the error message.

    An example of the PCCT being reported as erroneous yet perfectly fine
    is the following:

    Signature : "PCCT"
    Table Length : 0000006E
    Revision : 05
    Checksum : A9
    Oem ID : "XXXXXX"
    Oem Table ID : "XXXXX "
    Oem Revision : 00002280
    Asl Compiler ID : "XXXX"
    Asl Compiler Revision : 00000002

    Flags (decoded below) : 00000001
    Platform : 1
    Reserved : 0000000000000000

    Subtable Type : 00 [Generic Communications Subspace]
    Length : 3E

    Reserved : 000000000000
    Base Address : 00000000DCE43018
    Address Length : 0000000000001000

    Doorbell Register : [Generic Address Structure]
    Space ID : 01 [SystemIO]
    Bit Width : 08
    Bit Offset : 00
    Encoded Access Width : 01 [Byte Access:8]
    Address : 0000000000001842

    Preserve Mask : 00000000000000FD
    Write Mask : 0000000000000002
    Command Latency : 00001388
    Maximum Access Rate : 00000000
    Minimum Turnaround Time : 0000

    To fix this, we count up all of the possible subtable types for the
    PCCT, and only report an error when there are none (which could mean
    either no subtables, or no valid subtables), or there are too many.
    We also change the logic so that if there is a valid subtable, we
    do try to initialize it per the PCCT subtable contents. This is a
    change in functionality; previously, the probe would have returned
    right after the error message and would not have tried to use any
    other subtable definition.

    Tested on my personal laptop which showed the error previously; the
    error message no longer appears and the laptop appears to operate
    normally.

    Signed-off-by: Al Stone
    Reviewed-by: Prashanth Prakash
    Signed-off-by: Rafael J. Wysocki

    Al Stone
     

16 Nov, 2017

1 commit

  • Pull mailbox updates from Jassi Brar:
    "Change to POLL api and fixes for FlexRM and OMAP driver.

    Summary:

    - Core: Prefer ACK method over POLL, if both supported

    - Test: use flag instead of special character

    - FlexRM: Usual driver internal minor churn

    - Omap: fix error path"

    * tag 'mailbox-v4.15' of git://git.linaro.org/landing-teams/working/fujitsu/integration:
    mailbox/omap: unregister mbox class
    mailbox: mailbox-test: don't rely on rx_buffer content to signal data ready
    mailbox: reset txdone_method TXDONE_BY_POLL if client knows_txdone
    mailbox: Build Broadcom FlexRM driver as loadable module for iProc SOCs
    mailbox: bcm-flexrm-mailbox: Use common GPL comment header
    mailbox: bcm-flexrm-mailbox: add depends on ARCH_BCM_IPROC
    mailbox: bcm-flexrm-mailbox: Print ring number in errors and warnings
    mailbox: bcm-flexrm-mailbox: Fix FlexRM ring flush sequence

    Linus Torvalds
     

14 Nov, 2017

1 commit

  • Currently the mailbox framework sets txdone_method to TXDONE_BY_POLL if
    the controller sets txdone_by_poll. However some clients can have a
    mechanism to do TXDONE_BY_ACK which they can specify by knows_txdone.
    However, we endup setting both TXDONE_BY_POLL and TXDONE_BY_ACK in that
    case. In such scenario, we may end up with below warnings as the tx
    ticker is run both by mailbox framework and the client.

    WARNING: CPU: 1 PID: 0 at kernel/time/hrtimer.c:805 hrtimer_forward+0x88/0xd8
    CPU: 1 PID: 0 Comm: swapper/1 Not tainted 4.12.0-rc5 #242
    Hardware name: ARM LTD ARM Juno Development Platform
    task: ffff8009768ca700 task.stack: ffff8009768f8000
    PC is at hrtimer_forward+0x88/0xd8
    LR is at txdone_hrtimer+0xd4/0xf8
    Call trace:
    hrtimer_forward+0x88/0xd8
    __hrtimer_run_queues+0xe4/0x158
    hrtimer_interrupt+0xa4/0x220
    arch_timer_handler_phys+0x30/0x40
    handle_percpu_devid_irq+0x78/0x130
    generic_handle_irq+0x24/0x38
    __handle_domain_irq+0x5c/0xb8
    gic_handle_irq+0x54/0xa8

    This patch fixes the issue by resetting TXDONE_BY_POLL if client has set
    knows_txdone.

    Cc: Alexey Klimov
    Signed-off-by: Sudeep Holla
    Signed-off-by: Jassi Brar

    Sudeep Holla
     

09 Nov, 2017

1 commit


10 Aug, 2017

1 commit

  • When booting on an ACPI enabled system that does not provide the
    Platform Communications Channel Table (PCCT), the pcc mailbox driver
    prints -

    [ 0.484261] PCCT header not found.

    during probe before returning -ENODEV.

    This message clutters the bootlog and doesn't provide any useful
    information. Drop this message.

    Signed-off-by: Punit Agrawal
    Acked-by: Alexey Klimov
    Signed-off-by: Rafael J. Wysocki

    Punit Agrawal
     

26 Jul, 2017

1 commit

  • When PCCT is not available, kernel crashes as below when requests PCC
    channel 0. This patch fixes this issue.

    [ 0.920454] PCCT header not found.
    ...
    [ 8.031309] Unable to handle kernel NULL pointer dereference at virtual address 00000010
    [ 8.031310] [0000000000000010] user address but active_mm is swapper
    [ 8.031312] Internal error: Oops: 96000004 [#1] PREEMPT SMP
    [ 8.031313] Modules linked in:
    [ 8.031316] CPU: 31 PID: 1 Comm: swapper/0 Tainted: G W 4.13.0-rc1 #18
    [ 8.031317] Hardware name: AppliedMicro(R) 07/20/2017
    [ 8.031318] task: ffff809ef3b08000 task.stack: ffff809ef3b10000
    [ 8.031322] PC is at pcc_mbox_request_channel+0x8c/0x160
    [ 8.031325] LR is at xgene_slimpro_i2c_probe+0x1c0/0x378
    [ 8.031326] pc : [] lr : [] pstate: 00000045
    [ 8.031327] sp : ffff809ef3b13bd0
    [ 8.031327] x29: ffff809ef3b13bd0 x28: ffff000008ed90a0
    [ 8.031329] x27: ffff000009091000 x26: ffff000008e50470
    [ 8.031330] x25: ffff000008ed9100 x24: ffff809eefd9ac30
    [ 8.031332] x23: 0000000000000000 x22: ffff0000090e3e10
    [ 8.031333] x21: ffff0000090e3000 x20: 0000000000000000
    [ 8.031335] x19: 0000000000000000 x18: 0000000000087ffc
    [ 8.031336] x17: 2fe48d76a78303f0 x16: 0000000000087ffc
    [ 8.031337] x15: ffff000000000000 x14: 0000000000000000
    [ 8.031339] x13: 0000000000000000 x12: 0000000000000018
    [ 8.031340] x11: 0000000000000018 x10: 0101010101010101
    [ 8.031342] x9 : 0000000000000000 x8 : 7f7f7f7f7f7f7f7f
    [ 8.031343] x7 : fefefefeff6b646d x6 : 0000008080808080
    [ 8.031345] x5 : 0000000000000000 x4 : 0000000000000001
    [ 8.031346] x3 : 0000000000000000 x2 : ffff000008819b64
    [ 8.031348] x1 : 0000000000000000 x0 : 0000000000000000
    ...
    [ 8.031393] Call trace:
    [ 8.031394] Exception stack(0xffff809ef3b13a00 to 0xffff809ef3b13b30)
    [ 8.031395] 3a00: 0000000000000000 0001000000000000 ffff809ef3b13bd0 ffff000008899450
    [ 8.031397] 3a20: ffff809f7e1f9a10 ffff000008f60be0 0000000000000001 ffff809ef3b13b7c
    [ 8.031398] 3a40: ffff809f7e1f9a10 0000000000000000 ffff000009091000 0000000000000003
    [ 8.031399] 3a60: ffff000009091000 0000000000000003 ffff809ef3b13a80 ffff0000084e0794
    [ 8.031400] 3a80: ffff809ef3b13a90 ffff00000850bb64 ffff809ef3b13ad0 ffff00000850bf34
    [ 8.031402] 3aa0: 0000000000000000 0000000000000000 ffff000008819b64 0000000000000000
    [ 8.031403] 3ac0: 0000000000000001 0000000000000000 0000008080808080 fefefefeff6b646d
    [ 8.031404] 3ae0: 7f7f7f7f7f7f7f7f 0000000000000000 0101010101010101 0000000000000018
    [ 8.031405] 3b00: 0000000000000018 0000000000000000 0000000000000000 ffff000000000000
    [ 8.031406] 3b20: 0000000000087ffc 2fe48d76a78303f0
    [ 8.031409] [] pcc_mbox_request_channel+0x8c/0x160
    [ 8.031410] [] xgene_slimpro_i2c_probe+0x1c0/0x378
    [ 8.031413] [] platform_drv_probe+0x50/0xbc
    [ 8.031414] [] driver_probe_device+0x21c/0x2d0
    [ 8.031416] [] __driver_attach+0xac/0xb0
    [ 8.031417] [] bus_for_each_dev+0x58/0x98
    [ 8.031418] [] driver_attach+0x20/0x28
    [ 8.031419] [] bus_add_driver+0x1c8/0x22c
    [ 8.031421] [] driver_register+0x60/0xf4
    [ 8.031422] [] __platform_driver_register+0x4c/0x54
    [ 8.031425] [] xgene_slimpro_i2c_driver_init+0x18/0x20
    [ 8.031426] [] do_one_initcall+0x38/0x124
    [ 8.031429] [] kernel_init_freeable+0x190/0x22c
    [ 8.031431] [] kernel_init+0x10/0xfc
    [ 8.031432] [] ret_from_fork+0x10/0x50
    [ 8.031434] Code: cb030e63 8b030013 b140067f 54fffda8 (f9400a61)
    [ 8.031448] ---[ end trace 14eb48a4e1e1f9fb ]---

    Signed-off-by: Hoan Tran
    Acked-by: Prashanth Prakash
    Signed-off-by: Rafael J. Wysocki

    Hoan Tran
     

12 Jun, 2017

1 commit

  • ACPICA commit e7b817e3c405a4fb9ae9ee7ae4992b8c1f20d284

    Extended PCC Subspaces (types 3 and 4)

    Link: https://github.com/acpica/acpica/commit/e7b817e3
    Signed-off-by: David E. Box
    Signed-off-by: Bob Moore
    Signed-off-by: Lv Zheng
    Signed-off-by: Rafael J. Wysocki

    David E. Box
     

22 Dec, 2016

1 commit

  • * acpica:
    ACPI / osl: Remove deprecated acpi_get_table_with_size()/early_acpi_os_unmap_memory()
    ACPI / osl: Remove acpi_get_table_with_size()/early_acpi_os_unmap_memory() users
    ACPICA: Tables: Allow FADT to be customized with virtual address
    ACPICA: Tables: Back port acpi_get_table_with_size() and early_acpi_os_unmap_memory() from Linux kernel

    * acpi-scan:
    ACPI: do not warn if _BQC does not exist

    Rafael J. Wysocki
     

21 Dec, 2016

1 commit

  • This patch removes the users of the deprectated APIs:
    acpi_get_table_with_size()
    early_acpi_os_unmap_memory()
    The following APIs should be used instead of:
    acpi_get_table()
    acpi_put_table()

    The deprecated APIs are invented to be a replacement of acpi_get_table()
    during the early stage so that the early mapped pointer will not be stored
    in ACPICA core and thus the late stage acpi_get_table() won't return a
    wrong pointer. The mapping size is returned just because it is required by
    early_acpi_os_unmap_memory() to unmap the pointer during early stage.

    But as the mapping size equals to the acpi_table_header.length
    (see acpi_tb_init_table_descriptor() and acpi_tb_validate_table()), when
    such a convenient result is returned, driver code will start to use it
    instead of accessing acpi_table_header to obtain the length.

    Thus this patch cleans up the drivers by replacing returned table size with
    acpi_table_header.length, and should be a no-op.

    Reported-by: Dan Williams
    Signed-off-by: Lv Zheng
    Signed-off-by: Rafael J. Wysocki

    Lv Zheng
     

15 Nov, 2016

1 commit

  • This patch fixes the lockdep warning below

    DEBUG_LOCKS_WARN_ON(irqs_disabled_flags(flags))
    ------------[ cut here ]------------
    WARNING: CPU: 1 PID: 1 at linux-next/kernel/locking/lockdep.c:2876 lockdep_trace_alloc+0xe0/0xf0
    Modules linked in:

    CPU: 1 PID: 1 Comm: swapper/0 Not tainted 4.8.0-11756-g86c5152 #46
    ...
    Call trace:
    Exception stack(0xffff8007da837890 to 0xffff8007da8379c0)
    7880: ffff8007da834000 0001000000000000
    78a0: ffff8007da837a70 ffff0000081111a0 00000000600000c5 000000000000003d
    78c0: 9374bc6a7f3c7832 0000000000381878 ffff000009db7ab8 000000000000002f
    78e0: ffff00000811aabc ffff000008be2548 ffff8007da837990 ffff00000811adf8
    7900: ffff8007da834000 00000000024080c0 00000000000000c0 ffff000009021000
    7920: 0000000000000000 0000000000000000 ffff000008c8f7c8 ffff8007da579810
    7940: 000000000000002f ffff8007da858000 0000000000000000 0000000000000001
    7960: 0000000000000001 0000000000000000 ffff00000811a468 0000000000000002
    7980: 656c62617369645f 0000000000038187 00000000000000ee ffff8007da837850
    79a0: ffff000009db50c0 ffff000009db569d 0000000000000006 ffff000089db568f
    [] lockdep_trace_alloc+0xe0/0xf0
    [] __kmalloc_track_caller+0x50/0x250
    [] devres_alloc_node+0x28/0x60
    [] devm_request_threaded_irq+0x50/0xe0
    [] pcc_mbox_request_channel+0x110/0x170
    [] acpi_cppc_processor_probe+0x264/0x414
    [] __acpi_processor_start+0x28/0xa0
    [] acpi_processor_start+0x44/0x54
    [] driver_probe_device+0x1fc/0x2b0
    [] __driver_attach+0xb4/0xc0
    [] bus_for_each_dev+0x5c/0xa0
    [] driver_attach+0x20/0x30
    [] bus_add_driver+0x110/0x230
    [] driver_register+0x60/0x100
    [] acpi_processor_driver_init+0x2c/0xb0
    [] do_one_initcall+0x38/0x130
    [] kernel_init_freeable+0x210/0x2b4
    [] kernel_init+0x10/0x110
    [] ret_from_fork+0x10/0x50

    It's because the spinlock inside pcc_mbox_request_channel() is
    kept too long. This patch releases spinlock before request_irq()
    and free_irq() to fix this issue as spinlock is only needed to
    protect the channel data.

    Signed-off-by: Hoan Tran
    Reviewed-by: Prashanth Prakash
    Signed-off-by: Rafael J. Wysocki

    Hoan Tran
     

31 Aug, 2016

1 commit

  • ACPI 6.1 has a PCC HW-Reduced Communication Subspace type 2 intended for
    use on HW-Reduce ACPI Platform, which requires read-modify-write sequence
    to acknowledge doorbell interrupt. This patch provides the implementation
    for the Communication Subspace Type 2.

    Signed-off-by: Hoan Tran
    Reviewed-by: Prashanth Prakash
    Signed-off-by: Rafael J. Wysocki

    hotran
     

09 Apr, 2016

1 commit

  • * pm-cpufreq:
    cpufreq: dt: Drop stale comment
    cpufreq: intel_pstate: Documenation for structures
    cpufreq: intel_pstate: fix inconsistency in setting policy limits
    intel_pstate: Avoid extra invocation of intel_pstate_sample()
    intel_pstate: Do not set utilization update hook too early

    * pm-cpuidle:
    intel_idle: Add KBL support
    intel_idle: Add SKX support
    intel_idle: Clean up all registered devices on exit.
    intel_idle: Propagate hot plug errors.
    intel_idle: Don't overreact to a cpuidle registration failure.
    intel_idle: Setup the timer broadcast only on successful driver load.
    intel_idle: Avoid a double free of the per-CPU data.
    intel_idle: Fix dangling registration on error path.
    intel_idle: Fix deallocation order on the driver exit path.
    intel_idle: Remove redundant initialization calls.
    intel_idle: Fix a helper function's return value.
    intel_idle: remove useless return from void function.

    * acpi-cppc:
    mailbox: pcc: Don't access an unmapped memory address space

    Rafael J. Wysocki
     

07 Apr, 2016

1 commit

  • The acpi_pcc_probe() may end up accessing memory outside of the PCCT
    table space causing the kernel panic(). Increment the pcct_entry
    pointer after parsing 'HW-reduced Communications Subspace' to fix
    the problem. This change also enables the parsing of subtable at
    index 0.

    Signed-off-by: Shanker Donthineni
    Acked-by: Ashwin Chaugule
    Signed-off-by: Rafael J. Wysocki

    Shanker Donthineni
     

14 Mar, 2016

1 commit

  • * acpi-processor:
    ACPI / sleep: move acpi_processor_sleep to sleep.c
    ACPI / processor : add support for ACPI0010 processor container
    ACPI / processor_idle: replace PREFIX with pr_fmt

    * acpi-cppc:
    ACPI / CPPC: use MRTT/MPAR to decide if/when a req can be sent
    ACPI / CPPC: replace writeX/readX to PCC with relaxed version
    mailbox: pcc: optimized pcc_send_data
    ACPI / CPPC: optimized cpc_read and cpc_write
    ACPI / CPPC: Optimize PCC Read Write operations

    Rafael J. Wysocki
     

10 Mar, 2016

1 commit

  • pcc_send_data() can be invoked during the execution of performance
    critical code as in cppc_cpufreq driver. With acpi_* APIs, the
    doorbell register accessed in pcc_send_data() if present in system
    memory will be searched (in cached virt to phys addr mapping),
    mapped, read/written and then unmapped. These operations take
    significant amount of time.

    This patch maps the performance critical doorbell register
    during init and then reads/writes to it directly using the
    mapped virtual address. This patch + similar changes to CPPC
    acpi driver reduce the time per freq. transition from around
    200us to about 20us for the CPPC cpufreq driver

    Signed-off-by: Prashanth Prakash
    Acked-by: Ashwin Chaugule
    Signed-off-by: Rafael J. Wysocki

    Prakash, Prashanth
     

02 Feb, 2016

1 commit

  • This patch fixes the calculation of pcc_chan for non-zero id.
    After the compiler ignores the (unsigned long) cast the
    pcc_mbox_channels pointer is type-cast and then the type-cast
    offset is added which results in address outside of the range
    leading to the kernel crashing.

    We might add braces and make it:

    pcc_chan = (struct mbox_chan *)
    ((unsigned long) pcc_mbox_channels +
    (id * sizeof(*pcc_chan)));

    but let's go with array approach here and use id as index.

    Tested on Juno board.

    Signed-off-by: Alexey Klimov
    Acked-by: Sudeep Holla
    Acked-by: Ashwin Chaugule
    Signed-off-by: Jassi Brar

    Alexey Klimov
     

16 Oct, 2015

1 commit


25 Aug, 2015

1 commit

  • This change initializes the PCC Mailbox earlier than
    the ACPI processor driver. This enables drivers introduced
    in follow up patches (e.g. CPPC) to be probed via the ACPI
    processor driver interface. The CPPC probe requires the PCC
    channel to be initialized for it to query each CPUs performance
    capabilities.

    Signed-off-by: Ashwin Chaugule
    Reviewed-by: Al Stone
    Signed-off-by: Rafael J. Wysocki

    Ashwin Chaugule
     

12 May, 2015

1 commit

  • The mailbox controller's channel ops ought to be read-only. Update
    all the mailbox drivers to make their mbox_chan_ops const as well.

    Signed-off-by: Andrew Bresticker
    Cc: Ashwin Chaugule
    Cc: Ley Foon Tan
    Acked-by: Suman Anna
    Signed-off-by: Jassi Brar

    Andrew Bresticker
     

04 Mar, 2015

1 commit

  • Previously the PCC driver depended on the client
    side to map the communication space base address. This region
    was was then used in the PCC driver and the client side.
    The client side used this region to read and write its data
    and the PCC driver used it to only write the PCC command.
    Removing this split simplifies the PCC driver a lot. This patch
    moves all communication region read/writes to the client side.
    The PCC clients can now drive the PCC mailbox controller via the
    mbox_client_txdone() method.

    Signed-off-by: Ashwin Chaugule

    Ashwin Chaugule
     

12 Feb, 2015

1 commit


06 Feb, 2015

1 commit


05 Feb, 2015

1 commit


27 Nov, 2014

1 commit

  • ACPI 5.0+ spec defines a generic mode of communication
    between the OS and a platform such as the BMC. This medium
    (PCC) is typically used by CPPC (ACPI CPU Performance management),
    RAS (ACPI reliability protocol) and MPST (ACPI Memory power
    states).

    This patch adds PCC support as a Mailbox Controller. As of
    ACPI v5.1 there is no provision for clients to lookup mailbox
    controllers in a way that Linux expects. e.g. in DT the clients
    can list the mailboxes they can associate with in the DT binding
    and then provide a unique index to lookup a channel within a mailbox.
    Since the ACPI spec doesn't have anything similar, we introduce a
    mailbox controller specific API so that when the client calls it,
    we know to lookup in the context of a specific controller. This
    also helps in keeping a consistent interface across DT and ACPI
    for such drivers.

    This patch implements basic PCC support using the ACPI v5.1
    structures. IRQ mode support will be provided as follow up patches.

    Signed-off-by: Ashwin Chaugule
    Reviewed-by: Mark Brown
    Reviewed-by: Arnd Bergmann
    Signed-off-by: Jassi Brar

    Ashwin Chaugule