Loading drivers/gpu/drm/msm/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -71,6 +71,7 @@ msm-y := \ disp/dpu1/dpu_io_util.o \ disp/dpu1/dpu_irq.o \ disp/dpu1/dpu_kms.o \ disp/dpu1/dpu_kms_utils.o \ disp/dpu1/dpu_mdss.o \ disp/dpu1/dpu_plane.o \ disp/dpu1/dpu_power_handle.o \ Loading drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h +112 −0 Original line number Diff line number Diff line Loading @@ -270,6 +270,118 @@ void *dpu_debugfs_get_root(struct dpu_kms *dpu_kms); */ #define DPU_KMS_INFO_MAX_SIZE 4096 /** * struct dpu_kms_info - connector information structure container * @data: Array of information character data * @len: Current length of information data * @staged_len: Temporary data buffer length, commit to * len using dpu_kms_info_stop * @start: Whether or not a partial data entry was just started */ struct dpu_kms_info { char data[DPU_KMS_INFO_MAX_SIZE]; uint32_t len; uint32_t staged_len; bool start; }; /** * DPU_KMS_INFO_DATA - Macro for accessing dpu_kms_info data bytes * @S: Pointer to dpu_kms_info structure * Returns: Pointer to byte data */ #define DPU_KMS_INFO_DATA(S) ((S) ? ((struct dpu_kms_info *)(S))->data : 0) /** * DPU_KMS_INFO_DATALEN - Macro for accessing dpu_kms_info data length * it adds an extra character length to count null. * @S: Pointer to dpu_kms_info structure * Returns: Size of available byte data */ #define DPU_KMS_INFO_DATALEN(S) ((S) ? ((struct dpu_kms_info *)(S))->len + 1 \ : 0) /** * dpu_kms_info_reset - reset dpu_kms_info structure * @info: Pointer to dpu_kms_info structure */ void dpu_kms_info_reset(struct dpu_kms_info *info); /** * dpu_kms_info_add_keyint - add integer value to 'dpu_kms_info' * @info: Pointer to dpu_kms_info structure * @key: Pointer to key string * @value: Signed 64-bit integer value */ void dpu_kms_info_add_keyint(struct dpu_kms_info *info, const char *key, int64_t value); /** * dpu_kms_info_add_keystr - add string value to 'dpu_kms_info' * @info: Pointer to dpu_kms_info structure * @key: Pointer to key string * @value: Pointer to string value */ void dpu_kms_info_add_keystr(struct dpu_kms_info *info, const char *key, const char *value); /** * dpu_kms_info_start - begin adding key to 'dpu_kms_info' * Usage: * dpu_kms_info_start(key) * dpu_kms_info_append(val_1) * ... * dpu_kms_info_append(val_n) * dpu_kms_info_stop * @info: Pointer to dpu_kms_info structure * @key: Pointer to key string */ void dpu_kms_info_start(struct dpu_kms_info *info, const char *key); /** * dpu_kms_info_append - append value string to 'dpu_kms_info' * Usage: * dpu_kms_info_start(key) * dpu_kms_info_append(val_1) * ... * dpu_kms_info_append(val_n) * dpu_kms_info_stop * @info: Pointer to dpu_kms_info structure * @str: Pointer to partial value string */ void dpu_kms_info_append(struct dpu_kms_info *info, const char *str); /** * dpu_kms_info_append_format - append format code string to 'dpu_kms_info' * Usage: * dpu_kms_info_start(key) * dpu_kms_info_append_format(fourcc, modifier) * ... * dpu_kms_info_stop * @info: Pointer to dpu_kms_info structure * @pixel_format: FOURCC format code * @modifier: 64-bit drm format modifier */ void dpu_kms_info_append_format(struct dpu_kms_info *info, uint32_t pixel_format, uint64_t modifier); /** * dpu_kms_info_stop - finish adding key to 'dpu_kms_info' * Usage: * dpu_kms_info_start(key) * dpu_kms_info_append(val_1) * ... * dpu_kms_info_append(val_n) * dpu_kms_info_stop * @info: Pointer to dpu_kms_info structure */ void dpu_kms_info_stop(struct dpu_kms_info *info); /** * Vblank enable/disable functions */ Loading drivers/gpu/drm/msm/disp/dpu1/dpu_kms_utils.c 0 → 100644 +153 −0 Original line number Diff line number Diff line /* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. * * 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. */ #define pr_fmt(fmt) "dpu-kms_utils:[%s] " fmt, __func__ #include "dpu_kms.h" void dpu_kms_info_reset(struct dpu_kms_info *info) { if (info) { info->len = 0; info->staged_len = 0; } } void dpu_kms_info_add_keyint(struct dpu_kms_info *info, const char *key, int64_t value) { uint32_t len; if (info && key) { len = snprintf(info->data + info->len, DPU_KMS_INFO_MAX_SIZE - info->len, "%s=%lld\n", key, value); /* check if snprintf truncated the string */ if ((info->len + len) < DPU_KMS_INFO_MAX_SIZE) info->len += len; } } void dpu_kms_info_add_keystr(struct dpu_kms_info *info, const char *key, const char *value) { uint32_t len; if (info && key && value) { len = snprintf(info->data + info->len, DPU_KMS_INFO_MAX_SIZE - info->len, "%s=%s\n", key, value); /* check if snprintf truncated the string */ if ((info->len + len) < DPU_KMS_INFO_MAX_SIZE) info->len += len; } } void dpu_kms_info_start(struct dpu_kms_info *info, const char *key) { uint32_t len; if (info && key) { len = snprintf(info->data + info->len, DPU_KMS_INFO_MAX_SIZE - info->len, "%s=", key); info->start = true; /* check if snprintf truncated the string */ if ((info->len + len) < DPU_KMS_INFO_MAX_SIZE) info->staged_len = info->len + len; } } void dpu_kms_info_append(struct dpu_kms_info *info, const char *str) { uint32_t len; if (info) { len = snprintf(info->data + info->staged_len, DPU_KMS_INFO_MAX_SIZE - info->staged_len, "%s", str); /* check if snprintf truncated the string */ if ((info->staged_len + len) < DPU_KMS_INFO_MAX_SIZE) { info->staged_len += len; info->start = false; } } } void dpu_kms_info_append_format(struct dpu_kms_info *info, uint32_t pixel_format, uint64_t modifier) { uint32_t len; if (!info) return; if (modifier) { len = snprintf(info->data + info->staged_len, DPU_KMS_INFO_MAX_SIZE - info->staged_len, info->start ? "%c%c%c%c/%llX/%llX" : " %c%c%c%c/%llX/%llX", (pixel_format >> 0) & 0xFF, (pixel_format >> 8) & 0xFF, (pixel_format >> 16) & 0xFF, (pixel_format >> 24) & 0xFF, (modifier >> 56) & 0xFF, modifier & ((1ULL << 56) - 1)); } else { len = snprintf(info->data + info->staged_len, DPU_KMS_INFO_MAX_SIZE - info->staged_len, info->start ? "%c%c%c%c" : " %c%c%c%c", (pixel_format >> 0) & 0xFF, (pixel_format >> 8) & 0xFF, (pixel_format >> 16) & 0xFF, (pixel_format >> 24) & 0xFF); } /* check if snprintf truncated the string */ if ((info->staged_len + len) < DPU_KMS_INFO_MAX_SIZE) { info->staged_len += len; info->start = false; } } void dpu_kms_info_stop(struct dpu_kms_info *info) { uint32_t len; if (info) { /* insert final delimiter */ len = snprintf(info->data + info->staged_len, DPU_KMS_INFO_MAX_SIZE - info->staged_len, "\n"); /* check if snprintf truncated the string */ if ((info->staged_len + len) < DPU_KMS_INFO_MAX_SIZE) info->len = info->staged_len + len; } } Loading
drivers/gpu/drm/msm/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -71,6 +71,7 @@ msm-y := \ disp/dpu1/dpu_io_util.o \ disp/dpu1/dpu_irq.o \ disp/dpu1/dpu_kms.o \ disp/dpu1/dpu_kms_utils.o \ disp/dpu1/dpu_mdss.o \ disp/dpu1/dpu_plane.o \ disp/dpu1/dpu_power_handle.o \ Loading
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h +112 −0 Original line number Diff line number Diff line Loading @@ -270,6 +270,118 @@ void *dpu_debugfs_get_root(struct dpu_kms *dpu_kms); */ #define DPU_KMS_INFO_MAX_SIZE 4096 /** * struct dpu_kms_info - connector information structure container * @data: Array of information character data * @len: Current length of information data * @staged_len: Temporary data buffer length, commit to * len using dpu_kms_info_stop * @start: Whether or not a partial data entry was just started */ struct dpu_kms_info { char data[DPU_KMS_INFO_MAX_SIZE]; uint32_t len; uint32_t staged_len; bool start; }; /** * DPU_KMS_INFO_DATA - Macro for accessing dpu_kms_info data bytes * @S: Pointer to dpu_kms_info structure * Returns: Pointer to byte data */ #define DPU_KMS_INFO_DATA(S) ((S) ? ((struct dpu_kms_info *)(S))->data : 0) /** * DPU_KMS_INFO_DATALEN - Macro for accessing dpu_kms_info data length * it adds an extra character length to count null. * @S: Pointer to dpu_kms_info structure * Returns: Size of available byte data */ #define DPU_KMS_INFO_DATALEN(S) ((S) ? ((struct dpu_kms_info *)(S))->len + 1 \ : 0) /** * dpu_kms_info_reset - reset dpu_kms_info structure * @info: Pointer to dpu_kms_info structure */ void dpu_kms_info_reset(struct dpu_kms_info *info); /** * dpu_kms_info_add_keyint - add integer value to 'dpu_kms_info' * @info: Pointer to dpu_kms_info structure * @key: Pointer to key string * @value: Signed 64-bit integer value */ void dpu_kms_info_add_keyint(struct dpu_kms_info *info, const char *key, int64_t value); /** * dpu_kms_info_add_keystr - add string value to 'dpu_kms_info' * @info: Pointer to dpu_kms_info structure * @key: Pointer to key string * @value: Pointer to string value */ void dpu_kms_info_add_keystr(struct dpu_kms_info *info, const char *key, const char *value); /** * dpu_kms_info_start - begin adding key to 'dpu_kms_info' * Usage: * dpu_kms_info_start(key) * dpu_kms_info_append(val_1) * ... * dpu_kms_info_append(val_n) * dpu_kms_info_stop * @info: Pointer to dpu_kms_info structure * @key: Pointer to key string */ void dpu_kms_info_start(struct dpu_kms_info *info, const char *key); /** * dpu_kms_info_append - append value string to 'dpu_kms_info' * Usage: * dpu_kms_info_start(key) * dpu_kms_info_append(val_1) * ... * dpu_kms_info_append(val_n) * dpu_kms_info_stop * @info: Pointer to dpu_kms_info structure * @str: Pointer to partial value string */ void dpu_kms_info_append(struct dpu_kms_info *info, const char *str); /** * dpu_kms_info_append_format - append format code string to 'dpu_kms_info' * Usage: * dpu_kms_info_start(key) * dpu_kms_info_append_format(fourcc, modifier) * ... * dpu_kms_info_stop * @info: Pointer to dpu_kms_info structure * @pixel_format: FOURCC format code * @modifier: 64-bit drm format modifier */ void dpu_kms_info_append_format(struct dpu_kms_info *info, uint32_t pixel_format, uint64_t modifier); /** * dpu_kms_info_stop - finish adding key to 'dpu_kms_info' * Usage: * dpu_kms_info_start(key) * dpu_kms_info_append(val_1) * ... * dpu_kms_info_append(val_n) * dpu_kms_info_stop * @info: Pointer to dpu_kms_info structure */ void dpu_kms_info_stop(struct dpu_kms_info *info); /** * Vblank enable/disable functions */ Loading
drivers/gpu/drm/msm/disp/dpu1/dpu_kms_utils.c 0 → 100644 +153 −0 Original line number Diff line number Diff line /* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. * * 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. */ #define pr_fmt(fmt) "dpu-kms_utils:[%s] " fmt, __func__ #include "dpu_kms.h" void dpu_kms_info_reset(struct dpu_kms_info *info) { if (info) { info->len = 0; info->staged_len = 0; } } void dpu_kms_info_add_keyint(struct dpu_kms_info *info, const char *key, int64_t value) { uint32_t len; if (info && key) { len = snprintf(info->data + info->len, DPU_KMS_INFO_MAX_SIZE - info->len, "%s=%lld\n", key, value); /* check if snprintf truncated the string */ if ((info->len + len) < DPU_KMS_INFO_MAX_SIZE) info->len += len; } } void dpu_kms_info_add_keystr(struct dpu_kms_info *info, const char *key, const char *value) { uint32_t len; if (info && key && value) { len = snprintf(info->data + info->len, DPU_KMS_INFO_MAX_SIZE - info->len, "%s=%s\n", key, value); /* check if snprintf truncated the string */ if ((info->len + len) < DPU_KMS_INFO_MAX_SIZE) info->len += len; } } void dpu_kms_info_start(struct dpu_kms_info *info, const char *key) { uint32_t len; if (info && key) { len = snprintf(info->data + info->len, DPU_KMS_INFO_MAX_SIZE - info->len, "%s=", key); info->start = true; /* check if snprintf truncated the string */ if ((info->len + len) < DPU_KMS_INFO_MAX_SIZE) info->staged_len = info->len + len; } } void dpu_kms_info_append(struct dpu_kms_info *info, const char *str) { uint32_t len; if (info) { len = snprintf(info->data + info->staged_len, DPU_KMS_INFO_MAX_SIZE - info->staged_len, "%s", str); /* check if snprintf truncated the string */ if ((info->staged_len + len) < DPU_KMS_INFO_MAX_SIZE) { info->staged_len += len; info->start = false; } } } void dpu_kms_info_append_format(struct dpu_kms_info *info, uint32_t pixel_format, uint64_t modifier) { uint32_t len; if (!info) return; if (modifier) { len = snprintf(info->data + info->staged_len, DPU_KMS_INFO_MAX_SIZE - info->staged_len, info->start ? "%c%c%c%c/%llX/%llX" : " %c%c%c%c/%llX/%llX", (pixel_format >> 0) & 0xFF, (pixel_format >> 8) & 0xFF, (pixel_format >> 16) & 0xFF, (pixel_format >> 24) & 0xFF, (modifier >> 56) & 0xFF, modifier & ((1ULL << 56) - 1)); } else { len = snprintf(info->data + info->staged_len, DPU_KMS_INFO_MAX_SIZE - info->staged_len, info->start ? "%c%c%c%c" : " %c%c%c%c", (pixel_format >> 0) & 0xFF, (pixel_format >> 8) & 0xFF, (pixel_format >> 16) & 0xFF, (pixel_format >> 24) & 0xFF); } /* check if snprintf truncated the string */ if ((info->staged_len + len) < DPU_KMS_INFO_MAX_SIZE) { info->staged_len += len; info->start = false; } } void dpu_kms_info_stop(struct dpu_kms_info *info) { uint32_t len; if (info) { /* insert final delimiter */ len = snprintf(info->data + info->staged_len, DPU_KMS_INFO_MAX_SIZE - info->staged_len, "\n"); /* check if snprintf truncated the string */ if ((info->staged_len + len) < DPU_KMS_INFO_MAX_SIZE) info->len = info->staged_len + len; } }