lkml.org 
[lkml]   [2018]   [Dec]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 3.16 057/328] video: udlfb: Fix unaligned access
    3.16.62-rc1 review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Ladislav Michl <ladis@linux-mips.org>

    commit 115e77597efcc94cb1f6cbb7df5cf7ce8feb8632 upstream.

    Driver generates lots of alignment trap exceptions on ARM.
    Fix that by replacing typecasting of odd addresses with
    byte shifting and remove uneccessary typecasting.

    Signed-off-by: Ladislav Michl <ladis@linux-mips.org>
    Cc: Bernie Thompson <bernie@plugable.com>
    Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
    [bwh: Backported to 3.16: adjust context]
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    ---
    drivers/video/fbdev/udlfb.c | 23 ++++++++++++-----------
    1 file changed, 12 insertions(+), 11 deletions(-)

    --- a/drivers/video/fbdev/udlfb.c
    +++ b/drivers/video/fbdev/udlfb.c
    @@ -443,9 +443,9 @@ static void dlfb_compress_hline(

    *cmd++ = 0xAF;
    *cmd++ = 0x6B;
    - *cmd++ = (uint8_t) ((dev_addr >> 16) & 0xFF);
    - *cmd++ = (uint8_t) ((dev_addr >> 8) & 0xFF);
    - *cmd++ = (uint8_t) ((dev_addr) & 0xFF);
    + *cmd++ = dev_addr >> 16;
    + *cmd++ = dev_addr >> 8;
    + *cmd++ = dev_addr;

    cmd_pixels_count_byte = cmd++; /* we'll know this later */
    cmd_pixel_start = pixel;
    @@ -462,8 +462,8 @@ static void dlfb_compress_hline(
    while (pixel < cmd_pixel_end) {
    const uint16_t * const repeating_pixel = pixel;

    - *(uint16_t *)cmd = cpu_to_be16p(pixel);
    - cmd += 2;
    + *cmd++ = *pixel >> 8;
    + *cmd++ = *pixel;
    pixel++;

    if (unlikely((pixel < cmd_pixel_end) &&
    @@ -1532,15 +1532,16 @@ static int dlfb_parse_vendor_descriptor(
    u8 length;
    u16 key;

    - key = le16_to_cpu(*((u16 *) desc));
    - desc += sizeof(u16);
    - length = *desc;
    - desc++;
    + key = *desc++;
    + key |= (u16)*desc++ << 8;
    + length = *desc++;

    switch (key) {
    case 0x0200: { /* max_area */
    - u32 max_area;
    - max_area = le32_to_cpu(*((u32 *)desc));
    + u32 max_area = *desc++;
    + max_area |= (u32)*desc++ << 8;
    + max_area |= (u32)*desc++ << 16;
    + max_area |= (u32)*desc++ << 24;
    pr_warn("DL chip limited to %d pixel modes\n",
    max_area);
    dev->sku_pixel_limit = max_area;
    \
     
     \ /
      Last update: 2018-12-09 23:07    [W:2.267 / U:0.636 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site