Skip to contentSkip to conversation

drm/msm/dsi-staging: remove support for partial update

PATCH Superseded Jeykumar Sankaran 2 participants 4 messages Feb 28, 2018 – Mar 1, 2018 2 messages not in the archive

Subsystems (3)

v2 of 3 Superseded Latest is v3 →

lore
Share & tools
lore
#0 lore raw

PATCH v2 1/2 drm/msm/dsi-staging: remove support for partial update

Remove support partial update and related changes from dsi-staging since the DPU dependencies are getting cleaned up.

Change-Id I02462f520cdf99c8445b18e60212ca46155f9710
---
 drivers/gpu/drm/msm/dsi-staging/dsi_display.c | 104 +-------------------------
 drivers/gpu/drm/msm/dsi-staging/dsi_display.h |   5 +-
 drivers/gpu/drm/msm/dsi-staging/dsi_drm.c     |  26 +------
 drivers/gpu/drm/msm/dsi-staging/dsi_drm.h     |   4 +-
 drivers/gpu/drm/msm/dsi-staging/dsi_panel.c   |  85 ---------------------
 drivers/gpu/drm/msm/dsi-staging/dsi_panel.h   |   2 -
 6 files changed, 7 insertions(+), 219 deletions(-)
drivers/gpu/drm/msm/dsi-staging/dsi_display.c +1 -103
index 72055dc..31b7d7e 100644
@@ -3414,9 +3414,6 @@ int dsi_display_get_info(struct msm_display_info *info, void *disp)
 		break;
 	}
 
-	memcpy(&info->roi_caps, &display->panel->roi_caps,
-			sizeof(info->roi_caps));
-
 error:
 	mutex_unlock(&display->display_lock);
 	return rc;
@@ -3941,104 +3938,7 @@ int dsi_display_prepare(struct dsi_display *display)
 	return rc;
 }
 
-static int dsi_display_calc_ctrl_roi(const struct dsi_display *display,
-		const struct dsi_display_ctrl *ctrl,
-		const struct msm_roi_list *req_rois,
-		struct dsi_rect *out_roi)
-{
-	const struct dsi_rect *bounds = &ctrl->ctrl->mode_bounds;
-	struct dsi_rect req_roi = { 0 };
-	int rc = 0;
-
-	if (req_rois->num_rects > display->panel->roi_caps.num_roi) {
-		pr_err("request for %d rois greater than max %d\n",
-				req_rois->num_rects,
-				display->panel->roi_caps.num_roi);
-		rc = -EINVAL;
-		goto exit;
-	}
-
-	/**
-	 * if no rois, user wants to reset back to full resolution
-	 * note: h_active is already divided by ctrl_count
-	 */
-	if (!req_rois->num_rects) {
-		*out_roi = *bounds;
-		goto exit;
-	}
-
-	/* intersect with the bounds */
-	req_roi.x = req_rois->roi[0].x1;
-	req_roi.y = req_rois->roi[0].y1;
-	req_roi.w = req_rois->roi[0].x2 - req_rois->roi[0].x1;
-	req_roi.h = req_rois->roi[0].y2 - req_rois->roi[0].y1;
-	dsi_rect_intersect(&req_roi, bounds, out_roi);
-
-exit:
-	/* adjust the ctrl origin to be top left within the ctrl */
-	out_roi->x = out_roi->x - bounds->x;
-
-	pr_debug("ctrl%d:%d: req (%d,%d,%d,%d) bnd (%d,%d,%d,%d) out (%d,%d,%d,%d)\n",
-			ctrl->dsi_ctrl_idx, ctrl->ctrl->cell_index,
-			req_roi.x, req_roi.y, req_roi.w, req_roi.h,
-			bounds->x, bounds->y, bounds->w, bounds->h,
-			out_roi->x, out_roi->y, out_roi->w, out_roi->h);
-
-	return rc;
-}
-
-static int dsi_display_set_roi(struct dsi_display *display,
-		struct msm_roi_list *rois)
-{
-	int rc = 0;
-	int i;
-
-	if (!display || !rois || !display->panel)
-		return -EINVAL;
-
-	if (!display->panel->roi_caps.enabled)
-		return 0;
-
-	for (i = 0; i < display->ctrl_count; i++) {
-		struct dsi_display_ctrl *ctrl = &display->ctrl[i];
-		struct dsi_rect ctrl_roi;
-		bool changed = false;
-
-		rc = dsi_display_calc_ctrl_roi(display, ctrl, rois, &ctrl_roi);
-		if (rc) {
-			pr_err("dsi_display_calc_ctrl_roi failed rc %d\n", rc);
-			return rc;
-		}
-
-		rc = dsi_ctrl_set_roi(ctrl->ctrl, &ctrl_roi, &changed);
-		if (rc) {
-			pr_err("dsi_ctrl_set_roi failed rc %d\n", rc);
-			return rc;
-		}
-
-		if (!changed)
-			continue;
-
-		/* send the new roi to the panel via dcs commands */
-		rc = dsi_panel_send_roi_dcs(display->panel, i, &ctrl_roi);
-		if (rc) {
-			pr_err("dsi_panel_set_roi failed rc %d\n", rc);
-			return rc;
-		}
-
-		/* re-program the ctrl with the timing based on the new roi */
-		rc = dsi_ctrl_setup(ctrl->ctrl);
-		if (rc) {
-			pr_err("dsi_ctrl_setup failed rc %d\n", rc);
-			return rc;
-		}
-	}
-
-	return rc;
-}
-
-int dsi_display_pre_kickoff(struct dsi_display *display,
-		struct msm_display_kickoff_params *params)
+int dsi_display_pre_kickoff(struct dsi_display *display)
 {
 	int rc = 0;
 
@@ -4046,8 +3946,6 @@ int dsi_display_pre_kickoff(struct dsi_display *display,
 	if (display->misr_enable)
 		_dsi_display_setup_misr(display);
 
-	rc = dsi_display_set_roi(display, params->rois);
-
 	return rc;
 }
 
drivers/gpu/drm/msm/dsi-staging/dsi_display.h +2 -3
index b23a84d..a0f9ccf 100644
@@ -524,11 +524,10 @@ int dsi_display_set_power(struct drm_connector *connector,
 /*
  * dsi_display_pre_kickoff - program kickoff-time features
  * @display: Pointer to private display structure
- * @params: Parameters for kickoff-time programming
  * Returns: Zero on success
  */
-int dsi_display_pre_kickoff(struct dsi_display *display,
-		struct msm_display_kickoff_params *params);
+int dsi_display_pre_kickoff(struct dsi_display *display);
+
 /**
  * dsi_display_get_dst_format() - get dst_format from DSI display
  * @display:         Handle to display
drivers/gpu/drm/msm/dsi-staging/dsi_drm.c +3 -23
index 6847c53..017f881 100644
@@ -443,25 +443,6 @@ int dsi_conn_post_init(struct drm_connector *connector,
 		break;
 	}
 
-	if (panel->roi_caps.enabled) {
-		dpu_kms_info_add_keyint(info, "partial_update_num_roi",
-				panel->roi_caps.num_roi);
-		dpu_kms_info_add_keyint(info, "partial_update_xstart",
-				panel->roi_caps.align.xstart_pix_align);
-		dpu_kms_info_add_keyint(info, "partial_update_walign",
-				panel->roi_caps.align.width_pix_align);
-		dpu_kms_info_add_keyint(info, "partial_update_wmin",
-				panel->roi_caps.align.min_width);
-		dpu_kms_info_add_keyint(info, "partial_update_ystart",
-				panel->roi_caps.align.ystart_pix_align);
-		dpu_kms_info_add_keyint(info, "partial_update_halign",
-				panel->roi_caps.align.height_pix_align);
-		dpu_kms_info_add_keyint(info, "partial_update_hmin",
-				panel->roi_caps.align.min_height);
-		dpu_kms_info_add_keyint(info, "partial_update_roimerge",
-				panel->roi_caps.merge_rois);
-	}
-
 end:
 	return 0;
 }
@@ -598,15 +579,14 @@ enum drm_mode_status dsi_conn_mode_valid(struct drm_connector *connector,
 }
 
 int dsi_conn_pre_kickoff(struct drm_connector *connector,
-		void *display,
-		struct msm_display_kickoff_params *params)
+		void *display)
 {
-	if (!connector || !display || !params) {
+	if (!connector || !display) {
 		pr_err("Invalid params\n");
 		return -EINVAL;
 	}
 
-	return dsi_display_pre_kickoff(display, params);
+	return dsi_display_pre_kickoff(display);
 }
 
 void dsi_conn_enable_event(struct drm_connector *connector,
drivers/gpu/drm/msm/dsi-staging/dsi_drm.h +1 -3
index f427340..38de33c 100644
@@ -112,12 +112,10 @@ struct dsi_bridge *dsi_drm_bridge_init(struct dsi_display *display,
  * dsi_display_pre_kickoff - program kickoff-time features
  * @connector: Pointer to drm connector structure
  * @display: Pointer to private display structure
- * @params: Parameters for kickoff-time programming
  * Returns: Zero on success
  */
 int dsi_conn_pre_kickoff(struct drm_connector *connector,
-		void *display,
-		struct msm_display_kickoff_params *params);
+		void *display);
 
 /**
  * dsi_display_post_kickoff - program post kickoff-time features
drivers/gpu/drm/msm/dsi-staging/dsi_panel.c +0 -85

97 lines not on this page · raw message

drivers/gpu/drm/msm/dsi-staging/dsi_panel.h +0 -2
index c26a5db..3b1b47c 100644
@@ -155,8 +155,6 @@ struct dsi_panel {
 	enum dsi_op_mode panel_mode;
 
 	struct dsi_dfps_capabilities dfps_caps;
-	struct msm_roi_caps roi_caps;
-
 	struct dsi_panel_phy_props phy_props;
 
 	struct dsi_display_mode *cur_mode;
Signature · 7 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project

_______________________________________________
Freedreno mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/freedreno

A message that is not in the archive (sent off-list or not yet received): 1519786511-25931-1-git-send-email-jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org

#2 lore raw

PATCH v2 2/2 drm/msm: remove partial update support

Implementation of partial update in DPU DRM is heavily dependent on custom properties and dsi hooks. Removing the support for now. We may need to revisit the support in the future.

Change-Id Idd87272fe4d4c0a26fcb405154c0605af1edf1ba
---
 drivers/gpu/drm/msm/disp/dpu1/dpu_connector.c  | 139 +------
 drivers/gpu/drm/msm/disp/dpu1/dpu_connector.h  |   7 +-
 drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c       | 544 +------------------------
 drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h       |  18 -
 drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c    | 277 ++++---------
 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c |   2 +
 drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h        |   8 -
 drivers/gpu/drm/msm/disp/dpu1/dpu_kms_utils.c  |  42 --
 drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c      |  13 -
 drivers/gpu/drm/msm/msm_drv.h                  |  56 ---
 10 files changed, 89 insertions(+), 1017 deletions(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_connector.c +1 -138
index 57b8627..c5e6c53 100644
@@ -424,8 +424,7 @@ int dpu_connector_pre_kickoff(struct drm_connector *connector)
 {
 	struct dpu_connector *c_conn;
 	struct dpu_connector_state *c_state;
-	struct msm_display_kickoff_params params;
-	int idx, rc;
+	int idx, rc = 0;
 
 	if (!connector) {
 		DPU_ERROR("invalid argument\n");
@@ -462,15 +461,8 @@ int dpu_connector_pre_kickoff(struct drm_connector *connector)
 		}
 	}
 
-	if (!c_conn->ops.pre_kickoff)
-		return 0;
-
-	params.rois = &c_state->rois;
-
 	DPU_EVT32_VERBOSE(connector->base.id);
 
-	rc = c_conn->ops.pre_kickoff(connector, c_conn->display, &params);
-
 	return rc;
 }
 
@@ -645,122 +637,6 @@ static void dpu_connector_atomic_reset(struct drm_connector *connector)
 	return &c_state->base;
 }
 
-static int _dpu_connector_roi_v1_check_roi(
-		struct dpu_connector *c_conn,
-		struct drm_clip_rect *roi_conn,
-		const struct msm_roi_caps *caps)
-{
-	const struct msm_roi_alignment *align = &caps->align;
-	int w = roi_conn->x2 - roi_conn->x1;
-	int h = roi_conn->y2 - roi_conn->y1;
-
-	if (w <= 0 || h <= 0) {
-		DPU_ERROR_CONN(c_conn, "invalid conn roi w %d h %d\n", w, h);
-		return -EINVAL;
-	}
-
-	if (w < align->min_width || w % align->width_pix_align) {
-		DPU_ERROR_CONN(c_conn,
-				"invalid conn roi width %d min %d align %d\n",
-				w, align->min_width, align->width_pix_align);
-		return -EINVAL;
-	}
-
-	if (h < align->min_height || h % align->height_pix_align) {
-		DPU_ERROR_CONN(c_conn,
-				"invalid conn roi height %d min %d align %d\n",
-				h, align->min_height, align->height_pix_align);
-		return -EINVAL;
-	}
-
-	if (roi_conn->x1 % align->xstart_pix_align) {
-		DPU_ERROR_CONN(c_conn, "invalid conn roi x1 %d align %d\n",
-				roi_conn->x1, align->xstart_pix_align);
-		return -EINVAL;
-	}
-
-	if (roi_conn->y1 % align->ystart_pix_align) {
-		DPU_ERROR_CONN(c_conn, "invalid conn roi y1 %d align %d\n",
-				roi_conn->y1, align->ystart_pix_align);
-		return -EINVAL;
-	}
-
-	return 0;
-}
-
-static int _dpu_connector_set_roi_v1(
-		struct dpu_connector *c_conn,
-		struct dpu_connector_state *c_state,
-		void *usr_ptr)
-{
-	struct dpu_drm_roi_v1 roi_v1;
-	struct msm_display_info display_info;
-	struct msm_roi_caps *caps;
-	int i, rc;
-
-	if (!c_conn || !c_state) {
-		DPU_ERROR("invalid args\n");
-		return -EINVAL;
-	}
-
-	rc = dpu_connector_get_info(&c_conn->base, &display_info);
-	if (rc) {
-		DPU_ERROR_CONN(c_conn, "display get info error: %d\n", rc);
-		return rc;
-	}
-
-	caps = &display_info.roi_caps;
-	if (!caps->enabled) {
-		DPU_ERROR_CONN(c_conn, "display roi capability is disabled\n");
-		return -ENOTSUPP;
-	}
-
-	memset(&c_state->rois, 0, sizeof(c_state->rois));
-
-	if (!usr_ptr) {
-		DPU_DEBUG_CONN(c_conn, "rois cleared\n");
-		return 0;
-	}
-
-	if (copy_from_user(&roi_v1, usr_ptr, sizeof(roi_v1))) {
-		DPU_ERROR_CONN(c_conn, "failed to copy roi_v1 data\n");
-		return -EINVAL;
-	}
-
-	DPU_DEBUG_CONN(c_conn, "num_rects %d\n", roi_v1.num_rects);
-
-	if (roi_v1.num_rects == 0) {
-		DPU_DEBUG_CONN(c_conn, "rois cleared\n");
-		return 0;
-	}
-
-	if (roi_v1.num_rects > DPU_MAX_ROI_V1 ||
-			roi_v1.num_rects > caps->num_roi) {
-		DPU_ERROR_CONN(c_conn, "too many rects specified: %d\n",
-				roi_v1.num_rects);
-		return -EINVAL;
-	}
-
-	c_state->rois.num_rects = roi_v1.num_rects;
-	for (i = 0; i < roi_v1.num_rects; ++i) {
-		int rc;
-
-		rc = _dpu_connector_roi_v1_check_roi(c_conn, &roi_v1.roi[i],
-				caps);
-		if (rc)
-			return rc;
-
-		c_state->rois.roi[i] = roi_v1.roi[i];
-		DPU_DEBUG_CONN(c_conn, "roi%d: roi (%d,%d) (%d,%d)\n", i,
-				c_state->rois.roi[i].x1,
-				c_state->rois.roi[i].y1,
-				c_state->rois.roi[i].x2,
-				c_state->rois.roi[i].y2);
-	}
-
-	return 0;
-}
-
 static int _dpu_connector_update_bl_scale(struct dpu_connector *c_conn,
 		int idx,
 		uint64_t value)
@@ -852,12 +728,6 @@ static int dpu_connector_atomic_set_property(struct drm_connector *connector,
 		break;
 	}
 
-	if (idx == CONNECTOR_PROP_ROI_V1) {
-		rc = _dpu_connector_set_roi_v1(c_conn, c_state, (void *)val);
-		if (rc)
-			DPU_ERROR_CONN(c_conn, "invalid roi_v1, rc: %d\n", rc);
-	}
-
 	/* check for custom property handling */
 	if (!rc && c_conn->ops.set_property) {
 		rc = c_conn->ops.set_property(connector,
@@ -1304,13 +1174,6 @@ struct drm_connector *dpu_connector_init(struct drm_device *dev,
 		CONNECTOR_PROP_AD_BL_SCALE);
 #endif
 
-	rc = dpu_connector_get_info(&c_conn->base, &display_info);
-	if (!rc && display_info.roi_caps.enabled) {
-		msm_property_install_volatile_range(
-				&c_conn->property_info, "dpu_drm_roi_v1", 0x0,
-				0, ~0, 0, CONNECTOR_PROP_ROI_V1);
-	}
-
 	msm_property_install_range(&c_conn->property_info, "RETIRE_FENCE",
 			0x0, 0, INR_OPEN_MAX, 0, CONNECTOR_PROP_RETIRE_FENCE);
 
drivers/gpu/drm/msm/disp/dpu1/dpu_connector.h +1 -6
index 573a0c8..981f459 100644
@@ -163,13 +163,10 @@ struct dpu_connector_ops {
 	 * pre_kickoff - trigger display to program kickoff-time features
 	 * @connector: Pointer to drm connector structure
 	 * @display: Pointer to private display structure
-	 * @params: Parameter bundle of connector-stored information for
-	 *	kickoff-time programming into the display
 	 * Returns: Zero on success
 	 */
 	int (*pre_kickoff)(struct drm_connector *connector,
-			void *display,
-			struct msm_display_kickoff_params *params);
+			void *display);
 
 	/**
 	 * clk_ctrl - perform clk enable/disable on the connector
@@ -340,7 +337,6 @@ struct dpu_connector {
  * @out_fb: Pointer to output frame buffer, if applicable
  * @property_state: Local storage for msm_prop properties
  * @property_values: Local cache of current connector property values
- * @rois: Regions of interest structure for mapping CRTC to Connector output
  * @property_blobs: blob properties
  */
 struct dpu_connector_state {
@@ -349,7 +345,6 @@ struct dpu_connector_state {
 	struct msm_property_state property_state;
 	struct msm_property_value property_values[CONNECTOR_PROP_COUNT];
 
-	struct msm_roi_list rois;
 	struct drm_property_blob *property_blobs[CONNECTOR_PROP_BLOBCOUNT];
 };
 
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +3 -541

626 lines not on this page · raw message

drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h +0 -18
index b63df24..15e3eb6 100644
@@ -345,13 +345,8 @@ struct dpu_crtc_respool {
  * @is_ppsplit    : Whether current topology requires PPSplit special handling
  * @bw_control    : true if bw/clk controlled by core bw/clk properties
  * @bw_split_vote : true if bw controlled by llcc/dram bw properties
- * @crtc_roi      : Current CRTC ROI. Possibly sub-rectangle of mode.
- *                  Origin top left of CRTC.
  * @lm_bounds     : LM boundaries based on current mode full resolution, no ROI.
  *                  Origin top left of CRTC.
- * @lm_roi        : Current LM ROI, possibly sub-rectangle of mode.
- *                  Origin top left of CRTC.
- * @user_roi_list : List of user's requested ROIs as from set property
  * @property_state: Local storage for msm_prop properties
  * @property_values: Current crtc property values
  * @input_fence_timeout_ns : Cached input fence timeout, in ns
@@ -376,10 +371,7 @@ struct dpu_crtc_state {
 	bool bw_split_vote;
 
 	bool is_ppsplit;
-	struct dpu_rect crtc_roi;
 	struct dpu_rect lm_bounds[CRTC_DUAL_MIXERS];
-	struct dpu_rect lm_roi[CRTC_DUAL_MIXERS];
-	struct msm_roi_list user_roi_list;
 
 	struct msm_property_state property_state;
 	struct msm_property_value property_values[CRTC_PROP_COUNT];
@@ -605,14 +597,4 @@ int dpu_crtc_res_add(struct drm_crtc_state *state, u32 type, u64 tag,
  */
 void dpu_crtc_res_put(struct drm_crtc_state *state, u32 type, u64 tag);
 
-/**
- * dpu_crtc_get_crtc_roi - retrieve the crtc_roi from the given state object
- *	used to allow the planes to adjust their final lm out_xy value in the
- *	case of partial update
- * @crtc_state: Pointer to crtc state
- * @crtc_roi: Output pointer to crtc roi in the given state
- */
-void dpu_crtc_get_crtc_roi(struct drm_crtc_state *state,
-		const struct dpu_rect **crtc_roi);
-
 #endif /* _DPU_CRTC_H_ */
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +82 -195

435 lines not on this page · raw message

drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c +2 -0
index 289b9ff..bade72e 100644
@@ -2013,6 +2013,7 @@ static int dpu_dspp_parse_dt(struct device_node *np,
 	if (rc)
 		goto end;
 
+#ifdef CONFIG_DPU_AD4
 	/* Parse AD dtsi entries */
 	ad_prop_value = kcalloc(AD_PROP_MAX,
 			sizeof(struct dpu_prop_value), GFP_KERNEL);
@@ -2028,6 +2029,7 @@ static int dpu_dspp_parse_dt(struct device_node *np,
 		ad_prop_exists, ad_prop_value);
 	if (rc)
 		goto end;
+#endif
 
 	/* get DSPP feature dt properties if they exist */
 	snp = of_get_child_by_name(np, dspp_prop[DSPP_BLOCKS].prop_name);
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h +0 -8
index 62e7c5c..d11fb1d 100644
@@ -454,14 +454,6 @@ void dpu_kms_rect_intersect(const struct dpu_rect *r1,
 		struct dpu_rect *result);
 
 /**
- * dpu_kms_rect_merge_rectangles - merge a rectangle list into one rect
- * @rois: pointer to the list of rois
- * @result: output rectangle, all 0 on error
- */
-void dpu_kms_rect_merge_rectangles(const struct msm_roi_list *rois,
-		struct dpu_rect *result);
-
-/**
  * dpu_kms_rect_is_equal - compares two rects
  * @r1: rect value to compare
  * @r2: rect value to compare
drivers/gpu/drm/msm/disp/dpu1/dpu_kms_utils.c +0 -42

45 lines not on this page · raw message

drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c +0 -13
index 834dcc0..9e9c9d2 100644
@@ -3243,7 +3243,6 @@ static int dpu_plane_sspp_atomic_update(struct drm_plane *plane,
 	struct drm_crtc *crtc;
 	struct drm_framebuffer *fb;
 	struct dpu_rect src, dst;
-	const struct dpu_rect *crtc_roi;
 	bool q16_data = true;
 	int idx;
 
@@ -3357,11 +3356,6 @@ static int dpu_plane_sspp_atomic_update(struct drm_plane *plane,
 	_dpu_plane_sspp_atomic_check_mode_changed(pdpu, state,
 								old_state);
 
-	/* re-program the output rects always in the case of partial update */
-	dpu_crtc_get_crtc_roi(crtc->state, &crtc_roi);
-	if (!dpu_kms_rect_is_null(crtc_roi))
-		pstate->dirty |= DPU_PLANE_DIRTY_RECTS;
-
 	if (pstate->dirty & DPU_PLANE_DIRTY_RECTS)
 		memset(&(pdpu->pipe_cfg), 0, sizeof(struct dpu_hw_pipe_cfg));
 
@@ -3399,13 +3393,6 @@ static int dpu_plane_sspp_atomic_update(struct drm_plane *plane,
 			src.y &= ~0x1;
 		}
 
-		/*
-		 * adjust layer mixer position of the sspp in the presence
-		 * of a partial update to the active lm origin
-		 */
-		dst.x -= crtc_roi->x;
-		dst.y -= crtc_roi->y;
-
 		pdpu->pipe_cfg.src_rect = src;
 		pdpu->pipe_cfg.dst_rect = dst;
 
drivers/gpu/drm/msm/msm_drv.h +0 -56

86 lines not on this page · raw message

Signature · 7 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project

_______________________________________________
Freedreno mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/freedreno

A message that is not in the archive (sent off-list or not yet received): 1519786511-25931-2-git-send-email-jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org

#4 lore raw

Re: [DPU PATCH v2 2/2] drm/msm: remove partial update support

Quoted 6 lines · Jeykumar Sankaran

Implementation of partial update in DPU DRM is heavily dependent on custom properties and dsi hooks. Removing the support for now. We may need to revisit the support in the future.

Change-Id: Idd87272fe4d4c0a26fcb405154c0605af1edf1ba

Same comments regarding the commit message.

Quoted 14 lines
---
 drivers/gpu/drm/msm/disp/dpu1/dpu_connector.c  | 139 +------
 drivers/gpu/drm/msm/disp/dpu1/dpu_connector.h  |   7 +-
 drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c       | 544 +------------------------
 drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h       |  18 -
 drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c    | 277 ++++---------
 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c |   2 +
 drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h        |   8 -
 drivers/gpu/drm/msm/disp/dpu1/dpu_kms_utils.c  |  42 --
 drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c      |  13 -
 drivers/gpu/drm/msm/msm_drv.h                  |  56 ---
 10 files changed, 89 insertions(+), 1017 deletions(-)

<snip>

drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c static int dpu_dspp_parse_dt(struct device_node *np, · line 2016

Quoted 9 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c +1 -0
index 289b9ff..bade72e 100644
@@ -2013,6 +2013,7 @@ static int dpu_dspp_parse_dt(struct device_node *np,
 	if (rc)
 		goto end;
 
+#ifdef CONFIG_DPU_AD4

This seems unrelated to the change?

Let's try to avoid introducing new "CONFIG_" values, unless we actually intend on adding them to the Kconfig. If you want to remove something, just submit a new patch to delete it (along with the bindings and everything else relating to it). We can always reintroduce it as a new patch later.

Thanks!

Sean

Quoted 217 lines
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c +1 -0
 	/* Parse AD dtsi entries */
 	ad_prop_value = kcalloc(AD_PROP_MAX,
 			sizeof(struct dpu_prop_value), GFP_KERNEL);
@@ -2028,6 +2029,7 @@ static int dpu_dspp_parse_dt(struct device_node *np,
 		ad_prop_exists, ad_prop_value);
 	if (rc)
 		goto end;
+#endif
 
 	/* get DSPP feature dt properties if they exist */
 	snp = of_get_child_by_name(np, dspp_prop[DSPP_BLOCKS].prop_name);
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h +0 -8
index 62e7c5c..d11fb1d 100644
@@ -454,14 +454,6 @@ void dpu_kms_rect_intersect(const struct dpu_rect *r1,
 		struct dpu_rect *result);
 
 /**
- * dpu_kms_rect_merge_rectangles - merge a rectangle list into one rect
- * @rois: pointer to the list of rois
- * @result: output rectangle, all 0 on error
- */
-void dpu_kms_rect_merge_rectangles(const struct msm_roi_list *rois,
-		struct dpu_rect *result);
-
-/**
  * dpu_kms_rect_is_equal - compares two rects
  * @r1: rect value to compare
  * @r2: rect value to compare
drivers/gpu/drm/msm/disp/dpu1/dpu_kms_utils.c +0 -42
index 006d7ad..40e0162 100644
@@ -176,45 +176,3 @@ void dpu_kms_rect_intersect(const struct dpu_rect *r1,
 	}
 }
 
-void dpu_kms_rect_merge_rectangles(const struct msm_roi_list *rois,
-		struct dpu_rect *result)
-{
-	struct drm_clip_rect clip;
-	const struct drm_clip_rect *roi_rect;
-	int i;
-
-	if (!rois || !result)
-		return;
-
-	memset(result, 0, sizeof(*result));
-
-	/* init to invalid range maxes */
-	clip.x1 = ~0;
-	clip.y1 = ~0;
-	clip.x2 = 0;
-	clip.y2 = 0;
-
-	/* aggregate all clipping rectangles together for overall roi */
-	for (i = 0; i < rois->num_rects; i++) {
-		roi_rect = &rois->roi[i];
-
-		clip.x1 = min(clip.x1, roi_rect->x1);
-		clip.y1 = min(clip.y1, roi_rect->y1);
-		clip.x2 = max(clip.x2, roi_rect->x2);
-		clip.y2 = max(clip.y2, roi_rect->y2);
-
-		DPU_DEBUG("roi%d (%d,%d),(%d,%d) -> crtc (%d,%d),(%d,%d)\n", i,
-				roi_rect->x1, roi_rect->y1,
-				roi_rect->x2, roi_rect->y2,
-				clip.x1, clip.y1,
-				clip.x2, clip.y2);
-	}
-
-	if (clip.x2  && clip.y2) {
-		result->x = clip.x1;
-		result->y = clip.y1;
-		result->w = clip.x2 - clip.x1;
-		result->h = clip.y2 - clip.y1;
-	}
-}
-
drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c +0 -13
index 834dcc0..9e9c9d2 100644
@@ -3243,7 +3243,6 @@ static int dpu_plane_sspp_atomic_update(struct drm_plane *plane,
 	struct drm_crtc *crtc;
 	struct drm_framebuffer *fb;
 	struct dpu_rect src, dst;
-	const struct dpu_rect *crtc_roi;
 	bool q16_data = true;
 	int idx;
 
@@ -3357,11 +3356,6 @@ static int dpu_plane_sspp_atomic_update(struct drm_plane *plane,
 	_dpu_plane_sspp_atomic_check_mode_changed(pdpu, state,
 								old_state);
 
-	/* re-program the output rects always in the case of partial update */
-	dpu_crtc_get_crtc_roi(crtc->state, &crtc_roi);
-	if (!dpu_kms_rect_is_null(crtc_roi))
-		pstate->dirty |= DPU_PLANE_DIRTY_RECTS;
-
 	if (pstate->dirty & DPU_PLANE_DIRTY_RECTS)
 		memset(&(pdpu->pipe_cfg), 0, sizeof(struct dpu_hw_pipe_cfg));
 
@@ -3399,13 +3393,6 @@ static int dpu_plane_sspp_atomic_update(struct drm_plane *plane,
 			src.y &= ~0x1;
 		}
 
-		/*
-		 * adjust layer mixer position of the sspp in the presence
-		 * of a partial update to the active lm origin
-		 */
-		dst.x -= crtc_roi->x;
-		dst.y -= crtc_roi->y;
-
 		pdpu->pipe_cfg.src_rect = src;
 		pdpu->pipe_cfg.dst_rect = dst;
 
drivers/gpu/drm/msm/msm_drv.h +0 -56
index d8e090f..8574f30 100644
@@ -144,7 +144,6 @@ enum msm_mdp_crtc_property {
 	CRTC_PROP_DRAM_IB,
 	CRTC_PROP_ROT_PREFILL_BW,
 	CRTC_PROP_ROT_CLK,
-	CRTC_PROP_ROI_V1,
 	CRTC_PROP_IDLE_TIMEOUT,
 	CRTC_PROP_DEST_SCALER,
 
@@ -168,7 +167,6 @@ enum msm_mdp_conn_property {
 	CONNECTOR_PROP_DST_Y,
 	CONNECTOR_PROP_DST_W,
 	CONNECTOR_PROP_DST_H,
-	CONNECTOR_PROP_ROI_V1,
 	CONNECTOR_PROP_BL_SCALE,
 	CONNECTOR_PROP_AD_BL_SCALE,
 
@@ -228,38 +226,6 @@ enum msm_event_wait {
 };
 
 /**
- * struct msm_roi_alignment - region of interest alignment restrictions
- * @xstart_pix_align: left x offset alignment restriction
- * @width_pix_align: width alignment restriction
- * @ystart_pix_align: top y offset alignment restriction
- * @height_pix_align: height alignment restriction
- * @min_width: minimum width restriction
- * @min_height: minimum height restriction
- */
-struct msm_roi_alignment {
-	uint32_t xstart_pix_align;
-	uint32_t width_pix_align;
-	uint32_t ystart_pix_align;
-	uint32_t height_pix_align;
-	uint32_t min_width;
-	uint32_t min_height;
-};
-
-/**
- * struct msm_roi_caps - display's region of interest capabilities
- * @enabled: true if some region of interest is supported
- * @merge_rois: merge rois before sending to display
- * @num_roi: maximum number of rois supported
- * @align: roi alignment restrictions
- */
-struct msm_roi_caps {
-	bool enabled;
-	bool merge_rois;
-	uint32_t num_roi;
-	struct msm_roi_alignment align;
-};
-
-/**
  * struct msm_display_dsc_info - defines dsc configuration
  * @version:                 DSC version.
  * @scr_rev:                 DSC revision.
@@ -427,7 +393,6 @@ struct msm_mode_info {
  * @is_primary:         Set to true if display is primary display
  * @is_te_using_watchdog_timer:  Boolean to indicate watchdog TE is
  *				 used instead of panel TE in cmd mode panels
- * @roi_caps:           Region of interest capability info
  */
 struct msm_display_info {
 	int intf_type;
@@ -446,27 +411,6 @@ struct msm_display_info {
 
 	bool is_primary;
 	bool is_te_using_watchdog_timer;
-	struct msm_roi_caps roi_caps;
-};
-
-#define MSM_MAX_ROI	4
-
-/**
- * struct msm_roi_list - list of regions of interest for a drm object
- * @num_rects: number of valid rectangles in the roi array
- * @roi: list of roi rectangles
- */
-struct msm_roi_list {
-	uint32_t num_rects;
-	struct drm_clip_rect roi[MSM_MAX_ROI];
-};
-
-/**
- * struct - msm_display_kickoff_params - info for display features at kickoff
- * @rois: Regions of interest structure for mapping CRTC to Connector output
- */
-struct msm_display_kickoff_params {
-	struct msm_roi_list *rois;
 };
 
 /**
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project
Signature · 5 lines
Sean Paul, Software Engineer, Google / Chromium OS
_______________________________________________
Freedreno mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/freedreno
Reviewed-by
#5 lore raw
In reply to a message not in the archive
Quoted 3 lines · Jeykumar Sankaran

Remove support partial update and related changes from dsi-staging since the DPU dependencies are getting cleaned up.

Can you please add a "Changes in v2:" section to the commit message summarizing what you've changed since the last version? This is super helpful for reviewers.

Quoted 1 line

Change-Id: I02462f520cdf99c8445b18e60212ca46155f9710

I forgot this during my last patchset too, but please try to strip the Change-Id tag.

With the commit message changes,

Quoted 344 lines
---
 drivers/gpu/drm/msm/dsi-staging/dsi_display.c | 104 +-------------------------
 drivers/gpu/drm/msm/dsi-staging/dsi_display.h |   5 +-
 drivers/gpu/drm/msm/dsi-staging/dsi_drm.c     |  26 +------
 drivers/gpu/drm/msm/dsi-staging/dsi_drm.h     |   4 +-
 drivers/gpu/drm/msm/dsi-staging/dsi_panel.c   |  85 ---------------------
 drivers/gpu/drm/msm/dsi-staging/dsi_panel.h   |   2 -
 6 files changed, 7 insertions(+), 219 deletions(-)
drivers/gpu/drm/msm/dsi-staging/dsi_display.c +1 -103
index 72055dc..31b7d7e 100644
@@ -3414,9 +3414,6 @@ int dsi_display_get_info(struct msm_display_info *info, void *disp)
 		break;
 	}
 
-	memcpy(&info->roi_caps, &display->panel->roi_caps,
-			sizeof(info->roi_caps));
-
 error:
 	mutex_unlock(&display->display_lock);
 	return rc;
@@ -3941,104 +3938,7 @@ int dsi_display_prepare(struct dsi_display *display)
 	return rc;
 }
 
-static int dsi_display_calc_ctrl_roi(const struct dsi_display *display,
-		const struct dsi_display_ctrl *ctrl,
-		const struct msm_roi_list *req_rois,
-		struct dsi_rect *out_roi)
-{
-	const struct dsi_rect *bounds = &ctrl->ctrl->mode_bounds;
-	struct dsi_rect req_roi = { 0 };
-	int rc = 0;
-
-	if (req_rois->num_rects > display->panel->roi_caps.num_roi) {
-		pr_err("request for %d rois greater than max %d\n",
-				req_rois->num_rects,
-				display->panel->roi_caps.num_roi);
-		rc = -EINVAL;
-		goto exit;
-	}
-
-	/**
-	 * if no rois, user wants to reset back to full resolution
-	 * note: h_active is already divided by ctrl_count
-	 */
-	if (!req_rois->num_rects) {
-		*out_roi = *bounds;
-		goto exit;
-	}
-
-	/* intersect with the bounds */
-	req_roi.x = req_rois->roi[0].x1;
-	req_roi.y = req_rois->roi[0].y1;
-	req_roi.w = req_rois->roi[0].x2 - req_rois->roi[0].x1;
-	req_roi.h = req_rois->roi[0].y2 - req_rois->roi[0].y1;
-	dsi_rect_intersect(&req_roi, bounds, out_roi);
-
-exit:
-	/* adjust the ctrl origin to be top left within the ctrl */
-	out_roi->x = out_roi->x - bounds->x;
-
-	pr_debug("ctrl%d:%d: req (%d,%d,%d,%d) bnd (%d,%d,%d,%d) out (%d,%d,%d,%d)\n",
-			ctrl->dsi_ctrl_idx, ctrl->ctrl->cell_index,
-			req_roi.x, req_roi.y, req_roi.w, req_roi.h,
-			bounds->x, bounds->y, bounds->w, bounds->h,
-			out_roi->x, out_roi->y, out_roi->w, out_roi->h);
-
-	return rc;
-}
-
-static int dsi_display_set_roi(struct dsi_display *display,
-		struct msm_roi_list *rois)
-{
-	int rc = 0;
-	int i;
-
-	if (!display || !rois || !display->panel)
-		return -EINVAL;
-
-	if (!display->panel->roi_caps.enabled)
-		return 0;
-
-	for (i = 0; i < display->ctrl_count; i++) {
-		struct dsi_display_ctrl *ctrl = &display->ctrl[i];
-		struct dsi_rect ctrl_roi;
-		bool changed = false;
-
-		rc = dsi_display_calc_ctrl_roi(display, ctrl, rois, &ctrl_roi);
-		if (rc) {
-			pr_err("dsi_display_calc_ctrl_roi failed rc %d\n", rc);
-			return rc;
-		}
-
-		rc = dsi_ctrl_set_roi(ctrl->ctrl, &ctrl_roi, &changed);
-		if (rc) {
-			pr_err("dsi_ctrl_set_roi failed rc %d\n", rc);
-			return rc;
-		}
-
-		if (!changed)
-			continue;
-
-		/* send the new roi to the panel via dcs commands */
-		rc = dsi_panel_send_roi_dcs(display->panel, i, &ctrl_roi);
-		if (rc) {
-			pr_err("dsi_panel_set_roi failed rc %d\n", rc);
-			return rc;
-		}
-
-		/* re-program the ctrl with the timing based on the new roi */
-		rc = dsi_ctrl_setup(ctrl->ctrl);
-		if (rc) {
-			pr_err("dsi_ctrl_setup failed rc %d\n", rc);
-			return rc;
-		}
-	}
-
-	return rc;
-}
-
-int dsi_display_pre_kickoff(struct dsi_display *display,
-		struct msm_display_kickoff_params *params)
+int dsi_display_pre_kickoff(struct dsi_display *display)
 {
 	int rc = 0;
 
@@ -4046,8 +3946,6 @@ int dsi_display_pre_kickoff(struct dsi_display *display,
 	if (display->misr_enable)
 		_dsi_display_setup_misr(display);
 
-	rc = dsi_display_set_roi(display, params->rois);
-
 	return rc;
 }
 
drivers/gpu/drm/msm/dsi-staging/dsi_display.h +2 -3
index b23a84d..a0f9ccf 100644
@@ -524,11 +524,10 @@ int dsi_display_set_power(struct drm_connector *connector,
 /*
  * dsi_display_pre_kickoff - program kickoff-time features
  * @display: Pointer to private display structure
- * @params: Parameters for kickoff-time programming
  * Returns: Zero on success
  */
-int dsi_display_pre_kickoff(struct dsi_display *display,
-		struct msm_display_kickoff_params *params);
+int dsi_display_pre_kickoff(struct dsi_display *display);
+
 /**
  * dsi_display_get_dst_format() - get dst_format from DSI display
  * @display:         Handle to display
drivers/gpu/drm/msm/dsi-staging/dsi_drm.c +3 -23
index 6847c53..017f881 100644
@@ -443,25 +443,6 @@ int dsi_conn_post_init(struct drm_connector *connector,
 		break;
 	}
 
-	if (panel->roi_caps.enabled) {
-		dpu_kms_info_add_keyint(info, "partial_update_num_roi",
-				panel->roi_caps.num_roi);
-		dpu_kms_info_add_keyint(info, "partial_update_xstart",
-				panel->roi_caps.align.xstart_pix_align);
-		dpu_kms_info_add_keyint(info, "partial_update_walign",
-				panel->roi_caps.align.width_pix_align);
-		dpu_kms_info_add_keyint(info, "partial_update_wmin",
-				panel->roi_caps.align.min_width);
-		dpu_kms_info_add_keyint(info, "partial_update_ystart",
-				panel->roi_caps.align.ystart_pix_align);
-		dpu_kms_info_add_keyint(info, "partial_update_halign",
-				panel->roi_caps.align.height_pix_align);
-		dpu_kms_info_add_keyint(info, "partial_update_hmin",
-				panel->roi_caps.align.min_height);
-		dpu_kms_info_add_keyint(info, "partial_update_roimerge",
-				panel->roi_caps.merge_rois);
-	}
-
 end:
 	return 0;
 }
@@ -598,15 +579,14 @@ enum drm_mode_status dsi_conn_mode_valid(struct drm_connector *connector,
 }
 
 int dsi_conn_pre_kickoff(struct drm_connector *connector,
-		void *display,
-		struct msm_display_kickoff_params *params)
+		void *display)
 {
-	if (!connector || !display || !params) {
+	if (!connector || !display) {
 		pr_err("Invalid params\n");
 		return -EINVAL;
 	}
 
-	return dsi_display_pre_kickoff(display, params);
+	return dsi_display_pre_kickoff(display);
 }
 
 void dsi_conn_enable_event(struct drm_connector *connector,
drivers/gpu/drm/msm/dsi-staging/dsi_drm.h +1 -3
index f427340..38de33c 100644
@@ -112,12 +112,10 @@ struct dsi_bridge *dsi_drm_bridge_init(struct dsi_display *display,
  * dsi_display_pre_kickoff - program kickoff-time features
  * @connector: Pointer to drm connector structure
  * @display: Pointer to private display structure
- * @params: Parameters for kickoff-time programming
  * Returns: Zero on success
  */
 int dsi_conn_pre_kickoff(struct drm_connector *connector,
-		void *display,
-		struct msm_display_kickoff_params *params);
+		void *display);
 
 /**
  * dsi_display_post_kickoff - program post kickoff-time features
drivers/gpu/drm/msm/dsi-staging/dsi_panel.c +0 -85
index 2d94e5f..fd20eba 100644
@@ -2331,87 +2331,6 @@ static int dsi_panel_parse_topology(
 	return rc;
 }
 
-static int dsi_panel_parse_roi_alignment(struct device_node *of_node,
-					 struct msm_roi_alignment *align)
-{
-	int len = 0, rc = 0;
-	u32 value[6];
-	struct property *data;
-
-	if (!align || !of_node)
-		return -EINVAL;
-
-	memset(align, 0, sizeof(*align));
-
-	data = of_find_property(of_node, "qcom,panel-roi-alignment", &len);
-	len /= sizeof(u32);
-	if (!data) {
-		pr_err("panel roi alignment not found\n");
-		rc = -EINVAL;
-	} else if (len != 6) {
-		pr_err("incorrect roi alignment len %d\n", len);
-		rc = -EINVAL;
-	} else {
-		rc = of_property_read_u32_array(of_node,
-				"qcom,panel-roi-alignment", value, len);
-		if (rc)
-			pr_debug("error reading panel roi alignment values\n");
-		else {
-			align->xstart_pix_align = value[0];
-			align->ystart_pix_align = value[1];
-			align->width_pix_align = value[2];
-			align->height_pix_align = value[3];
-			align->min_width = value[4];
-			align->min_height = value[5];
-		}
-
-		pr_info("roi alignment: [%d, %d, %d, %d, %d, %d]\n",
-			align->xstart_pix_align,
-			align->width_pix_align,
-			align->ystart_pix_align,
-			align->height_pix_align,
-			align->min_width,
-			align->min_height);
-	}
-
-	return rc;
-}
-
-static int dsi_panel_parse_partial_update_caps(struct dsi_panel *panel,
-					       struct device_node *of_node)
-{
-	struct msm_roi_caps *roi_caps = &panel->roi_caps;
-	const char *data;
-	int rc = 0;
-
-	memset(roi_caps, 0, sizeof(*roi_caps));
-
-	data = of_get_property(of_node, "qcom,partial-update-enabled", NULL);
-	if (data) {
-		if (!strcmp(data, "dual_roi"))
-			roi_caps->num_roi = 2;
-		else
-			roi_caps->num_roi = 1;
-	}
-
-	roi_caps->merge_rois = of_property_read_bool(of_node,
-			"qcom,partial-update-roi-merge");
-
-	roi_caps->enabled = roi_caps->num_roi > 0;
-
-	pr_info("partial update num_rois=%d enabled=%d\n", roi_caps->num_roi,
-			roi_caps->enabled);
-
-	if (roi_caps->enabled)
-		rc = dsi_panel_parse_roi_alignment(of_node,
-				&panel->roi_caps.align);
-
-	if (rc)
-		memset(roi_caps, 0, sizeof(*roi_caps));
-
-	return rc;
-}
-
 static int dsi_panel_parse_dms_info(struct dsi_panel *panel,
 	struct device_node *of_node)
 {
@@ -2703,10 +2622,6 @@ struct dsi_panel *dsi_panel_get(struct device *parent,
 	if (rc)
 		pr_err("failed to parse hdr config, rc=%d\n", rc);
 
-	rc = dsi_panel_parse_partial_update_caps(panel, of_node);
-	if (rc)
-		pr_debug("failed to partial update caps, rc=%d\n", rc);
-
 	rc = dsi_panel_get_mode_count(panel, of_node);
 	if (rc) {
 		pr_err("failed to get mode count, rc=%d\n", rc);
drivers/gpu/drm/msm/dsi-staging/dsi_panel.h +0 -2
index c26a5db..3b1b47c 100644
@@ -155,8 +155,6 @@ struct dsi_panel {
 	enum dsi_op_mode panel_mode;
 
 	struct dsi_dfps_capabilities dfps_caps;
-	struct msm_roi_caps roi_caps;
-
 	struct dsi_panel_phy_props phy_props;
 
 	struct dsi_display_mode *cur_mode;
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project
Signature · 5 lines
Sean Paul, Software Engineer, Google / Chromium OS
_______________________________________________
Freedreno mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/freedreno